2015-11-25 6 views
1

Я нахожу программу nasm, которая просто печатает строку, используя директивы и макросы препроцессора. Вот код:Ошибки в коде, который пытается отобразить строки

%define hello "Hello, world!" 
%strlen size_h hello 

%macro print 2 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, %1 
    mov edx, %2 
    int 80h 
%endmacro 

section .text 
global _start 

_start: 
    print hello, size_h 
    mov eax, 1 
    mov ebx, 0 
    int 80h ;exit 

Я использую Л.Д. линкера.

Он показывает мне два предупреждения:

character constant too long 
dword data exceeds bounds 

Как я могу исправить это?

ответ

1

Макрос просто заменяет строки. Таким образом, print hello, size_h станет

mov eax, 4 
mov ebx, 1 
mov ecx, "Hello World!" 
mov edx, 13 
int 80h 

Вы видите, вы пытаетесь загрузить ECX со строкой, так как Int 80h/EAX=4 ожидает адрес. Сначала вам нужно сохранить строку, а затем вы можете загрузить ECX с его адресом. NASM не сделает этого для вас.

Следующий макрос сохраняет буквальное в разделе .text (вы не можете изменить его там):

%macro print 2 
    jmp short %%SkipData 
    %%string: db %1 
    %%SkipData: 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, %%string 
    mov edx, %2 
    int 80h 
%endmacro 

Этот макрос переключается в секции .data и обратно .text:

%macro print 2 
    section .data 
    %%string: db %1 
    section .text 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, %%string 
    mov edx, %2 
    int 80h 
%endmacro 
+0

Большой ! Большое спасибо! – sant016

 Смежные вопросы

  • Нет связанных вопросов^_^