首页 > 解决方案 > 四字 (NASM DQ) 何时需要 16 字节对齐?

问题描述

根据 Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes (Oct 2019) 第 4.1.1 节“字、双字、四字和双四字的对齐方式”:

“字、双字和四字在内存中不需要在自然边界上对齐。字、双字和四字的自然边界分别是偶数地址、可被 4 整除的地址和可被 8 整除的地址。”

但是手册的一段后面说:

“一些对双四字进行操作的指令要求内存操作数在自然边界上对齐。如果指定了未对齐的操作数,这些指令会生成通用保护异常 (#GP)。双四字的自然边界是任何可整除的地址到 16 点。”

我只是将我的数据部分安排在 64 字节边界上对齐,并将所有 dq var 组织在一起以设置在单个缓存行上。以下是前八个 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 整除的地址上?什么指令会导致这样的要求?

标签: assemblyoptimizationx86-64nasm

解决方案


例如MOVAPD(内存地址必须对齐)和MOVUPD(内存地址不必对齐)


推荐阅读