關於ARM 彙編的一些疑問:ide
1、ARM 各類模式下都有獨立的R13(R1三、R13_svc、R13_irq......) ,那麼程序在發生異常時是如何操做堆棧的呢?例如從用戶模式跳到IRQ。。spa
進入IRQ時是將寄存器壓入到R13_irq指向的堆棧空間,從IRQ模式返回時從R13_irq指向的堆棧空間彈出寄存器的值。it
2、R14在程序發生轉移的時候狀態如何變化class
BL指令在轉移到子程序執行以前,將其下一條指令的地址拷貝到R14寄存器中。軟件
對於異常中斷來講因爲各類異常中斷響應的過程不一樣,所以保存在LR中的地址是不一樣的。大多數狀況是LR=PC-8。因此各中斷返回時的指令也不同,指令以下:硬件
異常類型 模式 中斷向量 返回指令 程序進入異常時LR值程序
未定義指令 未定義 0x00000004 MOVS PC, R14_und LR = PC-4數據
軟件中斷 SVC(管理) 0x000000008 MOVS PC, R14_svc LR= PC-4異常
取指停止 abt(停止) 0x00000000c SUBS PC, R14_abt, #4 LR = PC -8margin
數據停止 abt 0x000000010 SUBS PC, R14_abt, #4 LR = PC - 8
IRQ中斷 IRQ 0x000000018 SUBS PC, R14_irq, #4 LR = PC - 8
FIQ中斷 FIQ 0x00000001c SUBS PC, R14_fiq, #4 LR = PC -8
3、CPSR在程序發生跳轉,和中斷的時候狀態如何變化。
程序發生跳轉的時候CPSR不會自動的被保存,而程序發生異常時例如從用戶模式跳到IRQ模式時硬件自將CPSR的值拷貝到SPSR_irq中。中斷返回時自動由硬件把SPSR_irq的值恢復到CPSR。
4、當前執行的指令與PC的關係 ARM7爲三級流水線結構因此
ARM模式下 PC值=當前執行的指令位置+8。
THUMB模式: PC值=當前執行的指令位置+4。
未定義異常發生後處理器響應過程以下
一、把下一條指令的地址拷貝給LR(當前執行的指令爲PC-8,因此LR=PC-4)
二、把程序狀態寄存器CPSR拷貝給SPSR_und
三、強制進入未定義模式
四、強制進入ARM狀態
五、跳轉到PC=0x00000004處執行
六、禁止IRQ中斷。
軟件中斷異常發生後處理器響應過程以下
一、把下一條指令的地址拷貝給LR(當前執行的指令爲PC-8,因此LR=PC-4)
二、把程序狀態寄存器CPSR拷貝給SPSR_svc
三、強制進入管理模式
四、強制進入ARM狀態
五、跳轉到PC=0x00000008處執行
六、禁止IRQ中斷。
取指停止異常發生後處理器響應過程以下
一、把中斷時PC的值拷貝給LR(LR=PC)
二、把程序狀態寄存器CPSR拷貝給SPSR_abt
三、強制進入停止異常模式
四、強制進入ARM狀態
五、跳轉到PC=0x0000000C處執行
六、禁止IRQ中斷。
數據停止異常發生後處理器響應過程以下
一、把中斷時PC的值拷貝給LR(LR=PC)
二、把程序狀態寄存器CPSR拷貝給SPSR_abt
三、強制進入停止異常模式
四、強制進入ARM狀態
五、跳轉到PC=0x00000010處執行
六、禁止IRQ中斷。
IRQ異常發生後處理器響應過程以下
一、把中斷時PC的值拷貝給LR(LR=PC)
二、把程序狀態寄存器CPSR拷貝給SPSR_irq
三、強制進入IRQ模式
四、強制進入ARM狀態
五、跳轉到PC=0x00000018處執行
六、禁止IRQ中斷。
FIQ異常發生後處理器響應過程以下
一、把中斷時PC的值拷貝給LR(LR=PC)
二、把程序狀態寄存器CPSR拷貝給SPSR_fiq
三、強制進入FIQ模式
四、強制進入ARM狀態
五、跳轉到PC=0x00000018處執行
六、禁止IRQ中斷。
七、禁止FIQ中斷。