下面几段小程序是在学习ARM指令应用是记下的。感觉比较经典,做一下整理。
1.长跳转(为了实现arm 4GB范围的跳转,三级流水)
START ;主程序体
。。。
ADD LR,PC,#4
CALL_SUB LDR PC,[PC,#-4]
DCD FUNCTION
RETURN 。。。
FUNCTION 。。。
MOV PC,LR
2.多路跳转(在多个处理程序中进行选择)
START :主程序体
。。。
LDR R0, [R1] ;从【R1】I/O地址读索引号
CMP R0,MAXINDEX
LDRL PC,[PC,R0,LSL#2]
B INDEXOUTOFLANG
DCD HANDLER0
DCD HANDLER1
DCD HANDLER2
。。。
3.子程序的进入和退出
X_FUNCTIONG
STMFD R13!,{R4-R12,R14}
。。。
LDMFD R13!,{R4,R12,PC}^
4.软中断
SWIHANDLER
STMFD SP!,{R0,R3,R12,LR}
MRS R0,SPSR_SVC
TST R0,#0X20 :测试cpsr【T】位
LDRNEH R0,[LR,#-2]
BICNE R0,#0XFF00
LDREQ R0,[LR,#-4]
BICNE R0,#0XFF000000
CMP R0,#MAX_SWI
LDRLS PC,[PC,R0,LSL #2]
B SWI_OUT_RANGE
DCD DO_SWI_0
5.IRQ响应
IRQHANDLER
SUB R14,R14,#4
STMFD R13!,{R12,R14}
MRS R12,SPSR_IRQ
STMFD R13!,{R12}
MOV R12,#INTBASE
LDR R12,[R12,#INTLEVER]
MRS R14,CPSR
BIC R14,R14,#0X80 ;设置CPSR[I]为0 即允许irq嵌套
MSR CPSR_C,R14
LDR PC,[PC,R12,LSL #2]
NOP ;站位符 因为三级流水
DCD PRIORITY_0_HANDLER
6.数据/指令预取中止
ABTHANDLER
SUB LR,LR,#4 ;数据访问中止此处立即数为#8
STMFD SP!,{RIGLIST,LR}
。。。
LDMFD SP!,{RIGLIST,PC}^