1. 程式人生 > >ARM組合語言指令(1)

ARM組合語言指令(1)

 
  • Handling Processor Exception
Exception Description
Reset 復位中斷,中斷向量在0x0000
Undefined Instruction un-recognized executing instruction
Software Interrupt(SWI) 使用者中斷,提供了在使用者模式下請求執行監控模式功能的方法,例如呼叫RTOS function
Prefetch Abort 用於地址非法,導致了處理器不能執行取址
Data Abort 到資料傳輸時,loadstore地址非法
IRQ 外部中斷髮生(低電平有效)
FIQ Fast Interrupt Requset發生(低電平有效)
通常情況下,應用運行於使用者模式,但是異常處理需要運行於特權模式(即非使用者模式),異常模式能夠訪問如下暫存器: 該模式下的r13或Stack Pointer(sp_mode) 該模式下的r14或Link Register(lr_mode) 該模式下的Saved Program Status Register(spsr_mode) 在FIQ模式下,還能夠方位r8_FIQ-r12_FIQ。
  • 中斷優先順序
Vector address Exception type Exception mode Priority(1=H, 6=Low)
0x0 Reset Supervisor(SVC) 1
0x4 Undefined Instruction Undef 6
0x8 Software Interrupt(SWI) Supervisor(SVC) 6
0xC Prefetch Abort Abort 5
0x10 Data Abort Abort 2
0x14 Reserved Not application Not application
0x18 Interrupt(IRQ) Interrupt(IRQ) 4
0x1C Fast Interrupt(FIQ)
Fast Interrupt(FIQ) 3
  • 進入異常處理
將CPSR拷貝到SPSR,在SPSR中儲存the current mode,interrupt mask及condition flags。改變CPSR到合適的模式,map in the appropriate banked register for that mode。其它異常發生時,遮蔽IRQ;在FIQ和reset發生時,遮蔽FIQ。將中斷返回地址存入到lr_mode。將PC指向中斷向量表中指定的地址。
  • 基本概念
ARM:Advanced RISC Machines RISC:Reduced Instruction Set Computer(精簡指令集) ARM支援7種處理器模式,正常情況下,程式在使用者模式下執行,當軟體異常或硬體中斷髮生時,進入相應的處理器模式。
處理器模式 說明 Visible Thumb state registers Visible ARM state registers
User使用者 正常程式執行模式 R7..R0, LR, SP, PC, CPSR R14..R0, PC, CPSR
FIQ 支援高速資料傳送或通道處理 R7..R0LR_fiq, SP_fiq, PC, CPSR, SPSR_fiq R7..R0, R14_fiq..R8_fiq, PC, CPSR, SPSR_fiq
IRQ 通用中斷處理 R7..R0LR_irq, SP_irq, PC, CPSR, SPSR_irq R12..R0R14_irq, R13_irq, PC, CPSR, SPSR_irq
Supervisor(svc) 作業系統保護模式 R7..R0LR_svc, SP_svc, PC, CPSR, SPSR_svc R12..R0, R14_svc,R13_svc PC, CPSR, SPSR_svc
Abort 實現虛擬儲存/儲存器保護 R7..R0LR_abt, SP_abt, PC, CPSR, SPSR_abt R12..R0R14_abt, R13_abt, PC, CPSR, SPSR_abt
Undefined 支援硬體輔助計算器的軟體模擬 R7..R0LR_und, SP_und, PC, CPSR, SPSR_und R12..R0R14_und, R13_und, PC, CPSR
System 執行作業系統工作 R7..R0LR, SP, PC, CPSR R14..R0, PC, CPSR
通常情況下,程式執行於使用者模式,如果發生外部中斷IRQ,就進入IRQ處理器模式,這時使用分組暫存器r13_irq和r14_irq,而不是使用r13和r14。R15是程式計數器PC,它指向正在取指的指令而不是正在執行的指令。由於ARM7中的三條流水線,讀取的PC指標,總是比當前執行的彙編程式碼的地址多8。         mov pc, pc 這條指令將使程式跳轉到當前指令的下下條指令(即跳過一條指令)執行程式。         sub, pc, pc, #4 執行的是下一條指令         sub, pc, pc, #8 則是一條死迴圈 R14:當執行帶連結分支的指令BL時,得到R15的副本 R13:作為堆疊指標(SP),通常在BOOT程式裡把R13初始化為指向異常模式分配的堆疊。
對未定義模式堆疊進行初始化 UNDEFMODE                  DEFINE                  0x1b(00011011) MODEMASK                    DEFINE                  0x1f(00001111) NOINT                               DEFINE                  0xc0(11000000) mrs   r0, cpsr                        bic         r0, r0, #MODEMASK                ;cpsr的低4位清零 orr         r1, r0, #UNDEFMODE | NOINT msr        cpsr_cxsf, r1 ldr         sp, =UndefStack                ;把堆疊的位置送給SP      
  ARM處理器支援程式狀態暫存器存取指令,用於程式狀態暫存器和通用暫存器之間交換內容。 MRS:程式狀態暫存器到通用暫存器的資料傳遞指令 MSR:通用暫存器到程式狀態暫存器的資料傳遞指令 由於ARMr14來儲存子程式的返回地址而不需要呼叫堆疊獲得,故ARM的子程式呼叫很快。