ARM 汇编比较指令-条件执行指令

比较指令用来比较两个数大小,或者是否相等,比较指令的运算结果会影响CPSR寄存器的N\Z\C、V标识位,具体的标志位可以参考前面的CPSR寄存器介绍,比较指令的格式如下/

CMP {cond} Rn, operand2 比较两个数大小

CMN {cond}Rn, operand2 取负比较

比较指令的使用示例及说明如下。

CMP R1, #10

CMP R1,R2

CMP R0, #1

比较指令的运行结果Z=1时,表示运算结果为0,两个数相乘,N=1表示运算结果为负,N=0 表示运算结果为非负,即运算结果为正或者为零。

3.2.6 条件执行指令

为了提高代码密度,减少ARM指令的数量, 几乎所有的ARM指令都可以根据CPSR寄存器中的标识为,通过指令组合实现条件执行,如无条件跳转指令B,我们呢可以在后面加上条件码组成BEQ,BNE组合指令,BEQ指令表示两个数比较,结果相等时跳转;BNE指令则表示结果不想等时跳转,CPSR寄存器中的标识位根据需要可以任意搭配成不同的条件码,和ARM指令一起组合使用,ARM指令的条件码如表3-3所示。

表 3-3 ARM指令的条件码

|-------|----------|-----------|-----|----------|-----------|
| 条件码 | CPSR 标识位 | 说明 | 条件码 | CPSR标志位 | 说明 |
| EQ | Z=1 | 相等 | HI | C置位,Z清零 | 无符号数大于 |
| NE | Z=0 | 不相等 | LS | C清零,Z置位 | 有符号数小于或等于 |
| CS/HS | C=1 | 无符号数大于或等于 | GE | N=V | 有符号数大于或等于 |
| CC/LO | C=0 | 无符号数小于 | LT | N!=V | 有符号数小于 |
| MI | N置位 | 负数 | GT | Z清零,N=V | 有符号数大于 |
| PL | N清零 | 整数或零 | LE | Z置位,N!=V | 有符号数小于或等于 |
| VS | V置位 | 溢出 | AL | 忽略 | 无条件执行 |
| VC | V清零 | 未溢出 | NV | 忽略 | 从不执行 |

条件执行经常出现在跳转或循环的程序结构中。如下面的汇编程序,通过循环结构,我们可以实现数据块搬运功能,我们可以将无条件跳转指令B和条件码NE组合在一起使用。构成一个循环程序结构。

AREA COPY,CODE,READONLY

Entry

START

LDR R0, =SRC

LDR R1, =DST

MOV R2, #10

LOOP

LDR R3,[R0] #4

STR R3, [R1], #4

SUBS R2, R2, #1

BNE LOOP

AREA COPYDATA, DATA, READWRITE

SRC DCD 1,2,3,4,5,6,7,8,9,0

DST DCD 0,0,0,0,0,0,0,,0,0,0,0

END

相关推荐
szxinmai主板定制专家3 小时前
一种基于 RK3568+AI 的国产化充电桩安全智能交互终端的设计与实现,终端支持各种复杂的交互功能和实时数据处理需求
arm开发·人工智能·嵌入式硬件·安全
szxinmai主板定制专家4 小时前
基于 ZYNQ ARM+FPGA+AI YOLOV4 的电网悬垂绝缘子缺陷检测系统的研究
arm开发·人工智能·嵌入式硬件·yolo·fpga开发
日更嵌入式的打工仔1 天前
汇编与反汇编
汇编
全栈工程师修炼日记2 天前
ARM TrustZone技术如何守护你的隐私
arm开发·trustzone·安全世界·非安全世界
m0_631274363 天前
嵌入式八股文-ARM
arm开发
aitav03 天前
⚡ arm 32位嵌入式 Linux 系统移植 QT 程序
linux·arm开发·qt
驱动探索者3 天前
linux 学习平台 arm+x86 搭建
linux·arm开发·学习
上园村蜻蜓队长5 天前
ARM芯片架构之coresight 时间戳组件介绍
arm开发·架构
学不动CV了5 天前
C语言(FreeRTOS)中堆内存管理分析Heap_1、Heap_2、Heap_4、Heap_5详细分析与解析(二)
linux·c语言·arm开发·stm32·单片机·51单片机
oioihoii6 天前
从汇编角度看C++优化:编译器真正做了什么
java·汇编·c++