因此,我有一个练习要解决:“给定向量V为x 16位整数,检查向量是否只包含偶数。如果是这样,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登记册目前包含一个数字,我们正在检查它是否偶数.如果是这样,我们为什么要在记忆中寻找那个地址呢?我在许多网站和书籍上查过记忆寻址是如何工作的,但我永远不能申请练习,也许这里的人能用一个简单的例子向我解释一下,我会很感激的…
发布于 2019-08-16 10:08:21
这里的ECX包含V数组中当前数字的索引(更准确地说是index+1),而不是数字本身。它是index+1,因为ECX是在MOVZX ECX, WORD [n]中用n初始化的(如基于1的数组,而不是以0为基础的数组中的n-1 )。
[V+ECX*2-2] -正在计算由ECX索引的数字的地址:
V -是数组的地址,ECX*2 -是计算数组内存中的ECX'th元素*2的偏移量,因为我们处理的是2字节数字(16位)。-2 -是将基于1的数组索引更改为基于0的数组索引,因为偏移量必须是基于0的,同样是-2,因为我们使用的是2字节的数字。[...] -由括号内的地址取值。WORD -接受一个2字节的值值得注意的是,允许使用V+...-2,因为V -是编译时间常数,因此编译器可以将V-2作为另一个常量计算,并将其放入编译后的二进制文件中。如果V是一个动态值,则[V+...-2]将不适合于单个指令,并且需要单独计算地址。
https://stackoverflow.com/questions/57522488
复制相似问题