YASM:vmovaps指令造成分段错误

问题描述 投票:1回答:1

问题: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。但是我真的不能回答适用于他的问题,以我的(是与他的内联汇编)。如果任何人都可以在重量上这个,我会感激不尽!

assembly nasm x86-64 simd avx
1个回答
7
投票

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

当源或目标操作数是存储器操作数,操作数必须在16字节(128位版本)对准,32字节(VEX.256编码版本)或64字节(EVEX.512编码版本)边界或一般保护性异常(#GP)将生成。对于EVEX.512编码版本,操作数必须对准内存操作数的大小。

(强调)

因此,你应该改变align 16align 32

© www.soinside.com 2019 - 2025. All rights reserved.