嵌入式系統原理與應用 課件 第6-8章 ARM指令集及匯編程序設計、Linux操作系統、Linux下的Shell命令與編程_第1頁
嵌入式系統原理與應用 課件 第6-8章 ARM指令集及匯編程序設計、Linux操作系統、Linux下的Shell命令與編程_第2頁
嵌入式系統原理與應用 課件 第6-8章 ARM指令集及匯編程序設計、Linux操作系統、Linux下的Shell命令與編程_第3頁
嵌入式系統原理與應用 課件 第6-8章 ARM指令集及匯編程序設計、Linux操作系統、Linux下的Shell命令與編程_第4頁
嵌入式系統原理與應用 課件 第6-8章 ARM指令集及匯編程序設計、Linux操作系統、Linux下的Shell命令與編程_第5頁
已閱讀5頁,還剩297頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式系統原理與設計第6章

ARM指令集及匯編程序設計本章需要掌握以下內容:ARM指令體系結構;常用ARM指令的功能;ARM匯編程序設計方法。/016.1ARM指令體系結構6.1.1ARM指令體系特點ARM指令集屬于RISC(ReducedInstructionSetComputer)指令集,它具有RISC指令集的如下特點:一個大的、統一的寄存器文件;基于load/store架構,即數據處理操作僅對寄存器內容進行操作,不能對內存的內容進行操作;簡單的尋址模式,即所有的加載/存儲地址僅由寄存器內容和指令字段共同決定;統一和固定長度的指令字段,以簡化指令譯碼。6.1.1ARM指令體系特點ARM指令集還有如下的獨特特點:

在大多數數據處理指令中對算術邏輯單元(ALU)和移位器的控制,以最大限度地利用ALU和移位器;自動遞增和自動遞減尋址模式,以優化程序循環;加載和存儲多條指令,以最大限度地提高數據吞吐量;有條件地執行幾乎所有指令,以最大限度地提高執行吞吐量。這些對基本RISC體系結構的增強使得ARM處理器能夠在高性能、小代碼量、低功耗和小硅片之間實現良好的平衡,這也是ARM在市場上取得成功的關鍵要素之一。6.1.2ARM指令體系結構的版本迄今為止,ARM指令體系架構發布了8個不同的版本,從低到高的版本號依次是v1到v8。同時,各個版本中還有一些變種,這些變種擴展了該版本指令集的功能。(1)v1版本(2)v2版本(3)v3版本目前已不再使用6.1.2ARM指令體系結構的版本(4)v4版本v4版本增加了半字的讀取和存儲指令;讀取帶符號的字節和半字數據的指令;增加了T變種,即指令集為16位的Thumb指令集;增加了處理器的特權模式,在該模式下,使用的是用戶模式下的寄存器。明確了哪些指令會引起未定義指令異常。該版本不向前兼容,即與以前的26位地址空間不兼容。目前常用的ARM7、ARM9處理器都采用該版本結構。6.1.2ARM指令體系結構的版本(5)v5版本v5結構提升了ARM和Thumb兩種指令的交互工作能力,對于T變種的指令和非T變種的指令使用相同的代碼生成技術;增加了DSP指令(E變種)、Java指令(J變種)。帶有連接和交換的轉移BLX指令;增加了前導零計數CLZ指令,增加了軟件斷點指令;為協處理器增加了更多可選擇的指令;更嚴格地定義了乘法指令對條件標志位的影響。目前,ARM10和XScale系列微處理器都采用v5版本的指令體系。6.1.2ARM指令體系結構的版本(6)v6版本v6版本主要是采用單指令多數據(SIMD)技術,擴展了媒體處理指令,使得ARM處理器在媒體應用中的處理能力得到較大提升。該版本首先在ARM11處理器得到應用。6.1.2ARM指令體系結構的版本(7)v7版本v7版本采用了Thumb-2技術。Thumb-2技術比純32位代碼減少31%的存儲開銷,同時能夠提供比已有的基于Thumb技術的解決方案高出38%的性能。v7架構還引入NEON技術,它是一種128位的SIMD指令擴展,將DSP和媒體處理能力提高近4倍,并支持改良的浮點運算,滿足3D圖形、游戲等應用以及傳統嵌入式控制應用的需求。該版本首先在CortexA8處理器上得到應用。6.1.2ARM指令體系結構的版本(8)v8版本v8版本將64位架構支持引入到ARM體系結構中。為向前兼容,v8版本支持AArch32和AArch64兩種執行狀態,A32、T32和A64三個主要指令集。v8指令體系結構主要面向高性能計算,目前主流的智能手機的處理器,如CortexA72、A76等,都采用的是ARMv8指令體系結構。6.1.3ARM指令體系支持的數據類型

字節(Byte,8位)

半字(HalfWord,16位)字(Word,32位)ARM的Load/Store指令支持三種數據類型有符號無符號有符號無符號6.1.4ARM處理器的指令集ARM處理器支持兩類指令集:32位的ARM指令集16位Thumb指令集ARM體系結構采用這種設計方式的目的在于減少程序代碼需要的存儲空間,因為完成同樣功能的Thumb指令只需要2個字節,而ARM指令需要4個字節。Thumb指令集是ARM指令集的子集6.1.4ARM處理器的指令集ARM指令集和Thumb指令集的不同點項目ARM指令Thumb指令指令工作標志CPSR的T位=0CPSR的T位=1操作數尋址方式大多數指令為3地址大多數指令為2地址指令長度32位16位內核指令58條30條條件執行大多數指令只有分支指令數據處理指令訪問桶形移位器和ALU獨立的桶形移位器和ALU指令寄存器使用15個通用寄存器+PC8個通用低寄存器+2個高寄存器+PC程序狀態寄存器特權模式下可讀可寫不能直接訪問異常處理能夠全盤處理不能處理6.1.5ARM指令的條件碼ARM指令可以條件執行,也就是根據CPSR中的條件標志位來決定是否執行某條指令。當條件滿足時執行該指令,條件不滿足時該指令被當作一條NOP指令(不完成任何實際操作,相當于在流水線中插入一個氣泡)。條件執行是ARM指令體系結構的特色之一,也特別有用。例如,如下的C語言代碼,如果變量a分配給R0寄存器,變量b分配給R1寄存器,如何用ARM匯編指令來實現?if(a>b)a++;else

b++;6.1.5ARM指令的條件碼CMPR0,R1 ;比較R0和R1的值,即比較a和b的大小ADDHIR0,R0,#1 ;如果R0>R1,執行該語句,即a++ADDLSR1,R1,#1 ;如果R0≤R1,執行該語句,即b++如下的C語言代碼,如果變量a分配給R0寄存器,變量b分配給R1寄存器,如何用ARM匯編指令來實現?if(a>b)a++;else

b++;6.1.5ARM指令的條件碼條件碼條件碼助記符含義CPSR中條件標志位值0000EQ相等Z=10001NE不相等Z=00010CS/HS無符號數大于/等于C=10011CC/LO無符號數小于C=00100MI負數N=10101PI非負數N=00110VS上溢出V=10111VC沒有上溢出V=01000HI無符號數大于(higher)C=1且Z=01001LS無符號數小于等于C=0且Z=11010GE帶符號數大于等于N=1且V=1或N=0且V=01011LT帶符號數小于N=1且V=0或N=0且V=11100GT帶符號數大于Z=0且N=V1101LE帶符號數小于/等于Z=1或N!=V1110AL無條件執行

1111NV該指令無條件執行ARMv5及以上版本各條件碼的含義和助記符6.1.6ARM指令分類ARM指令集可以分為5大類:數據處理指令:使用片內算術邏輯部件(ALU)、桶形移位器和乘法器完成數據算術、邏輯、移位和乘法等運算。分支跳轉指令:控制程序執行流程、以及完成ARM代碼和Thumb代碼的切換。存儲器訪問指令:控制存儲器和寄存器之間的數據傳送,包括從存儲器取數到寄存器(稱為Load)和將寄存器中的數存到存儲器(稱為Store)。協處理器指令:用于控制外部協處理器,以開放和統一的方式擴展指令集的片外功能。雜類指令:包括中斷調用、狀態寄存器的讀寫等。/026.2ARM指令集6.2.1數據處理指令1.數據傳送指令數據傳送指令用于向寄存器傳入一個數,屬于2操作數指令,一個源操作數,一個目的操作數,包括MOV和MVN兩條指令,指令語法格式如下:<opcode>{cond}{S}<Rd>,<shifter_operand>6.2.1數據處理指令1.數據傳送指令【例6-1】數據傳送指令的用法舉例。MOVR1,R2 ;R1=R2MOVR1,#10 ;R1=10MOVPC,LR ;PC=LR,該指令用于從子程序返回MOVR2,R2LSL#2 ;R2=R2<<2,該指令用于實現純移位操作MVNR1,#0xFF ;將16進制數0xFF按位取反傳送到R1,即R1=0xFFFFFF00MOVEQR1,#10 ;條件標志Z=1時R1=10,否則R1不變6.2.1數據處理指令2.算術邏輯運算指令該類指令用于加、減算術運算和與、或、異或等邏輯運算,屬于3操作數指令,兩個源操作數,一個目的操作數。指令語法格式如下:<opcode>{cond}{S}<Rd>,<Rn>,<shifter_operand>6.2.1數據處理指令1)ADD加法指令【例6-2】ADD指令的用法舉例。ADDRx,Rx,#1 ;Rx=Rx+1ADDRd,Rx,Rx,LSL#n ;Rd=Rx*(2n+1)ADDRs,PC,#offset ;生成基于PC的跳轉指針6.2.1數據處理指令2)ADC帶進位加法指令ADC指令和ADD指令聯合使用,可以實現兩個64位的操作數相加。例如,寄存器R0和R1中放置一個64位的源操作數,其中R0中放置低32位數值;寄存器R2和R3中放置另一個64位的源操作數,其中R2中放置低32位數值;則下面的指令序列實現了兩個64位操作數的加法操作,運算結果存放在寄存器R5和R4中,其中R4保存低32位數值。ADDSR4,R0,R2 ;加低端的字ADCR5,R1,R3 ;加高端的字,帶進位6.2.1數據處理指令3)SUB減法指令【例6-3】SUB指令的用法舉例。SUBR0,R1,R2 ;R0=R1-R2SUBR0,R1,#256 ;R0=R1-2566.2.1數據處理指令4)SBC帶借位減法指令SBC指令和SUBS指令聯合使用,可以實現兩個64位的操作數相減。例如寄存器R0和R1中放置一個64位的源操作數,其中R0中放置低32位數值,寄存器R2和R3中放置另一個64位的源操作數,其中R2中放置低32位數值,則下面的指令序列實現了兩個64位操作數的減法操作。SUBSR4,R0,R2SBCR5,R1,R36.2.1數據處理指令5)RSB逆向減法指令【例6-4】RSB指令的用法舉例。RSBR0,R1,#0 ;Rd=-R1RSBR0,R1,R2 ;Rd=R2-R1RSBRd,Rx,Rx,LSL#n ;Rd=Rx*(2n-1)6.2.1數據處理指令6)RSC帶借位逆向減法指令【例6-5】RSC指令的用法舉例。下面的指令序列可以求一個64位數值的負數。64位數放在寄存器R0與R1中,其負數放在R2與R3中。其中R0與R2中放低32位值。RSBSR2,R0,#0RSCR3,R1,#06.2.1數據處理指令7)AND邏輯與操作指令指令功能為Rd=Rn&shifter_operand(按位與,如果shifter_operand為立即數,要擴展成32位)。如果S=1,還要根據操作的結果更新CPSR中相應的條件標志位。8)ORR邏輯或操作指令指令功能為Rd=Rn|shifter_operand(按位或)。如果S=1,還要根據操作的結果更新CPSR中相應的條件標志位,更新方法與AND指令相同。6.2.1數據處理指令9)EOR邏輯異或操作指令指令功能為Rd=Rn^shifter_operand(按位異或,即相異為1,相同為0)。如果S=1,還要根據操作的結果更新CPSR中相應的條件標志位,更新方法與AND指令相同。10)BIC位清除指令BIC指令用于清除寄存器<Rn>的某些位,并把結果保存到目標寄存器<Rd>中。如果S=1,還要根據操作的結果更新CPSR中相應的條件標志位,更新方法與AND指令相同。6.2.1數據處理指令【例6-6】AND、ORR、EOR和BIC指令的用法舉例。AND R0,R0,#3 ;該指令保持R0的0、1位,其它位清零ORR R0,R0,#3 ;該指令將R0的0、1位置1,其它位保持不變EOR R0,R0,#3 ;該指令反轉R0的0、1位,其它位保持不變BIC R0,R0,#3 ;該指令將R0中的0、1位置0,其余位保持不變6.2.1數據處理指令3.比較測試指令這類指令屬于2操作數指令,有兩個源操作數,沒有目的寄存器,因而不保存運算結果,只用于更新CPSR中相應的條件標志位(N、Z、C和V位),包括CMP、CMN、TST、TEQ指令。指令語法格式如下:<opcode>{cond}<Rn>,<shifter_operand>opcode=CMP|CMN|TST|TEQ,其對應的二進制碼分別為1010|1011|1000|10016.2.1數據處理指令1)CMP比較指令CMP指令從寄存器<Rn>中減去<shifter_operand>表示的數值,根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。指令功能的偽碼如下:ifConditionPassed(cond)then/*cond條件成立*/alu_out=Rn-shifter_operandNFlag=alu_out[31]ZFlag=ifalu_out==0then1else0CFlag=NOTBorrowfrom(Rn-shifter_operand)VFlag=OverflowFrom(Rn-shifter_operand)6.2.1數據處理指令2)CMN基于相反數的比較指令CMN指令將寄存器<Rn>中的值加上<shifter_operand>表示的數值,根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。指令功能的偽碼如下:ifConditionPassed(cond)then/*cond條件成立*/alu_out=Rn+shifter_operandNFlag=alu_out[31]ZFlag=ifalu_out==0then1else0CFlag=CarryFrom(Rn+shifter_operand)VFlag=OverflowFrom(Rn+shifter_operand)6.2.1數據處理指令3)TST位測試指令TST指令將寄存器<Rn>的值與<shifter_operand>表示的數值按位做邏輯與操作,根據操作的結果更新CPSR中相應的條件標志位。指令功能的偽碼如下:ifConditionPassed(cond)then/*cond條件成立*/alu_out=RnANDshifter_operandNFlag=alu_out[31]ZFlag=ifalu_out==0then1else0CFlag=shifter_carry_outVFlag=unaffected6.2.1數據處理指令4)TEQ相等測試指令TEQ指令將寄存器<Rn>的值與<shifter_operand>表示的數值按位做邏輯異或操作,根據操作的結果更新CPSR中相應的條件標志位。其中,條件標志位的更新方法同TST指令。【例6-7】比較測試指令用法舉例(設R0=8,R1=4,R2=10)CMP R1,R0 ;根據R1-R0的結果設置CPSR標志位,N=1,Z=C=V=0CMNR1,#100 ;根據R1+100的結果設置CPSR標志位,N=Z=C=V=0TST R1,#3 ;測試R1的第0、1位是否為1,N=C=V=0,Z=1TST R1,R2,LSL#1 ;測試R1的第2、4位是否為1,N=Z=C=V=0TEQ R1,R2 ;測試R1與R2是否相等,N=Z=C=V=0TEQ R1,#4 ;測試R1與4是否相等,N=C=V=0,Z=16.2.1數據處理指令4.乘法指令與乘加指令ARMv5T支持的乘法指令與乘加指令共有6條,可根據運算結果分為32位和64位兩類。指令中所有的操作數、目的寄存器必須為通用寄存器,不能對操作數使用立即數或被移位的寄存器。目的寄存器和操作數1必須是不同的寄存器。乘法指令和乘加指令包括MUL、MLA、SMULL、SMLAL、UMULL、UMLAL共6條。對于乘法指令,源寄存器或目的寄存器不能為R15寄存器,否則執行結果不可預測。6.2.1數據處理指令1)MUL32位乘法指令MUL指令實現兩個32位的數(可以為無符號數,也可以為有符號數)的乘法,并將低32位結果存放到一個32位的寄存器中。如果S=1,可以根據運算結果設置CPSR寄存器中相應的條件標志位。MUL{<cond>}{S}<Rd>,<Rm>,<Rs>注:由于兩個32位的數相乘結果為64位,而MUL指令僅僅保存了64位結果的低32位,所以對于有符號的和無符號的操作數來說,MUL指令執行的結果相同。6.2.1數據處理指令2)MLA32位帶加數的乘法指令指令功能為Rd=(Rm*Rs)[31:0]+Rn。MLA指令實現兩個32位的數(可以為無符號數,也可為有符號數)的乘積,再將乘積加上第3個操作數,并將結果存放到一個32位的寄存器中。如果S=1,根據運算結果更新CPSR寄存器中N和Z標志位,更新方法與MUL相同。MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>6.2.1數據處理指令3)SMULL、SMLAL、UMULL和UMLAL64位乘法指令SMULL、SMLAL、UMULL和UMLAL為4條64位的乘法指令,指令語法格式如下:<opcode>{cond}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中:RdHi寄存器存放乘積結果的高32位數據,RdLo寄存器存放乘積結果的低32位數據。opcode=SMULL|SMLAL|UMULL|UMLAL,其對應的二進制碼分別為0000110|0000111|0000100|0000101。6.2.1數據處理指令SMULL64位有符號數乘法指令SMULL指令實現兩個32位的有符號數的乘積,乘積結果的高32位存放到一個32位的寄存器的<RdHi>中,乘積結果的低32位存放到另一個32位的寄存器<RdLo>中。如果S=1,可以根據運算結果設置CPSR寄存器中N和Z條件標志位。指令操作的偽代碼如下:ifConditionPassed(cond)then/*cond條件成立*/RdHi=(Rm*Rs)[63:32]RdLo=(Rm*Rs)[31:0]ifS==1thenNFlag=RdHi[31]ZFlag=if(RdHi==0)and(RdLo==0)then1else0CFlag=unaffectedVFlag=unaffected6.2.1數據處理指令SMLAL64位帶加數的有符號數乘法指令SMLAL指令將<Rm>和<Rs>兩個32位的有符號數的乘積結果與<RdHi>和<RdLo>中的64位數相加,結果的高32位存放到<RdHi>的寄存器中,結果的低32位存放到另一個寄存器<RdLo>中。UMULL64位無符號數乘法指令UMULL指令實現兩個32位的無符號數的乘積,乘積結果的高32位存放到一個32位的寄存器<RdHi>中,乘積結果的低32位存放到另一個32位的寄存器<RdLo>中。6.2.1數據處理指令UMLAL64位帶加數的無符號數乘法指令UMLAL指令將兩個32位的無符號數的64位乘積結果與<RdHi>和<RdLo>中的64位無符號數相加,結果的高32位存放到<RdHi>寄存器中,結果的低32位存放到另一個寄存器<RdLo>中。6.2.1數據處理指令【例6-8】典型乘法指令的用法舉例MUL R0,R1,R2 ;R0=(R1*R2)[31:0]MULS R0,R1,R2 ;R0=(R1*R2)[31:0],同時設置CPSR中N位和Z位MLA R0,R1,R2,R3 ;R0=(R1*R2)[31:0]+R3SMULL R1,R2,R3,R4 ;R1=(R3*R4)[31:0],R2=(R3*R4)[63:32]SMLAL R0,R1,R2,R3 ;R0=(R2*R3)[31:0]+R0,R1=(R2*R3)[63:32]+R1UMULL R1,R2,R3,R4 ;R1=(R3*R4)[31:0],R2=(R3*R4)[63:32]UMLAL R1,R2,R3,R4 ;R1=(R3*R4)[31:0]+R1,R2=(R3*R4)[64:32]+R26.2.2存儲器訪問指令RISC處理器的一大特色就是Load/Store架構,即只有Load/Store指令才能訪問存儲器。Load指令用于從內存中讀取數據放入寄存器中,Store指令用于將寄存器中的數據保存到內存。ARM的Load/Store指令包括如下3類:(1)單寄存器傳輸指令:單向在寄存器和存儲器之間傳輸一個數據(2)多寄存器傳輸指令:單向在寄存器和存儲器之間傳輸多個數據(3)數據交換指令:雙向在存儲器和寄存器之間交換一個數據,既有取數據、又有存數據6.2.2存儲器訪問指令1.單寄存器傳輸指令1)LDR/LDRB/STR/STRB指令功能指令功能LDR從存儲器中將一個32位的字數據傳送到目的寄存器中LDRB從存儲器中將一個8位的無符號字節數據傳送到目的寄存器中的低8位,高24位補0STR將目的寄存器中的32位數據存儲到存儲器中STRB將目的寄存器中的低8位數據存儲到存儲器中注:當程序計數器PC作為LDR指令的目的寄存器時,指令從存儲器中讀取的字數據被當做指令地址,從而可以實現程序流程的跳轉6.2.2存儲器訪問指令指令的編碼格式cond為條件碼。I為尋址模式指示位,1代表addr_mode是寄存器移位尋址模式,0代表addr_mode是12位立即數。P為變址方式指示位,1代表前變址,0代表后變址。U為運算指示位,1代表做加法,0代表做減法。B為字節訪問指示位,0代表32位的存儲,1代表8位存儲。W為回寫指示位,0代表地址不回寫到Rn,1代表回寫到Rn。L為加載指示位,1代表為Load指令,0代表為Store指令。Rn為基址寄存器,存儲器地址是Rn和addr_mode運算的結果。Rd為目的寄存器。addr_mode為另一個操作數的尋址模式,可以為12位立即數或寄存器移位尋址。6.2.2存儲器訪問指令指令的語法格式opcode=LDR|STR。addressing_mode用來指定存儲器的地址,與I、P、U和W位的設置相關,一般為Rn和addr_mode運算的結果。<opcode>{<cond>}{B}<Rd>,<addressing_mode>6.2.2存儲器訪問指令1.單寄存器傳輸指令2)LDRH/LDRSH/LDRSB/STRH指令功能指令功能LDRH從存儲器中將一個16位的無符號半字數據傳送到目的寄存器低16位,高16位補0LDRSH從存儲器中將一個16位的有符號半字數據傳送到目的寄存器低16位,高16位補符號位LDRSB從存儲器中將一個8位的有符號字節數據傳送到目的寄存器低8位,高24位補符號位STRH將目的寄存器中的低16位數據存儲到存儲器中6.2.2存儲器訪問指令指令的編碼格式cond為條件碼。P為變址方式指示位,1代表前變址,0代表后變址。U為運算指示位,1代表做加法,0代表做減法。I為尋址模式指示位,1代表addr_mode是8位立即數,0代表addr_mode是寄存器尋址模式,此時addr_mode[11:8]=SBZ。W為回寫指示位,0代表地址不回寫到Rn,1代表回寫到Rn。L為加載指示位,1代表為Load指令,0代表為Store指令。Rn為基址寄存器,存儲器地址是Rn和addr_mode運算的結果。Rd為目的寄存器。addr_mode為另一個操作數的尋址模式,可以為8位立即數或寄存器尋址。S為有符號加載指示位,1代表為有符號加載,0代表無符號加載。H為半字訪問指示位,1代表16位的數據傳輸,0代表8位的數據傳輸。6.2.2存儲器訪問指令指令的語法格式opcode=LDR|STR,type=H|SH|SB。addressing_mode用來指定存儲器操作數的地址,與P、U、I和W位的設置相關,一般為Rn和addr_mode運算的結果。<opcode>{<cond>}<type><Rd>,<addressing_mode>6.2.2存儲器訪問指令【例6-9】設R1=0x9008、R2=0xA5B45A4B、R3=0xFFFFFFFC,存儲器內容如圖6-1所示(16進制表示,小端訪問),在不考慮指令前后影響條件下,下面每條指令執行后的寄存器或存儲器的值為多少?地址0123456789ABCDEF0000900070717273808182830000FFFF4BB4B44B00009010A0A1A2A3B0B1B2B3FF000000A5A55A5A6.2.2存儲器訪問指令LDR R0,[R1]

LDR R0,[R1,#12]

LDR R0,[R1,R3]LDR R0,[R1,#16]! LDR R0,[R1],#16 LDRB R0,[R1,#2]

STR R2,[R1,#4] STRB R2,[R1,#9]!

R0←Mem[R1,4],即R0=0xFFFF0000R0←Mem[R1+12,4],即R0=0xB3B2B1B0R0←Mem[R1+R3,4],即R0=0x83828180R0←Mem[R1+16,4],R1←R1+16,即R0=0xFF,R1=0x9018R0←Mem[R1,4],R1←R1+16,即R0=0xFFFF0000,R1=0x9018R0←ZeroExtend(Mem[R1+2,1]),即R0=0xFFMem[R1+4,4]←R2,即地址0x900C開始4個字節為4B,5A,B4和A5Mem[R1+9,1]←R2[7:0],R1←R1+9,即地址0x9011處為4B,R1=0x90116.2.2存儲器訪問指令LDRH R0,[R1] LDRH R0,[R1,#2] LDRSHR0,[R1,R3]

LDRSHR0,[R1],#2

LDRSBR0,[R1,#3] STRHR2,[R1,#6] R0←ZeroExtend(Mem[R1,2]),即R0=0R0←ZeroExtend(Mem[R1+2,2]),即R0=0xFFFFR0←SignExtend(Mem[R1+R3,2]),即R0=0xFFFF8180R0←SignExtend(Mem[R1,2]),R1←R1+2,即R0=0,R1=0x900AR0←SignExtend(Mem[R1+3,1]),即R0=0xFFFFFFFFMem[R1+6]←R2[15:0],即地址0x900E開始2個字節為4B,5A6.2.2存儲器訪問指令2.批量數據加載/存儲指令ARM處理器支持批量數據加載/存儲指令,可以一條指令實現在地址連續的存儲器單元和多個寄存器之間傳送多個字數據。

具體來說,批量數據加載指令LDM可以從地址連續的存儲器中讀取多個字數據,傳送到指令中指定的多個寄存器;批量數據存儲指令STM可以將指令中寄存器列表中的各個寄存器的值寫入到地址連續的存儲器中。

LDM/STM指令的常見用途是將多個寄存器的內容入?;虺鰲?。6.2.2存儲器訪問指令指令的編碼格式cond為條件碼。P為變址方式指示位,1代表前變址,0代表后變址。U為運算指示位,1代表做加法,0代表做減法。W為回寫指示位,0代表地址不回寫到Rn,1代表回寫到Rn。L為加載指示位,1代表為LDM指令,0代表為STM指令。Rn為基址寄存器。register_list為寄存器列表,R0-R15每個寄存器1位,總共16位。6.2.2存儲器訪問指令指令的語法格式addr_mode,用來指示存儲器地址如何進行變化,必須為以下8種情況LDM|STM{<cond>}<addr_mode><Rn>{!},<register_list>{^}用于為數據塊傳送操作,稱為塊拷貝尋址模式;IA:每次傳送后地址加4;IB:每次傳送前地址加4;DA:每次傳送后地址減4;DB:每次傳送前地址減4;用于堆棧操作,稱為堆棧尋址模式。FD:滿遞減堆棧;ED:空遞減堆棧;FA:滿遞增堆棧;EA:空遞增堆棧。6.2.2存儲器訪問指令2.批量數據加載/存儲指令在進行數據復制時,即從存儲器中把一段數據復制到另外一個位置時,一般采用塊拷貝尋址模式。此時,需要先設置好源指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲。在進行程序現場保護時,即要把多個寄存器的值放入堆棧,或現場恢復時,即從堆棧取出多個寄存器的值時,一般采用堆棧尋址模式。此時,需要先設置好堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現堆棧操作。6.2.2存儲器訪問指令【例6-10】設R4=0x8010,分析下面塊拷貝STM指令執行后的R4及存儲器的值(不考慮指令執行相互間的影響)。STMIA R4!,{R0-R3}STMIB R4!,{R0-R3}STMDA R4!,{R0-R3}STMDB R4!,{R0-R3}6.2.2存儲器訪問指令【例6-10】設R4=0x8010,分析下面塊拷貝STM指令執行后的R4及存儲器的值(不考慮指令執行相互間的影響)。STMIA R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲器中,每次傳送后地址加4,存儲器值如圖6-2(a)所示,最后的地址寫入基址寄存器R4中,R4=0x8020。

8010HR0

8014HR1

8018HR2

801CHR3R4→8020H

6.2.2存儲器訪問指令【例6-10】設R4=0x8010,分析下面塊拷貝STM指令執行后的R4及存儲器的值(不考慮指令執行相互間的影響)。STMIB R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲器中,每次傳送前地址加4,存儲器值如圖6-2(b)所示,最后的地址寫入基址寄存器R4中,R4=0x8020。

8010H

8014HR0

8018HR1

801CHR2R4→8020HR36.2.2存儲器訪問指令【例6-10】設R4=0x8010,分析下面塊拷貝STM指令執行后的R4及存儲器的值(不考慮指令執行相互間的影響)。STMDA R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲器中,每次傳送后地址減4,存儲器值如圖6-2(c)所示,最后的地址寫入基址寄存器R4中,R4=0x8000。R4→8000H

8004HR0

8008HR1

800CHR2

8010HR36.2.2存儲器訪問指令【例6-10】設R4=0x8010,分析下面塊拷貝STM指令執行后的R4及存儲器的值(不考慮指令執行相互間的影響)。STMDB R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲器中,每次傳送前地址減4,存儲器值如圖6-2(d)所示,最后的地址寫入基址寄存器R4中,R4=0x8000。R4→8000HR0

8004HR1

8008HR2

800CHR3

8010H

6.2.2存儲器訪問指令【例6-11】設SP=0x8010,分析下面STM指令執行后的SP及存儲器的值(不考慮指令執行相互間的影響)。STMEA SP!,{R0-R3}STMFA SP!,{R0-R3}STMED SP!,{R0-R3}STMFD SP!,{R0-R3}6.2.2存儲器訪問指令【例6-11】設SP=0x8010,分析下面STM指令執行后的SP及存儲器的值(不考慮指令執行相互間的影響)。STMEA SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲器中,每次傳送后地址加4,存儲器值如圖6-3(a)所示,最后的地址寫入基址寄存器SP中,SP=0x8020。

8010HR0

8014HR1

8018HR2

801CHR3SP→8020H

6.2.2存儲器訪問指令【例6-11】設SP=0x8010,分析下面STM指令執行后的SP及存儲器的值(不考慮指令執行相互間的影響)。STMFA SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲器中,每次傳送前地址加4,存儲器值如圖6-3(b)所示,最后的地址寫入基址寄存器SP中,SP=0x8020。

8010H

8014HR0

8018HR1

801CHR2SP→8020HR36.2.2存儲器訪問指令【例6-11】設SP=0x8010,分析下面STM指令執行后的SP及存儲器的值(不考慮指令執行相互間的影響)。STMED SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲器中,每次傳送后地址減4,存儲器值如圖6-3(c)所示,最后的地址寫入基址寄存器SP中,SP=0x8000。SP→8000H

8004HR0

8008HR1

800CHR2

8010HR36.2.2存儲器訪問指令【例6-11】設SP=0x8010,分析下面STM指令執行后的SP及存儲器的值(不考慮指令執行相互間的影響)。STMFD SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲器中,每次傳送前地址減4,存儲器值如圖6-3(d)所示,最后的地址寫入基址寄存器SP中,SP=0x8000。SP→8000HR0

8004HR1

8008HR2

800CHR3

8010H

6.2.2存儲器訪問指令3、數據交換指令數據交換指令能在存儲器和寄存器之間實現雙向數據傳輸,既有存數據,也有加載數據。數據交換指令包括SWP和SWPB兩條,SWP實現字數據(32位)交換,SWPB實現字節數據(8位)交換。指令的編碼格式B=1代表SWPB指令,B=0代表SWP指令。6.2.2存儲器訪問指令【例6-12】SWP指令用法舉例。SWP R0,R1,[R2]

SWPB R0,R1,[R2]將R2所指向的存儲器中的字數據傳送到R0,同時將R1中的字數據傳送到R2所指向的存儲單元將R2所指向的存儲器中的字節數據傳送到R0,R0的高24位清零,同時將R1的低8位數據傳送到R2所指向的存儲單元6.2.3跳轉指令跳轉指令用于改變程序的順序執行流程,實現流程跳轉。在ARMv5指令集中有兩種方式可以實現程序的跳轉:跳轉指令;直接向程序計數器PC(R15)中寫入目標地址值。可以實現在4GB的地址空間中任意跳轉,這種跳轉指令又稱為長跳轉。6.2.3跳轉指令ARM的跳轉指令可以在當前指令向前或向后的32MB的地址空間跳轉。這類跳轉指令有如下4種:1)B{cond},最基本的跳轉指令。2)BX{cond},帶狀態切換的跳轉指令。3)BL{cond},帶返回的跳轉指令。4)BLX{cond},帶返回和狀態切換的跳轉指令。6.2.3跳轉指令1.B/BL指令指令的編碼格式L=1,代表為BL指令,否則為B指令。signed_immed_24為有符號的24位立即數,代表相對當前PC的偏移數。6.2.3跳轉指令1.B/BL指令指令的語法格式L決定是否保存返回地址。當有L時,將緊跟在跳轉指令之后指令的地址保存到LR寄存器中;當沒有L時,跳轉指令之后指令的地址將不會保存到LR寄存器中。B{L}{cond}<target_address>target_address為指令跳轉的目標地址,其計算方法如下:將指令中的24位帶符號的二進制立即數擴展為30位。將此30位數左移兩位以形成32位值。將得到的值與PC寄存器的值做加法,即得到跳轉的目標地址。跳轉的范圍大致為-32MB~+32MB6.2.3跳轉指令【例6-13】B及BL指令的使用。BWAITA ;程序跳轉到標號WAITA處執行B0x1234 ;程序跳轉到絕度地址0x1234處BLLabel ;先將下一條指令的地址保存到LR,再跳轉到Label處6.2.3跳轉指令2.BX指令指令的編碼格式BX(BranchandExchange)指令跳轉到指令中指定的目標地址,目標地址處的指令可以是ARM指令,也可以是Thumb指令,具體由寄存器Rm的bit[0]決定。6.2.3跳轉指令2.BX指令指令的語法格式其中,Rm寄存器中為跳轉的目標地址。當Rm寄存器的bit[0]=0時,目標地址處的指令為ARM指令;當bit[0]=1時,目的地址處的指令為Thumb指令。BX{<cond>}Rm6.2.3跳轉指令指令操作的偽代碼:ifConditionPassed(cond)thenCPSRTbit=Rm[0]PC=RmAND0xFFFFFFFE指令的使用:ADRL R0,ThumbFun+1 ;將Thumb程序的入口地址加1存入R0BX R0 ;跳轉到R0指定的地址6.2.3跳轉指令3.BLX指令(1)BLX(1)指令指令的編碼格式BLX(1)是無條件執行指令。BLX(1)指令一定會跳轉到指令中指定的目標地址,并將程序狀態切換為Thumb狀態,同時將返回地址保存到LR寄存器中。通常,BLX(1)用于在ARM程序中調用Thumb指令的子程序。6.2.3跳轉指令3.BLX指令(1)BLX(1)指令BLX(1)指令的語法格式target_address為指令跳轉的目標地址,其計算方法如下:1)將指令中的24位帶符號的二進制立即數擴展為30位。2)將此30位數左移兩位以形成32位值。3)將上步得到的32位數的bit[1]設置為H(H即指令編碼中的bit[24])。4)將上步得到的32位數與PC寄存器的內容做加法,結果即為跳轉的目標地址。BLX<target_address>6.2.3跳轉指令3.BLX指令(2)BLX(2)指令指令的編碼格式BLX(2)指令從ARM指令集跳轉到指令中指定的目標地址,目標地址的指令可以是ARM指令,也可以是Thumb指令。目標地址放在寄存器Rm中,目標地址處的指令類型由Rm的bit[0]決定。同時,該指令也將返回地址保存到LR寄存器中。6.2.3跳轉指令3.BLX指令(2)BLX(2)指令指令的語法格式其中,Rm寄存器中為跳轉的目標地址。當Rm的bit[0]=0時,目標地址處的指令為ARM指令;當bit[0]=1時,目標地址處的指令為Thumb指令。當Rm為R15時,會產生不可預知的結果。BLX{<cond>}Rm6.2.4雜項指令(1)SWI(軟中斷指令)SWI用于產生軟件中斷,ARM通過這種機制實現在用戶模式對操作系統中特權模式的程序的調用。指令的編碼格式指令的語法格式SWI{<cond>}<immed_24>6.2.4雜項指令(1)SWI(軟中斷指令)指令 SWI{<cond>}<immed_24>參數傳遞的方法:指令中24位的立即數指定了用戶請求的服務類型,參數通過通用寄存器傳遞。指令中的24位立即數被忽略,用戶請求的服務類型由寄存器R0的數值決定,參數通過其他的通用寄存器傳遞。指令的使用:MOV R0,#34 ;通過寄存器R0傳遞參數SWI 12 ;產生軟件中斷,調用操作系統編號為12的系統例程6.2.4雜項指令(2)狀態寄存器讀指令MRSMRS指令用于將程序狀態寄存器的內容傳送到通用寄存器中。當需要改變程序狀態寄存器的內容時,可用MRS指令將程序狀態寄存器的內容讀入通用寄存器,修改后再寫回程序狀態寄存器。當在異常中斷或進程切換時,需要保存當前程序狀態寄存器值,可先用MRS指令讀出程序狀態寄存器的值,然后保存。6.2.4雜項指令(2)狀態寄存器讀指令MRS指令的編碼格式指令的語法格式MRS{<cond>}<Rd>,PSRRd為通用寄存器,PSR為當前狀態寄存器CPSR或備份狀態寄存器SPSR,由R位(即bit[22])指定。6.2.4雜項指令(3)狀態寄存器寫指令MSRMSR指令用于將通用寄存器的內容或一個立即數傳送到狀態寄存器特定域中,即用于恢復狀態寄存器的內容或者改變狀態寄存器的內容。在使用時,建議在MSR指令中指明將要操作的域。指令的語法格式MSR{<cond>}PSR_<fields>,<Operand2>注:PSR=CPSR|SPSR,fields=f|s|x|c,Operand2=#immediate|Rm6.2.4雜項指令(3)狀態寄存器寫指令MSRI位(即bit[25])用來指定Operand2的形式,I=0則Operand2來源于Rm寄存器;I=1則Operand2由4位循環右移立即數rotate_imm_4和8位立即數imm_8構成;R位用來指定是哪個狀態寄存器,用法同MRS指令;field_mask用來指定操作的域。field_mask(即bit[19:16])每位依次代表操作狀態寄存器的標志位域(PSR[31:24])、狀態位域(PSR[23:16])、擴展位域(PSR[15:8])和控制位域(PSR[7:0])MSR指令的編碼格式6.2.4雜項指令(3)狀態寄存器寫指令MSRI位(即bit[25])用來指定Operand2的形式,I=0則Operand2來源于Rm寄存器;I=1則Operand2由4位循環右移立即數rotate_imm_4和8位立即數imm_8構成;R位用來指定是哪個狀態寄存器,用法同MRS指令;field_mask用來指定操作的域。field_mask(即bit[19:16])每位依次代表操作狀態寄存器的標志位域(PSR[31:24])、狀態位域(PSR[23:16])、擴展位域(PSR[15:8])和控制位域(PSR[7:0])MSR指令的編碼格式6.2.4雜項指令(3)狀態寄存器寫指令MSR【例6-14】MRS和MSR指令使用舉例。MRSR0,CPSR ;ReadtheCPSRBICR0,R0,#0xF0000000 ;CleartheN,Z,CandVbitsMSRCPSR_f,R0 ;UpdatetheflagbitsintheCPSR

;N,Z,CandVflagsnowallclearMRSR0,CPSR ;ReadtheCPSRORRR0,R0,#0x80 ;SettheinterruptdisablebitMSRCPSR_c,R0 ;UpdatethecontrolbitsintheCPSR

;interrupts(IRQ)nowdisabledMRSR0,CPSR ;ReadtheCPSRBICR0,R0,#0x1F ;ClearthemodebitsORRR0,R0,#0x11 ;SetthemodebitstoFIQmodeMSRCPSR_c,R0 ;UpdatethecontrolbitsintheCPSR

;nowinFIQmode/036.3Thumb指令集6.3.1Thumb指令集概述Thumb指令集是對ARM指令集重新編碼得到的子集,它旨在增強使用16位或更窄數據總線實現的ARM處理器的性能和提供比ARM指令集更好的代碼密度。

ARM指令集的T變種同時包含32位的ARM指令集和16位Thumb指令集。在ARMv6及以上指令版本中,Thumb指令集支持是必需的。所有的Thumb數據處理指令仍然支持32位的操作,指令和數據的尋址空間也仍然是32位。6.3.1Thumb指令集概述大多數Thumb指令是無條件執行的大多數Thumb指令采用2地址格式要實現相同的程序功能,所需的Thumb指令的條數要比ARM指令多。Thumb代碼所需的存儲空間為ARM代碼的60%~70%。Thumb代碼使用的指令數比ARM代碼多30%~40%。若使用16位的存儲器,Thumb代碼比ARM代碼快40%~50%。與ARM代碼相比,使用Thumb代碼,存儲器的功耗會降低約30%。6.3.2Thumb指令集編碼白底黑字:統一中文字體為微軟雅黑,英文為Arial字號20—28可適當調節得體即可6.3.2Thumb指令集編碼白底黑字:統一中文字體為微軟雅黑,英文為Arial字號20—28可適當調節得體即可6.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對照表Thumb指令ARM指令說明操作MOVRd,#expr8MOVRd,RmMOVRd,operand2數據傳送Rd←#expr8Rd←RmMVNRd,RmMVNRd,operand2數據非傳送Rd←(~Rm)ADDRd,Rn,#expr3ADDRd,#expr8ADDRd,Rn,RmADDRd,RmADDRd,Rp,#expr8*4ADDSP,#expr7*4ADDRd,Rn,operand2加法運算Rd←Rn+#expr3Rd←Rd+expr8Rd←Rn+RmRd←Rd+RmRd←SP|PC+expr8*4SP←SP+expr7*46.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對照表SUBRd,Rn,#expr3SUBRd,#expr8SUBRd,Rn,RmSUBSP,#expr7*4SUBRd,Rn,operand2減法運算Rd←Rn-#expr3Rd←Rd-expr8Rd←Rn-RmSP←SP-expr7*4ADCRd,RmADCRd,Rn,operand2帶進位加法Rd←Rd+Rm+CSBCRd,RmSBCRd,Rn,operand2帶進位減法Rd←Rd-Rm-(NOTC)ANDRd,RmANDRd,Rn,operand2邏輯與Rd←Rd&RmORRRd,RmORRRd,Rn,operand2邏輯或Rd←Rd|RmEORRd,RmEORRd,Rn,operand2邏輯異或Rd←Rd^RmBICRd,RmBICRd,Rn,operand2位清除Rd←Rd&(~Rm)6.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對照表CMPRn,#expr8CMPRn,RmCMPRn,operand2比較狀態標志←Rn-#expr8狀態標志←Rn-RmCMNRn,RmCMNRn,operand2負數比較狀態標志←Rn+RmTSTRn,RmTSTRn,operand2位測試狀態標志←Rn&RmMULRn,RmMULRd,Rm,Rs32位乘法Rd←Rd*Rm6.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對照表LDRRd,[Rn,#expr5*4]LDRRd,[Rn,Rm]LDRRd,[Rp,#expr8*4]LDRRd,addressing加載字數據Rd←[Rn,#expr5*4]Rd←[Rn,Rm]Rd←[PC|SP,#expr8*4]STRRd,[Rn,#expr5*4]STRRd,[Rn,Rm]STRRd,[SP,#expr8*4]STRRd,addressing存儲字數據[Rn,#expr5*4]←Rd[Rn,Rm]←Rd[SP,#expr8*4]←Rd/046.4ARM指令的尋址方式6.4.1尋址方式的類型1.立即數尋址立即數尋址是一種特殊的尋址方式,操作數就在指令編碼中給出,只要取出指令也就得到了操作數,故而這個操作數被稱為立即數。如下面指令:MOVR3,#0x3A ;將十六進制數3a放到寄存器R3中,即R3=0x3A在上面的指令中,第2個源操作數即為立即數,實際使用時以“#”符號作為前綴。十六進制的立即數在“#”后面加“0x”,以二進制表示的立即數在“#”后面加“%”,以十進制表示的立即數直接跟在“#”后。6.4.1尋址方式的類型2.寄存器尋址操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執行時直接取出寄存器值來操作。寄存器尋址是各類處理器經常采用的一種尋址方式。在下面所示的指令中,R2即為寄存器尋址。MOVR1,R2 ;將R2的數值放到R1中ADDR0,R1,R2 ;將R1和R2中的數值相加,然后賦值給R06.4.1尋址方式的類型3.寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存在以寄存器的值作為地址的存儲單元中,即寄存器為操作數的地址指針。如下面的指令:LDR R1,[R2] ;將R2指向的存儲單元的數據讀出保存在R1中6.4.1尋址方式的類型4.基址變址尋址基址變址尋址方式就是將寄存器(該寄存器一般稱為基址寄存器)的內容與指令中給出的地址偏移量相加/減,從而得到一個操作數的有效地址。基址尋址用于訪問基址附近的存儲單元,常用于查表、數組操作、功能部件寄存器訪問等。寄存器間接尋址是偏移量為0的基址加偏移尋址。如下面的指令:LDRR0,[R1,#4] ;將寄存器R1的內容加上4形成操作數的有效地址LDRR0,[R1],#4 ;將寄存器R1的值作為內存地址加載第2個操作數

;到R0;加載完成后,R1的值加4保存。LDRR0,[R1,R2] ;將R1+R2的值作為操作數的地址6.4.1尋址方式的類型5.多寄存器尋址一次可以傳送幾個寄存器的值,允許一條指令傳送16個寄存器的任何子集。LDMIA R1!,{R2-R7} ;{R2-R7}即為多寄存器尋址STMIA R0!,{R2-R7} ;{R2-R7}即為多寄存器尋址6.4.1尋址方式的類型6.寄存器移位尋址寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。6.4.1尋址方式的類型6.寄存器移位尋址寄存器移位選址舉例如下:MOV R0,R1,LSL#3

;“R1,LSL#3”代表對R1進行邏輯左移3位操作ANDS R1,R1,R2,LSR#3 ;“R2,LSR#3”代表對R2進行邏輯右移3位操作6.4.1尋址方式的類型7.相對尋址與基址變址尋址方式類似,但相對尋址由程序計數器PC提供基準地址,指令中的地址標號作為偏移量,兩者相加后得到的地址即為操作數的有效地址。BL SUBR1 ;調用到SUBR1子程序

BEQ LOOP ;條件跳轉到LOOP標號處

...LOOP ;LOOP標號

MOV R6,#1 ...SUBR1 ;子程序SUBR1的入口標號...6.4.1尋址方式的類型8.堆棧尋址堆棧是一種數據結構,按先進后出(FirstInLastOut,FILO)的方式工作,使用一個稱為堆棧指針的專用寄存器(ARM指令中,通常都采用R13寄存器作為堆棧寄存器SP)指示當前的操作位置,堆棧指針總是指向棧頂。根據堆棧的生成方式,堆棧又可以分為遞增堆棧(AscendingStack)和遞減堆棧(DecendingStack)。當堆棧由低地址向高地址生成時,稱為遞增堆棧;當堆棧由高地址向低地址生成時,稱為遞減堆棧。根據堆棧指針指向的地址是否存有有效數據,堆棧又可以分為滿堆棧(FullStack)和空堆棧(EmptyStack)。當堆棧指針指向的地址存有有效數據時,稱為滿堆棧;否則,堆棧指針指向下一個要放入的空位置,稱為空堆棧(EmptyStack)。6.4.1尋址方式的類型8.堆棧尋址1) 滿遞增堆棧(FA):堆棧指針指向最后壓入的數據,且由低地址向高地址生成;2) 滿遞減堆棧(FD):堆棧指針指向最后壓入的數據,且由高地址向低地址生成;3) 空遞增堆棧(EA):堆棧指針指向下一個將要放入數據的空位置,且由低地址向高地址生成;4) 空遞減堆棧(ED):堆棧指針指向下一個將要放入數據的空位置,且由高地址向低地址生成。LDMFASP!,{R2-R7} ;FA指定滿遞增堆棧方式STMEASP!,{R2-R7} ;EA指定空遞增堆棧方式6.4.1尋址方式的類型9.塊拷貝尋址塊拷貝尋址與堆棧尋址類似,主要用于LDM/STM指令中的存儲器地址的變化方式,只不過此時基址寄存器一般為R0-R12中的一個。1) IA:每次傳送后地址加4;2) IB:每次傳送前地址加4;3) DA:每次傳送后地址減4;4) DB:每次傳送前地址減4。LDMIAR0!,{R2-R7} ;IA指定每次傳送后地址加4STMIBR6!,{R2-R7} ;IB指定每次傳送前地址加46.4.2具體尋址方式1)#<immediate>采用立即數尋址方式指定shifter_operand。此時,立即數immediate可以為32位立即數。MOVR4,#0x8000000A ;#0x8000000A為合法立即數,可由8位的0xA8

;循環右移4位得到ADDR1,R2,#0x3F0 ;#0x3F0可以由0x3F循環右移28位得到ADDR1,R2,#0x3FF ;#0x3FF為非法立即數,此條指令匯編會報錯1.數據處理指令的第2操作數的具體形式6.4.2具體尋址方式2)<Rm>采用寄存器尋址方式指定shifter_operand。此時,12位shifter_operand的編碼為:bits[3:0]=Rm,其它8位全部為0;shifter_operand為Rm的值。3)<Rm>,LSL#<shift_imm>采用寄存器移位尋址方式指定shifter_operand。這種尋址方式中,是對Rm的值邏輯左移shift_imm位。此時,12位shifter_operand的編碼為:bits[11:7]=shift_imm,bits[3:0]=Rm,bits[6:4]=000。6.4.2具體尋址方式4)<Rm>,LSL<Rs>采用寄存器移位尋址方式指定shifter_operand。這種尋址方式中,是對Rm的值邏輯左移,左移多少位由Rs的內容決定。此時,12位shifter_operand的編碼為:bits[11:8]=Rs,bits[3:0]=Rm,bits[7:4]=0001。5)<Rm>,LSR#<shift_imm>采用寄存器移位尋址方式指定shifter_operand。這種尋址方式中,是對Rm的值邏輯右移shift_imm位。此時,12位shifter_operand的編碼為:bits[11:7]=shift_imm,bits[6:4]=010,b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論