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