问题:movaps
是给我分割故障。
背景:X86-64指令vmovaps
被设计成与AVX可以使用上的Core i系列处理器(其我运行这个系统)寄存器的值。的AVX寄存器是两倍宽的SSE那些(分别为256 VS 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
yasm -f elf64 -g dwarf2 <filename>
:编译
gcc -o <bin-name> <filename>.o
:与链接
当我运行这个用GDB,它只是报告它的第一vmovaps
指令收到分段错误的信号。我已经检查了对齐文件,我认为这是正确的。对于什么它的价值,我正在和一个I5 8600K执行此。
我也看了这个similar question。但是我真的不能回答适用于他的问题,以我的(是与他的内联汇编)。如果任何人都可以在重量上这个,我会感激不尽!
vmovaps
与ymm0
操作数需要32字节对齐。引述手册:
当源或目标操作数是存储器操作数,操作数必须在16字节(128位版本)对准,32字节(VEX.256编码版本)或64字节(EVEX.512编码版本)边界或一般保护性异常(#GP)将生成。对于EVEX.512编码版本,操作数必须对准内存操作数的大小。
(强调)
因此,你应该改变align 16
到align 32
。