1

Art of Assembly のセクション3.6.7 Self Modification Code Exercisesを手作業で実行しようとしていますが、上位/下位のバイト インターリーブで何か非常に間違ったことをしていると思わずにはいられません (著者がどのように架空の x86 バリアントに対してこれを行います)、またはテキストにエラーがあることを確認します。

つまり、本文中のプログラムは

   sub  ax, ax
   mov  [100], ax

a: mov  ax, [100]
   cmp  ax, 0
   je   b
   halt

b: mov  ax, 00c6
   mov [100], ax
   mov  ax, 0710
   mov [102], ax
   mov  ax, a6a0
   mov [104], ax
   mov  ax, 1000
   mov [106], ax
   mov  ax, 8007
   mov [108], ax
   mov  ax, 00e6
   mov [10a], ax
   mov  ax, 0e10
   mov [10c], ax
   mov  ax, 4
   mov [10e], ax
   jmp 100

おそらく「次のコードを100番地に書き込んで実行する」

   mov  ax, [1000]
   put
   add  ax, ax
   add  ax, [1000]
   put
   sub  ax, ax
   mov [1000], ax
   jmp 0004  

ただし、これはいくつかの理由で私には意味がありません (まず、バイト 100 に 00 を書き込みます。これは、ジャンプ先と思われる不正な命令です。次に、アドレスの上位/下位バイトが一方、mov ax, cb ループ内のステートメントで単純に上位バイトと下位バイトを交換すると、これは正しいように見えます。そう:

私は間違っていますか (もしそうなら、なぜですか?)、または b ループ定数の上位/下位バイトを交換する必要がありますか?

4

1 に答える 1

2

x86プロセッサは「リトルエンディアン」であるため、アドレス100に00は格納されません。00c6を単語として保存すると、c6が最初に保存されます。

一方、自己修正コードは古くから時代遅れです。最近のプロセッサでは、コードセグメントに書き込むことも、データを実行することもできません(少なくとも、膨大な数のループをジャンプすることなく)。もう1つの問題は、命令キャッシュが、変更するずっと前に変更されていないコードをロードしている可能性があることです。

古いコードを実行するリスクがあるか、パフォーマンスに多大な影響を与えるすべてのキャッシュをフラッシュする必要があります。要するに、自己修正コードはそれだけの価値がありません。1980年代初頭のPC/XT以来使用していません。

本の章を飛ばしてみませんか?

于 2012-09-13T20:29:06.377 に答える