Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x64和SSE中mov宽度的语义_Assembly_64 Bit_Sse_Freepascal - Fatal编程技术网

Assembly x64和SSE中mov宽度的语义

Assembly x64和SSE中mov宽度的语义,assembly,64-bit,sse,freepascal,Assembly,64 Bit,Sse,Freepascal,从以下方面考虑: mov字节PTR[ebx],2;将2移到EBX中存储地址处的单个字节中 mov字PTR[ebx],2;将2的16位整数表示形式移动到2个字节中,从EBX中的地址开始 mov-DWORD-PTR[ebx],2;将2的32位整数表示形式移动到4个字节中,从EBX中的地址开始 显然,我们正在定义要移动的数据的宽度 现在考虑一下: movdqu qword ptr [rcx], xmm0 这是移动128位,但我们不写movdqdqword。事实上,movdqu-dwor

从以下方面考虑:

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

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

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

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

现在考虑一下:

movdqu        qword ptr [rcx], xmm0
这是移动128位,但我们不写
movdqdqword
。事实上,
movdqu-dword ptr
产生了相同的结果


为什么SSE op的语义会发生变化?

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

nasm: error: impossible combination of address sizes
gas: Error: operand size mismatch for `movdqu'
对于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中是如此。

汇编程序不需要任何帮助来确定大小,只需完全删除qword ptr。好的,这纯粹是为了帮助编译器,这里显然不需要。请作为答案发布。我正在使用免费的Pascal,它不会给出警告。然而,我问的是尺寸背后的含义,汉斯简洁地回答。