我对组装很陌生,我想知道 ret 的行为。如果我在代码过程中从不使用调用,而是在最后放了一个 ret,那么代码就会回到开头。当没有使用呼叫时,这是默认行为吗?如果我使用 jmp,如果仍然没有使用调用,这会影响 ret 的行为吗?
call 将下一条指令的地址放入调用堆栈,然后跳转到目标地址。
ret从调用栈中弹出最后一个地址,然后跳转到这里。好像栈是空的就返回0x00000000,然后跳转到程序的开头。 至少在某些系统中。由于地址空间冲突,您不应该使用它。
jmp有没有效果调用堆栈上的,所以它不会改变的行为ret。
编辑:正如@PeterCordes 所写;如果您使用pushor pop,他们可以写入堆栈内存,并且ret会弹出它。