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
,编译器会把字符串文字和其他常量放在一起,与代码分开。