我有一个小程序,只是将一个项目添加到堆栈中,然后输入一个函数来添加另一个。问题在于,每次执行它时,它的行为都会很奇怪。
功能如下:
.section .data
.section .text
.globl _start
_start:
# Push
push $1
# Function call
call pfun
movq $60, %rax
syscall
.type pfun, @function
pfun:
# Push
push $2
# Return
ret
一点也不复杂,但是不会出现分段错误,如果您尝试对其进行调试,则会发现该错误在程序进入函数内部时发生,但没有任何有关其位置的信息。
程序收到信号SIGSEGV,分段错误。 0x0000000000000002 in ?? ()
现在,如果在函数推入并运行后添加“ pop”,则它将成功构建并运行。但是,如果您对其进行调试,则将看到它永远不会使用“ n”(next)命令进入函数。
我一直在寻找答案,但根本没有找到与ASM类似的东西。最近开始学习ASM,对我来说,它看起来非常不错,所以真的不知道为什么会发生这种情况。
答案 0 :(得分:2)
您的问题在这里:
pfun:
push $2
ret
我认为您不能正确理解call/ret
。您的函数与jmp 2
等效,并且总是在pm中触发异常。
call
与push (r)eip and then jmp
类似,而ret
是pop (r)eip
。在通话/功能中,您需要pop
此处或add (r)esp,0x??