ARM編程模型

原文:http://www.eefocus.com/article/08-08/49601s.html

ARM尋址方式與指令系統
ARM編程模型
ARM指令格式和尋址方式
ARM指令集
Thumb指令集

機器指令、僞指令和宏指令
機器指令:能被處理器直接執行,而僞指令宏和宏指令不能。機器指令包括ARM指令集和Thumb指令集 ;
僞指令:在源程序彙編期間,由彙編編譯器處理。其作用是爲彙編程序完成準備工作;
宏指令:在程序中用於調用宏,宏是一段獨立的程序代碼;在程序彙編時,對宏調用進行展開,用宏體代替宏指令。

ARM處理器模式
ARM微處理器支持7種工作模式:用戶模式、系統模式、快速中斷模式、外部中斷模式、管理模式、中止模式、未定義指令模式。
除用戶模式之外的其餘6種稱爲非用戶模式,或特權模式。
在特權模式中,除系統模式之外的其餘5種稱爲異常模式。
處理器的各種工作模式由當前程序狀態寄存器CPSR的低5位M[4:0]決定。
工作模式切換:
(1)發生異常,處理器自動改變CPSR中M[4:0]的值,進入相應的工作模式;
(2)處理器處於特權模式時,用指令向CPSR的M[4:0]字段寫入特定的值,進入相應的工作模式。
用戶模式時,不能改變工作模式,除非發生異常。

ARM處理器7種工作模式

特權模式

異常模式

 用戶和系統模式

處理器的工作狀態
從編程的角度講,ARM處理器工作在兩種狀態:ARM狀態或Thumb狀態。
(1)ARM狀態:處理器執行32位的ARM指令集時,工作在這種狀態。
(2)Thumb狀態:處理器執行16位的thumb指令集時,工作在這種狀態。
狀態切換:通過跳轉指令實現。

ARM的寄存器組織
37個寄存器:31個通用寄存器,包括程序計數器PC;
6個狀態寄存器。
寄存器均爲32位,分成7組,各工作模式擁有自己的寄存器組,只能訪問自己的寄存器組。
有些寄存器是重疊的,有些是工作模式特有的。
在不同的工作模式和處理器狀態下,程序員可以訪問的寄存器不盡相同。

ARM狀態各模式下的寄存器

ARM寄存器分類

ARM狀態各模式下可以訪問的寄存器

一般的通用寄存器

R0~R7通用寄存器

R8~R14通用寄存器

R8~R12的兩個分組

R13、R14的6個分組

堆棧指針寄存器R13(SP)

鏈接寄存器R14(LR)

 R14(LR)的作用
作用:保存返回地址
例如:
1.程序A執行過程中調用程序B;
2.程序跳轉至標號Lable,執行程序B。同時硬件將“BL Lable”指令的下一條指令所在地址存入R14(LR);
3.程序B執行最後,將R14寄存器的內容放入PC,返回程序A;

程序計數器R15(PC)


程序狀態寄存器CPSR

Thumb寄存器在ARM寄存器上的映射


狀態寄存器
CPSR:當前程序狀態寄存器,可以在任何工作模式下被訪問。
SPSR:程序狀態保存寄存器,只有在異常模式下,才能被訪問;各異常模式擁有自己的SPSR。發生異常時,SPSR保存CPSR的值,格式同CPSR。
狀態標誌:5個,N符號位,Z零標誌,C進位,V溢出位,Q DSP運算溢出位。
控制標誌:4個,I中斷允許,F快速中斷允許,T狀態選擇,M[4:0] 處理器工作模式

條件標誌位

 控制位


異常中斷
異常中斷:處理器由於外部或內部的原因,停止執行當前任務,轉而處理特定的事件,處理完後返回原程序,繼續執行。
當異常發生時,處理器首先自動保存當前狀態,即返回地址存入寄存器R14,當前寄存器CPSR存入SPSR中,接着進入相應的工作模式,並執行特定地址的指令。
ARM共有7種類型的異常,不同類型的異常將導致處理器進入不同的工作模式,並執行不同特定地址的指令。

7種類型異常中斷
復位:復位異常時,處理器立即停止當前程序,進入禁止中斷的管理模式,並從地址0x00000000處開始執行。
未定義指令:當前指令未定義時,便產生未定義指令中斷。
軟件中斷:用戶模式下使用指令SWI時,處理器便產生軟件中斷,進入管理模式,以調用特權操作。
指令預取中止:預取指令的地址不存在,或不允許當前指令訪問時,存儲器會向處理器發出中止信號;預取指令被執行時纔會產生該類異常。
數據訪問中止:數據訪問指令的地址不存在,或不允許當前指令訪問時,產生數據中止異常。
外部中斷請求:外部中斷請求引腳有效,且CPSR中的I位爲0時,產生IRQ異常。
快速中斷請求:快速中斷請求引腳有效,且CPSR中的F位爲0時,產生FIQ異常。

異常向量

異常中斷的優先級

復位
當nRESET信號由低變爲高電平時,ARM處理器執行下列操作:
1. 強制CPSR中的M[4:0]變爲b10011(管理模式);
2. 置位CPSR中的I和F位;
3. 清零CPSR中的T位;
4. 強制PC從地址0x00開始對下一條指令進行取指;
5. 返回到ARM狀態並恢復執行 。

bootloader源代碼外部中斷處理實例
從0x00000000開始設置以下指令。
發生外部中斷請求,處理器自動保存當前狀態(PC→R14,CPSR→SPSR),進入外部中斷模式,執行地址0x00000018處的指令。

在IRQ_SVC_HANDLER中,處理器將通用寄存器和返回地址壓入堆棧,接着跳轉到外部中斷請求的中斷服務程序中。
IRQ_SVC_Vector爲外部中斷請求的中斷向量。
IRQ_SVC_HANDLER處的代碼爲:

外部中斷包括的26種普通中斷的向量空間分配




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章