6

Linuxアセンブリチュートリアルには次のように記載されています。

覚えておくべき非常に重要なことが1つあります。(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の、制御がラベルに移動する前に1つ以上の命令が実行されます。

ほとんどの場合、私はあなたがあなたが読んだものを誤解したか、私があなたが書いたものを誤解したのではないかと恐れています。サブルーチンのあるポイントからret命令へのjmp-ingは問題ないはずです。他の人が指摘しているように、retを実行する代わりにjmp-ingするのはばかげた考えです。

于 2012-03-23T23:34:05.393 に答える