我在汇编中编写一些基本程序,其中我只是进行一些函数调用。我在OS X上,使用Mach-O 64位格式。但是,我对数据部分的理解似乎存在缺陷。我知道数据部分用于初始化数据,我决定初始化两块内存,如下所示:
default rel
global _main
extern _puts
section .data
first db "Message A", 0 ; null terminator
second db "Message B", 0
section .text
_main:
push rbp ; alignment
mov rbp, rsp
sub rsp, 0x10
lea rdi, [second]
call _puts
lea rdi, [first]
call _puts
add rsp, 0x10
pop rbp
ret
(我正在与libc联系,很明显)
我的理解是堆栈必须根据System V ABI规范进行16字节对齐。另外,rdi应该包含函数调用的第一个参数。
以上代码将打印“消息B”,但无法直接打印“消息A”。好像“消息A”在某处被覆盖了。
同样非常有趣的是,当我在.text
部分输入两个字符串时,代码按预期工作。由于.text
是只读的,我几乎可以肯定“消息A”在初始化后的某个时候被覆盖了。无论我在.data
部分输入了多少个字符串,我只能打印最后一个字符串,而其他字符串只是被覆盖。为什么最后一个字符串被初始化为唯一一个未被覆盖的字符串?
答案 0 :(得分:1)
此时此刻,似乎没有什么可行的。这是2.11.08中的一个错误,我认为有些人也报告了2.11.06的问题,所以转到2.11.05可能是你最好的选择,或等待2.11.09。