ARM编程中B指令与BL指令的区别

ARM汇编程序中B指令和BL指令都是会跳转到某个标号处运行,类似于C语言中的goto 命令,例如利用B指令实现一个循环(每次对r0 寄存器中的值加1):

.text
	mov r0, #1           //将r0寄存器的值初始化为1
	
loop:                   //要跳转的标号
	cmp r0, #10         //比较r0与10
	addle r0, #1        //满足r0小于等于10就加1
	ble loop            //满足r0小于等于10就跳转到loop标号处


.end

执行结果如下,最后R0寄存器中的数值变为B(十进制的11),证明B指令的作用是单纯的进行跳转,因为寄存器LR中的值始终没有发生改变。 

 而BL指令也有跳转标号的作用,但是还有一个重要的是,在进行跳转时寄存器LR会保存跳转指令的下一个指令的地址,作用是什么呢?我们知道在C语言中在执行函数时有中断这个概念,程序会优先处理中断而暂时不顺序执行程序,当程序处理完中断后便会返回到之前的程序处继续执行,

 这就是程序在遇到中断时的执行过程,在ARM中使用BL指令时,遇到跳转时LR寄存器会保存产生该跳转的下一条指令,目的是当程序执行完跳转程序后可以通过LR中的地址取出指令继续执行,还可以在程序产生异常时,LR通过 -4操作回到异常之前继续执行,例如我们通过BL指令模拟用户程序执行函数:

.text
	mov r0, #1                //初始化R0寄存器的值为1
	mov r1, #5                //初始化R1寄存器的值为5
	bl func_1                 //使用BL命令跳转到func_1处
	add r0, #10
	
	
func_1:
	add r1, #20               //对寄存器R1做加20
	mov pc, lr                //将寄存器LR中的地址赋给PC程序计数器

.end

当程序准备进行跳转时,即PC已经指向了CPU下一步该取指令的地址,LR保存了跳转指令的下一条指令的地址,即图中的0x0000000C,之后程序将在func_1中执行。

接下来再继续执行  mov pc, lr 指令后,PC所指向的指令就是之前LR寄存器中保存的地址对应的指令,所以CPU接下来就会到PC所指地址处取出指令执行,即会执行第六行的  add r0, #10 

 这就模拟了一次C语言在处理函数时的过程,在去执行中断程序时先将原本程序的现场保护起来,待执行完中断程序后回到现场继续执行程序。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值