ARM切换工作模式,异常处理

切换工作模式 处理软中断

	preserve8
	area reset, code, readonly
	code32
	entry

	b start	   ;reset
	nop       ;undef
	b deal_swi ;swi
	nop	       ;prefetch abort
	nop		   ;data abort
	nop		   ;reserved
	nop		   ;irp
	nop		   ;fiq
deal_swi
	stmfd sp!,{r4-r12,lr};保护现场
	sub r1,lr,#4 ;记录指向swi #5的地址
	ldr r1,[r0]  ;拿到swi #5的地址指向的值
    bic r0, r1, #(0xff << 24) ;拿到#5这个数
	import c_deal_swi
	bl c_deal_swi
	ldmfd sp!,{r4-r12,pc}^ ;带模式切换的恢复现场
start
    ldr sp, =0x40001000

	mrs r0,cpsr
	bic r0,#0x1f
	orr r0,#0x10
	msr cpsr_c,r0  ;切换工作模式到USER

	ldr sp,=0x40000C00 ;初始化USER模式的栈
	mov r0, #1
	mov r1, #2
	mov r2, #3
	mov r3, #5

	swi #5
	import c_add
	bl c_add
	
	
	nop
	b start
	export asm_add	
asm_add
	stmfd sp!,{r4-r12, lr}   ;保护现场
	add r0, r0, r1
	ldmfd sp!,{r4-r12, pc}   ;恢复现场

	end

 一般r0这个寄存器就是用来传递参数的

注意:切换工作模式就是切换CPSR的mode值,记得初始化栈,每种工作模式栈都不同

ldr r1,[r0]   类似*运算,取[]就是取寄存器里指向的数据的值

MRS 指令用于将程序状态寄存器的内容传送到通用寄存器中。
例:MRS RO,CPSR;传送CPSR 的内容到 RO 
MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。
语法:MSR{条件}程序状态寄存器(CPSR 或SPSR)_<域>,操作数
例:MSR CPSR_c,RO ;传送RO的内容到CPSR,但仅仅修改 CPSR 中的控制位域

swi #5     发生软中断,处理中断类似进程里的信号处理signal

注:#5会被记录
    sub r1,lr,#4 ;记录指向swi #5的地址
    ldr r1,[r0]  ;拿到swi #5的地址指向的值
    bic r0, r1, #(0xff << 24) ;拿到#5这个数

可以根据不同的数,进行中断处理

void c_deal_swi(unsigned int num)
{
	switch(num)
	{
		case 5:
		break;
		default:
		break;
	}
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值