Mic*_*ied 1 assembly x86-64 simd nasm avx
问题:movaps给我一个分段错误.
上下文:x86-64指令vmovaps设计用于Core i系列处理器(我运行此系统)上的AVX寄存器.AVX寄存器的宽度是SSE寄存器的两倍(分别为256和128位).指令vmovaps应将对齐的浮点值(32位)的向量移动到指定的ymm寄存器中.
可能的原因:源数据的对齐特别重要,因为错误对齐的数据是分段错误的来源.但是,即使我对齐了数据,我自己也遇到了分段错误.
segment .data
align 16
xs:
dd 0.0
dd 1.1
dd 2.2
dd 3.3
dd 4.4
dd 5.5
dd 6.6
dd 7.7
align 16
ys:
dd 8.8
dd 7.7
dd 6.6
dd 5.5
dd 4.4
dd 3.3
dd 2.2
dd 1.1
segment .text
global main
main:
push rbp
mov rbp, rsp
; Move eight 32-bit floats from "xs" into ymm0
vmovaps ymm0, [xs]
; Move eight 32-bit floats from "ys" into ymm1
vmovaps ymm1, [ys]
; Add all eight to each other simulatenously, put in ymm0
vaddps ymm0, ymm1
xor rax, rax
leave
ret
Run Code Online (Sandbox Code Playgroud)
编译:yasm -f elf64 -g dwarf2 <filename>
链接:gcc -o <bin-name> <filename>.o
当我使用GDB运行时,它只是报告它在第一vmovaps条指令上收到了分段故障信号.我检查了有关对齐的文档,我认为这一切都是正确的.为了它的价值,我正在i5 8600K上运行并执行它.
我也看过这个类似的问题.但是我无法将问题的答案应用到我的问题上(与他的内联汇编有关).如果有人可以参与其中,我将不胜感激!
vmovaps带ymm0操作数需要32字节对齐.引用手册:
当源或目标操作数是内存操作数时,操作数必须在16字节(128位版本),32字节(VEX.256编码版本)或64字节(EVEX.512编码版本)边界上对齐或者将生成一般保护例外(#GP).对于EVEX.512编码版本,操作数必须与内存操作数的大小对齐.
(重点补充)
因此,你应该align 16改为align 32.