利用栈实现软中断


ARM ;下面的指令全是ARM指令,不要顶格
AREA     |.text|,CODE,READONLY   ;代码区
ENTRY   ;程序入口
PRESERVE8   ;8字节对齐


IMPORT myadd
IMPORT mysub

_START
B RESET
LDR PC, UDEF_ADDR
LDR PC, SWI_ADDR
LDR PC, PEBT_ADDR
LDR PC, DATA_ADDR
NOP
LDR PC, IRQ_ADDR
LDR PC, FIQ_ADDR

UDEF_ADDR DCD UDEF_HANDLER
SWI_ADDR DCD SWI_HANDLER
PEBT_ADDR DCD PEBT_HANDLER
DATA_ADDR DCD DATA_HANDLER
DCD 0
IRQ_ADDR DCD IRQ_HANDLER
FIQ_ADDR DCD FIQ_HANDLER


UDEF_HANDLER B UDEF_HANDLER
SWI_HANDLER
STMFD SP!,{R0 - R12,LR} ;LDR R3, [LR,#-4] 将r0-r12和LR放到栈里
LDR R3, [LR,#-4] ;SUB R3,LR,#4 ;LDR R3, [R3]   软中断下需要偏移4
BIC R3, R3,#0XFF000000 ; 位清零
BL SWITCH_CASE

MVN R0, #0X0 ; 0取反为-1
LDMFD SP!,{R0 - R12,PC}^ ;加^恢复寄存器中的状态位
PEBT_HANDLER B PEBT_HANDLER
DATA_HANDLER B DATA_HANDLER
IRQ_HANDLER B IRQ_HANDLER
FIQ_HANDLER B FIQ_HANDLER


RESET ;上电复位直接进入reset模式
LDR SP, =SVC_STACK ;初始化
MRS R0, CPSR ;将状态寄存器读出,获得进入异常前的处理器状态
AND R0, #0XFFFFFFE0 ;将后5位清零
ORR R0, #0X10 ;设置为user模式,10000
MSR CPSR_fxsc, R0 ;重新写回,将修改后的值写回 CPSR寄存器的对应控制域
LDR SP, =USR_STACK

MOV R1, #5
MOV R2, #3
SWI 1
MOV R7, #0XFF
SWI 2
MOV R8, #0XFE
SWI 6
B STOP


SWITCH_CASE
CMP R3, #1
STMFDEQ SP!,{R0 - R3,LR} ;相等的时候才入栈
MOV R0,#8
MOV R1,#5
BLEQ myadd ;跳转到c语言函数
LDMFDEQ SP!,{R0 - R3,PC}

CMP R3, #2
STMFDEQ SP!,{R0 - R3,LR}
MOV R0,#8
MOV R1,#5
BLEQ mysub
LDMFDEQ SP!,{R0 - R3,PC}
STOP
B STOP

AREA     |.data|,DATA,READWRITE    ;数据区
SPACE 128
SVC_STACK
SPACE 128
USR_STACK
END    ;后面空一行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值