0

アドレッシングモードで少し混乱しています。

 array1 DWORD 200 DUP(?)

私がこの声明を持っている場合:

mov EAX, [EBX + EDI + 10]

EBXがベース、EDIがインデックス、+ 10はEDIにさらに10バイトを追加すると言っていますか?それで、EDIは14バイトの長さを返しますか?住所を返してEAXに入れますか?

同様に、

mov EAX, [EBX + EDI * 4]

これは、配列内のどのインデックスでも、4バイトの長さを返すということですか?配列はインデックスごとに4バイトの長さなので、正しいですか?私は*4が何をするのか理解していないと思います!

更に、

  mov ECX, 100 ; loop counter
  mov ESI, 0

  top1:

  mov [array1 + ESI * 4], ECX

  inc ESI

  loop top1

これは、4バイトの大きさのインデックス0から始まる配列に数値100を入れることになるでしょうか?つまり、index [0] = 100、index [1] = 101、index [2] = 102?

ありがとうございました

4

1 に答える 1

2
mov EAX, [EBX + EDI + 10]

に値を取り、に値をEBX追加してEDI10を追加し、この結果をアドレスとして使用して、32ビット値をにロードしますEAX

mov EAX, [EBX + EDI * 4]

の値を取得し、EBXの値の4倍に加算してからEDI、その結果をアドレスとして使用して、32ビット値をにロードしますEAX

最後の1つは、100から始まる番号の減少シーケンスを、から始まるメモリ位置に格納しarray1ます。ECXは、命令が実行されるたびに、loop0に達するまでデクリメントされます。各プログレッシブ値ECXが格納されるアドレスは、array1プラス4倍ESIであり、反復ごとにインクリメントされます。

于 2012-07-19T21:25:02.353 に答える