スクリーンショットに基づいて、コードは次のようです ( で埋められnop
、 で逆アセンブルされていudcli
ます):
エコー 40 e8 fc 00 01 00 e8 f7 00 e8 f4 ff x{1..244} 43 c3 | sed 's/x[0-9]*\>/90/g' | udcli -o 0x100 -x -16
0000000000000100 40インチ斧
0000000000000101 e8fc00 コールワード 0x200
0000000000000104 0100 add [bx+si], ax
0000000000000106 e8f700 コールワード 0x200
0000000000000109 e8f4ff コールワード 0x100
000000000000010c *** 到達していません ***
0000000000000200 43インクbx
0000000000000201 c3 ret
コード フローは次のとおりです。
0000000000000100 40インチ斧
ax
インクリメントされます。
0000000000000101 e8fc00 コールワード 0x200
戻りアドレス 0x104 がスタックにプッシュされ、ip
(命令ポインタ) が 0x200 に設定されます。
0000000000000200 43インクbx
bx
インクリメントされます。
0000000000000201 c3 ret
つまり、ip
スタックからポップされます。新規ip
は 0x104 になります。
0000000000000104 0100 add [bx+si], ax
の値がax
単語値 at に追加され[bx+si]
ます。
0000000000000106 e8f700 コールワード 0x200
戻りアドレス 0x109 がスタックにプッシュされ、ip
(命令ポインタ) が 0x200 に設定されます。
0000000000000200 43インクbx
bx
インクリメントされます。
0000000000000201 c3 ret
つまり、ip
スタックからポップされます。新規ip
は 0x109 になります。
0000000000000109 e8f4ff コールワード 0x100
戻りアドレス 0x10c がスタックにプッシュされ、ip
(命令ポインタ) が 0x100 に設定されます。したがって、これは実際には無限再帰関数であり、スタックが不足します。
したがって、問題は、 の後にコードを定義しないことですCALL 0200
。たまたま01 00
( add [bx+si], ax
) があり、return 後に実行され、その後に他の未定義命令が実行されます。
私のアドバイス: まともなアセンブラ (NASM、YASM、FASM...) をできるだけ早くダウンロードし、DEBUG でアセンブリ コードを書こうとして人生を台無しにしないでください。DEBUG を使用してアセンブリ プログラムを作成しようとすると、失敗する運命にあります。