この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 15003|答える: 0

[分解] アセンブリコマンドJMPの使用に関する詳細な説明

[リンクをコピー]
掲載地 2014/11/03 23:32:49 | | |
アセンブリ言語を学んでいるときに次のコードに出会ったとき、私は単にこのプログラムが普通に終わるはずがないと思いました。 しかし、デバッグによるシングルステップトラッキングの結果、プログラムは通常通り終了できることが判明し、奇妙な現象が起きました。コード:0005からコード:0014へ実行を始めると、jmpコマンドでコード:0008にジャンプし続けたのです。 しかし、ステップフォワードを続けると、プログラムはコード:0018ではなく直接コード:0(すなわちS1セグメント)にジャンプします。 最初は何が起きているのか理解できませんでしたが、何度も一歩ずつ観察した後でも、やはり変な感じがしました。 教科書[1]でJMP命令の使用を注意深く研究し、その後機械語と組み合わせてプログラムを分析した結果、JMP命令について新たな理解を得ることができました。

アセンブルコードアドレスオフセット(IP)機械命令  

CS:code(ユニット:H)を仮定します。

コードセグメント

        mov ax, 4c00h 0000 B8004C   

        国際 21時間0003 CD21

start:  mov ax,0            0005         B80000

    S: NOP 0008 90

        NOP 0009 90

        mov di, offset s 000A BF0800

        mov si, offset s2 000D BE2000        

        mov ax,cs:[si] CS:0020=F6EB

        mov cs:[di],ax CS:0008=9090

    s0: JMP ショート S 0016 EBF0

    S1: MOV AX,0 0018 B80000

        インターン 21時間001B CD21

        mov ax,0 001D B80000

    s2:JMPショートS1 0020 EBF6

        NOP 0022 90

コード終了

終了

1. 以下の2つのポイントを明確に理解する必要があります
1. CPU命令の実行プロセスは以下の通りです:
<1>。CS:IPが指し示したメモリユニットから命令を読み込み、命令バッファに入れます。
<2>. IP=IP+現在バッファに読み込まれている命令の長さ、すなわちIPが次の命令を指す長さです。
<3>。バッファ内の現在のコマンドを実行します。 ステップ<1に進みましょう>
2. 内部セグメントを転送するためのjmpショートコマンドの意味
<1>. IPはオフセット、すなわちIP = 指定子のアドレス、すなわちjmpコマンドの直後の最初のバイトのアドレスです。
<2>。このコマンドの関数はIPの値を修正し、コマンドを実行した後、IP = IP + 8ビットオフセットにすることです。
<3ビット>8ビットの変位範囲は-128~127で、オフセットは補数[2]の形で表されます。
2. 符号解析
1. ステップ1:プログラムは入口開始(コード:0005)から実行を開始します。コード:0013~0014文が実行されると、文jmpショートS1の機械語がラベルS2でコード:0008にコピーされ、IPは0016となります。 この時点で、jmp short s命令が存在しない場合、プログラムはs2:jmp short s1に実行され、命令バッファにJMPショートs1を読み込みIP=0022を行います。そしてs2からs1への転送はセグメント内転送であり、機械語形式はEB disp、disp=指定s1-指定s2=(00018-0022)補完=F6なので、命令JMPショートs1の機械語はEBF6であるべきです。 したがって、EBF6はコード:0008~code:0009ユニットにコピーされます。
ステップ2:命令JMPショートs(EBF0)を命令バッファに読み込む。
IP=IP+0002=0018;s-指定の補碼はs0=(0008-0018) = F0であり、s0からsへの転送はセグメント内転送であり、機械語形式はEBディスップ(すなわちEBF0)です。
3. ステップ3:コマンド jmp ショート s(EBF0)は、命令 EBF0 を実行した後、IPを修正するコマンドです。命令 は IP=IP+(指定 s-指定 s0)=0008(コード:0008 ユニットを指し示します)。
4. ステップ4:ユニットコード:0008の内容を読みます。 コマンドJMPショートs1(EBF6)はs2のコード:0008~code:0009ユニットにコピーされるため、ユニットの内容を読み取るとIP=IP+0002=000A
5. ステップ5:命令JMPショートs1(EBF6)は、命令EBF6を実行した後、IP=IP+(s1-s2指定)=0000(コード:0000ユニット)を指し示した後にIPを修正するコマンドです。
6. ステップ6:プログラムはコード:0000に進み、通常終了が完了します。
3. 追伸
このコードを正しく分析する:CPU命令の実行プロセスやJMPショートを理解する必要がありますか? (IP修正によって計算されます)。 さらに、オフセット計算結果の補数コードも鍵となります。 この一見異常なコードを分析した後、アセンブリ内のJMP命令をより深く理解することができました。





先の:シングルズデー「シムカップル」イベント
次に:Javaで抽象を詳細に使う方法
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com