Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 无法使用nasm编译具有xmmword操作数大小的汇编代码_Assembly_Nasm_Sse_128 Bit - Fatal编程技术网

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
    movq[rdi],xmm0
    存储qword low半段
  • SSE1
    movhps[rdi],xmm0
    存储高qword
  • AVX1
    vextractf128[rdi],ymm0,1
    对高半部分进行128位存储
  • AVX2
    vpmovzxbw ymm0,[rdi]
    从128位内存源操作数进行压缩字节->字零扩展
  • AVX-512F将dword元素缩小为字节元素(使用截断;其他版本使用饱和),并进行128位存储,以字节粒度进行掩蔽。(除了传统的SSE
    maskmovdqu
    具有缓存逐出NT语义之外,在没有AVX-512BW的情况下进行字节粒度掩蔽的唯一方法之一。因此我想这对Xeon Phi KNL来说尤其有趣。)

您可以在其中任何一个上指定
oword
,以确保内存访问的大小是您认为的大小。(即让NASM为您检查。)

这解释并解决了我的问题。非常感谢您的补充解释。