arm

;(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个字)的数据传送到目的寄存器中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值