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 ;后面空一行