NASM

时间:2015-05-21 22:27:24

标签: macos assembly nasm x86-64

我在汇编中编写一些基本程序,其中我只是进行一些函数调用。我在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部分输入了多少个字符串,我只能打印最后一个字符串,而其他字符串只是被覆盖。为什么最后一个字符串被初始化为唯一一个未被覆盖的字符串?

1 个答案:

答案 0 :(得分:1)

此时此刻,似乎没有什么可行的。这是2.11.08中的一个错误,我认为有些人也报告了2.11.06的问题,所以转到2.11.05可能是你最好的选择,或等待2.11.09。