正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 arm汇编 跳转和控制指令
Home android 嵌入式开发 arm汇编 跳转和控制指令

arm汇编 跳转和控制指令

android 嵌入式开发 by

一、B 、 BL 、 BX 、 BLX  和  BXJ

跳转、带链接跳转、跳转并切换指令集、带链接跳转并切换指令集、跳转并转 换到  Jazelle  状态。

语法

op1 { cond }{.W}  label 
op2 { cond }  Rm

其中:

 op1  是下列项之一:

  • B            跳转。
  • BL         带链接跳转
  • BLX      带链接跳转并切换指令集。
 op2  是下列项之一:

  • BX      跳转并切换指令集。
  • BLX    带链接跳转并切换指令集。
  • BXJ    跳转并转换为 Jazelle 执行。
 cond  是一个可选的条件代码。cond 不 能用于此指令的所有形式
 .W  是一个可选的指令宽度说明符,用于强制要求在  Thumb-2  中使用 32  位 B 指令。
 label  是一个程序相对的表达式。
 Rm  是一个寄存器,包含要跳转到的目标地址。

操作

所有这些指令均会引发跳转,或跳转到 label ,或跳转到包含在 Rm 中的地址处。 此外:

  • BL 和 BLX 指令可将下一个指令的地址复制到 lr ( r14 ,链接寄存器)中。
  • BX 和 BLX 指令可将处理器的状态从 ARM 更改为 Thumb ,或从 Thumb 更改 为 ARM 。
    BLX label 无论何种情况,始终会更改处理器的状态。
    BX Rm 和 BLX Rm 可从 Rm 的位 [0] 推算出目标状态:
    —如果 Rm 的位 [0] 为 0 ,则处理器的状态会更改为(或保持在) ARM 状态
    —如果 Rm 的位 [0] 为 1 ,则处理器的状态会更改为(或保持在) Thumb 状态。
  • BXJ 指令会将处理器的状态更改为  Jazelle 。

Jazelle是ARM体系结构的一种相关技术,用于在处理器指令层次对JAVA加速。

指令可用性和跳转范围

下表 给出了可在  ARM  和  Thumb  状态下使用的指令。 此表中未列出的指令不 可在这两种状态下使用。 括号中的注释给出了第一个可在其中使用指令的体系 结构版本。

 指令  ARM  16  位  Thumb  32  位  Thumb
 B label  ± 32MB (所有)  ± 2KB (所有  T )  ± 16MB  (所有  T2 )

使用 .W 可指示汇编器使用此  32  位指令。

B{cond} label  ± 32MB (所有)  – 252  到  +258 (所有  T )  ± 1MB (所有  T2 )

使用 .W 可指示汇编器使用此  32  位指令。

 BL label  ± 32MB (所有)  ± 4MB   (所有  T )

这是一个指令对

 ± 16MB (所有  T2 )
 BL{cond} label  ± 32MB(所有)  –  –
 BX Rm  可用   ( 4T , 5 )  可用     (所有  T )  用  16  位   (所有  T2 )
 BX{cond} Rm  可用   ( 4T , 5 )  –  –
 BLX label  ± 32MB (5)  ± 4MB  b (5T)  ± 16MB (除 ARMv7-M  之 外的所有  T2 )
 BLX Rm  可用 (5)  可用 (5T)  使用  16  位   (所有  T2 )
 BLX{cond} Rm
可用(5)
 –  –
 BXJ Rm  可用   ( 5J , 6 )  –  可用      (除 ARMv7-M  之 外的所有  T2 )
 BXJ{cond} Rm  可用   ( 5J , 6 )  –  –

扩展跳转范围

机器级指令 B 和 BL 对当前指令有地址范围限制。 但是,即使 label 超出范围,仍 可以使用这些指令。 通常您并不知道链接器会将 label 放在何处。 必要时链接器 会添加代码,以允许进行更长的跳转。

Thumb-2  中的  B

您可以使用 .W 宽度说明符强制 B 在  Thumb-2  代码中生成  32  位指令。

B.W 始终生成  32  位指令,即使使用  16  位指令就可访问目标也如此。

对于向前引用,不带 .W 的 B 始终在  Thumb  代码中生成  16  位指令,即使这会导 致无法访问可以使用  32  位  Thumb  指令访问的目标。

Thumb-2EE  中的  BX 、 BLX  和  BXJ

这 些指令可在  Thumb-2EE  代码中用作跳转,但不能用于更改状态。 不能在 Thumb-2EE  中使用这些指令的 op { cond }  label 格式。在该寄存器格式中, Rm 的 位  [0]  必须是  1 ,执行以  ThumbEE  状态在目标地址继续进行。

条件标记

这些指令不更改标记。

体系结构

有关这些指令在每种体系结构中的可用性的详细信息。

示例

B       loopA
    BLE     ng+8
    BL      subC
    BLLT    rtX
    BEQ     {pc}+4  ; #0x8004

二、IT

IT  (If-Then)  指令由四条后续条件指令( IT  块 )句组成。 这些条件可以完全相 同,也可以互为逻辑反。

IT  块中的指令(包括跳转)还必须在语法的 { cond } 部分中指定条件。

无需在代码中编写 IT 指令,因为汇编器会根据在后续指令中指定的条件为您自 动生成这些指令。 不过,如果确实需要编写 IT 指令,则汇编器会根据后续指令 中指定的条件对 IT 中指定的条件进行验证。

编写 IT 指令可确保您会考虑如何在代码设计中放置条件指令以及选择条件。 在汇编为  ARM  代码时,汇编器会执行相同的检查,但是不会生成任何 IT 指 令。

语法

IT{ x { y { z }}} { cond }

其中:

x  指定  IT  块中第二个指令的条件开关。
 y  指定  IT  块中第三个指令的条件开关。
 z  指定  IT  块中第四个指令的条件开关。
 cond  指定  IT  块中第一个指令的条件。

IT  块中第二个、第三个和第四个指令的条件开关可以是下列项之一:

T  Then 。 将条件 cond 应用于指令。
 E  Else 。 将 cond 的相反条件应用于指令。

用法

除了 CMP 、 CMN, 和 TST 之外,通常会影响条件代码标记的  16  位指令在用于  IT  块 内时,不会影响这些标记。

IT  块中 BKPT 指令总会得到执行,即使无法满足其条件也如此。

可以通过 AL 条件将 IT 块用于无条件执行指令。

IT  块内条件跳转的跳转范围比  IT  块外部的跳转的范围大。

限制

不允许在  IT  块中使用下面的指令:

  • IT
  • CBZ 和 CBNZ
  • TBB 和 TBH
  • CPS 、 CPSID 和 CPSIE
  • SETEND

使用  IT  块时的其他限制有:

  • 跳转指令或修改 pc 的任何指令只能是 IT 块中的最后一个指令。
  • 无法跳转到 IT 块中的任何指令,除非在从异常处理程序返回时。
  • 不能在 IT 块中使用任何汇编器指令。

条件标记

此指令不更改标记

异常

IT 指令与相应的  IT  块间或  IT  块内均可能会发生异常。 如果发生此异常,则会 进入到相应的异常处理程序,同时将适用的返回信息存入  lr  和  SPSR  中。

可像平常一样利用异常返回指令从异常返回, IT  块将会继续正常执行。 这是  pc  修改指令跳转到  IT  块中的指令的唯一方法。

体系结构

此  16  位  Thumb  指令可用于  ARMv6T2  及更高版本。

示例

ITTE   NE        ; IT can be omitted
    ANDNE  r0,r0,r1  ; 16-bit AND, not ANDS
    ADDSNE r2,r2,#1  ; 32-bit ADDS (16-bit ADDS does not set flags in IT block)
    MOVEQ  r2,r3     ; 16-bit MOV
    ITT    AL        ; emit 2 non-flag setting 16-bit instructions
    ADDAL  r0,r0,r1  ; 16-bit ADD, not ADDS
    SUBAL  r2,r2,#1  ; 16-bit SUB, not SUB
    ADD    r0,r0,r1  ; expands into 32-bit ADD
    IT     NE
        ADD    r0,r0,r1  ; syntax error: no condition code used in IT block
    ITT    EQ
    MOVEQ  r0,r1
    BEQ    dloop

说明

IT块中不可预知结果的指令
如果  IT  块中有不可预知结果的指令(例如 B 、 BL 和 CPS ),汇编器 会发出警告。 另外,如果有  pc  更改指令(例如 BX 、 CBZ 和 RFE ), 也会发出警告。

三、CBZ  和  CBNZ

比较,为零则跳转;比较,为非零则跳转。

语法

CBZ  Rn ,  label 
CBNZ  Rn ,  label

其中:

Rn  是存放操作数的寄存器
 label  是跳转目标

用法

可以使用 CBZ 或 CBNZ 指令避免更改条件代码标记并减少指令数目。 除了不更改条件代码标记外, CBZ Rn, label 与下列指令序列功能相同:

CMP     Rn, #0
    BEQ     label

除了不更改条件代码标记外, CBNZ Rn, label 与下列指令序列功能相同:

CMP     Rn, #0
    BNE     label

限制

跳转目标必须在指令之后的  4  到  130  个字节之内。

这些指令一定不能在  IT  块内使用。

条件标记

这些指令不更改标记

体系结构

这些  16  位  Thumb  指令可用于  ARMv6T2  及更高版本。

这些指令没有  ARM  或  32  位  Thumb  版本。

四、 TBB  和  TBH

表跳转字节或表跳转半字。

语法

TBB [ Rn ,  Rm ] 
TBH [ Rn ,  Rm , LSL #1]

其中:

 Rn 是基址寄存器。 此寄存器用于存放跳转长度表的地址。

Rn 不能为 r13 。 如果将 Rn 指定为  r15 ,则所用的值将为指令地址加  4 。

 Rm 是索引寄存器。 用于存放到跳转长度表的索引。

Rm 不能为  r15  或  r13 。

运算

这 些指令可利用单字节偏移表  ( TBB )  或半字偏移表  ( TBH )  来产生相对于  PC  的向前 跳转。 Rn 可提供指向表的指针,而 Rm 可提供指向表的索引。 跳转长度是从表返 回的字节值  ( TBB )  或半字值  ( TBH )  的两倍。

说明

在  Thumb-2EE  中,如果基址寄存器中的值为零,则代码将跳转到位于 HandlerBase – 4  的  NullCheck  处理程序处执行。

体系结构

这些  32  位  Thumb  指令可用于  ARMv6T2  及更高版本。 这些指令没有  ARM  或  16  位  Thumb  版本。

 

29 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章