段错误基本组装
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 函数之间传递参数。)
有关调用约定的更多文档,请参阅 x86 标记 wiki。还有关于使用调试器的信息,这会让你问一个更好的问题(通过显示哪条指令产生了段错误,以及它试图访问什么地址。)
.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 函数之间传递参数。)
有关调用约定的更多文档,请参阅 x86 标记 wiki。还有关于使用调试器的信息,这会让你问一个更好的问题(通过显示哪条指令产生了段错误,以及它试图访问什么地址。)