您的位置:首页 > 其它

ALIGN 边界对齐指令

2011-09-30 22:41 351 查看
ALIGN
指令通过用零或
NOP
指令进行填充将当前位置对齐到指定边界。

语法

ALIGN
{
expr
{,
offset{,pad
{,
padsize
}}}}[/code]
其中:

expr


是一个数值表达式,取值为 2 到 231 范围内的 2 的任何次幂

offset


可以是任何数值表达式

pad


可以是任何数值表达式

padsize


可为 1、2 或 4。

操作

使当前位置对齐到如下形式的下一地址:

offset
+
n
*
expr


如果未指定
expr
,则
ALIGN
会将当前位置设置到下一个字(四字节)边界处。前一个位置和当前新位置之间的未用空间用以下内容填充:

如果指定了
pad
,则用
pad
的副本填充

满足以下所有条件时,用
NOP
指令填充:

未指定
pad


ARM 或 Thumb 指令后面是
ALIGN
指令

在当前节中,
AREA
指令设置了
CODEALIGN
属性

其他情况用零填充。

根据
padsize
值的情况,
pad
将被分别视为一个字节、半字或字。如果未指定
padsize
,则
pad
在数据节中缺省为字节,在 Thumb 代码中缺省为半字,在 ARM 代码中缺省为字。

用法

使用
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示例)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: