嵌入式Linux之ARM彙編基礎

2021-10-03 12:14:32 字數 2375 閱讀 5980

對於 cortex-a 晶元來講,大部分晶元在上電以後c 語言環境還沒準備好,所以第一行程式肯定是彙編的,至於要寫多少匯程式設計序,那就看你能在哪一步把 c 語言環境準備好。

所謂的 c語言環境就是保證 c 語言能夠正常執行。 c 語言中的函式呼叫涉及到出棧入棧,出棧入棧就要對堆疊進行操作,所謂的堆疊其實就是一段記憶體,這段記憶體比較特殊,由 sp 指標訪問, sp 指標指向棧頂。

label: instruction @ comment

label 即標號

instruction 即指令

彙編指令或偽指令。

.byte定義單位元組資料,比如.byte 0x12。

.short定義雙位元組資料,比如.short 0x1234。

.long定義乙個 4 位元組資料,比如.long 0x12345678。

.equ賦值語句,格式為: .equ 變數名,表示式,比如.equ num, 0x12,表示 num=0x12。

.align資料位元組對齊,比如: .align 4 表示 4 位元組對齊。

.end表示原始檔結束。

.global定義乙個全域性符號,比如: .global _start。

@符號表示後面的是注釋,就跟 c 語言裡面的「/」和「/」一樣,其實在 gnu 彙編檔案中我們也可以使用「/」和「/」來注釋。comment 就是注釋內容。

add:

movs r0, #0x12 @設定 r0=0x12

上面**中「add:」就是標號,「movs r0,#0x12」就是指令,最後的「@設定 r0=0x12」就是注釋。

函式定義

函式名:

函式體返回語句

示例** 7.1.1.1 彙編函式定義

/* 未定義中斷 */

undefined_handler:

ldr r0, =undefined_handler

bx r0

/* svc 中斷 */

svc_handler:

ldr r0, =svc_handler

bx r0

/* 預取終止中斷 */

prefabort_handler:

ldr r0, =prefabort_handler

bx r0

「undefined_handler」就是函式名,「ldr r0, =undefined_handler」是函式體,「bx r0」是函式返回語句,「bx」指令是返回指令,函式返回語句不是必須的。

1.處理器內部資料傳輸指令

2.儲存器訪問指令

示例** 7.2.2.2 str 指令使用

1 ldr r0, =0x0209c004 @將暫存器位址 0x0209c004 載入到 r0 中,即 r0=0x0209c004

2 ldr r1, =0x20000002 @r1 儲存要寫入到暫存器的值,即 r1=0x20000002

3 str r1, [r0] @將 r1 中的值寫入到 r0 中所儲存的位址中

3.壓棧和出棧指令

儲存 r0~r15 暫存器的操作就叫做現場保護,恢復 r0~r15 暫存器的操作就叫做恢復現場。

在進行現場保護的時候需要進行壓棧(入棧)操作,恢復現場就要進行出棧操作。

壓棧的指令為 push,出棧的指令為 pop, push 和 pop 是一種多儲存和多載入指令,即可以一次

操作多個暫存器資料,他們利用當前的棧指標 sp 來生成位址。

4.跳轉指令

5.算數運算指令

6.邏輯運算指令

嵌入式ARM彙編複習

嵌入式系統是將先進的計算機技術 半導體技術和電子技術與各個行業的具體應用相結合後的產物。嵌入式系統的特點 形式多樣 面向特定應用,處理器和處理器體系結構型別多,關注成本,實時性和可靠性的要求 嵌入式微處理器的體系結構 可以分為馮 諾依曼 von neumann 結構或哈佛 harvard 結構兩大類...

嵌入式,ARM掃盲

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

ARM嵌入式實驗

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