无法使用 nasm 使用 xmmword 操作数大小编译汇编代码

Unable to compile assembly code with xmmword operand-size using nasm

我试图使用 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,根据 ndisasm 如果你 assemble 该指令然后 disassemble 生成的机器码。 oword = oct-word = 8x 2 字节字 = 16 字节。

  • What are the sizes of tword, oword and yword operands?

请注意,GNU .intel_syntax noprefix(由 objdump -drwC -Mintel 使用) 使用 xmmword ptr,与 NASM 不同。

如果你真的想使用 xmmword,%define xmmword oword 在你的文件的顶部。

操作数大小始终由所有SSE/AVX/AVX-512指令的助记符和/或其他寄存器操作数隐含;我想不出任何你需要指定 qword vs. oword vs. yword 或任何东西的说明,就像你使用 movsx eax, byte [rdi] vs. word [rdi].通常它与寄存器的大小相同,但有些洗牌/插入/提取指令有例外。例如:

  • SSE2 pinsrw xmm0, [rdi], 3 加载一个 word 并将其合并到 xmm0.
  • 的第 6 和第 7 字节中
  • SSE2 movq [rdi], xmm0 存储 qword 低半
  • SSE1 movhps [rdi], xmm0 存储高位 qword
  • AVX1 vextractf128 [rdi], ymm0, 1 对高半部分进行 128 位存储
  • AVX2 vpmovzxbw ymm0, [rdi] 从 128 位内存源操作数进行压缩字节->字零扩展
  • AVX-512F vpmovdb [rdi]{k1}, zmm2 将双字缩小为字节元素(截断;其他版本进行饱和)并进行 128 位存储,以字节粒度进行屏蔽。 (在没有 AVX-512BW 的情况下进行字节粒度屏蔽的唯一方法之一,除了 legacy-SSE maskmovdqu 具有缓存逐出 NT 语义。所以我想这对 Xeon Phi KNL 来说特别有趣。)

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