从here考虑以下内容:
mov BYTE PTR [ebx],2 ;将2移动到EBX中存储的地址处的单个字节中。
mov WORD PTR [ebx],2 ;将表示2的16位整数移动到EBX中从地址开始的2个字节中。
mov DWORD PTR [ebx],2 ;从EBX中的地址开始,将2的32位整数表示移到4个字节中。
显然,我们正在定义要移动的数据的宽度。
现在考虑一下:
movdqu qword ptr [rcx], xmm0
这是移动128位,但我们不写movdqu dqword
。实际上,movdqu dword ptr
产生相同的结果。
为什么SSE操作的语义会发生变化?
2条答案
按热度按时间w1e3prcc1#
对于MASM(32位,但是),这两条线作为错误被拒绝。
这两个被接受:
所以前缀是必要的,大小前缀匹配xmm寄存器的16字节=128位大小。还有两个类似于MOVZX的其他指令,32位和64位:
因此,我无法确认语义上的不一致性-至少与MASM。
xxhby3vn2#
虽然在这种情况下汇编器确实可以计算出操作的大小,但是如果你使用的大小规范与指令冲突,它至少应该提供一个警告。你忘记提到你使用的是哪个汇编器,但是nasm和gas都提供这样的诊断: