如果在没有调用的情况下使用 ret 会发生什么?

Pwe*_*elb 0 assembly avr

我对组装很陌生,我想知道 ret 的行为。如果我在代码过程中从不使用调用,而是在最后放了一个 ret,那么代码就会回到开头。当没有使用呼叫时,这是默认行为吗?如果我使用 jmp,如果仍然没有使用调用,这会影响 ret 的行为吗?

Cod*_*der 6

call 将下一条指令的地址放入调用堆栈,然后跳转到目标地址。

ret从调用栈中弹出最后一个地址,然后跳转到这里。好像栈是空的就返回0x00000000,然后跳转到程序的开头。 至少在某些系统中。由于地址空间冲突,您不应该使用它。

jmp没有效果调用堆栈上的,所以它不会改变的行为ret

编辑:正如@PeterCordes 所写;如果您使用pushor pop,他们可以写入堆栈内存,并且ret会弹出它。

  • 如果您在“ret”之前使用其他指令(例如“push”),它将弹出您推送的任何内容。“call”并不是唯一可以写入堆栈内存的指令。`ret` 基本上只是弹出指令指针。 (2认同)
  • 顺便说一句,如果您有兴趣超越当前的处理器:虽然 AVR 和 x86 以及许多其他处理器返回到从堆栈获取的返回地址,但也有一些处理器返回到从特殊寄存器获取的返回地址。 (2认同)