尝试显示字符串的代码中的错误

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