ARM体系架构支持7种处理器模式:
User:Normal program execution mode
FIQ:Supports a high-speed data transfer or channel process
IRQ:Used for general-purpose interrupt handling
Supervisor:A protected mode for the operating system
Abort:Implements virtual memory and/or memory protection
Undefined:Supports software emulation of hardware coprocessors
System:Run privileged operating system tasks(ARMv4 and above)
参考ARM嵌入式系统开发---软件设计与优化(Chapter2.2.1)
数据访问终止模式(Abort):当处理器访问存储器失败时,进入数据访问终止模式;
中断模式、快速中断模式
管理模式:处理器复位后,进入管理模式,操作系统内核也通常处于这种模式;
系统模式:特殊的用户模式,允许对CPSR的完全读写访问;
未定义模式:当处理器遇到没有定义的指令或者处理器不支持该指令时,就进入未定义模式;
用户模式:运行应用程序;
CPSR中的数据格式如下:
CPSR在所有的处理器模式中都可以访问,其中包含条件码标识,中断禁止位,当前处理器模式,其它的状态和控制信息
每一种异常模式都有一个SPSR寄存器,在相关异常发生时,SPSR用来保存CPSR中的值
N:Is set to bit 31 of the result of the instruction. If this result is regarded as a two's complement signed integer, then N = 1 if the result is negative and N = 0 if it is positive or zero.
N:指令执行完毕后,将指令执行结果的第31位用来给该位赋值,将结果看做是二进制补码有符号整数,如果结果是负值,则N为1,如果结果是正值或者0,则N为0;
Z:Is set to 1 if the result of the instruction is zero (this often indicates an equal result from a comparison), and to 0 otherwise.
Z:如果指令执行的结果是0,则该位设置为1,否则设置为0;
C:Is set in one of four ways:
• For an addition, includingthe comparison instruction CMN, C is set to 1 if the addition produced a carry (that is, an unsigned overflow), and to 0 otherwise.
• For a subtraction, including the comparison instruction CMP, C is set to 0 if the subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise.
• For non-addition/subtractions that incorporate a shift operation, C is set to the last bit shifted out of the value by the shifter.
• For other non-addition/subtractions, C is normally left unchanged (but see the individual instruction descriptions for any special cases).
C:四种方式设置:
(1)加法操作,包括比较指令CMN,如果产生进位(无符号溢出),C设置为1,否则设置为0;
(2)减法操作,包括比较指令CMP,如果产生借位(无符号下溢),C设置为0,否则设置为1;
(3)非加/减法操作,包括移位操作,C设置为移出位的最后一位;
(4)其它非加/减操作,C不改变;
V:Is set in one of two ways:
• For an addition or subtraction, V is set to 1 if signed overflow occurred, regarding the operands and result as two's complement signed integers.
• For non-addition/subtractions, V is normally left unchanged (but see the individual instruction descriptions for any special cases).
V:两种方式设置:
(1)加/减法操作,将操作数和指令执行结果视作二进制补码有符号整数,如果发生溢出,则设置为1,否则设置为0;
(2)非加/减法操作,V不改变;
溢出的判断:
如果计算机的字长为n位,n位二进制数的最高位为符号位。其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是
当n=8时,可表示的有符号数的范围为-128~+127;当n=16时,可表示的有符号数的范围为 -32768~+32767。两个有符号数进行加减运算时,
如果运算结果超过可表示的有符号数的范围时,就会发生溢出,使计算机结果出错。很显然,溢出只 能出现在两个同号数相加或两个异号数
相减的情况。
判断是否溢出的意义是什么?
判断是否溢出,即判断有符号数的运算结果是否正确,如果发生溢出,则结果是不正确的,如果没有溢出,结果才是正确的。
那么,发生溢出的情况下?处理器又会对结果做什么处理呢?
类似问题的文章,值得学习:http://www.embedu.org/Column/Column182.htm
模式标识位:
ARM汇编语言中的条件码
条件码与条件码标识位的关系:
1、Z:如果指令的计算结果为0,则Z置位,否则Z位为0
即减法指令时,两个值相等,Z为1,否则Z为0,对应于EQ,NE
2、C:C位同时有几种解释:
加法:无符号数溢出,设置1,无溢出,设置为0,对应于CS,CC
减法:无符号数下溢,即借位,设置为0,无下溢,设置为1,下溢的概念不易理解,可以假设为A减去B,当A大于等于B时,自然不会产生借位,只有当A小于B时,才会产生借位,即大于等于(HS)时设置为1,小于(LO)时设置为0;
3、N:这个比较容易理解,指令的结算结果被认为是一个32位的有符号数,最高位就是符号位,符号位1,表示负数,此时N为1,符号为0,表示正值或者0,即N的值总是与符号位一致,因此MI时N为1,PL时N为0;
4、V:这个也比较容易理解,加法、减法时,将两个操作数都视作是有符号数,结果也视作是有符号数,如果发生溢出,溢出包括两种,上溢出和下溢出,就设置为1,否则设置为0,因此VS时,V设置为1,VC时,设置为0;
只不过目前,有符号数补码计算的溢出判定还没了解?
5、Z、C:
Z=0,C=0:Z=0表示减法,两个数值不等,C=0表示减法,小于,即无符号数小于,这种组合没有意义;
Z=0,C=1:Z=0表示减法,两个数值不等,C=1表示减法,大于等于,取交集即无符号数大于(不包含等于,这就是与单纯C的区别),即HI;
Z=1,C=0:Z=1表示减法,两个数值相等,C=0表示减法,小于,此时两个条件取交集没有关系或者矛盾,取或运算,则小于等于,即LS;
Z=1,C=1:Z=1表示减法,两个数值相等,C=1表示减法,大于等于,取交集交集,即无符号数等于,这与单纯Z没区别,没意义;
6、N、V:
N=0,V=0:N=0表示减法,非负值,大于等于,V=0表示有符号数,减法未溢出,大于等于,取交集,即有符号数大于等于,即GE;
N=0,V=1:N=0表示减法,非负值,大于等于,V=1表示有符号数,减法溢出,小于,取交集为空;
N=1,V=0:N=1表示减法,负值,即小于,V=0表示有符号数,减法未溢出,即大于等于,取交集为空;
N=1,V=1:N=1表示减法,负值,即小于,V=0表示有符号数,减法溢出,即小于,取交集为小于?
似乎有问题?
有符号数加、减法的溢出不是进位或者借位,此处似乎是按照这个理解了,所以才出现的问题?如何解决?
注意区分溢出和借位,二者完全不同,溢出针对有符号数,而借位针对的是无符号数
有符号数可能发生溢出的情况:
正数加上正数,负数加上负数,正数减去负数,负数减去正数
有符号数绝对不会发生溢出的情况:
正数减去正数,负数减去负数,正数加上负数,负数加上正数
如何分析下面的组合呢?
N=0,V=0:
N=0,V=1:
N=1,V=0:
N=1,V=1:
如何分析?
7、N、Z、V:
N=0,Z=0,V=0:
N=0,Z=0,V=1:
N=0,Z=1,V=0:
N=0,Z=1,V=1:
N=1,Z=0,V=0:
N=1,Z=0,V=1:
N=1,Z=1,V=0:
N=1,Z=1,V=1:
如何分析?
问题卡在这,需要先学习了解有符号数补码计算时的溢出判定问题?