【发布时间】:2020-07-11 18:21:24
【问题描述】:
根据 Intel 64 和 IA-32 架构软件开发人员手册合卷(2019 年 10 月)第 4.1.1 节“字、双字、四字和双四字的对齐方式”:
"字、双字和四字在内存中不需要在自然边界上对齐。字、双字和四字的自然边界是偶数地址、可被四整除的地址、可被四整除的地址分别是八个。”
但是手册后面的一段说:
“某些对双四字进行操作的指令要求内存操作数在自然边界上对齐。如果指定了未对齐的操作数,这些指令会生成通用保护异常 (#GP)。双四字的自然边界是任意地址能被 16 整除。”
我只是将我的数据部分安排在 64 字节边界上对齐,并将所有 dq 变量组织在一起以设置在单个缓存行上。以下是前八个 dq:
section .data align=64
Return_Pointer_Array: dq 0, 0, 0
data_master_ptr: dq 0
n_ptr: dq 0
n_ctr: dq 0
n_length: dq 0
collect_ptr: dq 0
数据部分比这大,但我通过 Agner Fog 的 objconv 运行它,他没有显示数据对齐问题 - 在早期的工作中,我发现如果存在对齐问题,Fog 的 objconv 会标记它们。
我的问题是:如英特尔在上面引用的最后一段中所说,在什么情况下我必须将每个 dq 对齐到一个可被 16 整除的地址上?什么指令会导致这样的要求?
【问题讨论】:
-
任何对 XMM 寄存器进行操作的 SIMD 指令都需要在 16 字节对齐的边界上对齐。需要对齐访问的说明,例如 felixcloutier.com/x86/movdqa:vmovdqa32:vmovdqa64
-
您的示例中有一个严重错误:
DQis QuadWord = 8 bytes。您在谈论DDQ,即 DoubleQuadWord = 16 字节。所以 16 个字节是DDQ值的 自然 边界。 -
你的标题是“双四字”,即
DDQ。 (我知道这是违反直觉的),我用this answer 进行了检查。 -
@zx485 :如果人们理解第一个
D意味着 Define,他们可能不会觉得它违反直觉 -
现在,在您编辑之后,这个问题没有任何意义:您引用了“单词、双字和四字不需要在内存中的自然边界上对齐。”因此,根据英特尔手册,DQ 不需要在 16 字节边界上对齐。但是你的标题会问它是否......
标签: assembly optimization x86-64 nasm