Assembly YASM:vmovaps指令导致分段错误

Assembly YASM:vmovaps指令导致分段错误,assembly,nasm,x86-64,simd,avx,Assembly,Nasm,X86 64,Simd,Avx,问题:movaps给了我一个分段错误 上下文:x86-64指令vmovaps设计用于运行此系统的核心i系列处理器上的AVX寄存器。AVX寄存器的宽度是SSE寄存器的两倍,分别为256位和128位。指令vmovaps应将对齐的浮点值向量移动32位到指定的ymm寄存器中 可能原因:源数据的对齐特别重要,因为对齐不正确的数据是分段错误的来源。然而,即使我已经对齐了数据,我自己也遇到了分割错误 实例 编译时使用:yasm-f elf64-g dwarf2 链接:gcc-o.o 当我用GDB运行这个命令时

问题:movaps给了我一个分段错误

上下文:x86-64指令vmovaps设计用于运行此系统的核心i系列处理器上的AVX寄存器。AVX寄存器的宽度是SSE寄存器的两倍,分别为256位和128位。指令vmovaps应将对齐的浮点值向量移动32位到指定的ymm寄存器中

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

实例 编译时使用:yasm-f elf64-g dwarf2

链接:gcc-o.o

当我用GDB运行这个命令时,它只是报告它在第一条vmovaps指令上收到了一个分段错误信号。我已经检查了有关对齐的文档,我认为它们都是正确的。不管它值多少钱,我正在i5 8600K上运行和执行它

我也看过这个。然而,我不能真正地将他的问题的答案应用到我的问题上,这与他的内联汇编有关。如果有人能参与进来,我将不胜感激

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

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

重点补充

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

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

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

重点补充


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

好吧,既然您已经在调试器中了,那么查看实际地址以验证它是否对齐如何?你知道使用ymm0意味着你必须有32字节的对齐方式,对吗?因此,您应该更改为对齐32。手册非常清楚:当源操作数或目标操作数是内存操作数时,操作数必须在16字节128位版本上对齐,32字节VEX.256编码version@Jester我用的是雷伊·塞斯法思写的指南。我相信他的话,但他提到需要16字节对齐。我知道他没有具体说明。。。FWIW它们在GDB中是16字节对齐的。但不是32@Jester这正是问题所在。对不起,我没有用RTFM。我只是有点执着于我正在读的这本书,执着于从中获得的信息。如果你把它写下来作为一个答案,我会接受的。好吧,既然你已经在你的调试器里了,那么你看看实际的地址来验证它是对齐的怎么样?你知道使用ymm0意味着你必须有32字节的对齐方式,对吗?因此,您应该更改为对齐32。手册非常清楚:当源操作数或目标操作数是内存操作数时,操作数必须在16字节128位版本上对齐,32字节VEX.256编码version@Jester我用的是雷伊·塞斯法思写的指南。我相信他的话,但他提到需要16字节对齐。我知道他没有具体说明。。。FWIW它们在GDB中是16字节对齐的。但不是32@Jester这正是问题所在。对不起,我没有用RTFM。我只是有点执着于我正在读的这本书,执着于从中获得的信息。如果你把它写下来作为回答,我会接受的。
    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