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

Inv*_*ion 5 linux assembly nasm yasm

Linux程序集教程说明:

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

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

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

Oli*_*rth 9

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