1、***.s文件為匯編語言文件格式;
2、ARM寄存器(以Samsung芯片為例)
2.1、要介紹arm寄存器之前我們要先了解一下arm處理器的工作模式:
Arm處理器有七種工作模式,為的是形成不同的使用級別,以防造成對系統的破壞。
注意:
不同模式可以訪問的寄存器不同,可以運行的指令不同。
usr:普通模式,其他六種:特權模式,而除了usr和sys模式以外的五種模式是異常模式。
(1)usr(10000):普通應用程序運行的模式(應用程序)
(2)FIQ(10001):快速中斷模式,以處理快速情況,高速數據傳輸
(3)IRQ(10010):外部中斷模式,普通中斷處理
(4)svc(10011):管理模式(保護模式),操作系統使用的特權模式(內核)
(5)abt(10111):數據訪問中止模式,用於虛擬存儲和存儲保護
(6)und(11011):未定義指令終止模式,用於支持通過軟件仿真硬件的協處理器
(7)sys(11111):系統模式,用於運行特權級的操作系統任務(armv4以上版本才具有)
--------------------------------------------------------------------
2.2、Arm處理器總共有37個寄存器其可以分為以下兩類:
1. 通用寄存器(31個)
1. 不分組寄存器(R0—R7)(8)
2. 分組寄存器(R8—R14)(22,這里沒有算CotextA9新增加的監控模式中的寄存器)
3. PC指針(R15)(1)
2. 狀態寄存器(6個,同樣沒算CotextA9新增加的監控模式中的寄存器)
1. CPSR(1個)
2. SPSR(5個)




--------------------------------------------------------------------
2.3、下面結合上圖和上面列出的大框架對寄存器進行解析
1. 不分組寄存器(R0—R7)
在所有的運行模式下都使用同一個物理寄存器,它們未被系統用作特殊的用途。
2. 分組寄存器(R8—R14)
a) 對於R8~R12,當使用FIQ(快速中斷模式)時訪問寄存器R8_fiq~R12_fiq,當使用除FIQ模式以外的其他模式時,訪問寄存器R8~R12(同一個物理寄存器)
b) 對於R13,R14來說,每個寄存器對應6個不同的物理寄存器,其中一個是用戶模式與系統模式共用(圖中的R13,R14),
另外5個物理寄存器對應其他5種不同的運行模式,並采用以下記號來區分不同的物理寄存器分別為fiq,irq,svc,abt,und.(如上圖)
i.R13在ARM指令中常用作堆棧指針--“SP(stack pointer)”,特別注意:由於每一種模式都有自己的R13,所以我們在自己初始化的時候一般都要初始化每種模式下的R13,使其指向該運行模式的棧空間。
ii. R14稱為子程序鏈接寄存器--“LR(Link Register)”。有兩個特殊功能,一種是每一種模式下都可以用於保存函數的返回地址,另外就是異常處理后的返回地址,如中斷。
3. PC指針(R15)
R15用作程序計數器--PC對應一個物理寄存器,由於ARM體系結構采用了多級流水線技術
對於ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個字節程序狀態寄存器。
- CPSR

CPSR:當前程序狀態寄存器(current program status register),在任何處理器模式下被訪問。它包含了條件標志位、中斷禁止位、當前處理器模式標志以及其他的一些控制和狀態位。
在官方文檔中我們可以找到
下面介紹其中幾個比較重要的位,其他位,大家可以參考官方手冊:
N: 當兩個表示的有符號整數運算時,0表示結果為正或零或默認,1表示運算結果為負數;
Z:一般情況下,0表示運算的結果非零或默認,1表示運算的結果為零,對於CMP指令,1表示進行比較的兩個數大小相等。
C:下面分四種情況討論C的設置方法:
a) 加法運算(包括比較指令CMN):當運算產生了進位時(無符號數溢出),C=1,否則C=0。
b) 減法運算(包括比較指令CMP):當運算時產生了借位(無符號數溢出),C=0,否則C=1。
c) 對於包含移位操作的非加/減運算指令,C為移出值的最后一位。
d) 對於其他的非加/減運算指令,C的值通常不改變。
V:下面分兩種情況討論V的設置方法
a) 對於加/減法運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,V=1表示符號位溢出。
b) 對於其他的非加/減運算指令,C的值通常不改變。
I:1 表示禁止外部(硬件)中斷(IRQ)
F:1 表示禁止快速中斷(FIQ)
T:1表示為thumb狀態,0為arm狀態
M[4:0]:用來設置處理器的工作模式具體數據見本文開始的介紹。
- SPSR
SPSR:程序狀態保存寄存器(saved program status register),每一種處理器模式下都有一個狀態寄存器SPSR,SPSR用於保存CPSR的狀態,以便異常返回后恢復異常發生時的工作狀態。
當特定的異常中斷發生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。由於用戶模式/系統模式不是異常中斷模式,所以他沒有SPSR。
當用戶在用戶模式/系統模式訪問SPSR,將產生不可預知的后果。每一中異常運行模式(除usr和sys)有各自的物理寄存器。
