ARM彙編指令詳解

2021-10-23 21:59:32 字數 2521 閱讀 3708

基本設定

指令集工作模式

特權模式(privilege:特權模式)

privilege除了system模式外,其他5種為異常模式

各種模式的切換,程式設計師通過**切換,(cpsr暫存器);也可以cpu在某些情況下自動切換(中斷或者按復位鍵)

注意:system模式使用user模式暫存器集

mode位(理論上可以有32種模式)

t位(處理器狀態控制位)

中斷禁止位:

儲存返回位址到 lr_(r14)

設定 pc 為相應的異常向量

從異常返回時

從 spsr_恢復cpsr

從lr_恢復pc

注意:這些操作只能在 arm 態執行。

異常處理中有一些是硬體自動做的,有一些是程式設計師需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何寫**。

以上說的是cpu設計時提供的異常向量表,一般成為一級向量表。有些cpu為了支援多個中斷,還會提供二級中斷向量表,處理思路類似於這裡說的一級中斷向量表。

兩種風格

arm彙編特點

ldr/str架構

八種定址方式

指令字尾

同一指令經常附帶不同字尾,變成不同的指令。經常使用的字尾有:

兩個s用於不同的指令,名稱相同,但是在不同的指令結合卻有不同的作用

條件執行字尾

**注意**

- 條件字尾是否成立,不是取決於本句**,而是取決於這句**之前的**執行後的結果。

多指令流水線

**注意**:pc指向正被取指的指令,而非正在執行的指令
cpsr訪問指令

跳轉(分支)指令

訪存指令

arm彙編中的立即數

arm指令都是32位,除了指令標記和操作標記外,本身只能附帶很少位數的立即數。因此立即數有合法和非法之分。

軟中斷指令

協處理器(cp15)操作指令

cp15,即通常所說的系統控制協處理器( system control coprocesssor)。 soc內部另一處理核心,協助主cpu實現某些功能,被主cpu呼叫執行一定任務。

arm 處理器支援 16 個協處理器。在程式執行過程中,每個協處理器忽略屬於 arm 處理器和其他協處理器的指令。當乙個協處理器硬體不能執行屬於它的協處理器指令時,將產生乙個未定義指令異常中斷,在該異常中斷處理程式中,可以通過軟體模擬該硬體操作。(不必深究

舉例

協處理器的學習要點

不必深究

只看一般用法,不詳細區分引數細節,否則會陷入很多複雜未知中。關鍵在於理解,而不在於記住。

批量資料載入儲存指令(ldm/stm與棧的處理)

四種棧字尾符號的作用

的作用

ldmia r0,

ldmia r0!,

感嘆號的作用就是r0的值在ldm過程中發生的增加或者減少最後寫回到r0去,也就是說ldm時會改變r0的值。

^的作用

ldmfd sp!,

ldmfd sp!, ^

^的作用:在目標暫存器中有pc時,會同時將spsr寫入到cpsr,一般用於從異常模式返回。

總結:批量讀取或寫入記憶體時要用ldm/stm指令各種字尾以理解為主,不需記憶,最常見的是stmia(空堆疊遞增)和stmfd(滿堆疊遞減)。

謹記:操作棧時使用相同的字尾(ldm/stm)就不會出錯,不管是滿棧還是空棧、增棧還是減棧。

偽指令的意義

gun彙編中的一些符號

常用gun偽指令

偶爾用到的gun偽指令

最重要的幾個偽指令

adr與ldr

arm中有乙個ldr指令,還有乙個ldr偽指令

一般都使用ldr偽指令而不用ldr指令

ARM彙編指令

b或bl指令引起處理器轉移到 子程式名 也就是位址 處開始執行,這兩個指令都是相對跳轉指令。兩者的不同之處在於bl指令在轉移到子程式執行之前,將其下一條指令的位址拷貝到r14 lr,鏈結暫存器 由於bl指令儲存了下條指令的位址,因此使用指令 mov pc lr 即可實現子程式的返回。而b指令則無法實...

arm彙編指令

一般arm官方風格彙編指令為大寫,windows ads mdk 實際運用一般用gnu風格,為小寫,linux 1 arm採用risc架構,cpu本身不能直接讀取內 存,而需要先將記憶體中內容加載入cpu中通用寄 存器中才能被 cpu處理 ldr loadregister 指令 將記憶體內容加載入通...

ARM彙編指令

1.彙編概述 2.指令分類學習 3.偽指令 4.協處理訪問指令 為什麼要學習使用匯程式設計序?bootloader kernel的初始化和需要執行效率極高的程式中 1.arm標準彙編 2.gnu彙編 section.data 初始化的資料 section.bss 未初始化的資料 section.te...