RealView 编译工具 《汇编器指南》 ALIGN

来源:互联网 发布:二维树状数组 编辑:程序博客网 时间:2024/06/05 01:10
RealView 编译工具 《汇编器指南》4.0 版Home > 指令参考 > 其他指令 > ALIGN

7.8.1. ALIGN

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

语法

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

其中:

expr

是一个数值表达式,取值为 20 到 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示例)。

示例

        AREA    cacheable, CODE, ALIGN=3rout1   ; code              ; aligned on 8-byte boundary        ; code        MOV     pc,lr       ; aligned only on 4-byte boundary        ALIGN   8           ; now aligned on 8-byte boundaryrout2   ; code

AREA OffsetExample, CODE

        DCB     1           ; This example places the two        ALIGN   4,3         ; bytes in the first and fourth        DCB     1           ; bytes of the same word.

AREA Example, CODE, READONLY

start   LDR     r6,=label1        ; code        MOV     pc,lrlabel1  DCB     1           ; pc now misaligned        ALIGN               ; ensures that subroutine1 addressessubroutine1                 ; the following instruction.        MOV r5,#0x5