天天看點

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB

ARM體系架構—ARMv7-A指令集

  • 一、ARMv7-A指令集
  • 一、ARMv7-A記憶體操作指令
  • 二、單寄存器尋址記憶體操作指令
  • 三、多寄存器尋址記憶體操作指令
  • 四、SWP,SWPB

一、ARMv7-A指令集

ARMv7-A架構是32位處理器架構。也是load/store架構,即資料處理指令操作在通用寄存器完成,隻有load/store指令可以通路記憶體。此外ARM指令集還有一大特點,就是ARM指令集幾乎所有的指令都可以增加條件碼。

ARM指令集可以歸為一下四類:

  1. 資料處理操作(ALU操作例如ADD);
  2. 記憶體操作(load/store);
  3. 控制流(循環,跳轉,條件碼等);
  4. 系統(協處理器,debug,模式切換等等)。

本文重點介紹記憶體操作指令。

一、ARMv7-A記憶體操作指令

ARM core中的ALU(Arithmetic Logic Unit)隻能用于對寄存器的運算處理。隻有load和store指令可以執行記憶體的通路,其中:

  • load指令表示将資料從記憶體讀到寄存器中,memory->register
  • store指令表示将資料從寄存器寫的記憶體,register->memory

常見的load和store指令是LDR(Load Register)和STR(Store Register),和其他指令一樣,記憶體操作指令也可以跟條件碼字尾。關于條件碼的說明請參看《ARM體系架構—ARMv7-A指令集:資料處理指令》。

Load和Store指令可以跟B(Byte,8bit),H(Halfword,16bit),D(Doubleword,64bit)字尾,用于訓示記憶體操作的長度。此外還可以跟S(signed)字尾,用于訓示資料是否帶符号,之是以存在S(signed)字尾,是因為在資料8bit或16bit讀寫時可以保留高位的符号位。不加這些字尾,表示記憶體操作長度是32bit。

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB

上圖展示了記憶體操作指令,可以根據通路記憶體的長度和通路記憶體權限劃分記憶體操作指令。

對于記憶體通路長度的說明:

  1. 無長度字尾表示32bit通路;
  2. H字尾,表示16bit通路,用于STR指令;
  3. H字尾,SH字尾,表示無符号/有符号16bit通路,用于LDR指令;
  4. B字尾,表示8bit通路,用于STR指令;
  5. B字尾,SB字尾,表示無符号/有符号8bit通路,用于LDR指令;
  6. D字尾,表示32bit通路,用于LDR/STR指令;
  7. D字尾,表示64bit通路,用于LDREX/STREX指令;

對于記憶體通路權限的說明:

  1. 無權限字尾表示特權模式通路;
  2. T字尾,表示非特權模式通路(使用者模式,PL0),用于LDR/STR;
  3. EX字尾,表示獨占模式通路,用于LDR/STR,該指令用于共享記憶體同步;

按照尋址方式,記憶體操作指令分為兩種:

  1. 單寄存器記憶體操作指令;
  2. 多寄存器記憶體操作指令。

二、單寄存器尋址記憶體操作指令

單寄存器尋址記憶體操作指令,将位址分為兩部分:基址寄存器和偏移量。

  • 基址寄存器可以是R0-R12,SP或者LR。對于load操作,基址寄存器還可以是PC;
  • 偏移量又存在三種形式:立即數,寄存器和移位後的寄存器。

基址寄存器和偏移量配合尋址模式計算的模式,有三種:

  1. 偏移量尋址模式:寄存器基址加上或者減去偏移量,計算出位址;
  2. 前索引尋址模式:寄存器基址加上或者減去偏移量,計算出位址,計算出的新位址回寫到寄存器基址;
  3. 後索引尋址模式:寄存器基址即記憶體通路位址,寄存器基址加上或者減去偏移量,計算出的新位址回寫到寄存器基址。

以具體執行個體說明三種尋址計算模式。

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB
  1. 偏移量尋址模式,位址為寄存器R1中的值,偏移量為0;
  2. 偏移量尋址模式,位址為寄存器R1中的值+寄存器R2中的值,偏移量為R2中的值;
  3. 偏移量尋址模式,位址為寄存器R1中的值+寄存器R2中的值左移2位,偏移量為R2中的值左移2位;
  4. 前索引尋址模式,位址為寄存器R1中的值+立即數32,偏移量為32,計算出的新位址回寫到R1中;
  5. 後索引尋址模式,位址為寄存器R1中的值,偏移量為32,寄存器R1中的值+立即數32計算出的新位址回寫到R1中;

需要說明的是對于尋址計算方式的劃分隻是為了歸納,可能有不同類型的劃分方法。例如可以将示例中的1作為單獨的一種(寄存器尋址模式),也可以歸納到偏移為0的偏移量尋址模式。友善了解即可,不必拘泥于形式。

再以LDR指令詳細說明記憶體操作指令的格式。

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB
  • type:通路記憶體的長度,B-無符号8bit,SB-有符号8bit,H-無符号16bit,SH-有符号16bit。對于無符号字尾表示多餘位資料用0填充;
  • T:訓示記憶體通路指令是否在使用者模式下程序;
  • cond:條件碼(CPSR寄存器狀态位);
  • Rt:目标寄存器;
  • Rn:基址寄存器;
  • !:最終計算的位址是否寫回Rn;
  • offset:立即數偏移;
  • Rm:存儲偏移位址的寄存器;
  • shift:用于寄存器或立即數偏移量移位值。

三、多寄存器尋址記憶體操作指令

load/store指令提供的多寄存器尋址記憶體操作指令,可以實作超過32bit的記憶體通路。在棧操作以及記憶體拷貝的應用中優勢明顯。

多寄存器尋址指令為LDM(Load Multiple registers)和STM(Store Multiple registers)。

LDM及STM指令格式如下圖所示。

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB
  • addr_mode:四種位址模式,IA-每次傳輸後位址增加(預設模式),IB-每次傳輸前位址增加,DA-每次傳輸後位址減小,DB-每次傳輸前位址減小;
  • cond:條件碼(CPSR寄存器狀态位);
  • Rn:基址寄存器;
  • !:最終計算的位址是否寫回Rn;
  • reglist:存儲資料的寄存器清單,多個寄存器或寄存器範圍使用“,”隔開,寄存器範圍用“-”連接配接;
  • ^:寄存器清單中不包含PC時,該字尾表示load/store寄存器是使用者模式的寄存器,而不是目前模式的寄存器;寄存器清單中含有PC時,該字尾表示除了正常傳輸資料外,将SPSR寄存器拷貝到CPSR中,用于異常傳回處理,這種情況隻發生在異常模式。

舉例說明LDM的使用。

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB
  • 将R10所指記憶體位址的值,傳輸到R0-R3和R12寄存器中,“,”隔開非連續寄存器R12,“-”連接配接寄存器範圍R0-R3;
  • IA字尾,傳輸資料後位址增加4位元組,共傳輸5個寄存器,即20位元組資料;
  • R10 = R10 + 20,“!”即将最終記憶體位址回寫到寄存器R10中。

IA,IB,DA,DB四種字尾,在用于SP寄存器時,可以使用别名FD(Full Descending), FA(Full Ascending), ED(Empty Descending), EA(Empty Ascending),從棧的角度指定棧滿或棧空,以及棧的增長方向。

  • 滿堆棧:SP棧頂指針指向最後入棧的資料;
  • 空堆棧:SP棧頂指針指向下一個待入棧的資料的空位置。

寄存器R0-R5入棧及出棧指令:

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB

下圖以R0,R1寄存器入棧分析其過程:

  • 記憶體位址向上增長,棧位址向下增長;
  • SP棧頂指針位址減4,R2寄存器入棧;
  • SP棧頂指針位址減4,R1寄存器入棧;
  • 滿堆棧遞減字尾FD,SP棧頂指針最終指向R1寄存器入棧的位置。
    ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB

四、SWP,SWPB

除了以上介紹的記憶體操作指令外,還有SWP(Swap)和SWPB(Swap Byte)指令用于寄存器和記憶體的值互換。

其指令格式如下:

ARM體系架構—ARMv7-A指令集:記憶體操作指令一、ARMv7-A指令集一、ARMv7-A記憶體操作指令二、單寄存器尋址記憶體操作指令三、多寄存器尋址記憶體操作指令四、SWP,SWPB
  • cond:條件碼(CPSR寄存器狀态位);
  • B:單位元組交換;
  • Rt:目标寄存器;
  • Rt2:源寄存器,可以和Rt一樣;
  • Rn:位址寄存器,不能和Rt,Rt2一樣;

SWP将Rn所指記憶體單元的值讀到Rt,同時将Rt2寄存器值寫入到該記憶體單元。當Rt與Rt2一樣時,即寄存器與記憶體資料交換。

SWP/SWPB指令,在某些情況下,體系結構不能保證在加載和存儲之間不會對這些記憶體位置進行記憶體通路,因而記憶體不安全,ARMv7提供了LDREX/STREX和LDREXB/STREXB替代SWP/SWPB。因而SWP/SWPB指令是可選指令,可以被處理器被棄用。

ARMv7已經支援虛拟化,無論是否棄用SWP/SWPB指令,在虛拟化Hyp模式下,都沒有定義SWP/SWPB指令。