6

Linux 汇编教程指出:

有一件非常重要的事情要记住:如果你打算从一个过程中返回(使用 RET 指令),不要跳到它!如“从不!” 这样做会在 Linux 上导致分段错误(这没关系——你的程序所做的只是终止),但在 DOS 中它可能会以不同程度的可怕程度在你的脸上爆炸。

但我不明白为什么它会导致分段错误。这听起来就像从一个函数返回。

我有一种情况需要实现“如果发生 X,则调用过程 A。否则,调用过程 B”的逻辑。除了像袋鼠编织意大利面条码一样跳来跳去还有什么别的办法吗?

4

2 回答 2

10

因为CALL将当前指令地址压入堆栈,然后RET将其拉出以返回调用站点。 JMP(和相关说明)不要将任何东西压入堆栈。

于 2012-03-23T23:26:12.170 回答
-1

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

我相信你要问的问题是:

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

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

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

于 2012-03-23T23:34:05.393 回答