x64和SSE中mov宽度的语义

时间:2015-02-09 09:19:18

标签: assembly 64-bit sse freepascal

here考虑​​以下内容:

  

mov BYTE PTR [ebx],2;将2移动到存储在EBX中的地址的单个字节中。

     

mov WORD PTR [ebx],2;将16位整数表示形式2移动到从EBX中的地址开始的2个字节中。

     

mov DWORD PTR [ebx],2;将32位整数表示形式2移动到从EBX中的地址开始的4个字节中。

显然,我们正在定义要移动的数据的宽度。

现在考虑一下:

movdqu        qword ptr [rcx], xmm0

这是128位,但我们不会写movdqu dqword。实际上,movdqu dword ptr会产生相同的结果。

为什么语义会随SSE操作而改变?

2 个答案:

答案 0 :(得分:1)

使用MASM(32位,但是)这两行作为错误被拒绝。

movdqu        qword ptr [ecx], xmm0
movdqu        [ecx], xmm0             ; standard prefix DWORD
...
test.asm(121) : error A2022:instruction operands must be the same size

接受这两个:

movdqu oword ptr [ecx], xmm0    ; explicit 128bit
movdqu xmmword ptr [ecx], xmm0  ; explicit 128bit

因此前缀是必要的,并且大小前缀匹配xmm寄存器的16字节= 128位大小。还有另外两条与MOVZX类似的指令,32位和64位:

movd [ecx], xmm0            ; standard prefix DWORD
movd dword ptr [ecx], xmm0  ; explicit DWORD
movq qword ptr [ecx], xmm0  ; explicit QWORD needed

所以我无法证实语义上的不合理 - 至少对于MASM来说。

答案 1 :(得分:0)

虽然在这种情况下,汇编程序确实可以计算出操作大小,但是如果使用与指令冲突的大小规范,它应该至少提供警告。您忘记提到您使用的汇编程序,但nasm和gas都提供了这样的诊断程序:

nasm: error: impossible combination of address sizes
gas: Error: operand size mismatch for `movdqu'