2015-11-25 48 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 

我使用LD連接。

它顯示了我兩個警告:

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