本文将为大家分析关于ARM中断宏定义的相关介绍。 MACRO
本文引用地址:https://www.eepw.com.cn/article/201611/319275.htm $HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address) 存贮PC跳转地址
stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
上面是在汇编语言2440vectors.s中的一段完整的宏定义
MACRO相当于c中的#define
而$HandlerLabel 和 $HandleLabel是两个参数,大家注意,第一个参数和第二个参数是不一样的,中间少了个r
而第一个参数在本宏中是一个标号,而第二个函数是一个入口地址
以下有定义:
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
拿HandlerSWI HANDLER HandleSWI说明:把它用宏给替换下来以后是:
$HandlerSWI
1:sub sp,sp,#4 ;decrement sp(to store jump address) 存贮PC跳转地址
2:stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
3:ldr r0,=$HandleSWI ;load the address of HandleXXX to r0
4:ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
5:str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
6:ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
达内培训小提问:
这段宏定义的作用是什么呢?是安装SWI中断,如何安装的呢?
sub sp,sp,#4 是把SP的地址减4字节,而这个地方需要存放跳转地址也就是第5行的HandleSWI指向的内容(ISR)
接下来是压栈所需要的寄存器r0,因为接下来需要使用r0所以先压栈r0,这也是为什么刚刚先把SP加四字节的原因,第6句话就是跳转到刚刚第5句所压栈的地址处,也就是HandleSWI指向的内容(ISR)处
VectorsAddr
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
EXPORT VectorsAddr
Reset_Addr DCD ResetHandler ;第一次地址转换
Undefined_Addr DCD HandlerUndef
SWI_Addr DCD HandlerSWI
Prefetch_Addr DCD HandlerPabort
Abort_Addr DCD HandlerDabort
IRQ_Addr DCD HandlerIRQ
FIQ_Addr DCD HandlerFIQ
评论