切换工作模式 处理软中断
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;
}
}