Hello World用一个系统调用打印两条消息?为什么长度等于$-msg1包括两者?


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

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

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

所以len1是当前地址($)和msg1的地址之差。这样,它将是第一个消息的长度。

参见$在NASM中是如何工作的?查看更多细节和示例。


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

如果你想读+写而不需要exec,使用section .data;如果你想只读而不需要 exec,在Linux上使用section .rodata,编译器会把字符串文字和其他常量放在一起,与代码分开。

相关内容

  • 没有找到相关文章

最新更新