一文教你搞清楚arm cortex-m3核心的暫存器;本文以arm的
cortex-m3
核心為例,對於arm的核心暫存器做乙個簡單的介紹,並且市面上cortex-m3比較容易可以買到,可以結合實踐加深對arm彙編的理解。
arm的暫存器分為通用暫存器和特殊功能暫存器,從r0
—r15
,其中,r0
-r12
都是32位通用暫存器,用於資料操作。絕大多數16位thumb
指令只能訪問r0
-r7
,而32 位thumb-2 指令可以訪問所有暫存器1
。 具體如下圖所示;
下圖是在keil mdk
的除錯環境下的暫存器列表,如下所示;
stack pointer (sp)
,棧指標暫存器,該暫存器始終儲存著乙個指向棧頂的值,值得注意的地方;
暫存器r13
通常被用作堆疊指標暫存器,另外究竟使用哪個暫存器,由cpu
的控制暫存器來決定;
cpu
的configuration control register
,如下圖所示;
其中bit[0]
:nonebasethrdena
決定了cpu使用哪一種模式;
link register (lr)
,連線暫存器,即在呼叫子程式的時候,可以將當前的程式位址存入lr
暫存器,這樣就方便了函式的返回;
通常lr
會配合bl
和blx
來使用,下面簡單舉乙個函式呼叫的例子;
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...