arm寄存器解析
要介紹arm寄存器之前我們要先了解一下arm處理器的工作模式:
Arm處理器有七種工作模式,為的是形成不同的使用級別,以防造成對系統的破壞。不同模式可以訪(fǎng)問(wèn)的寄存器不同,可以運行的指令不同。
(1)usr(10):普通應用程序運行的模式(應用程序)
(2)FIQ(11):快速中斷模式,以處理快速情況,高速數據傳輸
(3)IRQ(10010):外部中斷模式,普通中斷處理
(4)svc(10011):保護模式(管理模式),操作系統使用的特權模式(內核)
(5)abt(10):數據訪(fǎng)問(wèn)中止模式,用于虛擬存儲和存儲保護
(6)und(11011):未定義指令終止模式,用于支持通過(guò)軟件仿真硬件的協(xié)處理器
(7)sys(11):系統模式,用于運行特權級的操作系統任務(wù)(armv4以上版本才具有)
注意:usr是普通模式,其他六種是特權模式,而除了usr和sys模式以外的五種模式是異常模式
--
Ok下面進(jìn)入正題:
我們首先可以找到這樣一本資料《ARM Architecture Reference Manual》在其中的Programmers’Model一章中,我們可以輕松的找到官方文檔對寄存器的說(shuō)明,建議大家去看看官方的英文文檔,我將其中的重要內容簡(jiǎn)單的總結一下。
Arm處理器總共有37個(gè)寄存器其可以分為以下兩類(lèi)(在此我先列出大框架下面會(huì )一一介紹):
1.通用寄存器(31個(gè))
1.不分組寄存器(R0—R7)
2.分組寄存器(R8—R14)
3.PC指針(R15)
2.狀態(tài)寄存器(6個(gè))
1.CPSR(1個(gè))
2.SPSR(5個(gè))
相信通過(guò)上面的介紹大家對arm的寄存器有個(gè)初步的印象,下面官方文檔對寄存器的說(shuō)明:

下面我將會(huì )結合上圖和我上面列出的大框架對寄存器進(jìn)行解析:
1.不分組寄存器(R0—R7)
在所有的運行模式下都使用同一個(gè)物理寄存器,它們未被系統用作特殊的用途。
2.分組寄存器(R8—R14)
a)對于R8~R12,當使用FIQ(快速中斷模式)時(shí)訪(fǎng)問(wèn)寄存器R8_fiq~R12_fiq,當使用除FIQ模式以外的其他模式時(shí),訪(fǎng)問(wèn)寄存器R8~R12
b)對于R13,R14來(lái)說(shuō),每個(gè)寄存器對應6個(gè)不同的物理寄存器,其中一個(gè)是用戶(hù)模式與系統模式共用(圖中的R13,R14),另外5個(gè)物理寄存器對應其他5種不同的運行模式,并采用以下記號來(lái)區分不同的物理寄存器分別為fiq,irq,svc,abt,und.(如上圖)
i.R13在A(yíng)RM指令中常用作堆棧指針SP
特別注意:由于每一種模式都有自己的R13,所以我們在自己初始化的時(shí)候一般都要初始化每種模式下的R13,使其指向該運行模式的??臻g。
ii.R14稱(chēng)為子程序鏈接寄存器LR(Link Register)
有兩個(gè)特殊功能,一種是每一種模式下都可以用于保存函數的返回地址,另外就是異常處理后的返回地址,如中斷。
3.PC指針(R15)
R15用作程序計數器(PC)對應一個(gè)物理寄存器,由于A(yíng)RM體系結構采用了多級流水線(xiàn)技術(shù)(不了解多級流水線(xiàn)的可以訪(fǎng)問(wèn)這個(gè)博客http://blog.csdn.net/abclixu123/article/details/7471822,博主講的不錯),對于A(yíng)RM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個(gè)字節程序狀態(tài)寄存器。
4.CPSR
在官方文檔中我們可以找到

下面介紹其中幾個(gè)比較重要的位,其他位,大家可以參考官方手冊:
N:當兩個(gè)表示的有符號整數運算時(shí),1表示運算結果為負數,0表示結果為正或零。
Z:1表示運算的結果為零,0表示運算的結果不為零。對于CMP指令,1表示進(jìn)行比較的兩個(gè)數大小相等。
C:下面分四種情況討論C的設置方法:
a)加法運算(包括比較指令CMN):當運算產(chǎn)生了進(jìn)位時(shí)(無(wú)符號數溢出),C=1,否則C=0。
b)減法運算(包括比較指令CMP):當運算時(shí)產(chǎn)生了借位(無(wú)符號數溢出),C=0,否則C=1。
c)對于包含移位操作的非加/減運算指令,C為移出值的最后一位。
d)對于其他的非加/減運算指令,C的值通常不改變。
V:下面分兩種情況討論V的設置方法
a)對于加/減法運算指令,當操作數和運算結果為二進(jìn)制的補碼表示的帶符號數時(shí),V=1表示符號位溢出。
b)對于其他的非加/減運算指令,C的值通常不改變。
I:1表示禁止外部(硬件)中斷(IRQ)
F:1表示禁止快速中斷(FIQ)
T:1表示為thumb狀態(tài)0為arm狀態(tài)
M[4:0]:用來(lái)設置處理器的工作模式具體數據見(jiàn)本文開(kāi)始的介紹。
5.SPSR
SPSR除usr、sys外,對應用于異常保護的CPSR的備份,異常時(shí),保存CPSR值,異常退出時(shí),將該值恢復到CPSR,以保證程序的正常運行,每一中異常運行模式(除usr和sys)有各自的物理寄存器。
以上是自己的arm寄存器的簡(jiǎn)單理解,希望各位提出寶貴意見(jiàn),并且在這個(gè)寒假從今天開(kāi)始沒(méi)有意外的話(huà)我的博客會(huì )一天一更,努力學(xué)習,歡迎大家監督。
評論