Assembly 无法使用nasm编译具有xmmword操作数大小的汇编代码
我试图使用Assembly 无法使用nasm编译具有xmmword操作数大小的汇编代码,assembly,nasm,sse,128-bit,Assembly,Nasm,Sse,128 Bit,我试图使用nasm(nasm-o file input.asm)编译汇编代码,并在以下代码段的第2行抛出了一个错误: mov rsi, 0x400200 movdqu xmm0,xmmword [rsi] nop 我不确定是否可以使用nasm编译带有128位寄存器的指令,但在涉及128位寄存器的情况下,是否有其他方法可以使用nasm编译?您不需要为内存操作数指定操作数大小, 只需使用movdqu xmm0,[rsi]并让xmm0表示128位操作数大小。 NASM支持SSE/AVX/AVX-51
nasm
(nasm-o file input.asm
)编译汇编代码,并在以下代码段的第2行抛出了一个错误:
mov rsi, 0x400200
movdqu xmm0,xmmword [rsi]
nop
我不确定是否可以使用nasm编译带有128位寄存器的指令,但在涉及128位寄存器的情况下,是否有其他方法可以使用nasm编译?您不需要为内存操作数指定操作数大小,
只需使用
movdqu xmm0,[rsi]
并让xmm0表示128位操作数大小。NASM支持SSE/AVX/AVX-512指令 如果确实要指定操作数大小,则128位的名称为
oword
,根据ndisam
,前提是汇编该指令,然后反汇编生成的机器代码。oword=oct字=8x 2字节字=16字节
请注意,GNU
.intel\u语法noprefix
(由objdump-drwC-Mintel
使用)将使用xmmword ptr
,与NASM不同
如果确实要使用xmmword,请在文件顶部定义xmmword oword
所有SSE/AVX/AVX-512指令的助记符和/或其他寄存器操作数始终暗示操作数大小;我想不出任何指令需要指定qword
vs.oword
vs.yword
或任何东西,就像您使用movsx eax,byte[rdi]
vs.word[rdi]
所做的那样。通常它与寄存器的大小相同,但也有一些无序/插入/提取指令的例外。例如:
- SSE2
加载一个pinsrw xmm0[rdi],3
,并将其合并到xmm0的字节6和7中字
- SSE2
存储qword low半段movq[rdi],xmm0
- SSE1
存储高qwordmovhps[rdi],xmm0
- AVX1
对高半部分进行128位存储vextractf128[rdi],ymm0,1
- AVX2
从128位内存源操作数进行压缩字节->字零扩展vpmovzxbw ymm0,[rdi]
- AVX-512F将dword元素缩小为字节元素(使用截断;其他版本使用饱和),并进行128位存储,以字节粒度进行掩蔽。(除了传统的SSE
具有缓存逐出NT语义之外,在没有AVX-512BW的情况下进行字节粒度掩蔽的唯一方法之一。因此我想这对Xeon Phi KNL来说尤其有趣。)maskmovdqu
您可以在其中任何一个上指定
oword
,以确保内存访问的大小是您认为的大小。(即让NASM为您检查。)这解释并解决了我的问题。非常感谢您的补充解释。