ARM汇编语言(6) ARM处理器模式及CPSR

时间:2021-09-23 12:34:00

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中的数据格式如下:

ARM汇编语言(6) ARM处理器模式及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的范围是
                      ARM汇编语言(6) ARM处理器模式及CPSR

当n=8时,可表示的有符号数的范围为-128~+127;当n=16时,可表示的有符号数的范围为 -32768~+32767。两个有符号数进行加减运算时,

如果运算结果超过可表示的有符号数的范围时,就会发生溢出,使计算机结果出错。很显然,溢出只 能出现在两个同号数相加或两个异号数

相减的情况。

判断是否溢出的意义是什么?

判断是否溢出,即判断有符号数的运算结果是否正确,如果发生溢出,则结果是不正确的,如果没有溢出,结果才是正确的。

那么,发生溢出的情况下?处理器又会对结果做什么处理呢?

类似问题的文章,值得学习:http://www.embedu.org/Column/Column182.htm



模式标识位:

ARM汇编语言(6) ARM处理器模式及CPSR


ARM汇编语言中的条件码

ARM汇编语言(6) ARM处理器模式及CPSR

条件码与条件码标识位的关系:

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:

如何分析?


问题卡在这,需要先学习了解有符号数补码计算时的溢出判定问题?