ARM處理器模式及寄存器
- ARM微處理器支持7種運(yùn)行模式,分別為:
用戶模式(usr): ARM處理器正常的程序執(zhí)行狀態(tài)。快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。外部中斷模式(irq):用于通用的中斷處理。管理模式(svc): 操作系統(tǒng)使用的保護(hù)模式。軟中斷和復(fù)位數(shù)據(jù)訪問中止模式(abt): 當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲及存儲保護(hù)。系統(tǒng)模式(sys): 運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真
- 除用戶模式外的其余6種模式都稱為特權(quán)模式,這些模式下,程序可以訪問所有的系統(tǒng)資源,也可以任一進(jìn)行處理器模式切換。其中,除系統(tǒng)模式外,其他5種模式又稱為異常模式
二、ARM寄存器
- 31個(gè)通用寄存器,包括程序計(jì)數(shù)器(PC)在內(nèi)。這些寄存器都是32位寄存器
- 6個(gè)32位狀態(tài)寄存器。
用戶模式 | 系統(tǒng)模式 | 特權(quán)模式 | 中止模式 | 未定義指令模式 | 外部中斷模式 | 快速中斷模式 |
R0 | R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 | R6 |
R8 | R8 | R8 | R8 | R8 | R8 | R8_fiq |
R9 | R9 | R9 | R9 | R9 | R9 | R9_fiq |
R10 | R10 | R10 | R10 | R10 | R10 | R10_fiq |
R11 | R11 | R11 | R11 | R11 | R11 | R11_fiq |
R12 | R12 | R12 | R12 | R12 | R12 | R12_fiq |
R13 | R13 | R13_svc | R13_abt | R13_und | R13_inq | R13_fiq |
R14 | R14 | R14_svc | R14_abt | R14_und | R14_inq | R14_fiq |
PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR SPSR_svc | CPSR SPSR_abt | CPSR SPSR_und | CPSR SPSR_inq | CPSR SPSR_fiq |
- 當(dāng)發(fā)生異常中斷時(shí),處理器進(jìn)入相應(yīng)的異常模式。在每一種異常模式下都有相應(yīng)的一組寄存器,供相應(yīng)的異常處理程序使用,這樣就可以保證在進(jìn)入異常模式時(shí),用戶模式下的寄存器(保存了程序運(yùn)行狀態(tài))不被破壞。
- 系統(tǒng)模式不是通過異常進(jìn)入的,他和用戶模式具有完全一樣的寄存器
1、通用寄存器
- 在ARM指令集中,這只是一種習(xí)慣的用法,并沒有任何指令強(qiáng)制性的使用R13作為棧指針,用戶也可以使用其他的寄存器作為棧指針;而在Thumb指令集中,有一些指令強(qiáng)制性地使用R13作為棧指針。
- 每一種異常模式擁有自己的物理的R13。應(yīng)用程序初始化該R13,使其指向該異常模式專用的棧地址。當(dāng)進(jìn)入異常模式時(shí),可以將需要使用的寄存器保存在R13所指的棧中;當(dāng)退出異常處理程序時(shí),將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會破壞被其中斷程序的運(yùn)行現(xiàn)場。
- 在ARM體系中具有下面兩種特殊的作用:每一種處理器模式自己的物理R14中存放在當(dāng)前子程序的返回地址。當(dāng)通過BL或BLX指令調(diào)用子程序時(shí),R14被設(shè)置成該子程序的返回地址。在子程序中,當(dāng)把R14的值到程序計(jì)數(shù)器PC中時(shí),子程序即返回。
- 當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理R14被設(shè)置成該異常模式將要返回的地址,對于有些異常模式,R14的值可能與將返回的地址有一個(gè)常數(shù)的偏移量。具體的返回方式與上面的子程序返回方式基本相同。
- R14寄存器也可以作為通用寄存器使用。
程序計(jì)數(shù)器R15(PC)
- 程序計(jì)數(shù)器R15又被記作PC。它雖然可以作為一般的通用寄存器使用,但是有一些指令在使用R15時(shí)有一些特殊限制。當(dāng)違反了這些限制時(shí),該指令執(zhí)行的結(jié)果將是不可預(yù)料的。
- 由于ARM采用了流水線機(jī)制,當(dāng)正確讀取了PC的值時(shí),該值為當(dāng)前指令地址值加8個(gè)字節(jié)。也就是說,對于ARM指令集來說,PC指向當(dāng)前指令的下兩條指令的地址。(因?yàn)锳RM使用RISC精簡指令集,ARM的一條指令所占內(nèi)存為32位,4個(gè)字節(jié)。所以當(dāng)一條指令正確讀取時(shí),該寄存器指向當(dāng)前指令地址加8,即指向下兩條指令的地址)
- 當(dāng)成功地向R15中寫入一個(gè)地址數(shù)值時(shí),程序?qū)⑻皆摰刂穲?zhí)行。由于ARM指令是字對齊的,所以PC值的第0位和第1位總為0。需要注意的是,當(dāng)使用指令STR/STM保存R15時(shí),保存的可能是當(dāng)前指令地址值加8字節(jié),也可能保存的是當(dāng)前指令地址加12字節(jié)。到底是哪種方式,取決于芯片具體設(shè)計(jì)方式。無論如何,在同一芯片中,要么采用當(dāng)前指令地址加8,要么采用當(dāng)前指令地址加12,不能有些指令采用當(dāng)前指令地址加8,另一些指令采用當(dāng)前指令地址加12。因此對于用戶來說,盡量避免使用STR/STM指令來保存R15的值。當(dāng)不可避免這種使用方式時(shí),可以先通過一些代碼來確定所用的芯片使用的是哪種實(shí)現(xiàn)方式。
- 對于ARM版本4以及更高的版本,程序必須保證寫入R15寄存器的地址值的bits[1:0]為0b00;否則將會產(chǎn)生不可預(yù)知的結(jié)果。
- 對于Thumb指令集來說,指令是半字對齊的。處理器將忽略bit[0],即寫入R15的地址值首先與0XFFFFFFFE做與操作,再寫入R15中。
- 還有—些指令對于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來確定是ARM指令,還是Thumb指令。這種讀取PC值和寫入PC值的不對稱的操作需要特別注意。
31 | 30 | 29 | 28 | 27 | 26 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
N | Z | C | V | Q | DNM(RAZ) | I | F | T | M4 | M3 | M2 | M1 | M0 |
1.條件標(biāo)志位
在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的。
在Thumb狀態(tài)下,僅有分支指令是有條件執(zhí)行的。
N Negative 對于有符號運(yùn)算,如果結(jié)果是負(fù)數(shù)則置位Z Zero 如果結(jié)果是零則置位C Carry 對于無符號運(yùn)算,如果發(fā)生進(jìn)位則置位V Overflow 對于有符號運(yùn)算,如果發(fā)生溢出則置位I IRQ 中斷禁用F FIQ 快速中斷禁用
標(biāo)志位 | 含義 |
N | 本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit[31]的值 當(dāng)兩個(gè)補(bǔ)碼表示的有符號整數(shù)運(yùn)算時(shí),N=1表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0表示結(jié)果為正數(shù)或零 |
Z | Z=1表示運(yùn)算的結(jié)果為零;Z=0表示運(yùn)算的結(jié)果不為零。 對于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。 |
C | 下面分4種情況討論C的設(shè)置方法: 在加法指令中(包括比較指令CMN),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無符號數(shù)運(yùn)算發(fā)生上溢出;其他情況下C=0。 在減法指令中(包括比較指令CMP),當(dāng)運(yùn)算中發(fā)生借位則C=0表示無符號數(shù)運(yùn)算發(fā)生下溢出;其他情況下C=1。 對于包含移位操作的非加/減法運(yùn)算指令,C中包含最后一次溢出的位數(shù)數(shù)值。 對于其他非加/減法運(yùn)算指令,C位的值通常不受影響。 |
V | 對于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號數(shù)時(shí)V=1表示符號位溢出。 通常其他的指令不影響V位,具體可參考各指令的說明。 |
2.Q標(biāo)志位
3.CPSR中的控制位
- 當(dāng)I=1時(shí)禁止IRQ中斷。
- 當(dāng)F=1時(shí)禁止FIQ中斷。
- T=0表示執(zhí)行ARM指令。
- T=1表示執(zhí)行Thumb指令。
- T=0表示執(zhí)行ARM指令。
- T=1表示強(qiáng)制下一條執(zhí)行的指令產(chǎn)生未定義指令中斷。
M[4:0] | 處理器模式 | 可訪問的寄存器 |
0b10000 | User | PC,R14一R0,CPSR |
0b10001 | FIQ | PC,R14_fiq-R8_flq,R7~R0,CPSR,SPSR_nq |
0b10010 | 1RQ | PC,R14 _irq-R13 _irq,R12一R0,CPSR,SPSR_ irq |
0b10011 | Supervisor | PC,R14_ svc-R13 _svc,R12~R0,CPSR,SPSR_svc |
0b10111 | Abort | PC,R14_abt-R13_abt,R12~R0,CPSR,SPSR_abt |
0b11011 | Undefined | PC,R14_und-R13_und,R12~R0,CPSR,SPSR_ und |
4.CPSR中的其他位
Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下寄存器集的一個(gè)子集,程序可以直接訪問8個(gè)通用寄存器(R7~R0)、程序計(jì)數(shù)器(PC)、堆棧指針(SP)、 連接寄存器(LR)和CPSR。同時(shí),在每一種特權(quán)模式下都有一組SP、LR和SPSR。圖2.4表明Thumb狀態(tài)下的寄存器組織。
Thumb狀態(tài)下的寄存器組織與ARM狀態(tài)下的寄存器組織的關(guān)系:
─ Thumb狀態(tài)下和ARM狀態(tài)下的R0~R7是相同的。
─ Thumb狀態(tài)下和ARM狀態(tài)下的CPSR和所有的SPSR是相同的。
─ Thumb狀態(tài)下的SP對應(yīng)于ARM狀態(tài)下的R13。
─ Thumb狀態(tài)下的LR對應(yīng)于ARM狀態(tài)下的R14。
─ Thumb狀態(tài)下的程序計(jì)數(shù)器對應(yīng)于ARM狀態(tài)下R15
以上的對應(yīng)關(guān)系如圖2.5所示:
訪問THUMB狀態(tài)下的高位寄存器(Hi-registers):
在Thumb狀態(tài)下,高位寄存器R8~R15并不是標(biāo)準(zhǔn)寄存器集的一部分,但可使用匯編語言程序受限制的訪問這些寄存器,將其用作快速的暫存器。使用帶特殊變量的MOV指令,數(shù)據(jù)可以在低位寄存器和高位寄存器之間進(jìn)行傳送;高位寄存器的值可以使用CMP和ADD指令進(jìn)行比較或加上低位寄存器中的值。
評論