SPSR与CPSR是一样的只不过是特殊模式下独自的"CPSR",与通用寄存器一样
ARMv4架构的CPSR寄存器
前4位(高4位):是运算产生的状态,N(负或小于状态),Z(0状态),C(进位或借位拓展),V(溢出标志)
后8位(低8位):
后5位是模式位,32中情况,可以区分32种模式,而ARM中只有7种模式,为了以后拓展用的,根据这几位来确定此时处于什么模式下
后5位模式对应表:10000 用户模式,10001快速中断模式,等等
模式位不能主动去修改,如果写后5位,就会实现模式切换,开机时是管理模式,要切换到系统模式,然后再切换到用户模式
其余3位,是8位是中断禁止位(开机时禁止的,1是禁止位),7位快速中断禁止位(开机时禁止的,1是禁止位),6位指令集状态位(Thumb(1)/ARM(0),默认是32位的)
其余是保留位
汇编指令:
一条完整汇编包含4方面内容:
1.指令:mov(赋值),add(加),b(跳转)
2.操作对象
3.伪指令:.text;.globel start;.code 32
4.label(符号),标记当前位置的地址,例如start:
指令格式:
mov{cond}{S} <Rd>,<shifter_operand>
cond:允许添加的条件,条件一定要紧接着mov这个助记符,条件指的是只有条件满足的情况下才会运行这条指令,否则不运行这条指令
S:该标志是更新CPSR寄存器;例如:sub r0,r1,r2如果r0位运算后为负数,此时如果是subs的话,就会把CPSR寄存器的第31位置成1
Rd:指的就是寄存器
shifter_operand:①#立即数;②寄存器;③寄存器移位形式:<Rm>,LSL #<shift_num>:例如ADD R1,R2,R3, LSL #3 //R3逻辑左移3位得到的新的值与R2相加保存到R1里
例如:
c语言,if(r0=0){r1++;}等价的汇编如下:
cmp r0,#0
addeq r1,r1,#1 //这里表eq就是相等的条件,这条指令的意思就是如果r0等于0,就执行r1=r1+1
补充:
1.ne是不等的条件
2.cond没有的情况下是always,是隐藏的,就是永远满足的条件,永远可以执行
其余还有12种,可以百度一下
ARM支持5种移位:LSL(logical shift left),LSR(logical shift right),ASR(算数右移,arithmetical shift right,右移补位用符号位补位,所以右移之前是负数,移完之后还是负数),ROR(ROtate Right循环右移,从低位移出,再从高位移入),RRX(扩展循环右移)