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