ARM指令-条件执行及标志位

本文介绍ARM指令集中的条件执行特性及其对性能的影响,包括条件码前缀的使用和如何通过添加“S”来更新条件标志位。此外,还详细解释了CPSR寄存器中条件标志位(NZCV)的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ARM指令条件码前缀的作用:
        ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的。
        这样可以提高代码密度,减少分支跳转指令数目,提高性能;
比如:
    CMP  r3,#0            ---比较r3和0
    BEQ  skip                ---相等就跳到skip
    ADD  r0,r1,r2        ---不相等就执行 r0 = r1 + r2
skip
……
看看加后缀简化后的样子:
    CMP  r3,#0            ---比较r3和0
    ADD NE   r0,r1,r2    ---加了NE后缀,不相等就执行r0 = r1 + r2
    

2.默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
    CMP不需要增加“S”就可以改变相应的标志位。
     1)、什么是标志位?
                即条件码标志位,就是程序执行的条件,每执行完一个指令条件标志位就会改变;
                是前面“ARM寄存器详解“里面讲到的CPSR:
CPSR程序状态寄存器剖析
 1.高4位:NZCV
                N 置1:结果是负数;
                Z  置1:结果是0;
                C  置1:结果完成或借位
                V  置1:结果溢出
     2)、加S怎样影响标志位?
        如:SUB S  r3,r3,#0            ---r3 = r3 - 0
                BEQ      skip                ---如果相等就跳转
            注:这个S的意义是:执行SUB后如果不相等的话,CPSR的Z清0(置1),按照这个条
                件再继续执行下面的。而CMP是默认可以改变标志位的,就不需要加S。

3.处理器如何知道根据指令来更改对应的条件标志位呢?
        这里说的单指数据处理指令,其他指令的话不需要运算就不需要改变CPSR的标志位;
        数据处理指令的机器码格式:
       
  这些是一一对应的:条件码对应指令后缀(写指令的时候需要写出来的)对应标志位;
这是一个针对某个ARM Cortex-M处理器的GPIO控制程序,具体功能是让GPIO B端口的第5、6、7、8、9、10、11、12、13个引脚以1s的间隔不断地交替闪烁。程序代码如下: ``` rPCONB EQU 0x56000010 rPDATB EQU 0x56000014 rPUPB EQU 0x56000018 AREA Init,CODE,READONLY ENTRY ResetEntry ldr r0,=rPCONB ; 将GPIO B端口的控制寄存器地址赋值给R0 ldr r1,=0x15400 ; 将0x15400赋值给R1,表示将第5-13个引脚配置为输出模式 str r1,[r0] ; 将R1的值写入GPIO B端口的控制寄存器中,配置GPIO的工作模式 ldr r0,=rPUPB ; 将GPIO B端口的上拉控制寄存器地址赋值给R0 ldr r1,=0x1E0 ; 将0x1E0赋值给R1,表示将第5-13个引脚配置为上拉模式 str r1,[r0] ; 将R1的值写入GPIO B端口的上拉控制寄存器中,配置上拉电阻 ldr r2,=rPDATB ; 将GPIO B端口的数据寄存器地址赋值给R2 ledloop ldr r1,=0x1E0 ; 将0x1E0赋值给R1,表示将第5-13个引脚的输出电平设置为高电平 str r1,[r2] ; 将R1的值写入GPIO B端口的数据寄存器中,将LED灯点亮 bl delay ; 调用延时函数,等待一段时间 ldr r1,=0x0 ; 将0赋值给R1,表示将第5-13个引脚的输出电平设置为低电平 str r1,[r2] ; 将R1的值写入GPIO B端口的数据寄存器中,将LED灯熄灭 bl delay ; 调用延时函数,等待一段时间 b ledloop ; 跳转到ledloop标签处,继续循环执行 delay ldr r3,=0xffffff ; 将0xffffff赋值给R3,作为循环计数器的初始值 delay1 sub r3,r3,#1 ; 将R3的值减1 cmp r3,#0x0 ; 将R3的值与0x0进行比较 bne delay1 ; 如果R3的值不为0,继续循环执行delay1标签处的指令 mov pc,lr ; 将程序控制权返回到调用者处 END ``` 该程序通过向GPIO B端口的数据寄存器写入高低电平来控制LED灯的状态,使用延时函数来控制LED灯的闪烁速度。由于不同的处理器型号开发环境可能存在差异,因此具体的GPIO控制方法延时函数需要根据实际情况进行调整修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值