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
2?
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
So len1
是当前地址之间的差异($
)和地址msg1
。这样它将是第一条消息的长度。
See $ 在 NASM 中究竟是如何运作的? https://stackoverflow.com/questions/47494744/how-does-work-in-nasm-exactly了解更多详细信息和示例。
注意section.data:
只是一个定义符号名称的标签,中间有一个点。它不会切换部分,因此您的代码和数据位于.text
部分(具有只读+执行权限),这是文件顶部的默认部分nasm -f elf32
输出。
Use section .data
如果你想在不执行的情况下进行读+写,或者section .rodata
在 Linux 上如果你想要只读withoutexec,编译器将字符串文字和其他常量放在一起,与代码分开。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)