我试图使用编译汇编代码nasm
(nasm -o file input.asm
)并在以下代码片段的第 2 行抛出错误:
mov rsi, 0x400200
movdqu xmm0,xmmword [rsi]
nop
我不确定是否可以使用 128 位寄存器的指令进行编译nasm
但是在涉及 128 位寄存器的情况下,还有其他方法使用 nasm 进行编译吗?
您不需要指定操作数大小对于内存操作数,
just use movdqu xmm0, [rsi]
并令 xmm0 表示 128 位操作数大小。
NASM 支持 SSE/AVX/AVX-512 指令。
如果您确实想指定操作数大小,则 128 位的名称为oword
, 根据ndisasm
如果您汇编该指令,然后反汇编生成的机器代码。 oword = oct-word = 8x 2 字节字 = 16 字节。
- 字、字和字操作数的大小是多少? https://stackoverflow.com/questions/12063840/what-are-the-sizes-of-tword-oword-and-yword-operands
- QWORD 之后是什么? https://stackoverflow.com/questions/39645078/what-comes-after-qword
请注意,GNU.intel_syntax noprefix
(如所用objdump -drwC -Mintel
) will use xmmword ptr
,与 NASM 不同。
如果你真的想使用xmmword,%define xmmword oword
在你的文件的顶部。
操作数大小是always由所有 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-512Fvpmovdb [rdi]{k1}, zmm2 https://www.felixcloutier.com/x86/vpmovdb:vpmovsdb:vpmovusdb将双字缩小为字节元素(进行截断;其他版本进行饱和)并进行 128 位存储,并以字节粒度进行屏蔽。 (除了传统的 SSE 之外,在没有 AVX-512BW 的情况下进行字节粒度屏蔽的唯一方法之一
maskmovdqu
它具有缓存驱逐 NT 语义。所以我想这对于 Xeon Phi KNL 来说特别有趣。)
You could指定oword
在其中任何一个上,以确保内存访问的大小是您认为的大小。 (即让 NASM 为您检查。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)