在ARM架構中,異常向量表是一組固定位置的記憶體地址,它們包含了處理器在遇到異常時需要跳轉到的處理程式的入口地址。每個異常型別都有一個對應的向量地址。當異常發生時,處理器會自動跳轉到對應的向量地址,並開始執行例外處理程式。
ARM處理器的異常向量表位於記憶體的低地址空間。具體地址如下:
異常型別 | 向量地址 |
---|---|
復位(Reset) | 0x00000000 |
未定義指令(Undefined Instruction) | 0x00000004 |
軟體中斷(SWI) | 0x00000008 |
預取指令異常(Prefetch Abort) | 0x0000000C |
資料異常(Data Abort) | 0x00000010 |
保留(Reserved) | 0x00000014 |
外部中斷(IRQ) | 0x00000018 |
快速外部中斷(FIQ) | 0x0000001C |
在ARM組合開發中,我們需要在程式開始時初始化異常向量表。初始化過程包括將每個向量地址設定為對應的例外處理程式的入口地址。這通常通過將例外處理程式的地址儲存在向量表中的相應位置來完成。
以下是一個初始化異常向量表的範例程式碼:
AREA Vectors, CODE, READONLY
; 復位向量
LDR PC, Reset_Addr
; 未定義指令向量
LDR PC, Undefined_Addr
; 軟體中斷向量
LDR PC, SWI_Addr
; 預取指令異常向量
LDR PC, Prefetch_Abort_Addr
; 資料異常向量
LDR PC, Data_Abort_Addr
; 保留向量
NOP
; 外部中斷向量
LDR PC, IRQ_Addr
; 快速外部中斷向量
LDR PC, FIQ_Addr
; 例外處理程式地址
Reset_Addr DCD _start
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Prefetch_Abort_Addr DCD Prefetch_Abort_Handler
Data_Abort_Addr DCD Data_Abort_Handler
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
在這個範例中,我們首先使用AREA
指令定義一個名為Vectors
的程式碼段。接下來,我們將每個異常向量設定為對應的處理程式地址。例如,對於軟體中斷(SWI),我們將其向量地址設定為SWI_Handler
。
在向量表的末尾,我們使用DCD
指令定義每個例外處理程式的入口地址。這些地址將在處理器遇到異常時被載入到程式計數器(PC)暫存器,從而實現例外處理的跳轉。
以下是一個簡單的範例程式碼,演示瞭如何使用異常向量表處理軟體中斷(SWI):
; 初始化異常向量表
AREA Vectors, CODE, READONLY
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Abort_Addr
LDR PC, Data_Abort_Addr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
Reset_Addr DCD _start
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Prefetch_Abort_Addr DCD Prefetch_Abort_Handler
Data_Abort_Addr```assembly
DCD Data_Abort_Handler
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
; 主程式
AREA Main, CODE, READONLY
_start
; 觸發軟體中斷
SWI 0
; 例外處理程式
AREA Handlers, CODE, READONLY
Undefined_Handler
B Undefined_Handler
SWI_Handler
; 在此處編寫軟體中斷處理程式
; ...
; 返回到主程式
MOV PC, LR
Prefetch_Abort_Handler
B Prefetch_Abort_Handler
Data_Abort_Handler
B Data_Abort_Handler
IRQ_Handler
B IRQ_Handler
FIQ_Handler
B FIQ_Handler
在這個範例中,我們首先初始化異常向量表,然後在_start
標籤下的主程式中觸發一個軟體中斷(SWI)。當軟體中斷髮生時,處理器會自動跳轉到SWI_Handler
例外處理程式。
在SWI_Handler
中,你可以編寫相應的處理程式碼。處理完成後,使用MOV PC, LR
指令返回到主程式。
需要注意的是,這個範例僅用於演示異常向量表的基本概念和用法。在實際開發中,你可能需要根據具體的硬體平臺和需求進行相應的調整和優化。
本節我們介紹了ARM處理器的異常向量表,包括其位置、初始化過程以及如何使用異常向量表處理異常。通過學習本節內容,你應該對ARM組合開發中的例外處理有了基本的瞭解。在之後的學習中,你可以更深入地探討各種異常型別以及如何編寫高效、穩定的例外處理程式。
推薦閱讀:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g