基本設定
指令集工作模式
特權模式(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用於不同的指令,名稱相同,但是在不同的指令結合卻有不同的作用條件執行字尾多指令流水線**注意**
- 條件字尾是否成立,不是取決於本句**,而是取決於這句**之前的**執行後的結果。
cpsr訪問指令**注意**:pc指向正被取指的指令,而非正在執行的指令
跳轉(分支)指令
訪存指令
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...