从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操作而改变?
答案 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'