段错误基本组装

Segmentation fault basic assembly

   .text
.global main
// code for main
main:
   push %r13
   push %r14
   push %r15
   pushq  
   call  show
   pop %r15
   pop %r14
   pop %r13
   mov [=10=],%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 之前保持对齐。我是组装新手,非常感谢您的帮助!

show:
    popq   x

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

此外,64 位代码的标准调用约定/ABI 在寄存器中传递参数,因此您没有将合理的参数传递给 printf。 (只要您不想从 C 中调用它们,您可以随心所欲地在自己的 asm 函数之间传递参数。)

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