设置: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
答案 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
即可完成此操作。