.text
.global main
// code for main
main:
push %r13
push %r14
push %r15
pushq $2
call show
pop %r15
pop %r14
pop %r13
mov $0,%rax
ret
// code for show
show:
popq x
pushq x
popq gen
lea genfmt_(%rip),%rdi
movq gen(%rip),%rsi
.extern printf
call printf
ret
.data
gen: .quad 0
genfmt_: .byte '%','u',10,0
x: .quad 0
标题几乎总结了它。我不知道为什么会产生分段错误错误。根据我的理解,当我按下r15,r14,r13时,堆栈指针对齐,然后在调用print f之前保持对齐。我是装配新手,所以对任何帮助表示赞赏!
答案 0 :(得分:1)
show:
popq x
是一个明显的错误。进入函数时堆栈上的第一件事是返回地址。当你尝试ret
时,你会遇到问题,因为你已经破坏了返回地址。
此外,64位代码的标准调用约定/ ABI在寄存器中传递args,因此您不会将合理的args传递给printf。 (你可以在自己喜欢的asm函数之间传递args,只要你不想从C调用它们。)
有关调用约定的更多文档,请参阅x86标记wiki。还有关于使用调试器的信息,这可以让你问一个更好的问题(通过显示哪个指令生成了segfault,以及它试图访问的地址。)