Hello World 通过一个系统调用打印两条消息?为什么 length equ $-msg1 包括两者?

Ale*_*ria 2 linux x86 assembly nasm

section.text:
global _start

_start:
    mov ebx, 1
    mov eax, 4
    mov ecx, msg1
    mov edx, len1
    int 0x80

    mov eax, 1 ; exit
    mov ebx, 0
    int 0x80


section.data:
msg1: db "Hello world", 10
msg2: db "Hello world!", 10
len1: equ $-msg1
len2: equ $-msg2
Run Code Online (Sandbox Code Playgroud)

它打印出: 你好世界你好世界!但为什么是msg2?

Ren*_*nat 5

len1填充错误,应该是:

section  .rodata        ; space needed between section directive and its operand
                        ; On Linux we normally put read-only data in .rodata

msg1: db "Hello world", 10
len1: equ $-msg1
msg2: db "Hello world!", 10
len2: equ $-msg2
Run Code Online (Sandbox Code Playgroud)

当前地址 ( ) 和 的地址len1之间的差异也是如此。这样它将是第一条消息的长度。$msg1

请参阅$ 在 NASM 中到底是如何工作的?了解更多详细信息和示例。


请注意,这section.data:只是一个定义符号名称的标签,中间有一个点。它不会切换部分,因此您的代码和数据位于该.text部分(具有只读+执行权限),这是文件顶部用于nasm -f elf32输出的默认部分。

section .data如果您想在没有 exec 的情况下进行读+写,或者section .rodata在 Linux 上如果您想在没有exec 的情况下进行只读,请使用此选项,其中编译器将字符串文字和其他常量将它们与代码分开分组。