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字节的零。)