首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YASM: vmovaps指令导致分割错误

YASM: vmovaps指令导致分割错误
EN

Stack Overflow用户
提问于 2019-02-05 22:31:52
回答 1查看 465关注 0票数 1

Problemmovaps给了我一个分段错误。

Context:x86-64指令vmovaps设计用于核心I系列处理器(我正在运行这个系统)上的AVX寄存器。AVX寄存器的宽度是SSE寄存器的两倍(分别为256位和128位)。指令vmovaps应该将对齐浮点值的向量(32位)移动到指定的ymm寄存器中.

可能的原因:源数据的对齐特别重要,因为不正确地对齐数据是分段错误的来源。然而,即使我已经对齐了我的数据,我自己也遇到了一个分割错误。

示例

代码语言:javascript
复制
    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 8600 K上运行和执行这个程序。

我也看过这个相似问题。然而,我不能真正地将他的问题的答案应用于我的问题(与他的内联程序集有关)。如果有人能参与进来,我将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-05 23:00:04

带有vmovaps操作数的ymm0需要32字节对齐。引用手册

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

(强调后加)。Linux将SIGSEGV提供给导致#GP异常的进程。

因此,对于静态的align 16元素数组,您应该将dd更改为align 32

或者使用vmovups非对齐负载,并让硬件来处理它;在碰巧对齐的数据上,以及在大多数CPU上,对于没有在缓存线边界上分离的负载/存储,速度也是一样的。

关联:如何解决AVX加载/存储操作中的32字节对齐问题?用于C和C++对齐事物的方式,包括自动(堆栈)或动态存储中的数组。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54544056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档