1. 程式人生 > >解析ARM的幾個關鍵暫存器

解析ARM的幾個關鍵暫存器

 



圖中縮寫如下:

R:Register;暫存器
PC:Program Counter;程式計數器
CPSR:Current Program Status Register;當前程式狀態暫存器
SPSR:Saved Program Status Register;儲存的程式狀態暫存器
SP:Stack Pointer;資料棧指標
LR:Link Register;連線暫存器
SB:靜態基址暫存器
SL:資料棧限制指標
FP:幀指標
IP:Intra-Procedure-call Scratch Register;內部程式呼叫暫存暫存器

ARM共有37個暫存器,可以工作在7種不同的模式。以下根據上圖進行分類的說明:

未分組暫存器r0-r7為所有模式共用,共8個。
分組暫存器中r8-r12,快速中斷模式有自己的一組暫存器,其他模式共用,所以有10個。
分組暫存器中r13,r14,除了使用者模式和系統模式共用外,其他模式各一組,所以共有2*7 - 2 = 12個。
r15和CPSR共用,共2個;SPSR除了使用者模式和系統模式沒有外,其他模式各一個,共5個。

所以總數為8+10+12+2+5 = 37個。與此對應的彙編名稱表明了它們通常的約定用法。

1. PC(程式計數器) = windows 中 EIP

解析: 
處理器要執行的程式(指令序列)都是以二進位制程式碼序列方式預儲存在計算機的儲存器中,處理器將這些程式碼逐條 
地取到處理器中再譯碼、執行,以完成整個程式的執行。為了保證程式能夠連續地執行下去,CPU必須具 
有某些手段來確定下一條取指指令的地址.程式計數器(PC)正是起到這種作用,所以通常又稱之為‘指令計數器’ 
。CPU總是按照PC的指向對指令序列進行取指、譯碼和執行,也就是說,最終是PC 決定了程式執行流向。故而,程 
序計數器(PC )屬於特別功能暫存器範疇,不能自由地用於儲存其他運算資料.

在程式開始執行前,將程式指令序列的起始地址,即程式的第一條指令所在的記憶體單元地址送入PC,CPU 按照 PC 
的指示從記憶體讀取第一條指令(取指)。當執行指令時,CPU自動地修改PC 的內容,即每執行一條指令PC增加一個 
量,這個量等於指令所含的位元組數(指令位元組數),使 PC總是指向下一條將要取指的指令地址。由於大多數指令都 
是按順序來執行的,所以修改PC 的過程通常只是簡單的對PC 加“指令位元組數”。 
當程式轉移時,轉移指令執行的最終結果就是要改變PC的值,此PC值就是轉去的目標地址。處理器總是按照PC 
指向取指、譯碼、執行,以此實現了程式轉移。

2.堆疊指標暫存器 SP (暫存器 R13)

ARM處理器中通常將暫存器R13作為堆疊指標(SP)。ARM處理器針對不同的模式,共有 6 個堆疊指標(SP),其中 
使用者模式和系統模式共用一個SP,每種異常模式都有各自專用的R13暫存器(SP)。它們通常指向各模式所對應的專 
用堆疊,也就是ARM處理器允許使用者程式有六個不同的堆疊空間,ARM處理器中的R13被用作SP。當不使用堆疊時, 
R13 也可以用做通用資料暫存器.


由於處理器的每種執行模式均有自己獨立的物理暫存器R13,在使用者應用程式的初始化部分,一般都要初始化每種模 
式下的R13,使其指向該執行模式的棧空間。這樣,當程式的執行進入異常模式時,可以將需要保護的暫存器放入R 
13所指向的堆疊,而當程式從異常模式返回時,則從對應的堆疊中恢復,採用這種方式可以保證異常發生後程序的 
正常執行。


3.R14稱為子程式連結暫存器LR(Link Register)

當執行子程式呼叫指令(BL)時,R14可得到R15(程式計數器PC)的備 
份.在每一種執行模式下,都可用R14儲存子程式的返回地址,當用BL或BLX指令呼叫子程式時,將PC的當前值給 
R14,執行完子程式後,又將R14的值回PC,即可完成子程式的呼叫返回。以上的描述可用指令完成。 
執行以下任意一條指令: 
MOV PC,LR 
BX LR 
在子程式入口處使用以下指令將R14存入堆疊: 
STMFD SP!,{,LR} 
對應的,使用以下指令可以完成子程式返回: 
LDMFD SP!,{,PC} 
R14也可作為通用暫存器。

4. PSR 暫存器

條件碼標誌(Condition Code Flags) 
N、Z、C、V均為條件碼標誌位。它們的內容可被算術或邏輯運算的結果所改變,並且可以決定某條指令是否 
被執行。 
在ARM狀態下,絕大多數的指令都是有條件執行的。 
在Thumb狀態下,僅有分支指令是有條件執行的。

N Negative 如果結果是負數則置位 當用補碼錶示的帶符號數進行運算時,N=1表示運算的結果為負數;N=0表示運算的結果是正數或零。 
Z Zero 如果結果是零則置位 Z=1表示運算的結果為零;Z=0表示運算的結果不為零。 
C Carry 如果發生進位則置位 有4種方法影響C的值: 
l 加法運算:當運算結果產生了進位時(無符號數溢位),C=1,否則C=0。 
2 減法運算(包括比較指令CMP):當運算時產生了借位(無符號數溢位)時,C=0,否則C=1。 
3 對於包含移位操作的非加/減運算指令,C為移出值的最後一位。 
4 對於其他的非加/減運算指令,C的值通常不改變。

V Overflow 如果發生溢位則置位 有2種方法設定V的值: 
l 對於加/減法運算指令,當運算元和運算結果為二進位制的補碼錶示的帶符號數時,V=1表示符號位溢位。 
2 對於其它的非加/減法運算指令,V的值通常不改變。 
I IRQ 中斷禁用 
F FIQ 快速中斷禁用 
T 工作狀態位,1為Thumb;0為ARM