ARM體系結構與編程:第4章 ARM微處理器指令系統(tǒng)_第1頁
ARM體系結構與編程:第4章 ARM微處理器指令系統(tǒng)_第2頁
ARM體系結構與編程:第4章 ARM微處理器指令系統(tǒng)_第3頁
ARM體系結構與編程:第4章 ARM微處理器指令系統(tǒng)_第4頁
ARM體系結構與編程:第4章 ARM微處理器指令系統(tǒng)_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 ARM微處理器指令系統(tǒng)目標學員:嵌入式初級開發(fā)者課程時長:6學時,270分鐘ARM微處理器指令系統(tǒng)本章目錄1324ARM微處理器的指令集概述 ARM指令集 ARM指令的尋址方式 Thumb指令及應用 課程目標掌握ARM指令集的分類與具體應用 掌握ARM指令集;深入理解C和匯編相互調用的過程;了解Thumb指令集簡介及應用場合;重點難點 ARM指令集 ARM指令的尋址方式 匯編與C語言互調課程目錄1324ARM微處理器的指令集概述 ARM指令集 ARM指令的尋址方式 Thumb指令及應用 ARM微處理器的指令向后兼容:新版本增加指令,并保持指令向后兼容;Load-store 結構*loa

2、d/store 從存儲器中讀某個值,操作完后再將其放回存儲器中只對存放在寄存器的數(shù)據(jù)進行處理;對于存儲器中的數(shù)據(jù),只能使用load/store指令進行存取ARM微處理器的指令的分類與格式 指令的分類(九大類): 數(shù)據(jù)處理指令移位指令乘法指令與乘加指令跳轉指令程序狀態(tài)寄存器(PSR)處理指令加載/存儲指令批量數(shù)據(jù)加載/存儲指令協(xié)處理器指令和異常產生指令ARM指令編碼格式說明Cond指令執(zhí)行的條件編碼Opcode指令操作符編碼S決定指令的操作是否影響CPSR的值Rd操作目標寄存器編碼Rn包含第一操作數(shù)的寄存器編碼Shifter_operand表示第二操作數(shù)cond001opcodesRnRdShi

3、fter_operand 31 28 27 25 24 21 20 19 16 15 12 11 8 7 0課程目錄1324ARM微處理器的指令集概述 ARM指令集 ARM指令的尋址方式 Thumb指令及應用 數(shù)據(jù)處理指令 數(shù)據(jù)傳送指令: 用于在寄存器和存儲器之間進行數(shù)據(jù)的雙向傳輸。算術邏輯運算指令: 完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的寄存器中,同時更新CPSR中的相應條件標志位。移位指令: ARM微處理器內嵌的桶型移位器(BarrelShifter),支持數(shù)據(jù)的各種移位操作。比較指令: 不保存運算結果,只更新CPSR中相應的條件標志位。 數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指

4、令、算術邏輯運算指令、移位指令和比較指令等。數(shù)據(jù)處理指令ADD r0, r1, r2r0 := r1 + r2ADC r0, r1, r2r0 := r1 + r2 + CSUB r0, r1, r2r0 := r1 - r2SBC r0, r1, r2r0 := r1 - r2 + C - 1RSB r0, r1, r2r0 := r2 r1RSC r0, r1, r2r0 := r2 r1 + C - 1算術操作按位邏輯操作AND r0, r1, r2r0 := r1 and r2ORR r0, r1, r2r0 := r1 or r2EOR r0, r1, r2r0 := r1 xor

5、r2BIC r0, r1, r2r0 := r1 and (not) r2寄存器移位MOV r0, r2r0 := r2MVN r0, r2r0 := not r2比較操作CMP r1, r2set cc on r1 - r2CMN r1, r2set cc on r1 + r2TST r1, r2set cc on r1 and r2TEQ r1, r2set cc on r1 xor r2數(shù)據(jù)處理指令 - MOVMOV指令是把一個數(shù)N送到目標寄存器中,N可以是寄存器,也可以是立即數(shù)。MOV指令語法: MOV條件S目的寄存器,源操作數(shù) 例: MOV R0,#0 x10 ; 把立即數(shù)0 x10

6、載入到R0寄存器,R0-0 x10 MOV R2,R0 ;把寄存器R0中的數(shù)據(jù)載入到R2寄存器R2-R0數(shù)據(jù)處理指令 - MVNMVN指令可完成從另一個寄存器、被移位的寄存器、或將一個立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。 MVN指令語法: MVN條件S目的寄存器,源操作數(shù) 例: MVN R0, #0 ; 把0邏輯取反后載入到R0寄存器中,R0 = -1 MVN R1, #0 xffffff00 ;把寄存器R0中的數(shù)據(jù)載入到R2寄存器R2-R0數(shù)據(jù)處理指令 - CMPCMP指令用于把一個寄存器的內容和另一個寄存器的內容或立即

7、數(shù)進行比較,同時更新CPSR中條件標志位的值。該指令進行一次減法運算,但不存儲結果,只更改條件標志位。 。CMP指令語法: CMP條件 操作數(shù)1,操作數(shù)2 例:CMPR1,R0 ;將寄存器R1的值與寄存器R0的值相減,并 根據(jù)結果設置CPSR的標志位 CMPR1,100 ; 將寄存器R1的值與立即數(shù)100相減,并根 據(jù)結果設置CPSR的標志位 數(shù)據(jù)處理指令 - CMNCMN指令用于把一個寄存器的內容和另一個寄存器的內容或立即數(shù)取反后進行比較,同時更新CPSR中條件標志位的值。該指令實際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結果更改條件標志位 。CMN指令語法: CMN條件 操作數(shù)1,操作數(shù)2 例:

8、 CMNR1,R0 ;將寄存器R1的值與寄存器R0的值相加,并 根據(jù)結果設置CPSR的標志位CMN R1,100 ;將寄存器R1的值與立即數(shù)100相加,并根 據(jù)結果設置CPSR的標志位 數(shù)據(jù)處理指令 - TSTTST 指令用于把一個寄存器的內容和另一個寄存器的內容或立即數(shù)進行按位的與運算,并根據(jù)運算結果更新CPSR中條件標志位的值。操作數(shù)1是要測試的數(shù)據(jù),而操作數(shù)2是一個位掩碼,該指令一般用來檢測是否設置了特定的位 。TST指令語法: TST 條件 操作數(shù)1,操作數(shù)2 例:TSTR1,0 x1 ;先進行and運算,如果結果為 零,則設置標志位Z=1 數(shù)據(jù)處理指令 - TEQTEQ指令用于把一個

9、寄存器的內容和另一個寄存器的內容或立即數(shù)進行按位的異或運算,并根據(jù)運算結果更新CPSR中條件標志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等 。TEQ指令語法: TEQ條件 操作數(shù)1,操作數(shù)2 例:TEQR1,R2 ; 將寄存器R1的值與寄存器R2的值按位異或 ,并根據(jù)結果設置CPSR的標志位 綜合示例MOV R0,#0 x31MOV R2,#0 x50MOV R3,#0 x100TST R0, #0 x01;測試是否影響標志位ZMOVEQ R2,#0 x3000TST R1,#0 x0f;CMP R2,R3ANDEQ R2,R2,#0 x3 ;如果R2等于R3則執(zhí)行該語句,否則跳過數(shù)

10、據(jù)處理指令 - ADDADD指令用于把兩個操作數(shù)相加,并將結果存放到目的寄存器中。操作數(shù)1應是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù) 。ADD指令語法: ADD條件S , , MOV R1, #3MOV R2, #5ADD R0, R1, R2 ; 寄存器與寄存器之間的加法操作, R0 = R1 + R2ADD R0, R1, #2 ; 寄存器與立即數(shù)之間的加法操作, R0 = R1 + 2ADD R0, R2, R1,LSL#1 ; 包含移位運算的加法操作,先進行 移位操作,再進行加法操作R0 = R2 + (R1 1)數(shù)據(jù)處理指令 - SUBSUB 用操作數(shù) 1

11、減去操作數(shù) 2,把結果放置到目的寄存器中。操作數(shù) 1 是一個寄存器,操作數(shù) 2 可以是一個寄存器、被移位的寄存器、或一個立即值。SUB指令語法: SUB條件S , , SUB R0, R1, R2 ; R0 = R1 - R2SUB R0, R1, #256 ; R0 = R1 256SUB R2, R1, R3,LSL#1 ; R0 = R2 - (R3 1)數(shù)據(jù)處理指令 - RSBRSB 用操作數(shù) 2 減去操作數(shù) 1,把結果放置到目的寄存器中。操作數(shù) 1 是一個寄存器,操作數(shù) 2 可以是一個寄存器、被移位的寄存器、或一個立即值。RSB指令語法: RSB條件S , , RSB R0, R1,

12、 R2 ; R0 = R2 - R1RSB R0, R1, #256 ; R0 = 256 - R1RSB R0, R2, R3,LSL#1 ; R0 = (R3 1) - R2桶形移位器ALU桶形移位器Rd結果N預處理未預處理RmRn移位操作LSL:邏輯左移(Logical Shift Left)。寄存器中字的低端空 出的位補0。 LSR:邏輯右移(Logical Shift Right)。寄存器中字的高端空 出的位補0。 ASR:算術右移(Arithmetic Shift Right)。算術移位的對象 是帶符號數(shù),在移位過程中必須保持操作數(shù)的符號不變。若 源操作數(shù)為正數(shù),則字的高端空出的位

13、補0。若源操作數(shù)為 負數(shù),則字的高端空出的位補1。 ROR:循環(huán)右移(Rotate Right)。從字的最低端移出的位填入 字的高端空出的位。 移位操作在任何數(shù)據(jù)處理指令中,第二個寄存器操作數(shù)可以有應用該操作數(shù)的移位操作.邏輯移位LSL:邏輯左移字的最小位空位清零LSR:邏輯右移字的最大位空位清零.移位操作算術移位ASR: = LSRASL: 算術左移循環(huán)移位: ROR, RRX案例分析一AREAExample,CODE,READONLY;聲明代碼段ExampleENTRYCODE32STARTMOV R0,#0 x10MOV R1,#0MOV R2,R0MOV R3,R2MOV R5,#0

14、xf000000fMVN R0, #0MVN R1,#0 xffffff00MOV R0,#0 xf案例分析二 TSTR1,#0 x01 ; 先進行and運算,如果結果為零,則設置zero=1 (繼續(xù)下面的LDR指令);否則,zero=0(跳到 NEXT處執(zhí)行)。BNE NEXTMOV R0,#0 x0MOV R4,R0,LSR #1MOV R3,R0,LSR #2NEXTMOV R1,#0 xf0000000MOV R4,R1,ASR #1MOV R3,R1,ASR #2B STARTEND運行效果乘法指令與乘加指令 ARM微處理器支持的乘法指令與乘加指令共有6條 : MUL 32位乘法指令

15、(常見)MLA 32位乘加指令(常見)SMULL64位有符號數(shù)乘法指令SMLAL64位有符號數(shù)乘加指令UMULL64位無符號數(shù)乘法指令UMLAL64位無符號數(shù)乘加指令數(shù)據(jù)處理指令 - MULMUL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結果放置到目的寄存器中,同時可以根據(jù)運算結果設置CPSR中相應的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù) 。MUL指令語法: MUL條件S, , 例:MUL R0,R1,R2 ; R0 = R1 R2 MULSR0,R1,R2 ;R0 = R1 R2,同時設置CPSR 中的相關條件標志位 數(shù)據(jù)處理指令 - MLAMLA指令完成將操作

16、數(shù)1與操作數(shù)2的乘法運算,再將乘積加上操作數(shù)3,并把結果放置到目的寄存器中,同時可以根據(jù)運算結果設置CPSR中相應的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。 MLA指令語法: MLA條件S, , , 例:MLAR0,R1,R2,R3;R0 = R1 R2 + R3MLASR0,R1,R2,R3 ;R0 = R1 R2 + R3,同時設置 CPSR中的相關條件標志位 案例分析一AREA Example,CODE,READONLY;聲明代碼段ExampleENTRY;標識程序入口CODE32;聲明32位ARM指令STARTMOV R1, #3 MOV R2, #5 AD

17、D R0, R1, R2 ; R0 = R1 + R2 ADD R0, R1, #2 ; R0 = R1 + 2 ADD R0, R2, R1,LSL#1 ; R0 = R2 + (R1 1) MOV R1, #0 xf1000000 MOV R2, #0 x80000000 ADD R0, R1, R2 ; R0 = R1 + R2 查看CPSR寄存器中 ;的C位是否變化ADDS R3, R1, R2 ; 查看CPSR寄存器中的C位是否 ;變化案例分析二MOV R4, #0 x5fffffff MOV R5, #0 x6eADDS R0, R4, R8SUB R0, R2, R1 ; R0

18、= R2 - R1 SUBS R0, R2, R1 ; R0 = R2 - R1SUB R0, R1, #2 ; R0 = R1 - 2 SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 1)RSB R0, R1, R2 ; R0 = R2 - R1 RSB R0, R1, #256 ; R0 = 256 - R1 RSB R0, R1, R3,LSL#1 ; R0 = (R3 1) - R1MOV R1, #3 MOV R2, #5 MUL R3, R1, R2B START END運行效果數(shù)據(jù)處理指令 ANDAND 將在兩個操作數(shù)上進行邏輯與,把結果放置到目的寄存器

19、中; 操作數(shù)1是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即值 。AND指令語法: AND條件S , , ;dest = op1&op2 例:MOV R0,#0 x02AND R0,R0,#0 x01;R0=R0&0 x01 取出最低位數(shù)據(jù)MOV R1,#0 x07MOV R3,#0 x05AND R2,R1,R3;R2=R1&R3數(shù)據(jù)處理指令 ORRORR 將在兩個操作數(shù)上進行邏輯或,把結果放置到目的寄存器中;對設置特定的位有用。操作數(shù) 1 是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即值 。ORR指令語法: ORR條件S , , ;dest =

20、op1 | op2 例:MOV R0,#0 x01ORR R0,R0,#0 x0F ;將R0的低4位置1數(shù)據(jù)處理指令 EOREOR 將在兩個操作數(shù)上進行邏輯異或,把結果放置到目的寄存器中;對反轉特定的位有用。操作數(shù) 1 是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即值。 EOR指令語法: EOR條件S , , ;dest = op1 op 2例:EOR R1,R1,#0 x0F;將R1的低4位取反EOR R2,R1,R0 ;R2 = R1 R0數(shù)據(jù)處理指令 BICBIC 是在一個字中清除位的一種方法,與 ORR 位設置是相反的操作。操作數(shù) 2 是一個 32 位位掩碼(m

21、ask)。如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位指示此位保持不變 。 BIC指令語法: BIC條件S , , ;dest = op_1 AND (!op_2)例:BIC R1,R1,#0 x0F;將R1的低4位清0,其他位保持不變 案例分析一AREA Example,CODE,READONLY ;聲明代碼段ExampleENTRY ;標識程序入口CODE32 ;聲明32位ARM指令STARTMOV R0,#0 x02AND R0,R0,#0 x01;R0=R0&0 x01 取出最低位數(shù)據(jù) MOV R1,#0 x0f7 MOV R3,#0 x05 AND R2,R1,R3;R2=

22、R1&R3MOV R0,#0 x0c1案例分析二ORR R0,R0,#0 x0F;將R0的低4位置1EOR R1,R1,#0 x0F;將R1的低4位取反EOR R2,R1,R0;R2 = R1 R0 BIC R1,R1,#0 x0F;將R1的低4位清0,其他位保持不變 BIC R1,R2,R3;這句是什么含義呢?B STARTEND運行效果跳轉指令 跳轉指令用于實現(xiàn)程序流程的跳轉,在ARM程序中有兩種方法可以實現(xiàn)程序流程的跳轉:使用專門的跳轉指令。直接向程序計數(shù)器PC寫入跳轉地址值。 ARM指令集中的跳轉指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉,包括以下4條指令:B跳轉指令B

23、L帶返回的跳轉指令BLX帶返回和狀態(tài)切換的跳轉指令BX帶狀態(tài)切換的跳轉指令數(shù)據(jù)處理指令 BB指令是最簡單的跳轉指令。一旦遇到一個 B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那里繼續(xù)執(zhí)行。 B指令語法: B條件目標地址例:B Label ;程序無條件跳轉到標號Label處執(zhí)行CMPR1,0 ;當CPSR寄存器中的Z條件碼置位時,程序跳轉到 標號Label處執(zhí)行BEQLabel數(shù)據(jù)處理指令 BLBL 是另一個跳轉指令,但跳轉之前,會在寄存器R14中保存PC的當前內容,因此,可以通過將R14 的內容重新加載到PC中,來返回到跳轉指令之后的那個指令處執(zhí)行。該指令是實現(xiàn)子程序調用的一個基本但

24、常用的手段。 BL指令語法: BL條件目標地址例:BLLabel;當程序無條件跳轉到標號Label處執(zhí)行時, 同時將當前的PC值保存到R14中 數(shù)據(jù)處理指令 BLXBLX指令從ARM指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態(tài)有ARM狀態(tài)切換到Thumb狀態(tài),該指令同時將PC的當前內容保存到寄存器R14中。 BLX指令語法: BLX條件目標地址程序狀態(tài)寄存器訪問指令 ARM微處理器支持程序狀態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條:MRS程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令MSR通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令數(shù)

25、據(jù)處理指令 MRSMRS指令用于將程序狀態(tài)寄存器的內容傳送到通用寄存器中。該指令一般用在以下幾種情況: 當需要改變程序狀態(tài)寄存器的內容時,可用MRS將程序狀態(tài)寄存器的內容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。 當在異常處理或進程切換時,需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存 。 MRS指令語法: MRS條件 通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR)例:MRSR0,CPSR;傳送CPSR的內容到R0MRSR0,SPSR;傳送SPSR的內容到R0數(shù)據(jù)處理指令 MRSMSR指令用于將操作數(shù)的內容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存

26、器或立即數(shù)。用于設置程序狀態(tài)寄存器中需要操作的位。該指令通常用于恢復或改變程序狀態(tài)寄存器的內容,在使用時,一般要在MSR指令中指明將要操作的域。MRS指令語法: MSR條件 程序狀態(tài)寄存器(CPSR或SPSR)_,操作數(shù) 例:MSRCPSR,R0;傳送R0的內容到CPSRMSRSPSR,R0;傳送R0的內容到SPSRMSRCPSR_c,R0;傳送R0的內容到CPSR,但僅僅修 改CPSR中的控制位域案例分析AREAExample,CODE,READONLY;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令STARTMOV R1,#0 x1 MOV R

27、2,#0 x2 SUBS R1,R1,R2;改變CPSR中的條件標志位 MRS R0,CPSR ;取出CPSR中的值 BIC R0,R0,#0 x1F;改變R0中的值,為模式切換做準備 ORR R0,R0,#0 x1F MSR CPSR_cxsf,R0;cxsf分別代表著CPSR不同的位域END運行效果單寄存器傳送指令LDR把一個字裝入一個寄存器Rdmem32addressSTR從一個寄存器保存一個字或者一個字節(jié)Rdmem32addressLDRB把一個字節(jié)裝入一個寄存器Rdmem8addressSTRB從一個寄存器保存一個字節(jié)Rdmem8addressLDRH把一個半字節(jié)裝入一個寄存器Rdm

28、em16addressSTRH從一個寄存器保存一個半字Rdmem16address數(shù)據(jù)處理指令 LDRLDR指令用于從存儲器中將一個32位的字數(shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲器中讀取32位的字數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理 。LDR指令語法: LDR條件 目的寄存器,例:LDR R0,R1 ;將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0。LDR R0,R1,R2 ;將存儲器地址為R1+R2的字數(shù)據(jù)讀入寄存器R0 尋址方式變址模式數(shù)據(jù)基址寄存器示例回寫前變址membase+offset基址寄存器加上偏移LDR r0,r1,#4!前變址membase+offset不變LDR r0,r

29、1,#4后變址membase基址寄存器加上偏移LDR r0,r1,#4例子PRE r0=0 x00000000, r1=0 x00009000, Mem320 x00009000=0 x01010101 Mem320 x00009004=0 x02020202回寫型前變址尋址: LDR r0, r1, #0 x4!POST r0=0 x02020202, r1=0 x00009004前變址尋址: LDR r0, r1,#0 x4 POST r0=0 x02020202, r1=0 x00009000后變址尋址: LDR r0, r1 ,#0 x4 POST r0=0 x01010101, r1

30、=0 x00009004數(shù)據(jù)處理指令 STRSTR指令用于從源寄存器中將一個32位的字數(shù)據(jù)傳送到存儲器中。該指令在程序設計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR 。STR指令語法: STR條件 源寄存器,例:STRR0,R1,8 ;將R0中的字數(shù)據(jù)寫入以R1為地址的存儲器中, 并將新地址R18寫入R1STRR0,R1,8 ;將R0中的字數(shù)據(jù)寫入以R18為地址的存儲器中數(shù)據(jù)處理指令 SWPSWP從操作數(shù)2所指向的內存裝載一個字并把這個字放置到目的寄存器 中。 把寄存器操作數(shù)1的內容存儲到同一個地址中。 如果目的和操作1是同一個寄存器,則把寄存器的內容和給定內存位置的內容進行交換

31、。SWP指令語法:例:SWP R0,R1,R2SWP R0,R0,R1SWPB R0,R1,R2;將R2所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到R0,R0的 高3個字節(jié);置零,同時將R1中的低一個字節(jié)數(shù)據(jù)傳 送到R2指向的存儲單元SWPB R0,R0,R1;將R1所指向的存儲器中的字節(jié)數(shù)據(jù)與R0中的低8位 數(shù)據(jù)交換案例分析一AREA Example,CODE,READONLY;聲明代碼段ExampleENTRY;標識程序入口CODE32;聲明32位ARM指令STARTMOV R1,#0 x1000000MOV R4,#0 x1100000MOV R2,#0 x1600000MOV R3,#0 x120

32、0MOV R0,#0 x1STR R0,R1;R1-R0,寄存器間接尋址LDR R5,R1;R0-R1,寄存器間接尋址案例分析二ADD R5,R1,#4MOV R5,#0 x7LDR R0,R1,#4;R0-R1+4LDR R0, R1, #-4 ;R0-R1-4,還可以從基址上減去偏移量來尋址LDR R0,R1,#4! ;R0-R1+4, R1-R1+4,R1中的值?LDR R0,R1,#4;R0-R1, R1-R1+4,觀察R0中的值,R1?LDR R0,R1,R2 ;R0-R1+R2,可以在方括號后附加“!”控制 寫回R1=R1+R2STR R2,R4SWP R0,R1,R4SWP R0

33、,R0,R1B STARTEND協(xié)處理器指令 ARM的協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在ARM協(xié)處理器的寄存器和存儲器之間傳送數(shù)據(jù)。 CDP 協(xié)處理器數(shù)操作指令LDC 協(xié)處理器數(shù)據(jù)加載指令STC 協(xié)處理器數(shù)據(jù)存儲指令MCR ARM處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令MRC 協(xié)處理器寄存器到ARM處理器寄存器的數(shù)據(jù)傳送指令注:此部分不做為重點,了解一下即可異常產生指令 ARM微處理器所支持的異常指令有如下兩條:SWI 軟件中斷指令 SWI指令用于產生軟件中斷,以便用戶程序能調用操作系統(tǒng)的系統(tǒng)例程

34、。操作系統(tǒng)在SWI的異常處理程序中提供相應的系統(tǒng)服務, BKPT 斷點中斷指令(了解) SWI 0 x02 ;該指令調用操作系統(tǒng)編號位02的系統(tǒng)例程。 本環(huán)節(jié)主要學習ARM微處理器的,數(shù)據(jù)處理指令、移位指令、乘法指令與乘加指令、邏輯指令、跳轉指令、程序狀態(tài)寄存器(PSR)處理指令、加載/存儲指令、協(xié)處理器指令和異常產生指令九大類指令語法并舉例說明其功能。 課程目錄1324ARM微處理器的指令集概述 ARM指令集 ARM指令的尋址方式 Thumb指令及應用 ARM指令的尋址方式一 立即尋址:也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)。 ADD

35、R0,R0,0 x3f ;R0R00 x3f定義:所謂尋址方式就是處理器根據(jù)指令中給出的地址信息來尋找物理地址的方式寄存器尋址: 就是利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是各類微處 理器經常采用的一種方式 ADD R0,R1,R2 ;R0R1R2ARM指令的尋址方式二 寄存器間接尋址:就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲器中。 ADD R0,R1,R2 ;R0R1R2LDR R0,R1 ;R0R1基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址 LDR R0,R1,4 ;R0R14LDR R0,R

36、1,4! ;R0R14、R1R14 ARM指令的尋址方式三多寄存器尋址:一條指令可以完成多個寄存器值的傳送。這種尋址方式可以用一條指令完成傳送最多16個通用寄存器的值 。 LDMIA R0,R1,R2,R3,R4;R1R0 ;R2R04 ;R3R08 ;R4R012相對尋址:以程序計數(shù)器PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址 BLNEXT;跳轉到子程序NEXT處執(zhí)行NEXT堆棧尋址 堆棧是一種數(shù)據(jù)結構,按先進后出(First In Last Out,F(xiàn)ILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。AR

37、M微處理器所支持批量數(shù)據(jù)加載/存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)存儲指令則完成相反的操作 堆棧操作ARM使用多寄存器Load/Store指令來完成堆棧操作; 使用堆棧時,需要確定堆棧在存儲空間中是向上生長(遞增的“A”)還是向下生長(遞減的“D”); 滿堆棧(“F”)是指堆棧指針指向堆棧的最后一個已使用的地址或滿位置;相反,空堆棧(“E”)是指SP指向堆棧的第一個沒有使用的地址或空位置;堆棧操作尋址方式尋址方式說明pop=LDMpush=STMFA遞增滿LDMFALDMDASTMFASTMIBFD

38、遞減滿LDMFDLDMIASTMFDSTMDBEA遞增空LDMEALDMDBSTMEASTMIAED遞減空LDMEDLDMIBSTMEDSTMDALDMFD sp!,r4-r7,pcSP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆棧r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存儲器頂SPSP100FF1234A0BE8034SPOld SP100FF

39、1234A0BE8034ARM堆棧操作通過塊傳送指令來完成:STMFD(Push)塊存儲- Full Descending stack STMDBLDMFD(Pop)塊裝載- Full Descending stack LDMIASTMFD sp!,r4-r7,lr例:把寄存器內容放入堆棧,更新sp0 x800180 x000000010 x800140 x000000020 x80010Empty0 x8000cEmpty0 x800180 x000000010 x800140 x000000020 x800100 x000000030 x8000c0 x00000002PRE 地址 數(shù)據(jù)POST 地址 數(shù)據(jù)SPSPPRE : r1=0 x0000

溫馨提示

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

評論

0/150

提交評論