1

私はアセンブリに非常に慣れていないため、古い 16 ビット dos ゲームの逆アセンブリ (IDA Free によって生成された逆アセンブリ) を理解することによって学習しようとしています。

そのコードで読んだことが2つありますが、それが何をしているのか推測できます。それにもかかわらず、私が正しいかどうかはよくわからないので、確認したかったのです(ところで、ここのコード例を短縮しただけです):

1)

lds di, some_adress ; (eg: ds = 0012h, di=BAF6h afterwards)
xor cx, cx
mov [di], cx ; <- what segment is used here

dsオフセットを適用して物理アドレスを計算するために、魔法のデフォルトセグメントとして使用していると思います。

2)

assume ds:dseg (e.g. 0012h)
mov ax, 0BAF6h ; <- why is the leading 0 here btw
push ds
push ax

だから私のスタックは次のようになっています:

...  ...
02   ds (0012)
00   ax (BAF6)  <- sp

それから:

mox bx, sp
les di, ss:[bx]

レジスタはes=0012hdi=BAF6hになっていると思いますが、残りのゲーム コードを見ると理にかなっていますが、私のスタックは のように見えるのでBAF6 0012 ...、これは最初の単語が に入れられdi、2 番目の単語が に入れられることを意味しesます。(私の観点からすると) 2 つの単語の順序が逆になっているので、これは少し混乱します。

4

1 に答える 1

1
  1. ds[bp+immediate][bp+si+immediate]およびを除く他のすべての 16 ビット メモリ アドレッシング モードのデフォルト セグメントです[bp+di+immediate]。基本的に、bp間接アドレッシングで使用しない限り、デフォルトのセグメントはds. 間接アドレッシングで使用する場合bp、デフォルトのセグメントはss.

  2. 16 進数の先行ゼロは、16 進数をシンボルから分離するために多くの逆アセンブラーおよびアセンブラー構文で使用される規則です (他の一部の逆アセンブラーおよびアセンブラーは、0x代わりに を使用します0)。先行ゼロは数値の数値に影響を与えず、すべての数値システム (2 進数、10 進数、16 進数など) で同じです。

ご想像のとおり、最初の単語を and にロードし、2 番目の単語を にロードするため、次のようになります。lesdi, ss:[bx]dies

mov di,ss:[bx]
mov es,ss:[bx+2]
于 2013-03-14T18:28:18.583 に答える