;(1)B 跳转指令
;B〔条件) (地址)
;B指令属于ARM指令集,是最简单的分支指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的地址,从那里继续执行。注意:存储在分支指令中的实际值是相对当前R15的值的一个偏移量,而不是一个绝对地址。它的值由汇编器来计算,是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移位为26位(+/- 32 MB)。
;(2)BL 带返回的跳转指令
;BI,〔条件) (地址)
;BL指令也属于ARM指令集,是另一个分支指令。就在分支之前,在寄存器R14中装载上R15的内容,因此可以重新装载R14到R15中来返回到这个分支之后的那个指令处执行,它是子例程的一个基本但强力的实现。
;(3)BLX 带返回和状态切换的跳转指令
;BLX <地址>
;BLX指令有两种格式,第1种格式的BLX指令记作BLX(1)。BLX(1)从ARM指令集跳转到指令中指定的目标地址,并将程序状态切换到Thumb状态,该指令同时将PC寄存器的内容复制到LR寄存器中。
;BLX(1)指令属于无条件执行的指令。
;第2种格式的BLX指令记作BLX(2)。BLX(2)指令从ARM指令集跳转到指令中指定的目标地址,目标地址的指令可以是ARM指令,也可以是Thumb指令。目标地址放在指令中的寄存器<dest>中,该地址的bit[0]值为0,目标地址处的指令类型由CPSR中的T位决定。该指令同时将PC寄存器的内容复制到LR寄存器中。
;(4)BX 带状态切换的跳转指令
;BX(条件) (dest)
;BX指令跳转到指令中指定的目标地址,目标地址处的指令可以是ARM指令,也可以是Thumb指令。目标地址值为指令的值和0xFFFFFFFE做“与”操作的结果,目标地址处的指令类型由寄存器决定。
area Init, code, readonly
code32
entry
start
; b指令的偏移量:0-23bit 2^10 * 2^10 * 2^4 = 16M 指令条数
; pc 与目标地址相隔的指令条数。
; 注意考虑流水线的原因,pc的值 = 当前正在执行的指令 + 8
; 16M * 4 = 64M -> +/-32M
mov r0, #1
mov r1, #2
;b start
;b stop ; 一去不复返
mov r0, #2 ; pc 偏移量: pc 与目标地址相隔的指令条数。
mov r1, #3
mov r2, #3
; 如果超过+/-32M 只能直接给Pc赋值 实现长跳转。
;mov pc, #0xff000000
;ldr pc, =0x1233300
;b func1
bl func1
;bl func2
stop
b stop ;
func1 ; 非叶子函数
mov r12, lr ;; 保存在临时寄存器里
mov r1, #100
mov r2, #200
mov r3, #300
ldr r10, =func
;跳转到thumb指令集中,告诉thumb指令函数的位置
ldr r0, =func2+1
bx r0
;bx的跳转回改变lr的值和bl相似
;BX指令是ARM指令系统中的带状态切换跳转指令。X指令跳转到指令中所指定的目标地址,若目标地址的bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址的代码解释为ARM代码;若目标地址的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码。
;ARM 和 Thumb 指令集的动态切换,是通过 BX 指令使用一个寄存器名作为参数来完成
;程序控制权被转交给该寄存器中存储的地址 ( LSB 位被屏蔽 )。
;如果 LSB=1, 则进入 Thumb 指令处理模式; 如果 LSB=0, 则进入 ARM 指令处理模式。
;通俗点讲其实就是BX 跳转的地址最低位为1还是0来判断是进入Thumb指令处理模式还是进人ARM指令处理模式。
func
mov lr, r12
mov pc, lr ; 返回
code16
func2 ; 叶子函数
mov r4, #10
mov r5, #20
mov r6, #30
bx r10
; pc : arm 字对齐 -》 最低2位一定为0. pc %4 == 0
; : thumb 半字对齐 -> 最低位一定为 0. pc %2 == 0
end
LDR{条件} 目的寄存器 <存储器地址>
作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。
;B〔条件) (地址)
;B指令属于ARM指令集,是最简单的分支指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的地址,从那里继续执行。注意:存储在分支指令中的实际值是相对当前R15的值的一个偏移量,而不是一个绝对地址。它的值由汇编器来计算,是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移位为26位(+/- 32 MB)。
;(2)BL 带返回的跳转指令
;BI,〔条件) (地址)
;BL指令也属于ARM指令集,是另一个分支指令。就在分支之前,在寄存器R14中装载上R15的内容,因此可以重新装载R14到R15中来返回到这个分支之后的那个指令处执行,它是子例程的一个基本但强力的实现。
;(3)BLX 带返回和状态切换的跳转指令
;BLX <地址>
;BLX指令有两种格式,第1种格式的BLX指令记作BLX(1)。BLX(1)从ARM指令集跳转到指令中指定的目标地址,并将程序状态切换到Thumb状态,该指令同时将PC寄存器的内容复制到LR寄存器中。
;BLX(1)指令属于无条件执行的指令。
;第2种格式的BLX指令记作BLX(2)。BLX(2)指令从ARM指令集跳转到指令中指定的目标地址,目标地址的指令可以是ARM指令,也可以是Thumb指令。目标地址放在指令中的寄存器<dest>中,该地址的bit[0]值为0,目标地址处的指令类型由CPSR中的T位决定。该指令同时将PC寄存器的内容复制到LR寄存器中。
;(4)BX 带状态切换的跳转指令
;BX(条件) (dest)
;BX指令跳转到指令中指定的目标地址,目标地址处的指令可以是ARM指令,也可以是Thumb指令。目标地址值为指令的值和0xFFFFFFFE做“与”操作的结果,目标地址处的指令类型由寄存器决定。
area Init, code, readonly
code32
entry
start
; b指令的偏移量:0-23bit 2^10 * 2^10 * 2^4 = 16M 指令条数
; pc 与目标地址相隔的指令条数。
; 注意考虑流水线的原因,pc的值 = 当前正在执行的指令 + 8
; 16M * 4 = 64M -> +/-32M
mov r0, #1
mov r1, #2
;b start
;b stop ; 一去不复返
mov r0, #2 ; pc 偏移量: pc 与目标地址相隔的指令条数。
mov r1, #3
mov r2, #3
; 如果超过+/-32M 只能直接给Pc赋值 实现长跳转。
;mov pc, #0xff000000
;ldr pc, =0x1233300
;b func1
bl func1
;bl func2
stop
b stop ;
func1 ; 非叶子函数
mov r12, lr ;; 保存在临时寄存器里
mov r1, #100
mov r2, #200
mov r3, #300
ldr r10, =func
;跳转到thumb指令集中,告诉thumb指令函数的位置
ldr r0, =func2+1
bx r0
;bx的跳转回改变lr的值和bl相似
;BX指令是ARM指令系统中的带状态切换跳转指令。X指令跳转到指令中所指定的目标地址,若目标地址的bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址的代码解释为ARM代码;若目标地址的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码。
;ARM 和 Thumb 指令集的动态切换,是通过 BX 指令使用一个寄存器名作为参数来完成
;程序控制权被转交给该寄存器中存储的地址 ( LSB 位被屏蔽 )。
;如果 LSB=1, 则进入 Thumb 指令处理模式; 如果 LSB=0, 则进入 ARM 指令处理模式。
;通俗点讲其实就是BX 跳转的地址最低位为1还是0来判断是进入Thumb指令处理模式还是进人ARM指令处理模式。
func
mov lr, r12
mov pc, lr ; 返回
code16
func2 ; 叶子函数
mov r4, #10
mov r5, #20
mov r6, #30
bx r10
; pc : arm 字对齐 -》 最低2位一定为0. pc %4 == 0
; : thumb 半字对齐 -> 最低位一定为 0. pc %2 == 0
end
LDR{条件} 目的寄存器 <存储器地址>
作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。