assembly x64和SSE中mov宽度的语义

a7qyws3x  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(125)

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操作的语义会发生变化?

w1e3prcc

w1e3prcc1#

对于MASM(32位,但是),这两条线作为错误被拒绝。

movdqu        qword ptr [ecx], xmm0
movdqu        [ecx], xmm0             
...
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            
movd dword ptr [ecx], xmm0  ; explicit DWORD
movq qword ptr [ecx], xmm0  ; explicit QWORD needed

因此,我无法确认语义上的不一致性-至少与MASM。

xxhby3vn

xxhby3vn2#

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

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

相关问题