Printf汇编语言堆栈指针nasm intel

时间:2014-10-09 02:38:30

标签: assembly nasm

设置:Nasm intel 64bit ubuntu 当我包含printf行时,我收到分段错误。没有包括它编译和运行正常。我只是想在这段代码中打印1。

调用printf是否打印堆栈指针处的内容? 当在这里调用printf时,DD2会在堆栈指针处吗?

我刚刚弹出最后两个项目,让堆栈返回初始位置。

所有的帮助表示赞赏,祝你度过愉快的夜晚!

SECTION .data
DD:
    db 1
DD2:
    db "%d"
extern printf

SECTION .text
global main

main:
    push DD
    push DD2
    call printf
    pop rax ; 
    pop rbx ;

    ret

1 个答案:

答案 0 :(得分:0)

64位的调用约定与您习惯使用的32位非常不同。

http://en.wikipedia.org/wiki/X86_calling_conventions

向下滚动到x86-64,它会告诉您前6个参数在寄存器中传递: RDI的第一个参数,RSI的第二个参数,RDX的第三个参数,第四个RCX,第五个R8,第六个R9,它们都被传递到堆栈中;浮点参数在XMM0-7中传递

所以,你的printf调用应该是:

mov     rsi, DD
mov     rdi, DD2
mov     rax, 0
call    printf

因为我们没有在xmm regs中传递任何内容,所以我们将rax设置为0(没有它可能会崩溃)

我还应该注意,堆栈必须是16字节对齐,这是程序启动时你链接到c库。但是,由于调用在堆栈上推送了一个8字节值(返回地址),因此堆栈未对齐。在您的功能开始时(在您的案例中为主),只需执行sub rsp, 8即可完成此操作。