为什么我得到 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")。在这种情况下,我认为明确对齐要求是一种很好的做法,因为您依赖它。
我在 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")。在这种情况下,我认为明确对齐要求是一种很好的做法,因为您依赖它。