【ARM】Programmers Model
00. 目錄
文章目錄
- 00. 目錄
- 01. ARM數(shù)據(jù)類型
- 02. 浮點(diǎn)數(shù)據(jù)類型
- 03. 處理器模式
- 04. 寄存器
- 05. 程序狀態(tài)寄存器
- 06. 附錄
01. ARM數(shù)據(jù)類型
ARM 采用的是 32 位架構(gòu),ARM 的基本數(shù)據(jù)類型有以下3種。
- Byte:字節(jié),8bit。
- Halfword:半字,16bit(半字必須與 2 字節(jié)邊界對(duì)齊)。
- Word:字,32bit(字必須與 4 字節(jié)邊界對(duì)齊)。
注意:
(1)ARM 系統(tǒng)結(jié)構(gòu) v4 以上版本支持以上 3 種數(shù)據(jù)類型,v4 以前版本僅支持字節(jié)和字。
(2)當(dāng)將這些數(shù)據(jù)類型中的任意一種聲明成 unsigned 類型時(shí),n 位數(shù)據(jù)值表示范圍為 0~2^n ?1的非負(fù)數(shù),通常使用二進(jìn)制格式。
(3)當(dāng)將這些數(shù)據(jù)類型的任意一種聲明成 signed 類型時(shí),n 位數(shù)據(jù)值表示范圍為?2^(n?1) ~2^(n?1) ?1的整數(shù),使用二進(jìn)制的補(bǔ)碼格式。
(4)所有數(shù)據(jù)類型指令的操作數(shù)都是字類型的,如“ADD r1,r0,#0x1”中的操作數(shù)“0x1”就是以字類型數(shù)據(jù)處理的。
(5)Load/Store 數(shù)據(jù)傳輸指令可以從存儲(chǔ)器存取傳輸數(shù)據(jù),這些數(shù)據(jù)可以是字節(jié)、半字、字。加載時(shí)自動(dòng)進(jìn)行字節(jié)或半字的零擴(kuò)展或符號(hào)擴(kuò)展。對(duì)應(yīng)的指令分別為 LDR/BSTRB(字節(jié)操作)、LDRH/STRH(半字操作)、LDR/STR(字操作)。詳見后面的指令參考。
(6)ARM 指令編譯后是 4 字節(jié)(與字邊界對(duì)齊)。Thumb 指令編譯后是 2 字節(jié)(與半字邊界對(duì)齊)。
02. 浮點(diǎn)數(shù)據(jù)類型
浮點(diǎn)運(yùn)算使用在 ARM 硬件指令集中未定義的數(shù)據(jù)類型。盡管如此,但 ARM 公司在協(xié)處理器指令空間定義了一系列浮點(diǎn)指令。通常這些
指令全部可以通過未定義指令異常(此異常收集所有硬件協(xié)處理器不接受的協(xié)處理器指令)在軟件中實(shí)現(xiàn),但是其中的一小部分也可以由
浮點(diǎn)運(yùn)算協(xié)處理器 FPA10 以硬件方式實(shí)現(xiàn)。另外,ARM 公司還提供了用 C 語言編寫的浮點(diǎn)庫作為 ARM 浮點(diǎn)指令集的替代方法(Thumb
代碼只能使用浮點(diǎn)指令集)。該庫支持 IEEE 標(biāo)準(zhǔn)的單精度和雙精度格式。C 編譯器有一個(gè)關(guān)鍵字標(biāo)志來選擇這個(gè)歷程。它產(chǎn)生的代碼與
軟件仿真(通過避免中斷、譯碼和浮點(diǎn)指令仿真)相比既快又緊湊。
03. 處理器模式
除用戶模式外的其他 7 種處理器模式稱為特權(quán)模式(Privileged Modes)。在特權(quán)模式下,程序可以訪問所有的系統(tǒng)資源,也可以任意地
進(jìn)行處理器模式切換。其中以下 6 種又稱為異常模式:
(1)快速中斷模式(FIQ)。
(2)外部中斷模式(IRQ)。
(3)特權(quán)模式(Supervior)。
(4)數(shù)據(jù)訪問中止模式(Abort)。
(5)未定義指令中止模式(Undef)。
(6)監(jiān)控模式(Monitor)。
處理器模式可以通過軟件控制進(jìn)行切換,也可以通過外部中斷或異常處理過程進(jìn)行切換。
大多數(shù)的用戶程序運(yùn)行在用戶模式下。當(dāng)處理器工作在用戶模式時(shí),應(yīng)用程序不能訪問受操作系統(tǒng)保護(hù)的一些系統(tǒng)資源,應(yīng)用程序也不能
直接進(jìn)行處理器模式切換。當(dāng)需要進(jìn)行處理器模式切換時(shí),應(yīng)用程序可以產(chǎn)生異常處理,在異常處理過程中進(jìn)行處理器模式切換。這種體
系結(jié)構(gòu)可以使操作系統(tǒng)控制整個(gè)系統(tǒng)資源的使用。當(dāng)應(yīng)用程序發(fā)生異常中斷時(shí),處理器進(jìn)入相應(yīng)的異常模式。在每一種異常模式中都有一
組專用寄存器以供相應(yīng)的異常處理程序使用,這樣就可以保證在進(jìn)入異常模式時(shí)用戶模式下的寄存器(保存程序運(yùn)行狀態(tài))不被破壞。
04. 寄存器
ARM 處理器有如下 40 個(gè) 32 位長的寄存器。
(1)33 個(gè)通用寄存器。
(2)6 個(gè)狀態(tài)寄存器:1 個(gè) CPSR(Current Program Status Register,當(dāng)前程序狀態(tài)寄存器),5 個(gè) SPSR(Saved Program Status
Register,備份程序狀態(tài)寄存器)。
(3)1 個(gè) PC(Program Counter,程序計(jì)數(shù)器)。
ARM 處理器共有 7 種不同的處理器模式,在每一種處理器模式中都有一組相應(yīng)的寄存器組,下圖 列出了 ARM 處理器的寄存器組織概
要。
當(dāng)前處理器的模式?jīng)Q定著哪組寄存器可操作,任何模式都可以存取下列寄存器。
(1)相應(yīng)的 R0~R12。
(2)相應(yīng)的R13(Stack Pointer,SP,棧指向)和R14(the Link Register,LR,鏈路寄存器)。
(3)相應(yīng)的 R15(PC)。
(4)相應(yīng)的 CPSR。
特權(quán)模式(除 System 模式外)還可以存取相應(yīng)的 SPSR。
通用寄存器根據(jù)其分組與否可分為以下兩類。
(1)未分組寄存器(Unbanked Register),包括 R0~R7。
(2)分組寄存器(Banked Register),包括 R8~R14。
未分組寄存器
未分組寄存器包括 R0~R7。顧名思義,在所有處理器模式下對(duì)于每一個(gè)未分組寄存器來說,指的都是同一個(gè)物理寄存器。未分組寄存器
沒有被系統(tǒng)用于特殊的用途,任何可采用通用寄存器的應(yīng)用場合都可以使用未分組寄存器。但由于其通用性,在異常中斷所引起的處理器
模式切換時(shí),其使用的是相同的物理寄存器,所以也就很容易使寄存器中的數(shù)據(jù)被破壞。
分組寄存器
R8~R14 是分組寄存器,它們每一個(gè)訪問的物理寄存器取決于當(dāng)前的處理器模式。對(duì)于分組寄存器 R8~R12 來說,每個(gè)寄存器對(duì)應(yīng)兩個(gè)
不同的物理寄存器。一組用于除FIQ 模式外的所有處理器模式,而另一組則專門用于 FIQ 模式。這樣的結(jié)構(gòu)設(shè)計(jì)有利于加快 FIQ 的處理速
度。不同模式下寄存器的使用,要使用寄存器名后綴加以區(qū)分。例如,當(dāng)使用 FIQ 模式下的寄存器時(shí),寄存器 R8 和寄存器 R9 分別記為
R8_fiq、R9_fiq;當(dāng)使用用戶模式下的寄存器時(shí),寄存器 R8 和 R9 分別記為 R8_usr、R9_usr 等。在 ARM 體系結(jié)構(gòu)中,R8~R12 沒有任
何指定的其他的用途,所以當(dāng) FIQ 中斷到達(dá)時(shí),不用保存這些通用寄存器,也就是說,FIQ 處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場的
指令,從而可以使中斷處理過程非常迅速。所以 FIQ 模式常被用來處理一些時(shí)間緊急的任務(wù),如 DMA 處理。對(duì)于分組寄存器 R13 和 R14
來說,每個(gè)寄存器對(duì)應(yīng) 6 個(gè)不同的物理寄存器。其中的一個(gè)是用戶模式和系統(tǒng)模式公用的,而另外 5 個(gè)分別用于 5 種異常模式。訪問時(shí)
需要指定它們的模式。名字形式如下:
(1)R13_<mode>
(2)R14_<mode>
其中,<mode>可以是以下幾種模式之一:usr、svc、abt、und、irp、fiq 及 mon。R13 寄存器在 ARM 處理器中常用作堆棧指針,稱為
SP。當(dāng)然,這只是一種習(xí)慣用法,并沒有任何指令強(qiáng)制性的使用 R13 作為堆棧指針,用戶完全可以使用其他寄存器作為堆棧指針。而在
Thumb 指令集中,有一些指令強(qiáng)制性地將 R13 作為堆棧指針,如堆棧操作指令。每一種異常模式擁有自己的 R13。異常處理程序負(fù)責(zé)初
始化自己的 R13,使其指向該異常模式專用的棧地址。在異常處理程序入口處,將用到的其他寄存器的值保存在堆棧中,返回時(shí),重新將
這些值加載到寄存器。通過這種保護(hù)程序現(xiàn)場的方法,異常不會(huì)破壞被其中斷的程序現(xiàn)場。寄存器 R14 又被稱為連接寄存器(Link
Register,LR),在 ARM 體系結(jié)構(gòu)中具有下面兩種特殊的作用。
(1)每一種處理器模式用自己的 R14 存放當(dāng)前子程序的返回地址。當(dāng)通過 BL 或 BLX指令調(diào)用子程序時(shí),R14 被設(shè)置成該子程序的返回
地址。在子程序返回時(shí),把 R14 的值復(fù)制到程序計(jì)數(shù)器(PC)。典型的做法是使用下列兩種方法之一。
① 執(zhí)行下面任何一條指令。
MOV PC, LR BX LR② 在子程序入口處使用下面的指令將 PC 保存到堆棧中。
STMFD SP!, {<register>,LR}在子程序返回時(shí),使用如下相應(yīng)的配套指令返回。
LDMFD SP!, {<register>,PC}(2)當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理寄存器 R14 被設(shè)置成該異常模式的返回地址,對(duì)于有些模式 R14 的值可能與返回地址有
一個(gè)常數(shù)的偏移量(如數(shù)據(jù)異常使用SUB PC,LR,#8 返回)。具體的返回方式與上面的子程序返回方式基本相同,但使用的指令稍微有
些不同,以保證當(dāng)異常出現(xiàn)時(shí)正在執(zhí)行的程序的狀態(tài)被完整保存。R14 也可以被用作通用寄存器使用。
05. 程序狀態(tài)寄存器
當(dāng)前程序狀態(tài)寄存器(Current Program Status Register,CPSR)可以在任何處理器模式下被訪問,它包含下列內(nèi)容:
(1)ALU(Arithmetic Logic Unit,算術(shù)邏輯單元)狀態(tài)標(biāo)志的備份。
(2)當(dāng)前的處理器模式。
(3)中斷使能標(biāo)志。
(4)設(shè)置處理器的狀態(tài)。
每一種處理器模式下都有一個(gè)專用的物理寄存器做備份程序狀態(tài)寄存器(SavedProgram Status Register,SPSR)。當(dāng)特定的異常中斷
發(fā)生時(shí),這個(gè)物理寄存器負(fù)責(zé)存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。當(dāng)異常處理程序返回時(shí),再將其內(nèi)容恢復(fù)到當(dāng)前程序狀態(tài)寄存器。CPSR
寄存器(和保存它的 SPSR 寄存器)中的位分配如下圖所示。
下面給出各個(gè)狀態(tài)位的定義。
1.標(biāo)志位
N(Negative)、Z(Zero)、C(Carry)和 V(oVerflow)通稱為條件標(biāo)志位。這些條件標(biāo)志位會(huì)根據(jù)程序中的算術(shù)指令或邏輯指令的
執(zhí)行結(jié)果進(jìn)行修改,而且這些條件標(biāo)志位可由大多數(shù)指令檢測以決定指令是否執(zhí)行。在 ARM 4T 架構(gòu)中,所有的 ARM 指令都可以條件執(zhí)
行,而 Thumb 指令卻不能。各條件標(biāo)志位的具體含義如下。
1)N
本位設(shè)置成當(dāng)前指令運(yùn)行結(jié)果的 bit[31]的值。當(dāng)兩個(gè)由補(bǔ)碼表示的有符號(hào)整數(shù)運(yùn)算時(shí),N = 1 表示運(yùn)算的結(jié)果為負(fù)數(shù),N = 0 表示結(jié)果為
正數(shù)或零。
2)Z
Z = 1 表示運(yùn)算的結(jié)果為零,Z = 0 表示運(yùn)算的結(jié)果不為零。
3)C
下面分 4 種情況討論 C 的設(shè)置方法。
(1)在加法指令中(包括比較指令 CMN),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則 C = 1,表示無符號(hào)數(shù)運(yùn)算發(fā)生上溢出;其他情況下 C = 0。
(2)在減法指令中(包括比較指令 CMP),當(dāng)運(yùn)算中發(fā)生錯(cuò)位(即無符號(hào)數(shù)運(yùn)算發(fā)生下溢出),則 C = 0;其他情況下 C = 1。
(3)對(duì)于在操作數(shù)中包含移位操作的運(yùn)算指令(非加/減法指令),C 被設(shè)置成被移位寄存器最后移出去的位。
(4)對(duì)于其他非加/減法運(yùn)算指令,C 的值通常不受影響。
4)V
下面分兩種情況討論 V 的設(shè)置方法。
(1)對(duì)于加/減運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果都是以二進(jìn)制的補(bǔ)碼表示的帶符號(hào)的數(shù)時(shí),且運(yùn)算結(jié)果超出了有符號(hào)運(yùn)算的范圍是溢出。
V = 1 表示符號(hào)位溢出。
(2)對(duì)于非加/減法指令,通常不改變標(biāo)志位 V 的值(具體可參照 ARM 指令手冊(cè))。盡管以上 C 和 V 的定義看起來頗為復(fù)雜,但使用時(shí)
在大多數(shù)情況下用一個(gè)簡單的條件測試指令即可,不需要程序員計(jì)算出條件碼的精確值即可得到需要的結(jié)果。
2.Q 標(biāo)志位
在帶 DSP 指令擴(kuò)展的 ARM v5 及更高版本中,bit[27]被指定用于指示增強(qiáng)的 DAP 指令是否發(fā)生了溢出,因此也就被稱為 Q 標(biāo)志位。同
樣,在 SPSR 中 bit[27]也被稱為 Q 標(biāo)志位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù) CPSR 中的 Q 標(biāo)志位。在 ARM v5 以前的版本及 ARM v5
的非 E 系列處理器中,Q 標(biāo)志位沒有被定義,屬于待擴(kuò)展的位。
3.控制位
CPSR 的低 8 位(I、F、T 及 M[4:0])統(tǒng)稱為控制位。當(dāng)異常發(fā)生時(shí),這些位的值將發(fā)生相應(yīng)的變化。另外,如果在特權(quán)模式下,也可以
通過軟件編程來修改這些位的值。
1)中斷禁止位
I = 1,IRQ 被禁止。
F = 1,FIQ 被禁止。
2)狀態(tài)控制位
T 位是處理器的狀態(tài)控制位。
T = 0,處理器處于 ARM 狀態(tài)(即正在執(zhí)行 32 位的 ARM 指令)。
T = 1,處理器處于 Thumb 狀態(tài)(即正在執(zhí)行 16 位的 Thumb 指令)。
當(dāng)然,T 位只有在 T 系列的 ARM 處理器上才有效,在非 T 系列的 ARM 版本中,T 位將始終為 0。
3)模式控制位
M[4:0]作為位模式控制位,這些位的組合確定了處理器處于哪種狀態(tài),下圖列出了其具體含義。
只有表中列出的組合是有效的,其他組合無效。
4.IF-THEN 標(biāo)志位
CPSR 中的 bits[15:10,26:25]稱為 if-then 標(biāo)志位,它用于對(duì) thumb 指令集中 if-then-else這一類語句塊的控制。其中 IT[7:5]定義為基本
條件,如下圖所示。IT[4:0]被定義為 IF-THEN 語句塊的長度。
5.E 位/A 位/GE[19-16]位的定義
A 表示異步異常禁止位。
E 表示大小端控制位,0 表示小端操作,1 表示大端操作。注意,該位在預(yù)取階段是被忽略的。
GE[19-16]用于表示在 SIMD 指令集中的大于、等于標(biāo)志。在任何模式下該位可讀可寫。
06. 附錄
6.1 ARM官方網(wǎng)站: https://developer.arm.com/
6.2 ARM Architecture Reference Manual
總結(jié)
以上是生活随笔為你收集整理的【ARM】Programmers Model的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Tools】Ubuntu中vscode
- 下一篇: 【ARM】Cortex存储系统