ALIGN
指令通过用零或 NOP
指令进行填充将当前位置对齐到指定边界。
语法
ALIGN
{expr
{,offset{,pad
{,padsize
}}}}
其中:
-
是一个数值表达式,取值为 2 到 231 范围内的 2 的任何次幂
-
可以是任何数值表达式
-
可以是任何数值表达式
-
可为 1、2 或 4。
expr
offset
pad
padsize
操作
使当前位置对齐到如下形式的下一地址:
offset
+ n
* expr
如果未指定
,则 expr
会将当前位置设置到下一个字(四字节)边界处。前一个位置和当前新位置之间的未用空间用以下内容填充:ALIGN
-
如果指定了
,则用pad
的副本填充pad
-
满足以下所有条件时,用
NOP
指令填充:-
未指定
pad
-
ARM 或 Thumb 指令后面是
ALIGN
指令 -
在当前节中,
AREA
指令设置了CODEALIGN
属性
-
-
其他情况用零填充。
根据
值的情况,padsize
将被分别视为一个字节、半字或字。如果未指定 pad
,则 padsize
在数据节中缺省为字节,在 Thumb 代码中缺省为半字,在 ARM 代码中缺省为字。pad
用法
使用 ALIGN
可确保数据和代码对齐到适当的边界上。在下列情况下,这通常是必须的:
-
ADR
Thumb 伪指令只能加载字对齐的地址,但 Thumb 代码内的标签可能不是字对齐的。使用ALIGN 4
可确保 Thumb 代码内的地址是四字节对齐的。 -
使用
ALIGN
可利用有些 ARM 处理器上的高速缓存。例如,ARM940T 带有一个含 16 字节行的高速缓存。 使用ALIGN 16
可在 16 字节边界上对齐函数入口点,并使高速缓存的效率最高。 -
LDRD
和STRD
双字数据传送必须是八字节对齐的。如果要用LDRD
或STRD
访问数据,则应在内存分配指令(如DCQ
)之前使用ALIGN 8
(请参阅数据定义指令)。 -
只有标签的行可以是任意对齐的。 随后的 ARM 代码是字对齐的(Thumb 代码是半字对齐的)。因此标签不能正确寻址代码。在标签前使用
ALIGN 4
(或对 Thumb 代码使用ALIGN 2
)。
对齐相对于例程所在的 ELF 节的起始位置。 节必须对齐到相同的或更近似的边界上。 AREA
指令中的 ALIGN
属性以不同方式指定(请参阅AREA 和示例)。