{[V + ECX * 2-2]”在内存中到底指什么?

时间:2019-08-16 09:50:08

标签: x86 nasm addressing-mode

因此,我有一个练习可以解决:“给定x个16位整数的向量V,检查该向量是否仅包含偶数。如果是这种情况,则EAX等于1,否则为0。x保存在地址n并具有16位。这是解决方案:

    MOVZX ECX, WORD [n]
    XOR EAX, EAX
bcle:
    TEST WORD [V+ECX*2-2], 1
    LOOPZ bcle
    JNZ sinon
    INC EAX
sinon:

现在我被困在[V + ECX * 2-2]……也许我错了,但是我相信ECX寄存器此时包含一个数字,我们正在检查它的偶数与否……以及是否多数民众赞成在这种情况下,为什么我们要在内存中寻找该地址?我曾在许多网站和书中查询过内存寻址的工作原理,但我永远都不会申请练习,也许有人可以通过一个简单的例子向我解释一下,我将不胜感激...

1 个答案:

答案 0 :(得分:2)

ECX此处包含V数组中当前数字的索引(更准确地说是索引+1),而不是数字本身。它的索引为+1,因为ECX是在n中用n-1初始化的(如在基于1的数组中,而不是MOVZX ECX, WORD [n]如在基于0的数组中)。 >

[V+ECX*2-2]-正在计算由ECX索引的数字的地址:

  • V-是数组的地址
  • ECX*2-是对数组内存中第ECX个元素*2的偏移量的计算,因为我们要处理2个字节的数字(16位)< / li>
  • -2-是将基于1的数组索引更改为基于0的数组索引,因为偏移必须基于0,因此再次-2,因为我们使用2字节数字
  • [...]-通过括号内的地址获取值
  • WORD-取2个字节的值

值得一提的是,允许V+...-2是因为V-是一个编译时间常量,因此编译器可以将V-2计算为另一个常量并将其放入已编译的二进制文件中。如果V是动态值,则[V+...-2]将不适合单个指令,并且地址需要单独计算。