为什么我的程序集使用“+”和“*”符号而不是计算地址的指令?

时间:2014-05-14 15:59:33

标签: assembly x86 x86-64

我有这个集会:

movzx eax, r8w
add r8d, 0x4
movzx edx, r8w
cmp edx, 0x1f4
movdqu xmm3, xmmword ptr [r9+rax*4+0xfb0]   ; Why "+" instead of ADD asm??
movdqu xmm1, xmmword ptr [r11+rax*4]        ; ??
movdqu xmm4, xmmword ptr [r10+rax*4]        ; ??

为什么显示“+”和“*”运算符而不是添加和乘法ASM指令来计算地址?当然,汇编的目的是将C ++完全分解为x86指令吗?

1 个答案:

答案 0 :(得分:1)

问题的第一部分(为什么这不是ADD指令)和第二部分(*)具有相同的答案。这里的指令试图使用寄存器来形成索引。这允许对内存进行索引访问,并且在访问内存中定义的逻辑数组时非常有用。

两个要点 - 被乘数不能是任意值,它必须是1,2,4或8中的一个 - 这限制了直接数组访问仅限于最多64位(qword)大小的元素。如果允许16或32,则可以使用xmmword或ymmword的直接存储器阵列。即使在本机64位代码中,可以使用的立即偏移量也限制为最大32位长数 - 尽管通常情况下,这不应该导致太多问题。

第二点是这种加法发生得比通常基于指令的加法快得多 - 所以像

这样的指令序列
shl rbx,1
mov rax, qword ptr [rsi+rbx]

明显慢于

mov rax,qword ptr [rsi+2*rbx]