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