Problem: movaps
给我一个分段错误。
Context:x86-64指令vmovaps
设计用于与 Core i 系列处理器(我正在运行该系统)上的 AVX 寄存器一起使用。 AVX 寄存器的宽度是 SSE 寄存器的两倍(分别为 256 位和 128 位)。操作说明vmovaps
应该将对齐的浮点值(32 位)向量移动到指定的位置ymm
登记。
可能的原因:源数据的对齐尤为重要,因为不正确对齐的数据是分段错误的根源。然而,即使我对齐了数据,我自己也遇到了分段错误。
Example
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 上运行并执行此操作。
我也看过这个类似的问题。然而,我无法真正将他的问题的答案应用到我的问题上(与他的内联汇编有关)。如果有人能对此发表意见,我将不胜感激!