<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          arm寄存器解析

          作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
          寒假閑來(lái)無(wú)事準(zhǔn)備將自己的走過(guò)的arm之路總結(jié)一下,今天就先從arm的寄存器說(shuō)起吧,歡迎各位拍磚。
          要介紹arm寄存器之前我們要先了解一下arm處理器的工作模式:
          Arm處理器有七種工作模式,為的是形成不同的使用級(jí)別,以防造成對(duì)系統(tǒng)的破壞。不同模式可以訪問(wèn)的寄存器不同,可以運(yùn)行的指令不同。
          (1)usr(10):普通應(yīng)用程序運(yùn)行的模式(應(yīng)用程序)
          (2)FIQ(11):快速中斷模式,以處理快速情況,高速數(shù)據(jù)傳輸
          (3)IRQ(10010):外部中斷模式,普通中斷處理
          (4)svc(10011):保護(hù)模式(管理模式),操作系統(tǒng)使用的特權(quán)模式(內(nèi)核)
          (5)abt(10):數(shù)據(jù)訪問(wèn)中止模式,用于虛擬存儲(chǔ)和存儲(chǔ)保護(hù)
          (6)und(11011):未定義指令終止模式,用于支持通過(guò)軟件仿真硬件的協(xié)處理器
          (7)sys(11):系統(tǒng)模式,用于運(yùn)行特權(quán)級(jí)的操作系統(tǒng)任務(wù)(armv4以上版本才具有)
          注意:usr是普通模式,其他六種是特權(quán)模式,而除了usr和sys模式以外的五種模式是異常模式
          --
          Ok下面進(jìn)入正題:
          我們首先可以找到這樣一本資料《ARM Architecture Reference Manual》在其中的Programmers’Model一章中,我們可以輕松的找到官方文檔對(duì)寄存器的說(shuō)明,建議大家去看看官方的英文文檔,我將其中的重要內(nèi)容簡(jiǎn)單的總結(jié)一下。
          Arm處理器總共有37個(gè)寄存器其可以分為以下兩類(在此我先列出大框架下面會(huì)一一介紹):
          1.通用寄存器(31個(gè))
          1.不分組寄存器(R0—R7)
          2.分組寄存器(R8—R14)
          3.PC指針(R15)
          2.狀態(tài)寄存器(6個(gè))
          1.CPSR(1個(gè))
          2.SPSR(5個(gè))
          相信通過(guò)上面的介紹大家對(duì)arm的寄存器有個(gè)初步的印象,下面官方文檔對(duì)寄存器的說(shuō)明:


          下面我將會(huì)結(jié)合上圖和我上面列出的大框架對(duì)寄存器進(jìn)行解析:
          1.不分組寄存器(R0—R7)
          在所有的運(yùn)行模式下都使用同一個(gè)物理寄存器,它們未被系統(tǒng)用作特殊的用途。
          2.分組寄存器(R8—R14)
          a)對(duì)于R8~R12,當(dāng)使用FIQ(快速中斷模式)時(shí)訪問(wèn)寄存器R8_fiq~R12_fiq,當(dāng)使用除FIQ模式以外的其他模式時(shí),訪問(wèn)寄存器R8~R12
          b)對(duì)于R13,R14來(lái)說(shuō),每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器,其中一個(gè)是用戶模式與系統(tǒng)模式共用(圖中的R13,R14),另外5個(gè)物理寄存器對(duì)應(yīng)其他5種不同的運(yùn)行模式,并采用以下記號(hào)來(lái)區(qū)分不同的物理寄存器分別為fiq,irq,svc,abt,und.(如上圖)
          i.R13在ARM指令中常用作堆棧指針SP
          特別注意:由于每一種模式都有自己的R13,所以我們?cè)谧约撼跏蓟臅r(shí)候一般都要初始化每種模式下的R13,使其指向該運(yùn)行模式的??臻g。
          ii.R14稱為子程序鏈接寄存器LR(Link Register)
          有兩個(gè)特殊功能,一種是每一種模式下都可以用于保存函數(shù)的返回地址,另外就是異常處理后的返回地址,如中斷。
          3.PC指針(R15)
          R15用作程序計(jì)數(shù)器(PC)對(duì)應(yīng)一個(gè)物理寄存器,由于ARM體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù)(不了解多級(jí)流水線的可以訪問(wèn)這個(gè)博客http://blog.csdn.net/abclixu123/article/details/7471822,博主講的不錯(cuò)),對(duì)于ARM指令集而言,PC總是指向當(dāng)前指令的下兩條指令的地址,即PC的值為當(dāng)前指令的地址值加8個(gè)字節(jié)程序狀態(tài)寄存器。
          4.CPSR
          在官方文檔中我們可以找到


          下面介紹其中幾個(gè)比較重要的位,其他位,大家可以參考官方手冊(cè):
          N:當(dāng)兩個(gè)表示的有符號(hào)整數(shù)運(yùn)算時(shí),1表示運(yùn)算結(jié)果為負(fù)數(shù),0表示結(jié)果為正或零。
          Z:1表示運(yùn)算的結(jié)果為零,0表示運(yùn)算的結(jié)果不為零。對(duì)于CMP指令,1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。
          C:下面分四種情況討論C的設(shè)置方法:
          a)加法運(yùn)算(包括比較指令CMN):當(dāng)運(yùn)算產(chǎn)生了進(jìn)位時(shí)(無(wú)符號(hào)數(shù)溢出),C=1,否則C=0。
          b)減法運(yùn)算(包括比較指令CMP):當(dāng)運(yùn)算時(shí)產(chǎn)生了借位(無(wú)符號(hào)數(shù)溢出),C=0,否則C=1。
          c)對(duì)于包含移位操作的非加/減運(yùn)算指令,C為移出值的最后一位。
          d)對(duì)于其他的非加/減運(yùn)算指令,C的值通常不改變。
          V:下面分兩種情況討論V的設(shè)置方法
          a)對(duì)于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)位溢出。
          b)對(duì)于其他的非加/減運(yùn)算指令,C的值通常不改變。
          I:1表示禁止外部(硬件)中斷(IRQ)
          F:1表示禁止快速中斷(FIQ)
          T:1表示為thumb狀態(tài)0為arm狀態(tài)
          M[4:0]:用來(lái)設(shè)置處理器的工作模式具體數(shù)據(jù)見(jiàn)本文開(kāi)始的介紹。
          5.SPSR
          SPSR除usr、sys外,對(duì)應(yīng)用于異常保護(hù)的CPSR的備份,異常時(shí),保存CPSR值,異常退出時(shí),將該值恢復(fù)到CPSR,以保證程序的正常運(yùn)行,每一中異常運(yùn)行模式(除usr和sys)有各自的物理寄存器。

          以上是自己的arm寄存器的簡(jiǎn)單理解,希望各位提出寶貴意見(jiàn),并且在這個(gè)寒假?gòu)慕裉扉_(kāi)始沒(méi)有意外的話我的博客會(huì)一天一更,努力學(xué)習(xí),歡迎大家監(jiān)督。


          關(guān)鍵詞: ARM寄存

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();