汇编指令-跳转指令B BEQ BNE BCC

B指令:B为无条件跳转,一般在函数内部跳转。

在汇编语句中没有子程序返回,我们通过压栈指针的地址,再通过弹栈把这个地址弹到PC中来实现子程序返回跳转的。16位指令占用的地址空间是2个字节,当前指令用.来表示,所以用.-2,就跳到上一条指令。

DelayTime

	PUSH	{R0,LR}			;3指令周期   压栈到LR(R14)寄存器中
	//压栈后SP指针地址里是R0的数据和LR下一条指令的地址
	LDR		R0,=0x1e847e	;2指令周期  
	SUBS	R0,R0,#1		;1指令周期  减1指令
	BNE		.-2				;3指令周期  
	
	POP		{R0,PC}			;3指令周期  	弹栈到PC(R15)寄存器中

调用延时函DelayTime的时候用长跳转指令BL,通过修改程序指针的值,延时完需跳转回来。

通过修改程序指针的值来实现跳转,把当前的下一条指令的地址传递到LR(R14中)寄存器

执行完延时子程序后,在将地址弹栈到PC指针上,PC就可以进行下一条指令执行了。

 

BEQ指令:  Z =1 跳转,相等时跳转。             运行结果为0跳转。

MOVS R0,#0
MOVS R0,R0
BEQ Label
;用户代码1
Label
;用户代码2

运行完MOVS R0,R0 后结果为0,跳到Labl,执行用户代码2。

Z 标志位:运行完结果如果是0, Z置1,结果不是0,Z置0。

BNE指令: Z=0 跳转,不相等时跳转。        运行结果不为0跳转。

例子:
MOVS R0,#1
MOVS R1,#2
CMP R0,R1
BNE Label
;用户代码1
Label
;用户代码2

运行完CMP R0,R1后,结果不为0跳转,跳到Labl,执行用户代码2。


Z 标志位:运行完结果是0 ,Z置1,结果不是0,Z置0。

CMP R0,R1,比较运算后Z=0,那么就跳转到用户代码2执行。

 

BCC指令:写BCC 或者写BLO 都可以,这条指令是C=0 跳转,CMP R0,R1 比较,也可以说R0<R1 跳转。

C 标志位:加操作发生进位或者减操作没有发生借位该位置1, 加操作没有发生进位或者减操作发生借位该位置0。

例子:

MOVS R0,#5
MOVS R1,#10
CMP R0,R1
BCC Label
;用户代码1
Label
;用户代码2

执行用户代码2,BCC 这条指令是C=0 跳转本例中执行5-10 减不过,发生了借位,所以C=0,执行BCC 的时候发生跳转,跳到用户代码2 处执行。
 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑞莱科技

感谢您的支持,希望与您交流学习

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值