因此,我有一个练习可以解决:“给定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寄存器此时包含一个数字,我们正在检查它的偶数与否……以及是否多数民众赞成在这种情况下,为什么我们要在内存中寻找该地址?我曾在许多网站和书中查询过内存寻址的工作原理,但我永远都不会申请练习,也许有人可以通过一个简单的例子向我解释一下,我将不胜感激...
答案 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]
将不适合单个指令,并且地址需要单独计算。