|
アセンブリ言語を学んでいるときに次のコードに出会ったとき、私は単にこのプログラムが普通に終わるはずがないと思いました。 しかし、デバッグによるシングルステップトラッキングの結果、プログラムは通常通り終了できることが判明し、奇妙な現象が起きました。コード: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命令をより深く理解することができました。
|