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

相关推荐
JT灬新一18 小时前
ARM驱动学习之5 LEDS驱动
arm开发·单片机·学习
机器未来1 天前
基于FPGA的SD卡的数据读写实现(SD NAND FLASH)
arm开发·嵌入式硬件·fpga开发
JT灬新一1 天前
ARM驱动学习之4小结
linux·arm开发·学习
JT灬新一2 天前
ARM驱动学习之21_字符驱动
arm开发·学习
大专生学编程2 天前
树莓派交叉编译
linux·arm开发
洛寒瑜2 天前
【读书笔记-《30天自制操作系统》-18】Day19
c语言·开发语言·汇编·笔记·学习·操作系统·文件读取
大山很山2 天前
关于单片机的【汇编指令系统】
汇编·单片机
看星星的派大星3 天前
通过 汇编 分析 结构体
linux·汇编
xiaozhiwise3 天前
ARM 全局变量更换基址寄存器
汇编
Q行天下3 天前
x86的Docker环境下载ARM版容器镜像
arm开发·docker·容器