点击(此处)折叠或打开
- SWI_Exception:
- STMFD SP!, {R2-R3,LR} //把R2,R3,LR值入栈
- #0号软中断的处理程序
- CMP R0, #0 //将R0和0比较
- //以下4行带EQ条件的代码均为当R0为0时应该执行的语句
- MRSEQ R2, SPSR //把SPSR读入到R2中
- STREQ R2, [R1] /把R2的值存入到[R1]中
- ORREQ R2, R2, #0x80 //把R2的Bit7位置1
- MSREQ SPSR_c, R2 //把R2的值写入到SPSR_c中,即禁止IRQ
- #1号软中断的处理程序
- CMP R0, #1 //比较R0值和1
- LDREQ R2, [R1] //相等则把[R1]中的数据存入R2中
- MSREQ SPSR_c, R2 //相等把R2的值写入到SPSR_c中,恢复IRQ
- #11号软中断的处理程序
- CMP R0, #11 //比较R0的值和11
- MRSEQ R2, SPSR //相等则把SPSR的值转存入到R2中
- BICEQ R2, R2, #0x1F //相等则把R2的Bit0~Bit4全部清零
- ORREQ R2, R2, #Mode_SYS //相等则把R2与#Mode_SYS相与再存入R2
- MSREQ SPSR_c, R2 //相等则把R2的值存入SPSR_c中,即进入系统模式
- #12号软中断的处理程序
- CMP R0, #12 //比较R0的值和12
- MRSEQ R2, SPSR //相等则把SPSR的值存入R2
- BICEQ R2, R2, #0x1F //相等则把R2的Bit0~Bit4清零
- ORREQ R2, R2, #Mode_USR //相等则把R2与#Mode_USR相与再存入R2中
- MSREQ SPSR_c, R2 //相等则把R2存入SPSR_c,即进入用户模式
- LDMFD SP!, {R2-R3,PC} //恢复R2、R3、PC值,返回
- .END //汇编代码段结束