YASM:vmovaps指令导致分段错误

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上运行并执行它.

我也看过这个类似的问题.但是我无法将问题的答案应用到我的问题上(与他的内联汇编有关).如果有人可以参与其中,我将不胜感激!

Jes*_*ter 7

vmovapsymm0操作数需要32字节对齐.引用手册:

当源或目标操作数是内存操作数时,操作数必须在16字节(128位版本),32字节(VEX.256编码版本)或64字节(EVEX.512编码版本)边界上对齐或者将生成一般保护例外(#GP).对于EVEX.512编码版本,操作数必须与内存操作数的大小对齐.

(重点补充)

因此,你应该align 16改为align 32.