2014-10-09 86 views
0

设置:纳斯姆英特尔64位ubuntu 当我包含printf行时出现分段错误。不包括它编译和运行良好。我只是试图在这个代码中打印1。Printf汇编语言堆栈指针nasm英特尔

是否调用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 

回答

0

对于64位的调用约定是非常不同的,那么你已经习惯了32位。

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

向下滚动到X86-64它会告诉你,前6个参数在寄存器中传递:在RDI,第二PARAM在RSI中,RDX第三个参数,第4 RCX,第5 R8 1 PARAM ,第6个R9,并且他们通过堆栈;浮点PARAMS在XMM0-7

就这么过去了,你的printf调用应该是:

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

,因为我们没有在XMM暂存器传递什么,我们RAX设置为0(如果没有它它可能崩溃)

我还应该注意,堆栈必须是16字节对齐的,这是当你的程序启动时,你链接到C库。但是,由于该调用会在堆栈上返回一个8字节的值(返回地址),因此堆栈未对齐。在你的功能开始时(主要是你的情况),只需做一个sub rsp, 8,这将处理它。

+0

哇,谢谢你的详细回复! – 2014-10-09 04:23:45