ARM彙編基礎之核心暫存器詳解

2021-10-05 20:47:02 字數 2403 閱讀 3782

一文教你搞清楚arm cortex-m3核心的暫存器;

本文以arm的cortex-m3核心為例,對於arm的核心暫存器做乙個簡單的介紹,並且市面上cortex-m3比較容易可以買到,可以結合實踐加深對arm彙編的理解。

arm的暫存器分為通用暫存器和特殊功能暫存器,從r0r15,其中,r0-r12都是32位通用暫存器,用於資料操作。絕大多數16位thumb指令只能訪問r0-r7,而32 位thumb-2 指令可以訪問所有暫存器1

。 具體如下圖所示;

下圖是在keil mdk的除錯環境下的暫存器列表,如下所示;

stack pointer (sp),棧指標暫存器,該暫存器始終儲存著乙個指向棧頂的值,值得注意的地方;

暫存器r13通常被用作堆疊指標暫存器,另外究竟使用哪個暫存器,由cpu的控制暫存器來決定;

cpuconfiguration control register,如下圖所示;

其中bit[0]nonebasethrdena決定了cpu使用哪一種模式;

link register (lr),連線暫存器,即在呼叫子程式的時候,可以將當前的程式位址存入lr暫存器,這樣就方便了函式的返回;

通常lr會配合blblx來使用,下面簡單舉乙個函式呼叫的例子;

bl	func01

bl func02

b .func01

mov r5, #05

bx lr

func02

mov r6, #06

bx lr

program counter(pc),程式計數暫存器,這個暫存器的bit [0]始終為0,所以指令的對齊方式是按照四個位元組(乙個字)或者兩個位元組(半字)來對齊的。

ldr lr,

=func01

ldr pc,

=func03

b .func01

mov r5, #05

bx lr

func02

mov r6, #06

bx lr

func03

mov r7, #07

mov r8, #08

bx lr

這個程式程式為直接將func03標籤的位址裝載到pc暫存器,因此程式會直接跳轉到func03,因為之前將func01裝載到lr暫存器,因此最終會呼叫函式func01

程式狀態暫存器(program status register),記錄 alu 標誌(0 標誌,進製標誌,負數標誌,溢位標誌),執行狀態,以及當前正服務的中斷號,整體如下圖所示;

ipsr: interrupt psr;正服務的中斷號;

epsr:execution psr;執行狀態;

xpsr:儲存狀態暫存器;

cortex-m3核心對arm架構的暫存器進行初步的了解,包括有哪些暫存器,以及這些暫存器的作用,配合簡單的**,從而加深理解,另外由於筆者能力有限,文中難免存在錯誤和紕漏,望大佬不吝賜教。

cortex™-m3 technical reference manual ↩︎

ARM彙編中PC暫存器詳解

近日,在研究一些開源native層hook方案的實現方式,並據此對arm彙編層中容易出問題的一些地方做了整理,以便後來人能有從中有所收穫並應用於現實問題中。當然,文中許多介紹參考了許多零散的文章,本文重點工作在於對相關概念的整理收集,並按相對合理順序引出後文中對hook技術中的一些難點的解讀。and...

彙編基礎之暫存器及彙編指令

最近在學習協程方面的知識,在協程的一種實現方式中有一種是用彙編實現的,所以這裡再把彙編知識複習一下。暫存器按照其用途可分為以下4類 資料暫存器包括 個16位的暫存器 ax,bx,cx,dx 或者8個8位的暫存器 ah,al,bh,bl,ch,cl,dh,dl 這些暫存器都是用來暫時存放運算元,運算結...

ARM中斷暫存器詳解

s3c2440的中斷暫存器 1.中斷分兩大類 內部中斷和外部中斷。2.外部中斷。24個外部中斷占用gpf0 gpf7 eint0 eint7 gpg0 gpg15 eint8 eint23 用這些腳做中斷輸入,則必須配置引腳為中斷,並且不要上拉。具體參考datesheet資料手冊。暫存器 extin...