无法使用 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 为您检查。)
我试图使用 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-SSEmaskmovdqu
具有缓存逐出 NT 语义。所以我想这对 Xeon Phi KNL 来说特别有趣。)
您 可以 在其中任何一个上指定 oword
以确保内存访问的大小与您认为的一样。 (即让 NASM 为您检查。)