ARM寄存器及功能介绍/R0-R15寄存器
1、ARM 寄存器組介紹
ARM 處理器一般共有 37 個(gè)寄存器,其中包括:
(1) 31 個(gè)通用寄存器,包括 PC(程序計(jì)數(shù)器)在內(nèi),都是 32 位的寄存器。
(2) 6 個(gè)狀態(tài)寄存器,都是 32 位的寄存器。
ARM 處理器共有 7 種不同的處理器模式:
用戶模式(User),快速中斷模式(FIQ),普通中斷模式(IRQ),管理模式(Svc),數(shù)據(jù)訪問中止模式(Abort),未定義指令中止模式(Und),系統(tǒng)模式(Sys),
在每一種處理器模式中有一組相應(yīng)的寄存器。在任意一種處理器模式下,可見的寄存器包括 15 個(gè)通用寄存器(R0~R14)、一個(gè)或者二個(gè)狀態(tài)寄存器以及程序計(jì)數(shù)器(PC)。在所有的寄存器中,有些是各模式共用同一個(gè)物理寄存器,有些寄存器是各個(gè)模式自己擁有獨(dú)立的物理寄存器
其中 r0~r3 主要用于子程序間傳遞參數(shù), r4~r11 主要用于保存局部變量,但在 Thumb 程序中,通常只能使用 r4~r7 來保存局部變量; r12 用作子程序間scratch 寄存器,即 ip 寄存器; r13 通常用做棧指針,即 sp; r14 寄存器又被稱為連接寄存器(lr),用于保存子程序以及中斷的返回地址; r15 用作程序計(jì)數(shù)器(pc),由于 ARM 采用了流水線機(jī)制,當(dāng)正確讀取了 PC 的值后,該值為當(dāng)前指令地址加 8 個(gè)字節(jié),即 PC 指向當(dāng)前指令的下兩條指令地址。
CPSR和SPSR都是程序狀態(tài)寄存器,其中SPSR是用來保存中斷前的CPSR中的值,以便在中斷返回之后恢復(fù)處理器程序狀態(tài)。
2.CPSR寄存器詳解
所有處理器模式下都可訪問當(dāng)前程序狀態(tài)寄存器CPSR。CPSR中包含條件碼標(biāo)志、中斷禁止位、當(dāng)前處理器模式以及其他狀態(tài)和控制信息。在每種異常模式下都有一個(gè)對用的程序狀態(tài)寄存器SPSR。當(dāng)異常出現(xiàn)時(shí),SPSR用于保存CPSR的狀態(tài),以便異常返回后恢復(fù)異常發(fā)生時(shí)的工作狀態(tài)。
(1)條件碼標(biāo)志
N、Z、C、V,最高4位稱為條件碼標(biāo)志。ARM的大多數(shù)指令可以條件執(zhí)行的,即通過檢測這些條件碼標(biāo)志來決定程序指令如何執(zhí)行。
各個(gè)條件碼的含義如下:
N:在結(jié)果是有符號的二進(jìn)制補(bǔ)碼情況下,如果結(jié)果為負(fù)數(shù),則N=1;如果結(jié)果為非負(fù)數(shù),則N=0。
Z:如果結(jié)果為0,則Z=1;如果結(jié)果為非零,則Z=0。
C:其設(shè)置分一下幾種情況:
對于加法指令(包含比較指令CMN),如果產(chǎn)生進(jìn)位,則C=1;否則C=0。對于減法指令(包括比較指令CMP),如果產(chǎn)生借位,則C=0;否則C=1。對于有移位操作的非法指令,C為移位操作中最后移出位的值。對于其他指令,C通常不變。V:對于加減法指令,在操作數(shù)和結(jié)果是有符號的整數(shù)時(shí),如果發(fā)生溢出,則V=1;如果無溢出發(fā)生,則V=0;對于其他指令,V通常不發(fā)生變化。
(2)控制位的作用在圖1中可以看出,在這里就不闡述了。
二:CPSR與CPSR_c的區(qū)別
CPSR_c指的是CPSR的低8位控制位CPSR有4個(gè)8位區(qū)域:標(biāo)志域(F)、狀態(tài)域(S)、擴(kuò)展域(X)、控制域(C)MSR - Load specified fields of the CPSR or SPSR with an immediate constant, or from the contents of a general-purpose register.Syntax:MSR{cond} <psr>_<fields>, #immed_8r MSR{cond} <psr>_<fields>, Rm where: cond is an optional condition code. <psr> is either CPSR or SPSR. <fields> specifies the field or fields to be moved. <fields> can be one or more of:c control field mask byte (PSR[7:0]) x extension field mask byte (PSR[15:8]) s status field mask byte (PSR[23:16) f flags field mask byte (PSR[31:24]). immed_8r is an expression evaluating to a numeric constant. The constant must correspond to an 8-bit pattern rotated by an even number of bits within a 32-bit word. Rm is the source register.
C 控制域屏蔽字節(jié)(psr[7:0])X 擴(kuò)展域屏蔽字節(jié)(psr[15:8])S 狀態(tài)域屏蔽字節(jié)(psr[23:16])F 標(biāo)志域屏蔽字節(jié)(psr[31:24])常用于MRS或MSR指令,用于psr中的值轉(zhuǎn)移到寄存器或把寄存器的內(nèi)容加載到psr中.
如:
MSR CPSR_c,#0xd3
三、R0-R15寄存器 根據(jù)“ARM-thumb 過程調(diào)用標(biāo)準(zhǔn)”:
R0-R3 用作傳入函數(shù)參數(shù),傳出函數(shù)返回值。在子程序調(diào)用之間,可以將 r0-r3 用于任何用途。
被調(diào)用函數(shù)在返回之前不必恢復(fù) r0-r3。如果調(diào)用函數(shù)需要再次使用 r0-r3 的內(nèi)容,則它必須保留這些內(nèi)容。
R4-R11 被用來存放函數(shù)的局部變量。如果被調(diào)用函數(shù)使用了這些寄存器,它在返回之前必須恢復(fù)這些寄存器的值。
R12 是內(nèi)部調(diào)用暫時(shí)寄存器 ip。它在過程鏈接膠合代碼(例如,交互操作膠合代碼)中用于此角色。
在過程調(diào)用之間,可以將它用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復(fù) r12。
R13 是棧指針 sp。它不能用于任何其它用途。sp 中存放的值在退出被調(diào)用函數(shù)時(shí)必須與進(jìn)入時(shí)的值相同。
R14 是鏈接寄存器 lr。如果您保存了返回地址,則可以在調(diào)用之間將 r14 用于其它用途,程序返回時(shí)要恢復(fù)
R15 是程序計(jì)數(shù)器 PC。它不能用于任何其它用途。
注意:在中斷程序中,所有的寄存器都必須保護(hù),編譯器會(huì)自動(dòng)保護(hù)R4~R11
總結(jié)
以上是生活随笔為你收集整理的ARM寄存器及功能介绍/R0-R15寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Calibre去除Kindle电子书的
- 下一篇: matlab的输出(命令窗口、fprin