“[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,因为 ECX
在 MOVZX 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]
将不适合单个指令,地址需要单独计算。
所以我有这个练习要解决:“给定一个 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,因为 ECX
在 MOVZX 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]
将不适合单个指令,地址需要单独计算。