簡體   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