0

我对寻址模式有点困惑。

 array1 DWORD 200 DUP(?)

如果我有这个声明:

mov EAX, [EBX + EDI + 10]

EBX 是基数,EDI 是索引,+10 是说向 EDI 添加十个字节?那么,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

这会将数字 100 放入从索引零开始 4 字节大的数组中?那么,索引[0] = 100,索引[1]= 101,索引[2]= 102?

谢谢

4

1 回答 1

2
mov EAX, [EBX + EDI + 10]

取值 inEBX和 in 相加EDI并加 10,然后将此结果作为地址将 32 位值加载到EAX.

mov EAX, [EBX + EDI * 4]

取 in 的值并将 in 的值EBX加 4 倍EDI,然后将结果作为地址将 32 位值加载到EAX.

最后一个存储从 100 开始的递减数字序列到从 开始的内存位置array1ECX每次loop指令执行时递减,直到达到 0。每个递增值ECX存储的地址是array1加 4 倍ESI,在每次迭代时递增。

于 2012-07-19T21:25:02.353 回答