嵌入式-ARM寄存器基本概念
無論是學(xué)習(xí)哪一種處理器,首先需要明確的就是這種處理器的寄存器以及工作模式。
本文引用地址:http://m.butianyuan.cn/article/148879.htmARM有37個(gè)寄存器,其中31個(gè)通用寄存器,6個(gè)狀態(tài)寄存器。
這里尤其要注意區(qū)別的是ARM自身寄存器和它的一些外設(shè)的寄存器的區(qū)別。
ARM自身是統(tǒng)一架構(gòu)的,也就意味著37個(gè)寄存器無論在哪個(gè)公司的芯片里面都會(huì)出現(xiàn)。但是各家公司會(huì)對(duì)ARM進(jìn)行外設(shè)的擴(kuò)展,所以就出現(xiàn)了好多外設(shè)寄存器,一定要與這37個(gè)寄存器區(qū)別開來!!!
1、備份寄存器(R8-R14)
對(duì)于R8-R12來說,除在快速中斷模式下,每個(gè)模式對(duì)應(yīng)相同物理寄存器,所以在FIQ模式下可不必保護(hù)和恢復(fù)中斷現(xiàn)場(chǎng)。
對(duì)于R13-R14來說,每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器,其中一個(gè)是用戶模式和系統(tǒng)模式共用的。
寄存器R13常用做棧指針SP,除用戶和系統(tǒng)模式外,其他模式在使用時(shí)的名字構(gòu)成為R13_
寄存器R14又被稱
2、不分組寄存器(R0-R7)
不分組也就是說說,在所有的處理器模式下指的都時(shí)同一物理寄存器。在異常中斷造成處理器模式切換時(shí),由于不同的處理器模式使用一個(gè)名字相同的物理寄存器,就是使用的同一個(gè)寄存器,這樣可能造成寄存器中數(shù)據(jù)被破壞,所以在進(jìn)行模式切換時(shí)必須加以保護(hù)。
為連接寄存器(LR),除用戶和系統(tǒng)模式外,其他模式在使用時(shí)的名字構(gòu)成為 R14_
有下面兩種特殊用途:
A、每個(gè)處理器模式自己的物理R14中存放在當(dāng)前子程序的返回地址。當(dāng)通過BL或BLX指令調(diào)用子程序時(shí),R14被設(shè)置成該子程序的返回地址。
B、當(dāng)異常中斷發(fā)生時(shí),該異常模式下的R14被設(shè)置成保存該模式基于PC的返回地址,對(duì)于有些異常模式,R14的值有可能與將返回的地址有個(gè)常數(shù)的偏移量,不同模式偏移量還有所不同(在ARM 的異常處理里有詳細(xì)介紹)。
3、程序計(jì)數(shù)器R15
對(duì)于用戶來說,盡量避免使用STR/STM指令來保存R15的值。當(dāng)成功向R15寫入一個(gè)地址數(shù)值時(shí),程序?qū)⑻D(zhuǎn)到該地址執(zhí)行。
在ARM狀態(tài)下指令總是字對(duì)齊的,所以PC的PC[1:0]位恒為零,在想PC寫入地址時(shí)一定要注意將PC[1:0]設(shè)為零。
ARM采用的是3級(jí)流水線結(jié)構(gòu),所以PC指向的是當(dāng)前執(zhí)行指令的下兩條指令,PC-8為當(dāng)前指令地址。
4、程序狀態(tài)寄存器
CPSR(當(dāng)前程序狀態(tài)寄存器)可以在任何處理器模式下被訪問。同時(shí)除了用戶和系統(tǒng)模式以外,每中處理器模式下都有一個(gè)專用的物理狀態(tài)寄存器,稱為 SPSR(備份程序狀態(tài)寄存器)。當(dāng)特定的異常中斷發(fā)生時(shí),這個(gè)寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。當(dāng)在用戶模式和系統(tǒng)模式中訪問SPSR,將會(huì)產(chǎn)生不可預(yù)知的結(jié)果。
CPSR和SPSR的格式相同,如下:
0:M0
1:M1
2:M2
3:M3
4:M4
5:T(=1 Thumb執(zhí)行)
6:F(=1是禁止)
7:I(=1是禁止)
注意:M0~M4并不是所有的組合都定義了有效的處理模式,如果錯(cuò)誤設(shè)置,將會(huì)引起無法預(yù)料的錯(cuò)誤。
27:Q 在ARM V5的E系列處理器中,CPSR的bit[27]稱為q標(biāo)識(shí)位,主要用于指示增強(qiáng)的dsp指令是否發(fā)生了溢出。同樣的spsr的bit[27]位也稱為q 標(biāo)識(shí)位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)識(shí)位。
在ARM V5以前的版本及ARM V5的非E系列的處理器中,Q標(biāo)識(shí)位沒有被定義
28:V 對(duì)于加減運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)為溢出;通常其他指令不影響V位。
對(duì)于其他指令,V統(tǒng)常不發(fā)生變化。
29:C 下面分四種情況討論C的設(shè)置方法:
在加法指令中(包括比較指令CMN),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無符號(hào)運(yùn)算發(fā)生上溢出;其他情況C=0。
在減法指令中(包括減法指令CMP),當(dāng)運(yùn)算中發(fā)生借位,則C=0,表示無符號(hào)運(yùn)算數(shù)發(fā)生下溢出;其他情況下C=1。
對(duì)于包含移位操作的非加減運(yùn)算指令,C中包含最后一次移出位的數(shù)值。
對(duì)于其他非加減運(yùn)算指令,C位的值通常不受影響。
30:Z z=1表示運(yùn)算的結(jié)果為零;z=0表示運(yùn)算的結(jié)果不為零。對(duì)于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。
31:N 當(dāng)兩個(gè)表示的有符號(hào)整數(shù)運(yùn)算時(shí),n=1表示運(yùn)算結(jié)果為負(fù)數(shù),n=0表示結(jié)果為正書或零。
MRS:狀態(tài)寄存器到通用寄存器的傳送指令。
MSR:通用寄存器到狀態(tài)寄存器的傳送指令
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論