关于SWI指令切换模式

来源:互联网 发布:黑客攻防编程解析pdf 编辑:程序博客网 时间:2024/06/10 15:39

        AREA    vectors,CODE,READONLY

 

        ENTRY

 

vector

       ldr PC,Reset_Addr                            //将程序地址写入PC;ldr PC,[pc, #offset to literal pool]

       ldr PC,Undef_Addr

       ldr PC,SWI_Addr

       ldr PC,Pref_Addr

       ldr PC,Abort_Addr

       ldr PC,IRQ_Addr

       ldr PC,FIQ_Addr

 

Reset_Addr  DCD Reset_Handler           //文字库

Undef_Addr  DCD Undefined_Handler

SWI_Addr    DCD SWI_Handler

Pref_Addr    DCD Prefetch_Handler

Abort_Addr  DCD Abort_Handler

IRQ_Addr    DCD IRQ_Handler

FIQ_Addr    DCD FIQ_Handler

 

 

 

start

         bReset_Handler

Undefined_Handler

         bUndefined_Handler

SWI_Handler

 

SoftwareInterrupt

       LDR  R0,[LR,#-4]                     //将swi的程序指令给R0

       BIC   R0,R0,#0xFF000000       //将高八位清零,剩下的就是swi 后面的数据(中断号)

       CMP     R0, #3

       LDRLO   PC, [PC, R0, LSL #2]  

       bx   lr             

 

SwiFunction

 

        DCD     function0     ;0

 

        DCD     function1     ;1

 

        DCD     function2     ;2

function0

 

        movs  r1,#10

bx  lr

 

function1

        movs  r2,#10

bx  lr

 

function2

        movs  r3,#10

bx  lr                                            //跳转到SWI指令行的下一条指令,lr 保存的是程序发生异常时的下一条指令的地址

 

 

Prefetch_Handler

         bPrefetch_Handler

Abort_Handler

         b Abort_Handler

nop                                              ;/* Reserved vector */ 

IRQ_Handler

         bIRQ_Handler

FIQ_Handler

        bFIQ_Handler

 

 

 

注意:一定要确保程序的起始地址从0x0开始,可以通过设置“Options For Target”中link的起始地址

 

 

 

 

原创粉丝点击