分段故障基本组件

时间:2016-07-09 20:06:14

标签: assembly att

   .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之前保持对齐。我是装配新手,所以对任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

show:
    popq   x

是一个明显的错误。进入函数时堆栈上的第一件事是返回地址。当你尝试ret时,你会遇到问题,因为你已经破坏了返回地址。

此外,64位代码的标准调用约定/ ABI在寄存器中传递args,因此您不会将合理的args传递给printf。 (你可以在自己喜欢的asm函数之间传递args,只要你不想从C调用它们。)

有关调用约定的更多文档,请参阅标记wiki。还有关于使用调试器的信息,这可以让你问一个更好的问题(通过显示哪个指令生成了segfault,以及它试图访问的地址。)