转自:http://zqwt.012.blog.163.com/blog/static/1204468420133266206247/
/* set the cpu to SVC32 mode */
mrs r0,cpsr // 把当前程序状态寄存器中的数据拷贝给r0
bic r0,r0,#0x1f // r0和0x1f(00011111)的反码进行位与,目的是给r0的后5位清零
orr r0,r0,#0xd3
/* r0和0xd3 (11010011)进行位或,最后得到r0=11010011,
* 目的是设置r0的后5位为10011,让ARM进入SVC特权模式 */
msr cpsr,r0
/* 把当前r0中保存的CPU的状态拷贝给cpsr,让ARM进入SVC特权模式 */
l MRS {} Rd, CPSR|SPSR
这条指令的意思是将CPSR|SPSR传送到Rd。我们可以使用这两条指令将状态寄存器传送到一般寄存器,只修改该寄存器必要的位,再将结果传送回状态寄存器,这样能够最好地完成对CRSP或SPSR的修改。
MSR {} CPSR_|SPSR_,Rm 或是 MSR {} CPSR_f|SPSR_f,#
MRS和MSR配合使用,作为更新PSR的“读取--修改--写回”序列的一部分
bic r0,r1,r2 ;r0:=r1 and not r2
orr ro,r1,r2 ;r0:=r1 or r2这几条指令执行完毕后,进入SVC32模式,该模式主要用来处理软件中断(SWI)
我们可以在S3C2410x芯片手册中研读这一段文字:
THE PROGRAM STATUS REGISTERS
The ARM920T contains a Current Program Status Register(CPSR), plus five Saved Program Status Registers(SPSRs) for use by exception handlers.
ARM920T具有一个当前程序状态寄存器(CPSR),还有5个保存程序状态寄存器(SPSR)供异常处理程序使用。
These register's functions are:
l Hold information about the most recently performed ALU operation
保存有算术逻辑单元最近的操作
l Control the enabling and disabling of interrupts
控制着开启和关闭中断
l Set the processor operating mode
设置处理器的操作模式
那么,现在我们很容易理解:11010011 表示CPU禁止任何中断、仍处于arm状态、切换到特权模式