繁体   English   中英

YASM:vmovaps指令导致分段错误

[英]YASM: vmovaps instruction causing segmentation fault

问题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

编译yasm -f elf64 -g dwarf2 <filename>

链接至gcc -o <bin-name> <filename>.o

当我使用GDB运行它时,它只是报告说它在第一个vmovaps指令上收到了分段错误信号。 我检查了有关对齐的文档,我认为这都是正确的。 对于它的价值,我正在i5 8600K上运行和执行。

我也看过这个类似的问题 但是,我无法真正解决他的问题(与他的内联汇编有关)。 如果有人可以对此表示感谢,我将不胜感激!

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

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

(强调)

因此,您应该将align 16更改为align 32

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM