汇编:为什么跳转到通过ret返回的标签会导致分段错误?

时间:2012-03-23 23:22:35

标签: linux assembly nasm yasm

Linux Assembly Tutorial州:

  

有一件非常重要的事情需要记住:如果您打算从程序返回(使用RET指令),请不要跳转到它!就像“从来没有!”这样做会导致Linux上的分段错误(这是正常的 - 所有程序都会终止),但在DOS中,它可能会因为各种程度的可怕而在您面前爆炸。

但我无法理解为什么会导致分段错误。听起来就像从函数返回一样。

我遇到需要实现逻辑的情况“如果X发生,请调用程序A.否则,调用程序B.”除了袋鼠编织意大利面条代码之外还有其他方式吗?

2 个答案:

答案 0 :(得分:9)

因为CALL将当前指令地址压入堆栈,并且RET将其拉出以便返回到呼叫站点。 JMP(及相关说明)不会将任何内容压入堆栈。

答案 1 :(得分:-1)

我认为这个建议可能与管道有关,但我不确定。

我相信你提出的问题是:

... subroutine entrypoint ...
... various instructions in a routine ...
jmp label
... move instructions in a routine...
label:
ret

问题是什么,如果有的话,有这个吗?首先,我不确定这是一个问题。但如果是,那就是管道。在某些处理器上,在控制移动到标签之前,将执行 jmp之后的一条或多条指令

大多数情况下,我担心你误解了你所读到的内容,或者我误解了你所写的内容。从子程序中的一个点到ret指令的jmp-ing应该没问题。正如其他人所指出的那样,jmp-ing而不是执行ret是一个愚蠢的想法。