您的位置:首页 > 其它

操作影响cpsr的条件码的指令(teq等),与影响关系

2017-11-20 17:50 288 查看
1. 简介算术逻辑运算指令:(ADD、ADC、SUB、SBC、RSB、RSC、AND、ORR、EOR、BIC)完成常 用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中。
当这些指令后面加了S(如ADDS时),指令同时更新CPSR中的相应条件标志位。
比较指令 (CMP、CMN、TST、TEQ)不保存运算结果,只更新CPSR中相应的条件标志位。
它们总是会影响CPSR条件标志位.

2、CPSR格式及说明:
其中CPSR寄存器中保存程序在当前运行状态时cpu的运行状态, 包括了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为 SPSR (备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用 SPSR 来恢复 CPSR 。由于用户模式和系统模式不是异常中断模式,所以他没有 SPSR 。当用户在用户模式或系统模式访问 SPSR ,将产生不可预知的后果。CPSR 格式如下所示(SPSR和CPSR格式相同)。


(1).条件码标志:N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。条件码标志各位的具体含义如下表所示:
标志位含义
N当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零
ZZ=1表示运算的结果为零,Z=0表示运算的结果非零。
C可以有4中方法设置C位:
-加法运算(包括CMP):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0
-减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1
-对于包含移位操作的非加/减运算指令,C为移出值的最后一位
-对于其它的非加/减运算指令,C的值通常不会改变
V可以有2种方法设置V的值:
-对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
-对于其它的非加/减运算指令,V的值通常不会改变
Q在ARM V5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。同样的spsr的bit[27]位也称为q标识位,用于在异常中断发生时保存和恢复CPSR中的Q标识位。在ARM V5以前的版本及ARM V5的非E系列的处理器中,Q标志位无定义
在ARM状态下,绝大多数的指令都是有条件执行的;在THUMB状态下,仅有分支指令是条件执行的
(2).控制位:CPSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行于特权模式时,这些位也可以由程序修改。
标志位含义
IIRQ中断禁止位。置1时,禁止IRQ中断
FFIQ中断禁止位。置1时,禁止FIQ中断
T该位反映处理器的运行状态。当该位为1时,程序运行于THUMB状态,否则运行于ARM状态。该信号反映在外部引脚TBIT上。在程序中不得修改CPSR中的TBIT位,否则处理器工作状态不能确定。
M4-M0这几位是模式位,这些位决定了处理器的运行模式
位模式含义表:


CPSR寄存器控制位设置方法:
其中cpsr_c代表的是这32位中的低8位,也就是控制位
当你看到有些程序里这样写
msr cpsr_c 0xd2 使用0xd2做为值来修改cpsr,但只修改cpsr的控制位。也就是[5:7]位。

APSR(CPSR)与condition的关系图:



条件码可以加在指令中(上表中的Mnemonic extension),做为条件判断执行,类似C语言中的if语句。
例:
b指令加上条件码, BEQ label ( 注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值 由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展 为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。
表示当之前的某条指令导致的条件码z=1是,跳转到label处执行。
只要条件码z不发生改变,就可以一直使用这种条件码,比果这条指令后又跟了几条
bicne r0, r0, #0x1f 表示如z==0, 将r0的[0:4]位清空。
orrne r0, r0, #0x13 表示如z==0, 将r0位或上0x13后的值设到r0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: