<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指令集和常用寄存器

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
1)ARM指令集 32位的 ARM指令和 16位 的Thumb指令
1,寄存器尋址
MOV R1, R2 //將寄存器R2的值傳給寄存器R1
2,立即尋址
MOV R0, #0XFF00 //數據包含在指令中
3,寄存器偏移尋址
MOV R0, R2, LSL #3 //R2的值左移3位,結果放入 R0中 即 R0 = R2 * 8
LSL邏輯左移、 LSR邏輯右移、 ASL算術(shù)左移、 ASR算術(shù)右移、 ROR循環(huán)右移、RRX帶擴展的循環(huán)右移
4,寄存器間接尋址
LDR R1, [R2] //將R2中的數值作為地址,取出此地址的數據保存在R1中
SWP R1,R1,[R2] //將R2中的數值作為地址
5,基址尋址 將基址寄存器的內容與指令中給出的偏移量相加,形成有效地址
LDR R2,[R3, #0x0F] //將R3中數值加0x0F作為地址,取出數據保存在R2中
LDR R0, [R1], #-4 //將R1地址單元內容存入R0中,且R1= R1 - 4
STR R1, [R0, #-2] //將R0中數值減2作為地址,
6,多寄存器尋址
LDMIA R1!, {R2-R7, R12} //將R1單元的數據讀出到R2-R7,R12中,R1自動(dòng)加1
STMIA R0!,{R3-R6,R10} //將R3-R6中德數據保存到R0指向的地址,R0自動(dòng)加1
7,堆棧尋址
滿(mǎn)遞增 LDMFA STMFA
滿(mǎn)遞減 LDMFD STMFD
空遞增 LDMEA STMEA
空遞減 LDMED STMED
8,塊拷貝尋址 多寄存器傳送指令用于一塊數據從存儲器的某一位置拷貝到另一位置
STMIA R0!,{R1-R7}
STMIB R0!, {R1-R7}
STMDA
STMDB
9,相對尋址
由程序計數器PC提供基準地址,指令中地址碼字段作為偏移量,兩者相加都得到的地址即為操作數的有效地址
帶S的會(huì )影響CPSR寄存器,標志位
R15 為程序計數器PC。
2)ARM存儲器訪(fǎng)問(wèn)指令
ARM處理器是加載/存儲體系結構的典型RISC處理器,對存儲器的訪(fǎng)問(wèn)只能使用加載和存儲指令實(shí)現。LDR/STR
批量加載和存儲指令可實(shí)現一條指令加載/存儲多個(gè)寄存器的內容,大大提高了效率。SWP指令是一條寄存器和存儲器
內容交換的指令,可用于信號量操作等。ARM處理器是馮諾依曼存儲結構,程序空間、RAM空間及IO映射空間統一編址,
除對RAM操作外,對外圍IO、程序數據的訪(fǎng)問(wèn)均要通過(guò)加載/存儲指令進(jìn)行。
LDR/STR T為可選后綴,有T表示處理器在特權模式下,使用后綴!表示結果回寫(xiě)。S表示帶符號擴展。
B后綴表一個(gè)字節, H表示半字(2字節),
程序相對偏移 LDR Rd, label; //label為程序標號,必須是當前指令的+-4KB范圍內
1,LDM 和 STM 可以實(shí)現一組寄存器和一塊連續的內存單元之間傳輸數據。主要用于現場(chǎng)保護、數據、參數傳遞等。
IA 傳送后地址加4 DA 傳送后地址減4
IB 傳送前地址加4 DB 傳送前地址減4
STMFD R0!,{R0-R7,LR} //現場(chǎng)保存 將R0-R7,LR入棧
LDMFD R1!,{R0-R7,PC} //恢復現場(chǎng) 異常處理返回
2,SWP
寄存器和存儲器交換指令,用于將一個(gè)內存單元(該單元地址放在寄存器Rn中)的內容讀取到一個(gè)寄存器Rd中,同時(shí)將另
一個(gè)寄存器Rm的內容寫(xiě)入到該內存單元中。
SWP R1, R2, [R0] //將R0指向存儲單元內容讀取一字節到R1中(高24位清零),并將R2內容寫(xiě)入該內存單元
3)ARM跳轉指令
B label 跳轉指令 Pc<-label 限制在當前指令的+-32KB的范圍內
BL label 帶鏈接的跳轉指令 LR<- PC-4, PC<- label 用于子程序調用
BX Rm 帶狀態(tài)切換的跳轉指令 PC<- label切換狀態(tài)
4)ARM協(xié)處理器指令
1,CDP 通知ARM協(xié)處理器執行特定的操作
2,LDC 從某一連續的內存單元將數據讀取到協(xié)處理器的寄存器中
LDC p5, c2, [R2, #4] //讀取R2+4指向內存單元的數據傳送到協(xié)處理器p5的c2寄存器中
3,STC 將協(xié)處理器的寄存器數據寫(xiě)入到某一連續的內存單元中
4,MCR 將ARM處理器的寄存器中的數據傳送到協(xié)處理器的寄存器中。
5,MRC 將協(xié)處理器的寄存器中的數據傳送到ARM處理器的寄存器中。
5)ARM雜項指令
SWI immediately——24 軟中斷指令 處理器進(jìn)入管理模式
MRS Rd, psr 讀狀態(tài)寄存器指令
MSR psr_fields, Rd/#immed_8r 寫(xiě)狀態(tài)寄存器指令
6)ARM偽指令
ADR偽指令 小范圍的地址讀取偽指令,用于將PC相對偏移的地址值讀取到寄存器中。
ADRL偽指令 中等范圍的地址讀取偽指令,用于將PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。
LDR偽指令 大范圍的地址讀取偽指令,用于加載32位的立即數或一個(gè)地址到指定寄存器中。
NOP偽指令 空操作偽指令
ARM匯編程序由機器指令, 偽指令和宏指令組成,偽指令不像機器指令那樣在處理器運行期間由機器執行,而是由匯編程序
對源程序處理。
1)符號定義偽指令
GBLA全局的算術(shù)變量初始化為0 LCLA 局部的 SETA 賦值
GBLL全局的邏輯變量初始化為false LCLL 局部的 SETL 賦值
GBLS全局的字符串變量初始化空 LCLS 局部的 SETS 賦值
ARM處理器共有 37個(gè)寄存器。其中包括:
**31個(gè)通用寄存器,包括程序計數器(PC)在內。這些寄存器都是32位寄存器。
**6個(gè)狀態(tài)寄存器。這些寄存器也是32位寄存器。
ARM處理器共有7種不同的處理器模式,每一種模式中都有一組相應的寄存器組。在任何時(shí)刻,可見(jiàn)的寄存器包括15個(gè)通用寄存器
(R0-R14),一個(gè)或兩個(gè)狀態(tài)寄存器及程序計數器(PC)。在所有的寄存器中,有些是各模式公用一個(gè)物理寄存器,有一些寄存
器各模式擁有自己獨立的物理寄存器。
****************************************************
通用寄存器 ARM
通用寄存器分為以下三類(lèi):備份寄存器、未備份寄存器、程序計數器PC
備份寄存器
對于R8-R12備份寄存器來(lái)說(shuō),每個(gè)寄存器對應兩個(gè)不同的物理寄存器。系統為將備份寄存器用于任何的非凡用途,但是
當中斷處理非常簡(jiǎn)單,僅僅使用R8-R14寄存器時(shí),FIQ處理程序可以不必執行保存和恢復中斷現場(chǎng)的指令,從而可以使中
斷處理非常迅速。 ARM
對于R13,R14備份寄存器來(lái)說(shuō),每個(gè)寄存器對應六個(gè)不同的物理寄存器,其中的一個(gè)是系統模式和用戶(hù)模式共用的;另外
的五個(gè)對應于其他的五種處理器模式。采用下面的記號來(lái)區分各個(gè)物理寄存器:
R13_ 字串5
其中MODE可以是下面幾種模式之一:usr,svc,abt,und,irq,fiq
字串5
未備份寄存器
未備份寄存器包括R0-R7。對于每一個(gè)未備份寄存器來(lái)說(shuō),所有處理器模式下都是使用同一個(gè)物理寄存器。未備份寄存器
沒(méi)有被系統用于非凡的用途,任何可采用通用寄存器的場(chǎng)合都可以使用未備份寄存器。
程序計數器PC
可以作為一般的通用寄存器使用,但有一些指令在使用R15時(shí)有一些限制。由于A(yíng)RM采用了流水線(xiàn)處理器機制,當正確讀取
了PC的值時(shí),該值為當前指令地址值加上8個(gè)字節。也就是說(shuō),對于A(yíng)RM指令集來(lái)說(shuō),PC指向當前指令的下兩條指令的地址。
由于A(yíng)RM指令是字對齊的,PC值的第0位和第一位總為0。
需要注意的是,當使用str/stm保存R15時(shí),保存的可能是當前指令地址值加8個(gè)字節,也可能保存的是當前指令地址值加12
個(gè)字節。到底哪種方式取決于芯片的具體設計。對于用戶(hù)來(lái)說(shuō),盡量避免使用STR/STM指令來(lái)保存R15的值。
當成功的向R15寫(xiě)入一個(gè)數值時(shí),程序將跳轉到該地址執行。由于A(yíng)RM指令是字對齊的,寫(xiě)入R15的值應滿(mǎn)足bits[1:0]為0b00
,具體要求arm個(gè)版本有所不同:
**對于arm3以及更低的版本,寫(xiě)入R15的地址值bits[1:0]被忽略,即寫(xiě)入r15的地址值將與0xFFFF FFFC做與操作。
**對于A(yíng)RM4以及更高的版本,程序必須保證寫(xiě)入R15的地址值bits[1:0]為0b00,否則將產(chǎn)生不可預知的后果。
對于Thumb指令集來(lái)說(shuō),指令是班子對齊的,處理器將忽略bit[0]。


關(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>