ALIGN 边界对齐指令

ALIGN 指令通过用零或 NOP 指令进行填充将当前位置对齐到指定边界。

语法
ALIGN {expr{,offset{,pad{,padsize}}}}

其中:

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 字节边界上对齐函数入口点,并使高速缓存的效率最高。

  • LDRDSTRD 双字数据传送必须是八字节对齐的。如果要用 LDRDSTRD 访问数据,则应在内存分配指令(如 DCQ)之前使用 ALIGN 8(请参阅数据定义指令)。

  • 只有标签的行可以是任意对齐的。 随后的 ARM 代码是字对齐的(Thumb 代码是半字对齐的)。因此标签不能正确寻址代码。在标签前使用 ALIGN 4(或对 Thumb 代码使用 ALIGN 2)。

对齐相对于例程所在的 ELF 节的起始位置。 节必须对齐到相同的或更近似的边界上。 AREA 指令中的 ALIGN 属性以不同方式指定(请参阅AREA示例)。

转载于:https://my.oschina.net/fzliu/blog/32830

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值