Linux Assembly Tutorial状態:アセンブリ:retを介して返されるラベルにジャンプすると、セグメンテーションフォルトが発生するのはなぜですか?
覚えておくべき1つの非常に重要なことがあります:あなたは(RET命令で)手続きから復帰することを計画している場合は、それにジャンプしないでください! 「決して!」のようにそうすることで、Linux上でセグメンテーション違反が発生します(これは問題ありません。すべてのプログラムが終了します)。しかしDOSでは、さまざまな程度の恐怖であなたの顔に爆発する可能性があります。
しかし、私ははそれがセグメンテーションフォールトが発生しない理由を理解することはできません。それはちょうど関数から戻るのと同じように聞こえる。
「Xが発生した場合は、手順Aを呼び出してください」というロジックを実装する必要がある状況があります。それ以外の場合は手順Bを呼び出します。カンガルーのようなスパゲッティコードのように飛び回る以外の方法はありますか?
ちょうど注意してください:あなたがこれを行うことを特に妨げるものは何もありませんが、新しいアセンブリプログラマにとっては必ずしもそのことが明らかではありません。これの最も一般的なケースは「テールコール」と呼ばれ、関数型言語では一般的です。その効果はジャンプを含む関数の呼び出し元に戻ります(その関数の残りの部分をバイパスします)。*あなたがスタックの少しの部分をきれいにした場合。もしあなたがそうでなければ、それはセグメンテーションを見るときです。 – cHao
'jmp'と' call'の違いを理解してください。 – hirschhornsalz