ARM指令集和常用寄存器

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算術左移、 ASR算術右移、  ROR循環右移、RRX帶擴展的循環右移
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自動加1
STMIA R0!,{R3-R6,R10}//將R3-R6中德數據保存到R0指向的地址,R0自動加1
7,堆棧尋址
滿遞增 LDMFA STMFA
滿遞減 LDMFD STMFD
空遞增 LDMEA STMEA
空遞減 LDMED STMED
8,塊拷貝尋址 多寄存器傳送指令用於一塊數據從存儲器的某一位置拷貝到另一位置
STMIA R0!,{R1-R7}
STMIB R0!, {R1-R7}
STMDA
STMDB
9,相對尋址
由程序計數器PC提供基準地址,指令中地址碼字段作爲偏移量,兩者相加都得到的地址即爲操作數的有效地址
帶S的會影響CPSR寄存器,標誌位
R15 爲程序計數器PC。
2)ARM存儲器訪問指令
ARM處理器是加載/存儲體系結構的典型RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現。LDR/STR
批量加載和存儲指令可實現一條指令加載/存儲多個寄存器的內容,大大提高了效率。SWP指令是一條寄存器和存儲器
內容交換的指令,可用於信號量操作等。ARM處理器是馮諾依曼存儲結構,程序空間、RAM空間及IO映射空間統一編址,
除對RAM操作外,對外圍IO、程序數據的訪問均要通過加載/存儲指令進行。
||LDR/STR T爲可選後綴,有T表示處理器在特權模式下,使用後綴!表示結果回寫。S表示帶符號擴展。
B後綴表一個字節, H表示半字(2字節),
||程序相對偏移 LDR Rd, label; //label爲程序標號,必須是當前指令的+-4KB範圍內
1,LDM 和 STM 可以實現一組寄存器和一塊連續的內存單元之間傳輸數據。主要用於現場保護、數據複製、參數傳遞等。
IA 傳送後地址加4  DA 傳送後地址減4 
IB 傳送前地址加4  DB 傳送前地址減4 
STMFD R0!,{R0-R7,LR}  //現場保存 將R0-R7,LR入棧
LDMFD R1!,{R0-R7,PC}  //恢復現場 異常處理返回
2,SWP
寄存器和存儲器交換指令,用於將一個內存單元(該單元地址放在寄存器Rn中)的內容讀取到一個寄存器Rd中,同時將另
一個寄存器Rm的內容寫入到該內存單元中。
SWP R1, R2, [R0] //將R0指向存儲單元內容讀取一字節到R1中(高24位清零),並將R2內容寫入該內存單元
3)ARM跳轉指令
B label   跳轉指令             Pc<-label 限制在當前指令的+-32KB的範圍內
BL label  帶鏈接的跳轉指令     LR<- PC-4, PC<- label 用於子程序調用
BX Rm  帶狀態切換的跳轉指令 PC<- label切換狀態
4)ARM協處理器指令
1,CDP 通知ARM協處理器執行特定的操作
2,LDC 從某一連續的內存單元將數據讀取到協處理器的寄存器中
LDC p5, c2, [R2, #4] //讀取R2+4指向內存單元的數據傳送到協處理器p5的c2寄存器中
3,STC 將協處理器的寄存器數據寫入到某一連續的內存單元中
4,MCR 將ARM處理器的寄存器中的數據傳送到協處理器的寄存器中。
5,MRC 將協處理器的寄存器中的數據傳送到ARM處理器的寄存器中。
5)ARM雜項指令
SWI immediately——24 軟中斷指令 處理器進入管理模式
MRS Rd, psr 讀狀態寄存器指令
MSR psr_fields, Rd/#immed_8r 寫狀態寄存器指令
6)ARM僞指令
ADR僞指令 小範圍的地址讀取僞指令,用於將PC相對偏移的地址值讀取到寄存器中。
ADRL僞指令 中等範圍的地址讀取僞指令,用於將PC相對偏移的地址值或基於寄存器相對偏移的地址值讀取到寄存器中。
LDR僞指令 大範圍的地址讀取僞指令,用於加載32位的立即數或一個地址到指定寄存器中。
NOP僞指令 空操作僞指令
 
ARM彙編程序由機器指令,僞指令和宏指令組成,僞指令不像機器指令那樣在處理器運行期間由機器執行,而是由彙編程序
對源程序處理。
1)符號定義僞指令
GBLA全局的算術變量初始化爲0    LCLA 局部的        SETA 賦值
GBLL全局的邏輯變量初始化爲falseLCLL 局部的   SETL 賦值
GBLS全局的字符串變量初始化空        LCLS 局部的   SETS 賦值

ARM處理器共有37個寄存器。其中包括:
  **31個通用寄存器,包括程序計數器(PC)在內。這些寄存器都是32位寄存器。 

  **6個狀態寄存器。這些寄存器也是32位寄存器。 
ARM處理器共有7種不同的處理器模式,每一種模式中都有一組相應的寄存器組。在任何時刻,可見的寄存器包括15個通用寄存器
(R0-R14),一個或兩個狀態寄存器及程序計數器(PC)。在所有的寄存器中,有些是各模式公用一個物理寄存器,有一些寄存
器各模式擁有自己獨立的物理寄存器。 
**************************************************** 
通用寄存器 ARM 
      通用寄存器分爲以下三類:備份寄存器、未備份寄存器、程序計數器PC 
備份寄存器 
      對於R8-R12備份寄存器來說,每個寄存器對應兩個不同的物理寄存器。系統爲將備份寄存器用於任何的非凡用途,但是
  當中斷處理非常簡單,僅僅使用R8-R14寄存器時,FIQ處理程序可以不必執行保存和恢復中斷現場的指令,從而可以使中
  斷處理非常迅速。 ARM 
      對於R13,R14備份寄存器來說,每個寄存器對應六個不同的物理寄存器,其中的一個是系統模式和用戶模式共用的;另外
  的五個對應於其他的五種處理器模式。採用下面的記號來區分各個物理寄存器: 

R13_<MODE> 字串5 
其中MODE可以是下面幾種模式之一:usr,svc,abt,und,irq,fiq 
字串5 
未備份寄存器  
      未備份寄存器包括R0-R7。對於每一個未備份寄存器來說,所有處理器模式下都是使用同一個物理寄存器。未備份寄存器
  沒有被系統用於非凡的用途,任何可採用通用寄存器的場合都可以使用未備份寄存器。 
程序計數器PC 
      可以作爲一般的通用寄存器使用,但有一些指令在使用R15時有一些限制。由於ARM採用了流水線處理器機制,當正確讀取
  了PC的值時,該值爲當前指令地址值加上8個字節。也就是說,對於ARM指令集來說,PC指向當前指令的下兩條指令的地址。
  由於ARM指令是字對齊的,PC值的第0位和第一位總爲0。 
      需要注意的是,當使用str/stm保存R15時,保存的可能是當前指令地址值加8個字節,也可能保存的是當前指令地址值加12
  個字節。到底哪種方式取決於芯片的具體設計。對於用戶來說,儘量避免使用STR/STM指令來保存R15的值。
      當成功的向R15寫入一個數值時,程序將跳轉到該地址執行。由於ARM指令是字對齊的,寫入R15的值應滿足bits[1:0]爲0b00
  ,具體要求arm個版本有所不同:
**對於arm3以及更低的版本,寫入R15的地址值bits[1:0]被忽略,即寫入r15的地址值將與0xFFFF FFFC做與操作。
**對於ARM4以及更高的版本,程序必須保證寫入R15的地址值bits[1:0]爲0b00,否則將產生不可預知的後果。
對於Thumb指令集來說,指令是班子對齊的,處理器將忽略bit[0]。 
發佈了44 篇原創文章 · 獲贊 12 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章