【发布时间】:2019-08-16 09:50:08
【问题描述】:
所以我有这个练习要解决:“给定一个 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 寄存器包含一个数字,我们正在检查它是否偶数...如果那就是为什么我们要在内存中寻找那个地址呢?我在许多网站和书籍上查找了内存寻址的工作原理,但我永远无法应用于练习,也许如果这里有人可以用一个简单的例子向我解释我会很感激......
【问题讨论】:
-
这个循环有很多错过的优化...
test byte [v+ecx*2-2], 1将节省 2 个字节并避免 Intel CPU 上的 LCP 解码停滞。 (test r/m16, imm8不存在,只有 imm16 版本。在 32 位模式下具有 16 位立即数的指令可能会停止,因为操作数大小前缀会更改指令其余部分的长度。)此外,loop是英特尔 CPU 速度慢;将test/jnz作为dec/jnz循环内的循环体确实会更快。但是这个循环无法优化性能或代码大小。此外,索引寻址模式将在 Intel 上解压。 -
另外,如果您的数组是静态的,通常大小可以是汇编时常量,而不是存储在内存中。就像在
V定义之后的n equ $ - V一样。我知道这些都不是你要问的,但是这个优化不完善的循环让我很困扰。
标签: x86 nasm addressing-mode