您的位置:首页 > 其它

arm指令集分支指令

2015-12-29 17:16 197 查看
分支指令

B : 分支

(Branch)

B{条件} <地址>

B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。注意存储在分支指令中的实际的值是相对当前的 R15 的值的一个偏移量;而不是一个绝对地址。它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(+/- 32 M)。

BL : 带连接的分支

(Branch with Link)

BL{条件}  <地址>

BL
是另一个分支指令。就在分支之前,在寄存器 14 中装载上 R15 的内容。你可以重新装载 R14 到 R15 中来返回到在这个分支之后的那个指令,它是子例程的一个基本但强力的实现。它的作用在屏幕装载器 2 (例子 4)中得以很好的展现...

条件:

EQ : 等于 如果一次比较之后设置了 Z 标志。   NE : 不等于 如果一次比较之后清除了 Z 标志。   VS : 溢出设置 如果在一次算术操作之后设置了 V 标志,计算的结果不适合放入一个 32bit 目标寄存器中。   VC : 溢出清除 如果清除了 V 标志,与 VS 相反。   HI : 高于(无符号) 如果一次比较之后设置了 C 标志清除了 Z 标志。   LS : 低于或同于(无符号) 如果一次比较操作之后清除了 C 标志设置了 Z 标志。   PL : 正号 如果一次算术操作之后清除了 N。出于定义‘正号’的目的,零是正数的原因是它不是负数...   MI : 负号 如果一次算术操作之后设置了 N 标志。   CS : 进位设置 如果一次算术操作或移位操作之后设置了 C 标志,操作的结果不能表示为 32bit。你可以把 C 标志当作结果的第 33 位。   CC : 进位清除 与 CS 相反。   GE : 大于或等于(有符号) 如果一次比较之后...

设置了 N 标志设置了 V 标志

或者...

清除了 N 标志清除了 V 标志。   GT : 大于(有符号) 如果一次比较之后...

设置了 N 标志设置了 V 标志

或者...

清除了 N 标志清除了 V 标志
并且...

清除了 Z 标志。   LE : 小于或等于(有符号) 如果一次比较之后...

设置了 N 标志清除了 V 标志

或者...

清除了 N 标志设置了 V 标志
并且...

设置了 Z 标志。   LT : 小于(有符号) 如果一次比较之后...

设置了 N 标志清除了 V 标志。

或者...

清除了 N 标志设置了 V 标志。   AL : 总是 缺省条件,所以不用明显声明。   NV : 从不 不是特别有用,它表示应当永远不执行这个指令。是穷人的 NOP。

包含 NV 是为了完整性(与 AL 相对),你不应该在你的代码中使用它。

 我们把下面的c 转换为asm

/*
if(a >b)
return a;
else
return b;
*/


mov r1,#5

mov r2,#2

cmp r1,r2

bgt bunfly @ 如果cmp 以后,大于执行bunfly 标号代码

add r0,r1,r2 @ 不满足就执行add 指令

b over

bunfly:

sub r0,r1,r2    @r0 = r1-r2

over:

nop

bl 指令可以保存执行完函数地址

bl bunfly

mov r1,#3      // 如果使用b 指令将不会继续执行mov 指令,直接跑非程序,bl 可解决

//现在我们有一个bunfly函数

bunfly:

add r0,r1, r2

mov pc,lr  // 固定格式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: