我正在编写一些汇编语言中的基本程序,在这些程序中,我只进行一些函数调用。我在OS上,使用Mach-O 64位格式.然而,我对数据部分的理解似乎有一个缺陷。据我了解,data部分用于初始化数据,我已决定初始化两个内存块,如下所示:
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规范对齐16字节。此外,rdi应该包含函数调用的第一个参数。
以上代码将打印“消息B",但无法直接打印”消息A“。好像“消息A”在某个地方被覆盖了。
同样有趣的是,当我在.text部分中输入这两个字符串时,代码按预期工作。由于.text是只读的,我几乎可以肯定,“消息A”在初始化后的某个时候会被覆盖。无论我在.data部分输入了多少字符串,我都只能打印最后一个字符串,而其他字符串只是简单地被覆盖。为什么最后一个字符串初始化为唯一未被覆盖的字符串?
发布于 2015-07-17 16:29:12
在这一刻,周围似乎没有太多的工作。这是2.11.08中的一个bug,我认为有些人也报告了2.11.06的问题,所以去2.11.05可能是最好的选择,或者等待2.11.09。
https://stackoverflow.com/questions/30385380
复制相似问题