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, c
b ループ内のステートメントで単純に上位バイトと下位バイトを交換すると、これは正しいように見えます。そう:
私は間違っていますか (もしそうなら、なぜですか?)、または b ループ定数の上位/下位バイトを交換する必要がありますか?