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

What does "[V+ECX*2-2]" refer to in memory exactly?

所以我有这个练习要解决:“给定一个 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 寄存器包含一个数字,我们正在检查它是否为偶数...如果是这样,我们为什么要在内存中寻找该地址?我在很多网站和书籍上查阅了内存寻址的工作原理,但我永远无法应用于练习,也许如果这里有人可以用一个简单的例子向我解释,我将不胜感激...

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

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

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

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