[英]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上運行和執行。
我也看過這個類似的問題 。 但是,我無法真正解決他的問題(與他的內聯匯編有關)。 如果有人可以對此表示感謝,我將不勝感激!
vmovaps
與ymm0
操作數需要32字節對齊。 引用手冊:
當源或目標操作數是內存操作數時,操作數必須在16字節(128位版本), 32字節(VEX.256編碼版本)或64字節(EVEX.512編碼版本)邊界上對齊否則將生成一般保護例外(#GP)。 對於EVEX.512編碼版本,操作數必須與內存操作數的大小對齊。
(強調)
因此,您應該將align 16
更改為align 32
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.