我有这个集会:
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指令吗?
答案 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]