<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微處理器的編程模型之:ARM寄存器組織

ARM微處理器的編程模型之:ARM寄存器組織

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

本文引用地址:http://dyxdggzs.com/article/257086.htm

1.讀操作

由于的流水線(xiàn)機制,指令讀出的r15的值是指令地址加上8個(gè)字節。由于指令始終是字對齊的,所以讀出的結果位[1∶0]始終是0(但在Thumb狀態(tài)下,指令為2字節對齊,bit[0]=0)。

讀PC主要用于快速地對臨近的指令或數據進(jìn)行位置無(wú)關(guān)尋址,包括程序中的位置無(wú)關(guān)分支。

需要注意的是,當使用指令STR或STM對r15進(jìn)行保存時(shí),保存的可能是當前指令地址加8或當前指令地址加12。到底是哪種方式,取決于芯片的具體設計方式。當然,在同一個(gè)芯片中,要么采用當前指令地址加8,要么采用當前指令地址加12,不可能有些指令采用當前地址加8,有些采用當前地址加12。程序開(kāi)發(fā)人員應盡量避免使用STR或STM指令來(lái)對r15進(jìn)行操作。當不可避免要使用這種方式時(shí),可以先通過(guò)一小段程序來(lái)確定所使用的芯片是使用哪種方式實(shí)現的。例如:

SUB R1,PC,#4 ;r1中存放STR指令地址

STR PC,[R0] ;將PC=STR地址+offset保存到r0中

LDR R0,[R0]

SUB R0,R0,R1 ;offset=PC-STR地址

2.寫(xiě)操作

當指令向r15寫(xiě)入地址數據時(shí),如果指令成功返回,它將使程序跳轉到該地址執行。由于指令是字對齊的,寫(xiě)入r15的地址值應滿(mǎn)足bit[1:0]=0b00,具體的規則根據ARM版本的不同也有所不同:

· 對于A(yíng)RM版本3以及更低的版本,寫(xiě)入r15的地址值bit[1:0]被忽略,即寫(xiě)入r15的地址值將與0xFFFFFFFC做與操作。

· 對于A(yíng)RM版本4以及更高的版本,程序必須保證寫(xiě)入r15寄存器的地址值的bit[1:0]為0b00,否則將會(huì )產(chǎn)生不可預知的結果。

對于Thumb指令集來(lái)說(shuō),指令是半字對齊的。處理器將忽略bit[0],即寫(xiě)入r15寄存器的值在寫(xiě)入前要先和0XFFFFFFFE做與操作。

有些指令對r15的操作有特殊的要求。比如,指令BX利用bit[0]來(lái)確定需要跳轉到的子程序是ARM狀態(tài)還是Thumb狀態(tài)。

注意

這種讀取PC值和寫(xiě)入PC值的不對稱(chēng)操作需要特別注意。

3.3.3 程序狀態(tài)寄存器

當前程序狀態(tài)寄存器CPSR(Current Program Status Register)可以在任何處理器模式下被訪(fǎng)問(wèn),它包含下列內容。

· ALU(Arithmetic Logic Unit)狀態(tài)標志的備份。

· 當前的處理器模式。

· 中斷使能標志。

· 設置處理器的狀態(tài)(只在4T架構)。

每一種處理器模式下都有一個(gè)專(zhuān)用的物理寄存器作備份程序狀態(tài)寄存器SPSR(Saved Program Status Register)。當特定的異常中斷發(fā)生時(shí),這個(gè)物理寄存器負責存放當前程序狀態(tài)寄存器的內容。當異常處理程序返回時(shí),再將其內容恢復到當前程序狀態(tài)寄存器。

注意

由于用戶(hù)模式和系統模式不屬于異常中斷模式,所以它們沒(méi)有SPSR。當在用戶(hù)模式或系統模式中訪(fǎng)問(wèn)SPSR,將會(huì )產(chǎn)生不可預知的結果。

CPSR寄存器(和保存它的SPSR寄存器)中的位分配如圖3.4所示。

注意

對于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數相等。

· C

下面分4種情況討論C的設置方法。

① 在加法指令中(包括比較指令CMN),當結果產(chǎn)生了進(jìn)位,則C=1,表示無(wú)符號數運算發(fā)生上溢出;其他情況下C=0。

② 在減法指令中(包括比較指令CMP),當運算中發(fā)生錯位(即無(wú)符號數運算發(fā)生下溢出),則C=0,;其他情況下C=1。

③ 對于在操作數中包含移位操作的運算指令(非加/減法指令),C被設置成被移位寄存器最后移出去的位。

④ 對于其他非加/減法運算指令,C的值通常不受影響。

· V

下面分兩種情況討論V的設置方法。

① 對于加/減運算指令,當操作數和運算結果都是以二進(jìn)制的補碼表示的帶符號的數時(shí),V=1表示符號位溢出。

② 對于非加/減法指令,通常不改變標志位V的值(具體可參照ARM指令手冊)。

盡管以上C和V的定義看起來(lái)頗為復雜,但使用時(shí)在大多數情況下用一個(gè)簡(jiǎn)單的條件測試指令即可,不需要程序員計算出條件碼的精確值即可得到需要的結果。

注意

下面兩種情況會(huì )對CPSR的條件標志位產(chǎn)生影響。

1.比較指令(CMN、CMP、TEQ、TST)。

2.目的寄存器不是r15的算術(shù)邏輯運算和數據傳輸指令。這些指令可以通過(guò)在指令末尾加標志“S”來(lái)通知處理器指令的執行結果影響標志位。

塵埃粒子計數器相關(guān)文章:塵埃粒子計數器原理


評論


相關(guān)推薦

技術(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>