Assembly 为什么psubd xmm内存出现分段错误?

Assembly 为什么psubd xmm内存出现分段错误?,assembly,x86-64,gnu-assembler,Assembly,X86 64,Gnu Assembler,我在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

我在
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
数值如下:

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是默认值(“小于或等于符号大小的两个最大幂,最多16”)。在这种情况下,我认为明确对齐要求是一种良好的做法,因为您依赖它。

LABELX是否对齐到16字节?引述如下:“对于.lcomm指令不接受对齐参数的目标,这是大多数ELF目标的情况,.local指令可以与.comm结合使用(参见Comm)定义对齐的本地公共数据。“值得指出的是,使用
.Comm
/
.lcomm
,您不需要
.section.bss
。如果您使用
.section.bss
,您可以使用
.p2align 4
/
LABELX:.skip 16
(或
.zero 16
或以任何其他方式发出16字节的零。)