尝试显示字符串的代码中的错误
Errors in code that tries to display strings
我正在编写一个 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
我该如何纠正?
宏只是替换字符串。所以,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
我正在编写一个 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
我该如何纠正?
宏只是替换字符串。所以,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