嵌入式ARM彙編複習

2021-07-02 19:50:27 字數 3673 閱讀 2822

嵌入式系統是將先進的計算機技術、半導體技術和電子技術與各個行業的具體應用相結合後的產物。

嵌入式系統的特點:

形式多樣、面向特定應用,處理器和處理器體系結構型別多,關注成本,實時性和可靠性的要求

嵌入式微處理器的體系結構 :可以分為馮•諾依曼(von neumann)結構或哈佛(harvard)結構兩大類。 

資料型別

位元組型資料(byte):資料寬度為8bits

半字資料型別(halfword):資料寬度為16bits,訪問式必須以2位元組對齊的方式

字資料型別(word):資料寬度為32bits,訪問式必須以4位元組對齊的方式

進入thumb狀態:

執行bx指令,並設定運算元暫存器的狀態(位[0])為1。

在thumb狀態進入異常(irq, fiq, undef, abort,swi etc.),當異常處理返回時自動轉換到thumb狀態

進入arm狀態:

執行bx指令,並設定運算元暫存器的狀態(位[0])為0。

進入異常時,將pc放入異常模式鏈結暫存器中,從異常向量位址開始執行也可進入arm狀態

除了user模式,其他模式都是特權模式,可以 任意訪問系統資源,system模式與user的區別在於可以訪問系統資源,其他異常模式用於處理異常、

arm處理器有37個暫存器

31個通用暫存器:程式計數器、堆疊及其他通用暫存器

6個狀態暫存器

這些暫存器不能同時看到

不同的處理器狀態和工作模式確定哪些暫存器是對程式設計者是可見的

arm state 與thumb state暫存器的關係 thumb是r0~r7+sp,lr,pc,cpsr,spsr  ;  arm是r0~r15其中其中r13~15對於  sp,lr,pc 還有cpsr,spsr。

異常發生時伴隨的模式切換意味著, 被呼叫的異常處理程式會訪問:

它自己的堆疊指標 (sp_)

它自己的鏈結暫存器 (lr_)

它自己的備份程式狀態暫存器 (spsr_)

如果是fiq異常處理, 5個其它的通用狀態暫存器 (r8_fiq to r12_fiq)

其它暫存器和原來模式下的暫存器是相同的

通用暫存器是r0-r15的暫存器,分為三類

沒有對應影子暫存器的暫存器r0-r7

有對應影子暫存器的暫存器r8-r14

程式計數器r15 (或者pc)  

影子暫存器是指該暫存器在不同的模式下對應的物理暫存器

r13(也被稱為sp指標)被用作棧指標,通常在系統初始化時需要對所有模式下的sp指標賦值,當cpu在不同的模式時棧指標會被自動切換成相應模式下的值。

r14有兩個用途,一是在呼叫子程式時用於儲存呼叫返回位址,二是在發生異常時用於儲存異常返回位址。

r15用作程式計數器(pc),可以被讀寫

arm state: bits [1:0]為0,bits[31:2]即為 pc.

thumb state:bit [0]為0,bits[31:1]即為 pc

cpsr(當前程式狀態暫存器)在所有的模式下都是可以讀寫的,它主要包含:

條件標誌

中斷使能標誌

當預處理器的模式

其它的一些狀態和控制標誌

cpsr有32位,其中31~27 表示條件標誌

分別為

n z c v
條件標誌位

n = alu產生負數結果

z = alu產生結果是0

c = alu操作產生進製或借位

v = alu結果溢位

n = alu產生負數結果

z = alu產生結果是0

c = alu操作產生進製或借位

v = alu結果溢位

7~6中斷標誌, 7對應irq中斷 ,6對應fiq中斷,為1時禁止。

5——arm,thumb標誌位為0表示arm,

4~0表示模式控制位

10000~ user

10001       ~fiq

10010      ~irq

10011       ~supersiver

10111    ~abort

11011  ~undefined

11111   ~system

中斷分為外部中斷,軟體中斷與異常。

arm處理器把上述三種事件都以異常模式來處理,並且都通過異常向量來響應

當異常發生時cpu自動到指定的向量位址讀取指令並且執行,即arm的向量位址處存放的是一條指令(一般是一條跳轉指令)

有7中異常,按優先順序從大到小排序:

在所有異常的入口,irq 中斷被遮蔽

只有重新被使能才可觸發核心響應 (如:中斷巢狀處理)

在 fiqs 和 reset 異常的入口,fiq中斷被遮蔽

arm處理器響應異常的過程如下:

拷貝cpsr暫存器的內容至對應模式下的 spsr_暫存器中;

將返回位址儲存到對應模式下的lr_暫存器中;

對 cpsr 暫存器的一些控制位進行設定:

無論發生異常時處理器處於thumb 狀態還是arm狀態,響應異常後處理器都會切換到 arm 狀態,即cpsr[5]=0;

將模式位 cpsr[4:0]設定為被響應異常的模式編碼;

設定中斷遮蔽位:如果異常模式為reset 或 fiq 則

cpsr[6]=1       /*禁止快速中斷*/

cpsr[7]=1       /*禁止正常中斷*/

將程式計數器(pc)設定為異常向量的位址

從異常處理程式返回時(執行特定的異常返回指令,需注意對於復位異常不需要返回),處理器執行下列動作:

將spsr_中的內容恢復到cpsr中;

將pc設定為lr_的值

同異常響應過程一樣,上述過程只能在arm狀態下完成。

對於軟中斷和未定義指令異常返回

movs pc,lr

對於 fiq, irq 和指令預取異常返回

subs pc,lr,#4

對於資料訪問中止異常的返回

subs pc,lr,#8    

如果lr暫存器在壓棧前已經被矯正,那麼帶 ^ 修飾符 ldm 指令 也可以用於返回

ldmfd sp!,^

軟中斷處理程式必須從swi 指令中提取軟中斷號

但是在這之前,軟中斷處理程式必須確定呼叫軟中斷功能函式之前的狀態是arm 還是 thumb 狀態

在 spsr 中檢查 t 標誌位

在 arm 狀態下,swi 指令在位址 lr-4 處,thumb狀態下則為lr-2處

arm 的定址空間是線性的位址空間,為232=4g

bytes 0 to 3 儲存第乙個word, bytes 4 to 7儲存第二個word

arm支援大端(big-endian)和小端(little-endian)的記憶體資料方式,可以通過硬體的方式設定(沒有提供軟體的方式)端模式

記憶體和i/o – i/o埠編址方式

arm 的i/o埠都是記憶體對映的方式,即對i/o埠的訪問與記憶體的訪問的方式完全一樣。

嵌入式Linux之ARM彙編基礎

對於 cortex a 晶元來講,大部分晶元在上電以後c 語言環境還沒準備好,所以第一行程式肯定是彙編的,至於要寫多少匯程式設計序,那就看你能在哪一步把 c 語言環境準備好。所謂的 c語言環境就是保證 c 語言能夠正常執行。c 語言中的函式呼叫涉及到出棧入棧,出棧入棧就要對堆疊進行操作,所謂的堆疊其...

嵌入式,ARM掃盲

炮製了一篇,基本是拿來主義,不算技術,只能算雜談。注 此處正常模式和普通模式是我生造的術語,沒有確定是否存在,各位請暫且忽略。arm異常處理過程 arm的異常,包括復位 未定義指令 軟體中斷 資料訪問中止 外部中斷請求 快 速中斷請求。處理過程 1 儲存現場,包括處理器當前狀態 中斷遮蔽位 cpsr...

ARM嵌入式實驗

問題 在startup.s中增加函式,由c程式呼叫,以此取得彙編中相關引數的設定值。獲取pll中m,p值,c程式呼叫彙編函式 在c語言中,要extern 乙個函式宣告即可,然後這個函式在彙編裡面實現。在彙編裡面,用export 把c語言定義的函式名引進來,再開始編寫函式名開始的段 實現 c程式呼叫 ...