<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM 關(guān)鍵幾個(gè)寄存器

ARM 關(guān)鍵幾個(gè)寄存器

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏



圖中縮寫(xiě)如下:

本文引用地址:http://dyxdggzs.com/article/201611/318801.htm
R:Register;寄存器PC:Program Counter;程序計數器CPSR:Current Program Status Register;當前程序狀態(tài)寄存器SPSR:Saved Program Status Register;保存的程序狀態(tài)寄存器SP:Stack Pointer;數據棧指針LR:Link Register;連接寄存器SB:靜態(tài)基址寄存器SL:數據棧限制指針FP:幀指針I(yè)P:Intra-Procedure-call Scratch Register;內部程序調用暫存寄存器

ARM共有37個(gè)寄存器,可以工作在7種不同的模式。以下根據上圖進(jìn)行分類(lèi)的說(shuō)明:

未分組寄存器r0-r7為所有模式共用,共8個(gè)。分組寄存器中r8-r12,快速中斷模式有自己的一組寄存器,其他模式共用,所以有10個(gè)。分組寄存器中r13,r14,除了用戶(hù)模式和系統模式共用外,其他模式各一組,所以共有2*7 - 2 = 12個(gè)。r15和CPSR共用,共2個(gè);SPSR除了用戶(hù)模式和系統模式?jīng)]有外,其他模式各一個(gè),共5個(gè)。

所以總數為8+10+12+2+5 = 37個(gè)。與此對應的匯編名稱(chēng)表明了它們通常的約定用法。

1. PC(程序計數器) = windows 中 EIP

解析:
處理器要執行的程序(指令序列)都是以二進(jìn)制代碼序列方式預存儲在計算機的存儲器中,處理器將這些代碼逐條
地取到處理器中再譯碼、執行,以完成整個(gè)程序的執行。為了保證程序能夠連續地執行下去,CPU必須具
有某些手段來(lái)確定下一條取指指令的地址.程序計數器(PC)正是起到這種作用,所以通常又稱(chēng)之為‘指令計數器’
。CPU總是按照PC的指向對指令序列進(jìn)行取指、譯碼和執行,也就是說(shuō),最終是PC 決定了程序運行流向。故而,程
序計數器(PC )屬于特別功能寄存器范疇,不能自由地用于存儲其他運算數據.

在程序開(kāi)始執行前,將程序指令序列的起始地址,即程序的第一條指令所在的內存單元地址送入PC,CPU 按照 PC
的指示從內存讀取第一條指令(取指)。當執行指令時(shí),CPU自動(dòng)地修改PC 的內容,即每執行一條指令PC增加一個(gè)
量,這個(gè)量等于指令所含的字節數(指令字節數),使 PC總是指向下一條將要取指的指令地址。由于大多數指令都
是按順序來(lái)執行的,所以修改PC 的過(guò)程通常只是簡(jiǎn)單的對PC 加“指令字節數”。
當程序轉移時(shí),轉移指令執行的最終結果就是要改變PC的值,此PC值就是轉去的目標地址。處理器總是按照PC
指向取指、譯碼、執行,以此實(shí)現了程序轉移。

2.堆棧指針寄存器 SP (寄存器 R13)

ARM處理器中通常將寄存器R13作為堆棧指針(SP)。ARM處理器針對不同的模式,共有 6 個(gè)堆棧指針(SP),其中
用戶(hù)模式和系統模式共用一個(gè)SP,每種異常模式都有各自專(zhuān)用的R13寄存器(SP)。它們通常指向各模式所對應的專(zhuān)
用堆棧,也就是ARM處理器允許用戶(hù)程序有六個(gè)不同的堆??臻g,ARM處理器中的R13被用作SP。當不使用堆棧時(shí),
R13 也可以用做通用數據寄存器.


由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶(hù)應用程序的初始化部分,一般都要初始化每種模
式下的R13,使其指向該運行模式的??臻g。這樣,當程序的運行進(jìn)入異常模式時(shí),可以將需要保護的寄存器放入R
13所指向的堆棧,而當程序從異常模式返回時(shí),則從對應的堆棧中恢復,采用這種方式可以保證異常發(fā)生后程序的
正常執行。


3.R14稱(chēng)為子程序鏈接寄存器LR(Link Register)

當執行子程序調用指令(BL)時(shí),R14可得到R15(程序計數器PC)的備
份.在每一種運行模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時(shí),將PC的當前值給
R14,執行完子程序后,又將R14的值回PC,即可完成子程序的調用返回。以上的描述可用指令完成。
執行以下任意一條指令:
MOV PC,LR
BX LR
在子程序入口處使用以下指令將R14存入堆棧:
STMFD SP!,{,LR}
對應的,使用以下指令可以完成子程序返回:
LDMFD SP!,{,PC}
R14也可作為通用寄存器。

4. PSR 寄存器

條件碼標志(Condition Code Flags)
N、Z、C、V均為條件碼標志位。它們的內容可被算術(shù)或邏輯運算的結果所改變,并且可以決定某條指令是否
被執行。
在A(yíng)RM狀態(tài)下,絕大多數的指令都是有條件執行的。
在Thumb狀態(tài)下,僅有分支指令是有條件執行的。

N Negative 如果結果是負數則置位 當用補碼表示的帶符號數進(jìn)行運算時(shí),N=1表示運算的結果為負數;N=0表示運算的結果是正數或零。
Z Zero 如果結果是零則置位 Z=1表示運算的結果為零;Z=0表示運算的結果不為零。
C Carry 如果發(fā)生進(jìn)位則置位 有4種方法影響C的值:
l 加法運算:當運算結果產(chǎn)生了進(jìn)位時(shí)(無(wú)符號數溢出),C=1,否則C=0。
2 減法運算(包括比較指令CMP):當運算時(shí)產(chǎn)生了借位(無(wú)符號數溢出)時(shí),C=0,否則C=1。
3 對于包含移位操作的非加/減運算指令,C為移出值的最后一位。
4 對于其他的非加/減運算指令,C的值通常不改變。

V Overflow 如果發(fā)生溢出則置位 有2種方法設置V的值:
l 對于加/減法運算指令,當操作數和運算結果為二進(jìn)制的補碼表示的帶符號數時(shí),V=1表示符號位溢出。
2 對于其它的非加/減法運算指令,V的值通常不改變。
I IRQ 中斷禁用
F FIQ 快速中斷禁用
T 工作狀態(tài)位,1為T(mén)humb;0為ARM



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>