在函数内部推送时出现分段错误 x86_64 GAS
Segmentation fault on push inside a function x86_64 GAS
我有一个小程序,它只是将一个项目添加到堆栈,然后输入一个函数来添加另一个项目。问题是每次执行它都会有奇怪的行为。
函数如下:
.section .data
.section .text
.globl _start
_start:
# Push
push
# Function call
call pfun
movq , %rax
syscall
.type pfun, @function
pfun:
# Push
push
# Return
ret
一点都不复杂,但会失败并给出分段错误,如果您尝试调试它,您会发现错误发生在程序进入函数内部时,但它不会有任何关于它所在位置的信息。
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000002 in ?? ()
现在,如果您在函数 push 和 运行 之后添加一个 "pop",那么它将成功构建并 运行。但是如果你调试它,你会发现它永远不会使用 "n"(next) 命令进入函数内部。
我搜索了一个答案,但没有找到任何与 ASM 相似的答案。最近开始学习 ASM,对我来说它看起来非常好,所以真的不知道为什么会这样。
您的问题在这里:
pfun:
push
ret
我认为您没有正确理解 call/ret
。您的功能等同于 jmp 2
并且总是在下午触发异常。
call
等同于 push (r)eip and then jmp
而 ret
是 pop (r)eip
。在 call/function 中,您需要 pop
您在此处推送的所有内容或 add (r)esp,0x??
我有一个小程序,它只是将一个项目添加到堆栈,然后输入一个函数来添加另一个项目。问题是每次执行它都会有奇怪的行为。
函数如下:
.section .data
.section .text
.globl _start
_start:
# Push
push
# Function call
call pfun
movq , %rax
syscall
.type pfun, @function
pfun:
# Push
push
# Return
ret
一点都不复杂,但会失败并给出分段错误,如果您尝试调试它,您会发现错误发生在程序进入函数内部时,但它不会有任何关于它所在位置的信息。
Program received signal SIGSEGV, Segmentation fault. 0x0000000000000002 in ?? ()
现在,如果您在函数 push 和 运行 之后添加一个 "pop",那么它将成功构建并 运行。但是如果你调试它,你会发现它永远不会使用 "n"(next) 命令进入函数内部。
我搜索了一个答案,但没有找到任何与 ASM 相似的答案。最近开始学习 ASM,对我来说它看起来非常好,所以真的不知道为什么会这样。
您的问题在这里:
pfun:
push
ret
我认为您没有正确理解 call/ret
。您的功能等同于 jmp 2
并且总是在下午触发异常。
call
等同于 push (r)eip and then jmp
而 ret
是 pop (r)eip
。在 call/function 中,您需要 pop
您在此处推送的所有内容或 add (r)esp,0x??