Gok*_*oks 3 assembly sse nasm 128-bit
我试图使用nasm( nasm -o file input.asm) 编译汇编代码,并在以下代码片段的第 2 行抛出错误:
mov rsi, 0x400200
movdqu xmm0,xmmword [rsi]
nop
Run Code Online (Sandbox Code Playgroud)
我不确定是否可以使用 128 位寄存器的指令进行编译nasm,但是在涉及 128 位寄存器的情况下,是否有其他方法可以使用 nasm 进行编译?
您不需要为内存操作数指定操作数大小,
只需使用movdqu xmm0, [rsi]并让 xmm0 表示 128 位操作数大小。
NASM 支持 SSE/AVX/AVX-512 指令。
如果您确实想要指定操作数大小,则 128 位的名称为oword,具体取决于ndisasm您是否汇编该指令,然后反汇编生成的机器代码。oword = oct-word = 8x 2 字节字 = 16 字节。
请注意,与 NASM 不同,GNU .intel_syntax noprefix(由 所使用objdump -drwC -Mintel)将使用xmmword ptr。
如果您确实想使用 xmmword,%define xmmword oword请在文件顶部。
对于所有 SSE/AVX/AVX-512 指令,操作数大小始终由助记符和/或其他寄存器操作数隐含;我想不出任何需要指定qwordvs. owordvs.yword或任何内容的说明,就像使用movsx eax, byte [rdi]vs.那样word [rdi]。通常它的大小与寄存器相同,但某些随机/插入/提取指令也有例外。例如:
pinsrw xmm0, [rdi], 3加载aword并将其合并到xmm0的字节6和7中。movq [rdi], xmm0存储qword低半部分movhps [rdi], xmm0存储高qwordvextractf128 [rdi], ymm0, 1对高半部分进行 128 位存储vpmovzxbw ymm0, [rdi]从 128 位内存源操作数进行打包字节到字零扩展vpmovdb [rdi]{k1}, zmm2将双字缩小为字节元素(进行截断;其他版本进行饱和)并执行 128 位存储,并以字节粒度进行屏蔽。(除了具有缓存maskmovdqu驱逐 NT 语义的传统 SSE 之外,在没有 AVX-512BW 的情况下进行字节粒度屏蔽的唯一方法之一。所以我想这对于 Xeon Phi KNL 来说特别有趣。)您可以指定oword其中任何一个,以确保内存访问的大小符合您的预期。(即让 NASM 为您检查。)