为什么我得到 psubd xmm 内存分段错误?

Why I get segmentation fault for psubd xmm, memory?

我在 bss 中有一个名为 LABELX 的标签,我在其中维护了一个 64 位地址。在我的代码中是这样介绍的:

.section    .bss
.lcomm LABELX, 16  ### I reserved 128 bit to have the same length as XMMs

在我的代码中的某些地方,我有一个减法如下:

psubd   LABELX, %xmm11

数值如下:

Value in XMM11 : F7A2D830 ### the higher bits are all zeros.
Value at LABELX: 7FFFF7A2D740

我希望从 XMM11 中减去存储在 LABELX 中的值的最低 32 位,并将结果存储在 XMM11 的最低 32 位中。为什么我会出现分段错误?

分段错误是因为 LABELX 没有与 16 字节地址对齐。

使用以下内容定义 LABELX:

.local LABELX
.comm LABELX, 16, 16

第二个16是对齐要求。它可以省略,因为 16 是默认值 ("the largest power of two less than or equal to the size of the symbol, up to a maximum of 16")。在这种情况下,我认为明确对齐要求是一种很好的做法,因为您依赖它。