arm指令集分支指令
2015-12-29 17:16
197 查看
分支指令
B : 分支
(Branch)
B{条件} <地址>
B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。注意存储在分支指令中的实际的值是相对当前的 R15 的值的一个偏移量;而不是一个绝对地址。它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(+/- 32 M)。
条件:
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
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 // 固定格式
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 // 固定格式
相关文章推荐
- Python 1.2 中的字符串和编码
- dbms_job不能自动执行
- 华为s9303开启snmp(转载)
- C#中this关键字的使用
- VMware LAN区段配置后无法ping通
- Elasticsearch学习笔记(二)单节点准实时索引的实现
- 安装win7 ubuntu双系统
- MUI 页面传值 webview
- 【HDOJ】2155 小黑的镇魂曲
- [转载]华为交换机配置命令解释
- nginx与Elasticsearch结合使用
- HDOJ 1049-Climbing Worm【数学】
- 49.Android 各种Span
- 聊天室的实现(消息实时刷新)
- rgb32编程写为bmp文件
- Oracle 11.2.0.4 RAC上调整SCAN 及 遇到的问题 on Oracle Linux 6
- 有用吧? 写了个比sqrtf()快一倍的sqrt()函数
- android实例开发之公交查询笔记(一)
- STM32之keil MDK下建立第一个工程
- JAVA序列化的总结