第3章 ARM的指令系統(tǒng)_第1頁
第3章 ARM的指令系統(tǒng)_第2頁
第3章 ARM的指令系統(tǒng)_第3頁
第3章 ARM的指令系統(tǒng)_第4頁
第3章 ARM的指令系統(tǒng)_第5頁
已閱讀5頁,還剩111頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、ARM處理器開發(fā)詳解處理器開發(fā)詳解 第第3章章 ARM的指令系統(tǒng)的指令系統(tǒng) 2 本章主要內容本章主要內容: uARM處理器的尋址方式處理器的尋址方式 uARM處理器的指令集處理器的指令集 ARM指令系統(tǒng)概述 一、指令系統(tǒng)概念一、指令系統(tǒng)概念 指令:指令:是規(guī)定計算機進行某種操作的命令。是規(guī)定計算機進行某種操作的命令。 指令系統(tǒng):指令系統(tǒng):計算機能夠執(zhí)行的各種指令的集合。計算機能夠執(zhí)行的各種指令的集合。 二、二、ARMARM指令的特點指令的特點 所有指令都是所有指令都是3232位位的。的。 大多數(shù)指令都在大多數(shù)指令都在單周期單周期內完成。內完成。 所有指令都可以所有指令都可以條件條件執(zhí)行。執(zhí)行。

2、 ARMARM指令為指令為load/storeload/store類型。類型。 基本指令僅基本指令僅3636條條,分成六類。,分成六類。 有有8 8種種尋址方式。尋址方式。 指令集可以通過協(xié)處理器擴展。指令集可以通過協(xié)處理器擴展。 3 lARMARM指令是加載指令是加載/ /存儲存儲(Load/Store)(Load/Store)型:型: ARMARM指令集是指令集是load/storeload/store結構:對存儲器中的數(shù)據結構:對存儲器中的數(shù)據只能只能 使用使用load/storeload/store指令進行存取指令進行存取,所有其他操作只能在寄存,所有其他操作只能在寄存 器中完成,即只

3、能對存放在寄存器的數(shù)據進行處理。器中完成,即只能對存放在寄存器的數(shù)據進行處理。 lARMARM指令可以分為六大類:指令可以分為六大類: 數(shù)據處理指令、存儲器訪問數(shù)據處理指令、存儲器訪問Load/StoreLoad/Store指令、程序狀指令、程序狀 態(tài)寄存器處理指令、跳轉指令、協(xié)處理器指令、異常產生態(tài)寄存器處理指令、跳轉指令、協(xié)處理器指令、異常產生 指令。指令。 lARMARM指令有指令有8 8種尋址方式:種尋址方式: 立即尋址、寄存器尋址、寄存器移位尋址、寄存器間立即尋址、寄存器尋址、寄存器移位尋址、寄存器間 接尋址、基址尋址、堆棧尋址接尋址、基址尋址、堆棧尋址 、塊拷貝尋址、相對尋址。、塊

4、拷貝尋址、相對尋址。 4 簡單的ARM程序 ;文件名:文件名:TEST1.S ;功能:實現(xiàn)兩個寄存器相加功能:實現(xiàn)兩個寄存器相加 ;說明:使用說明:使用ARMulate軟件仿真調試軟件仿真調試 AREAExample1,CODE,READONLY ;聲明代碼段聲明代碼段Example1 ENTRY ;標識程序入口標識程序入口 CODE32 ;聲明聲明32位位ARM指令指令 START MOVR0,#0 ;設置參數(shù)設置參數(shù) MOVR1,#10 LOOPBLADD_SUB ;調用子程序調用子程序ADD_SUB BLOOP ;跳轉到跳轉到LOOP ADD_SUB ADDSR0,R0,R1 ;R0 =

5、 R0 + R1 MOVPC,LR ;子程序返回子程序返回 END ;文件結束文件結束 使用“;”進行注釋 標號頂格寫 實際代碼段 聲明文件結束 5 主要內容主要內容 一、立即尋址一、立即尋址 二、寄存器尋址二、寄存器尋址 三、寄存器移位尋址三、寄存器移位尋址 四、寄存器間接尋址四、寄存器間接尋址 五、基址尋址五、基址尋址 六、堆棧尋址六、堆棧尋址 七、塊拷貝尋址七、塊拷貝尋址 八、相對尋址八、相對尋址 3.1 ARM處理器的尋址方式處理器的尋址方式 尋址方式:尋址方式:處理器根據指令中給出的(地址)信息,尋找處理器根據指令中給出的(地址)信息,尋找 操作數(shù)(物理地址)的方式。操作數(shù)(物理地址

6、)的方式。 6 7 這是一種特殊的尋址方式,這是一種特殊的尋址方式,操作數(shù)本身就在指令中操作數(shù)本身就在指令中給出,給出, 只要取出指令也就取到了操作數(shù)。這個操作數(shù)被稱為立即數(shù)只要取出指令也就取到了操作數(shù)。這個操作數(shù)被稱為立即數(shù) ,對應的尋址方式也就叫做立即尋址。,對應的尋址方式也就叫做立即尋址。 立即數(shù)的概念立即數(shù)的概念 立即立即數(shù)是數(shù)是由一個由一個8bit常數(shù)移動常數(shù)移動4bit偶數(shù)偶數(shù)位位(0,2,4,26,28,30) 得到的。得到的。 下面列舉了一些有效的立即數(shù):下面列舉了一些有效的立即數(shù): 0 xFF、0 x104、0 xFF0、0 xFF00、0 xFF000、0 xFF00000

7、0、0 xF000000F 下面是一些無效的立即數(shù):下面是一些無效的立即數(shù): 0 x101、0 x102、0 xFF1、0 xFF04、0 xFF003、0 xFFFFFFFF、0 xF000001F 1立即數(shù)尋址方式立即數(shù)尋址方式 應用立即數(shù)的指令:應用立即數(shù)的指令: MOV R0,0 ;送送0到到R0 ADD R3,R3,1 ;R3的值加的值加1 CMP R7,1000 ;R7的值和的值和1000比較比較 BIC R9,R8,0 xFF00 ;將將R8中中815位清零,位清零, 結果保存在結果保存在R9中中 在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要求在以上兩條指令中,第二個源操作數(shù)即

8、為立即數(shù),要求以以 “”為前綴為前綴,對于以十六進制表示的立即數(shù),還要求在,對于以十六進制表示的立即數(shù),還要求在 “”后加上后加上“0 x”0 x”或或“ ;將將R2R2的值存入的值存入R1 R1 SUB R0,R1,R2SUB R0,R1,R2 ; ;將將R1R1的值減去的值減去R2R2的值,結果保存到的值,結果保存到R0R0 2寄存器尋址方式寄存器尋址方式 10 寄存器移位尋址寄存器移位尋址是是ARMARM指令集特有的尋址方式。當指令集特有的尋址方式。當 第第2 2個操作數(shù)是寄存器移位方式時,第個操作數(shù)是寄存器移位方式時,第2 2個寄存器個寄存器 操作數(shù)在與第操作數(shù)在與第1 1個操作數(shù)結合

9、之前,選擇進行移位個操作數(shù)結合之前,選擇進行移位 操操作。作。 寄寄存器移位尋址指令舉例如下:存器移位尋址指令舉例如下: MOVMOVR0,R2,LSL R0,R2,LSL #3#3 ;R2;R2的值左移的值左移3 3位,結果放入位,結果放入R0R0, ; ;即是即是R0=R2R0=R28 8 ANDSANDSR1,R1,R2,LSL R3 R1,R1,R2,LSL R3 ;R2;R2的值左移的值左移R3R3位,然后和位,然后和R1R1相相 ;“;“與與”操作,結果放入操作,結果放入R1R1 3寄存器移位尋址方式寄存器移位尋址方式 移位操作(1) 寄存器移位尋址的寄存器移位尋址的5 5種移位操

10、作:種移位操作: lLSLLSL:邏輯左移(:邏輯左移(Logical Shift LeftLogical Shift Left)。寄存器中字的低端)。寄存器中字的低端 空出的位補空出的位補0 0。 lLSRLSR:邏輯右移(:邏輯右移(Logical Shift RightLogical Shift Right)。寄存器中字的高)。寄存器中字的高 端空出的位補端空出的位補0 0。 lASRASR:算術右移(:算術右移(Arithmetic Shift RightArithmetic Shift Right)。算術移位的對)。算術移位的對 象是帶符號數(shù),在移位過程中必須保持操作數(shù)的符號不變。若

11、象是帶符號數(shù),在移位過程中必須保持操作數(shù)的符號不變。若 源操作數(shù)為正數(shù),源操作數(shù)為正數(shù),則字的高端空出的位補則字的高端空出的位補0 0。若源操作數(shù)為負。若源操作數(shù)為負 數(shù),則字的高端空出的位補數(shù),則字的高端空出的位補1 1。 lRORROR:循環(huán)右移(:循環(huán)右移(Rotate RightRotate Right)。從字的最低端移出的位填)。從字的最低端移出的位填 入字的高端空出的位。入字的高端空出的位。 lRRXRRX:寄存器擴展循環(huán)右移(:寄存器擴展循環(huán)右移(Rotate Right Extended by 1 Rotate Right Extended by 1 placeplace)。操

12、作數(shù)右移一位,空位(位)。操作數(shù)右移一位,空位(位3131)用原)用原C C標志填充。標志填充。 移位操作(2) 移位操作移位操作 u邏輯移位邏輯移位 LSL:LSL:邏輯左移字的最小位空位清零邏輯左移字的最小位空位清零 LSR:LSR:邏輯右移字的最大位空位清零邏輯右移字的最大位空位清零. . 12 u算術移位算術移位 uASR:ASR:算術右移算術右移 uASL:ASL:算術左移算術左移 移位操作(3) 13 寄存器間接尋址寄存器間接尋址就是就是以寄存器中的值作為操作數(shù)的地址,而操作以寄存器中的值作為操作數(shù)的地址,而操作 數(shù)本身存放在存儲器數(shù)本身存放在存儲器中。中。 例如例如 ADDADD

13、 R0, R1, R2 R0, R1, R2 ; R0R1 ; R0R1R2R2 LDRLDR R0, R1 R0, R1 ; R0R1 ; R0R1 STRSTR R0, R1R0, R1 ; R1R0 ; R1R0 在第一條指令中,以寄存器在第一條指令中,以寄存器R2R2的值作為操作數(shù)的地址,在存的值作為操作數(shù)的地址,在存 儲器中取得一個操作數(shù)后與儲器中取得一個操作數(shù)后與R1R1相加,結果存入寄存器相加,結果存入寄存器R0R0中。中。 但是這種用法是否允許呢?但是這種用法是否允許呢? 4寄存器間接尋址方式寄存器間接尋址方式 14 l基址尋址基址尋址就是將就是將寄存器(該寄存器一般稱作基址寄

14、存器)的內容寄存器(該寄存器一般稱作基址寄存器)的內容 與指令中給出的地址偏移量相加與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地,從而得到一個操作數(shù)的有效地 址址 l基址尋址方式常用于基址尋址方式常用于訪問某基地址附近的單元訪問某基地址附近的單元 采用基址尋址方式的指令常見有以下幾種形式采用基址尋址方式的指令常見有以下幾種形式 LDRLDR R0, R1, R0, R1, 4 4 ; R0R1 ; R0R144 LDRLDR R0, R1, R0, R1, 4!4! ; R0R1 ; R0R144、R1R1R1R14 4 LDRLDR R0, R1, R0, R1, 4 4 ; R

15、0R1 ; R0R1、R1R1R1R14 4 LDRLDR R0, R1, R2 R0, R1, R2 ; R0R1 ; R0R1R2R2 5基址尋址方式基址尋址方式 LDRLDR R0,R1, R0,R1,4!4! ; R0R1 ; R0R14 4、R1R1R1R14 4 說明說明:“!”表示寫回或更新基址寄存器表示寫回或更新基址寄存器 15 l相對尋址相對尋址以程序計數(shù)器以程序計數(shù)器PCPC的當前值為基地址的當前值為基地址,指令中的地址標指令中的地址標 號作為偏移量號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址,將兩者相加之后得到操作數(shù)的有效地址 l以下程序段完成子程序的調用和返回,跳轉

16、指令以下程序段完成子程序的調用和返回,跳轉指令BLBL采用了相采用了相 對尋址方式對尋址方式 BLBL SORT SORT; ; 跳轉到子程序處執(zhí)行跳轉到子程序處執(zhí)行 SORTSORT MOVMOV PC, LR PC, LR; ; 從子程序返回從子程序返回 6相對尋址方式相對尋址方式 16 7多寄存器尋址方式多寄存器尋址方式 l采用采用多寄存器尋址方式多寄存器尋址方式,一條指令可以完成多個寄存器值的傳一條指令可以完成多個寄存器值的傳 送,最多送,最多傳送傳送1616個通用寄存器個通用寄存器的值的值 l例如例如 LDMLDMIAIA R0!, R1, R2, R3, R4 R0!, R1, R

17、2, R3, R4 ; R1R0,R0=R0+4 ; R1R0,R0=R0+4 ; R2R0,R0=R0+4; R2R0,R0=R0+4 ; R3R0,R0=R0+4; R3R0,R0=R0+4 ; R4R0,R0=R0+4; R4R0,R0=R0+4 l指令后綴指令后綴IAIA表示在每次執(zhí)行操作后表示在每次執(zhí)行操作后R0R0按字長度增加按字長度增加 l注意注意:在寄存器列表中在寄存器列表中同一寄存器僅能指定一次同一寄存器僅能指定一次;加載;加載/ /存存 儲操作按照儲操作按照寄存器固定次序寄存器固定次序進行,所以寄存器排列先后關系進行,所以寄存器排列先后關系 隨意隨意 LDMLDMIAIA

18、R1, R0, R2, R5 R1, R0, R2, R5 ; ; R0R1,R2R1+4,R5R1+8R0R1,R2R1+4,R5R1+8 17 尋址模式尋址模式描述描述起始地址起始地址結束地址結束地址Rn!Rn! IAIA執(zhí)行后增加執(zhí)行后增加RnRnRn+4Rn+4* *N-4N-4Rn+4Rn+4* *N N IBIB執(zhí)行前增加執(zhí)行前增加Rn+4Rn+4Rn+4Rn+4* *N NRn+4Rn+4* *N N DADA執(zhí)行后減少執(zhí)行后減少Rn-4Rn-4* *N+4N+4RnRnRn-4Rn-4* *N N DBDB執(zhí)行前減少執(zhí)行前減少Rn-4Rn-4* *N NRn-4Rn-4Rn-4

19、Rn-4* *N N 注:!決定注:!決定RnRn的值是否隨著傳送而改變的值是否隨著傳送而改變 多寄存器傳送指令的尋址模式 18 例例1: 要求:保存要求:保存r1r3到內存地址到內存地址0 x90000 x900c,并且更新基址寄存,并且更新基址寄存 器器r4 PRE: r1=0 x00000001, r2=0 x00000002, r3=0 x00000003, r4=0 x9000 執(zhí)行操作:執(zhí)行操作: STMIA r4!, r1, r2, r3(執(zhí)行后增加執(zhí)行后增加) POST: mem320 x9000=0 x00000001 mem320 x9004=0 x00000002 mem

20、320 x9008=0 x00000003 r4=0 x900c 19 例2:將存儲器中的連續(xù)數(shù)據裝載到寄存器 PRE mem320 x80018=0 x03, mem320 x80014=0 x02, mem320 x80010=0 x01, r0=0 x00080010, r1=0 x00000000, r2=0 x00000000, r3=0 x00000000 執(zhí)行指令:執(zhí)行指令: LDMIA r0!, r1-r3 POST r0=0 x0008001c, r1=0 x00000001, r2=0 x00000002, r3=0 x00000003 0 x800200 x0000000

21、5 0 x8001c0 x00000004 0 x800180 x00000003 0 x800140 x00000002 0 x800100 x00000001 0 x8000c0 x00000000 地址指針地址指針 存儲地址存儲地址 數(shù)據數(shù)據 r3=0 x00000000 r2=0 x00000000 r1=0 x00000000 r0=0 x80010 20 l堆棧堆棧按先進后出(按先進后出(FILOFILO)的方式工作)的方式工作 l根據堆棧的生成方式根據堆棧的生成方式 l堆棧指針遞增計數(shù)堆棧指針遞增計數(shù)遞增堆棧遞增堆棧 l堆棧指針遞減計數(shù)堆棧指針遞減計數(shù)遞減堆棧遞減堆棧 8堆棧尋址

22、方式堆棧尋址方式 21 棧底 棧頂 棧區(qū) SP 堆棧存 儲區(qū) 棧頂 棧底 棧區(qū) SP 向下 增長 向上 增長 0 x12345678 0 x12345678 堆棧壓棧 堆棧壓棧 22 l根據堆棧指針指向來分根據堆棧指針指向來分 l堆棧指針指向最后一個壓入堆棧的數(shù)據時,稱為堆棧指針指向最后一個壓入堆棧的數(shù)據時,稱為滿堆棧滿堆棧 l堆棧指針指向下一個將要放入數(shù)據的空位置時,稱為堆棧指針指向下一個將要放入數(shù)據的空位置時,稱為空空 堆棧堆棧 棧頂SP 棧頂SP 棧底 空堆棧 棧底 滿堆棧 0 x12345678 0 x12345678棧頂SP0 x12345678 棧頂SP 壓棧壓棧 23 lARMA

23、RM微處理器支持這四種類型的堆棧工作方式微處理器支持這四種類型的堆棧工作方式 l滿遞增堆棧滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據,且由低地址向堆棧指針指向最后壓入的數(shù)據,且由低地址向 高地址生成高地址生成LDMFALDMFA, , STMSTMFAFA l滿遞減堆棧滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據,且由高地址向堆棧指針指向最后壓入的數(shù)據,且由高地址向 低地址生成低地址生成LDMLDMFDFD, , STMSTMFDFD l空遞增堆??者f增堆棧:堆棧指針指向下一個將要放入數(shù)據的空位置,堆棧指針指向下一個將要放入數(shù)據的空位置, 且由低地址向高地址生成且由低地址向高地址生成LDMLDMEAEA

24、, , STMSTMEAEA l空遞減堆棧空遞減堆棧:堆棧指針指向下一個將要放入數(shù)據的空位置,堆棧指針指向下一個將要放入數(shù)據的空位置, 且由高地址向低地址生成且由高地址向低地址生成LDMLDMEDED, , STMSTMEDED STMFDSTMFD SP!, R0-R7, LR SP!, R0-R7, LR LRLR最先進棧,最先進棧,R0R0最后最后 LDMFDLDMFD SP!, R0-R7, PC SP!, R0-R7, PC R0R0最先出棧,最先出棧,PCPC最后最后 24 例:把寄存器內容放入堆棧,更新SP 0 x800180 x00000001 0 x800140 x00000

25、002 0 x80010Empty 0 x8000cEmpty 0 x800180 x00000001 0 x800140 x00000002 0 x800100 x00000003 0 x8000c0 x00000002 PRE 地址地址 數(shù)據數(shù)據POST 地址地址 數(shù)據數(shù)據 SP SP PRE : r1=0 x00000002, r4=0 x00000003, sp=0 x00080014 執(zhí)行指令:執(zhí)行指令: STMFD sp!, r1,r4 25 POST: r1=0 x00000002, r4=0 x00000003, sp=0 x0008000c 尋址方式習題尋址方式習題 1.下列

26、指令的作用和采用了哪種尋址方式:下列指令的作用和采用了哪種尋址方式: MOV R0, #0 x04 MOV R0, R1 MOV R0,R1, LSL#4 LDR R0, R1 LDR R0,R1,#0 x04 LDR R0,R1,#0 x04 26 LDMIA R0,R1R3 STMFD SP!,R1R3 BL Loop 27 選擇題選擇題1:下列哪條指令屬于寄存器尋址?:下列哪條指令屬于寄存器尋址? A、MOV R1 ,#0 x198 B、LDR R0 , R1 , #4 C、MOV R3 , R0 D、MOV R0 , R2 ,#4 28 l數(shù)據處理指令數(shù)據處理指令 l存儲器訪問存儲器訪

27、問Load/StoreLoad/Store指令指令 l程序狀態(tài)寄存器處理指令程序狀態(tài)寄存器處理指令 l跳轉指令跳轉指令 l協(xié)處理器指令協(xié)處理器指令 l異常產生指令異常產生指令 3.2 ARM處理器的指令集處理器的指令集 29 32位的ARM指令語法格式如下: s , , 各個部分解釋如下: opcode:指令助記符,如:指令助記符,如mov cond: 條件碼助記符,默認是條件碼助記符,默認是al(無條件執(zhí)行)(無條件執(zhí)行) s: 指令的執(zhí)行是否影響指令的執(zhí)行是否影響CPSR(當前程序狀態(tài)寄存器當前程序狀態(tài)寄存器)的值的值 rd: 目標寄存器目標寄存器 rn: 包含第一個操作數(shù)的包含第一個操作

28、數(shù)的目標寄存器目標寄存器 opcode2: 第二操作數(shù),又稱為第二操作數(shù),又稱為shifter_operand ARM指令的編碼格式介紹 30 ARMARM指令典型的編碼格式為:指令典型的編碼格式為:每條每條ARMARM指令占有指令占有4 4個個 字節(jié),其指令長度為字節(jié),其指令長度為3232位。位。 指令結構:指令結構: 例:例:ADDS R2,R1,#1 SUBNES R2,R1,#0 x20 LDR R0,R1 CondOpcodeSRnRdOperand2 011121516192021242527283178 31 指令的條件碼指令的條件碼 S , , 所有的所有的ARMARM指令都可

29、以條件執(zhí)行指令都可以條件執(zhí)行,而,而ThumbThumb指令只有指令只有B B (跳轉)指令具有條件執(zhí)行(跳轉)指令具有條件執(zhí)行 功能。如果指令不標明條件代功能。如果指令不標明條件代 碼,將默認為無條件(碼,將默認為無條件(ALAL)執(zhí)行。)執(zhí)行。 不符合條件的代碼依然占用一個時鐘周期(相當于一不符合條件的代碼依然占用一個時鐘周期(相當于一 個個NOPNOP指令)。指令)。 條件碼的書寫方法:條件碼的書寫方法:條件碼的位置在指令助記符的后面條件碼的位置在指令助記符的后面 (因此也稱為條件后綴)。(因此也稱為條件后綴)。 例如:例如: MOVMOVEQEQ R0, R1R0, R1 32 條件碼

30、條件碼助記符助記符含含 義義標標 志志 00000000EQEQ相等相等Z=1Z=1 00010001NENE不相等不相等Z=0Z=0 00100010CS/HSCS/HS無符號數(shù)大于或等于無符號數(shù)大于或等于C=1C=1 00110011CC/LOCC/LO無符號數(shù)小于無符號數(shù)小于C=0C=0 01000100MIMI負數(shù)負數(shù)N=1N=1 01010101PIPI非負數(shù)非負數(shù)N=0N=0 01100110VSVS溢出溢出V=1V=1 01110111VCVC沒有溢出沒有溢出V=0V=0 10001000HIHI無符號數(shù)大于無符號數(shù)大于C=1C=1且且Z=0Z=0 10011001LSLS無符號

31、數(shù)小于或等于無符號數(shù)小于或等于C=0C=0或或Z=1Z=1 10101010GEGE有符號數(shù)大于或等于有符號數(shù)大于或等于N=VN=V 10111011LTLT有符號數(shù)小于有符號數(shù)小于N!=VN!=V 11001100GTGT有符號數(shù)大于有符號數(shù)大于Z=0Z=0且且N=VN=V 11011101LELE有符號數(shù)小于或等于有符號數(shù)小于或等于Z=1Z=1或或N!=VN!=V 11101110ALAL無條件執(zhí)行無條件執(zhí)行任意任意 11111111保留保留v5v5以下版本總執(zhí)行以下版本總執(zhí)行,v5,v5及以上版本有用及以上版本有用 指令的條件碼表指令的條件碼表 33 ARMARM指令可以通過添加適當?shù)臈l

32、件碼后綴來達到條件執(zhí)行的指令可以通過添加適當?shù)臈l件碼后綴來達到條件執(zhí)行的 目的。目的。 這樣可以提高代碼密度,減少分支跳轉指令數(shù)目,提高性這樣可以提高代碼密度,減少分支跳轉指令數(shù)目,提高性 能。能。 C C代碼:代碼: If(a b) a+; Else b+; 對應的匯編代碼:對應的匯編代碼: CMPR0,R1 ;R0與與R1比較比較 ADDHI R0,R0,#1 ;若若R0R1,則,則R0=R0+1 ADDLS R1,R1,#1 ;若若R011,則則R1=R1+1 例例1: 34 例例2 2: CMP r3,#0 CMP r3,#0CMP r3,#0 CMP r3,#0 BEQBEQ ski

33、pskip ADDNEADDNE r0,r1,r2 r0,r1,r2 ADD r0,r1,r2 ADD r0,r1,r2 skipskip 默認情況下,數(shù)據處理指令不影響默認情況下,數(shù)據處理指令不影響程序狀態(tài)寄存器程序狀態(tài)寄存器的條件碼的條件碼 標志位,但可以選擇通過添加標志位,但可以選擇通過添加“S S”來影響標志位。來影響標志位。 CMPCMP不需不需 要增加要增加 “S S”就可改變相應的標志位。就可改變相應的標志位。 looploop SUBSSUBS r1,r1,#1 r1,r1,#1 BNEBNE loop loop如果如果 Z Z標志清零則跳轉標志清零則跳轉 R1R1減減1 1,

34、并設置標志位,并設置標志位 35 36 數(shù)據數(shù)據操作指令是操作指令是指對存放在指對存放在寄存器寄存器中的數(shù)據中的數(shù)據 進行操作的指令進行操作的指令。 數(shù)據處理指令可分為:數(shù)據處理指令可分為: u數(shù)據傳送指令數(shù)據傳送指令 進行數(shù)據的傳輸進行數(shù)據的傳輸:MOV:MOV、MVNMVN u算術邏輯運算指令算術邏輯運算指令 完成常用的算術與邏輯的運算,同時完成常用的算術與邏輯的運算,同時更新更新CPSRCPSR中的相應條件中的相應條件 標志位標志位 u比較指令比較指令 不保存運算結果,只不保存運算結果,只更新更新CPSRCPSR中相應的條件標志中相應的條件標志 3.2.1 數(shù)據操作指令數(shù)據操作指令 37

35、 助記符說明操作條件碼位置 MOV Rd,operand2MOV Rd,operand2數(shù)據傳送數(shù)據傳送RdRdoperand2 operand2 MOVcondSMOVcondS MVN Rd,operand2MVN Rd,operand2數(shù)據非傳送數(shù)據非傳送RdRd(operand2)(operand2)MVNMVNcondcondSS ARMARM數(shù)據處理指令數(shù)據處理指令數(shù)據傳送數(shù)據傳送 38 39 MOV指令多用于指令多用于設置初始值設置初始值或者或者在寄存器間傳送數(shù)據在寄存器間傳送數(shù)據 (1)指令的語法格式:)指令的語法格式: MOVS , (2)指令舉例)指令舉例 MOVMOV R

36、0, R0 R0, R0; R0 = ; R0 = R0R0 NOP NOP 指令指令 MOV R0, R0, LSL#3MOV R0, R0, LSL#3; R0 = R0 ; R0 = R0 * * 8 8 MOV PC, R14MOV PC, R14 ; ; 退出到調用者,用于普退出到調用者,用于普 通函數(shù)返回,通函數(shù)返回,PCPC即是即是R15R15 MOVS PC, R14MOVS PC, R14 ; ; 退出到調用者并恢復標退出到調用者并恢復標 志位,用于異常函數(shù)返回志位,用于異常函數(shù)返回 MOV指令指令 (3)指令的使用)指令的使用 將數(shù)據從一個寄存器傳送到另一個寄存器將數(shù)據從一

37、個寄存器傳送到另一個寄存器 將一個將一個常數(shù)值常數(shù)值傳送到寄存器中。傳送到寄存器中。 實現(xiàn)無算術和邏輯運算的實現(xiàn)無算術和邏輯運算的單純移位操作單純移位操作,操作數(shù)乘以,操作數(shù)乘以 2 2n n可以用左移可以用左移n n位來實現(xiàn)。位來實現(xiàn)。 當當PCPC(R15R15)用作目的寄存器時,可以實現(xiàn)程序跳轉。)用作目的寄存器時,可以實現(xiàn)程序跳轉。 如如“MOV PCMOV PC,LR”LR”。 當當PCPC作為目標寄存器且指令中作為目標寄存器且指令中S S位被設置時,指令在位被設置時,指令在 執(zhí)行跳轉操作的同時,將當前處理器模式的執(zhí)行跳轉操作的同時,將當前處理器模式的SPSRSPSR寄存器寄存器 的

38、內容復制到的內容復制到CPSRCPSR中。這種指令中。這種指令“MOVS PC LR”MOVS PC LR”可以實可以實 現(xiàn)從某些異常中斷中返回?,F(xiàn)從某些異常中斷中返回。 40 41 MVN MVN指令是將第二操作數(shù)按位取反后傳送到目標寄存指令是將第二操作數(shù)按位取反后傳送到目標寄存 器,多用于向寄存器傳送一個負數(shù)或生成位掩碼。器,多用于向寄存器傳送一個負數(shù)或生成位掩碼。 (1)指令的語法格式)指令的語法格式: MNVS , (2)指令舉例)指令舉例 MVN R0, #4 ; R0 = -5 MVN R1,#0 xFF ;R1=0 xFFFFFF00 MVN R1,R2 ;將將R2取反,結果存到

39、取反,結果存到R1 這這是邏輯非操作而不是算術操作,這個取反的值加是邏輯非操作而不是算術操作,這個取反的值加1 1才才 是它的取負的是它的取負的值。值。 MVN指令指令 (3)指令的使用)指令的使用 向寄存器中傳送一個向寄存器中傳送一個負數(shù)負數(shù),或者說是一個更大范圍的,或者說是一個更大范圍的 立即數(shù)立即數(shù)。 生成生成位掩碼位掩碼(Bit MaskBit Mask)。)。 求一個數(shù)的求一個數(shù)的反碼反碼。 42 助記符助記符說明說明操作操作條件碼位置條件碼位置 ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法運算指令加法運算指令RdRdRn+operand2Rn

40、+operand2ADDcondSADDcondS SUB Rd, Rn, operand2SUB Rd, Rn, operand2減法運算指令減法運算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondS RSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向減法指令逆向減法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondS ADC Rd, Rn, operand2ADC Rd, Rn, operand2帶進位加法帶進位加法RdRdRn+operand2+CarryRn+operand2+C

41、arryADCcondSADCcondS SBC Rd, Rn, operand2SBC Rd, Rn, operand2帶進位減法指令帶進位減法指令 RdRdRn-operand2-Rn-operand2- (NOT)Carry(NOT)Carry SBCcondSSBCcondS RSC Rd, Rn, operand2RSC Rd, Rn, operand2 帶進位逆向減法帶進位逆向減法 指令指令 RdRdoperand2-Rn-operand2-Rn- (NOT)Carry(NOT)Carry RSCRSCcondcondSS ARMARM數(shù)據處理指令數(shù)據處理指令算術運算算術運算 43

42、 44 ADDADD指令指令將寄存器將寄存器shifter_operandshifter_operand的值加上的值加上RnRn表示的數(shù)值表示的數(shù)值 ,并將結果保存到目標寄存器,并將結果保存到目標寄存器RdRd中,并根據指令的執(zhí)行結中,并根據指令的執(zhí)行結 果設置果設置CPSRCPSR中相應的標志位中相應的標志位。 (1 1)指令的語法格式)指令的語法格式 ADDS ,ADDS , (2 2)ADDADD指令舉例指令舉例 ADD R0, R1, R2ADD R0, R1, R2; R0 = R1 + R2; R0 = R1 + R2 ADD R0, R1, #256ADD R0, R1, #25

43、6; ; R0 = R1 + 256R0 = R1 + 256 ADD R0, R2, R3,LSL#1ADD R0, R2, R3,LSL#1; ; R0 = R2 + (R3 1)R0 = R2 + (R3 1) ADD指令指令 45 SUB(Subtract)指令)指令從寄存器從寄存器Rn中減去中減去 shifter_operand表示的數(shù)值表示的數(shù)值,并將結果保存到目標寄存器,并將結果保存到目標寄存器Rd 中,并根據指令的執(zhí)行結果設置中,并根據指令的執(zhí)行結果設置CPSR中相應的標志位中相應的標志位。 (1)指令的語法格式)指令的語法格式 SUBS , (2)SUB指令指令舉例舉例 SU

44、B SUB R0R0, R1, , R1, R2 ; R0 = R1 R2 ; R0 = R1 R2 R2 SUBS R0SUBS R0, R1, #, R1, #256 256 ; R0 = R1 ; R0 = R1 256 256,影響標志位,影響標志位 SUB R0SUB R0, R2, , R2, R3,LSL#1 ; R0 = R2R3,LSL#1 ; R0 = R2 (R31) (R31) SUB指令指令 46 RSB(Reverse Subtract)指令)指令從寄存器從寄存器shifter_operand 中減去中減去Rn表示的數(shù)值表示的數(shù)值,并將結果保存到目標寄存器,并將結果

45、保存到目標寄存器Rd中,中, 并根據指令的執(zhí)行結果設置并根據指令的執(zhí)行結果設置CPSR中相應的標志位中相應的標志位。 (1)指令的語法格式)指令的語法格式 RSBS , (2)RSB指令舉例指令舉例 RSB R3,R1RSB R3,R1,#0 xFF00,#0 xFF00 ; ;R3=0 xFF00-R1R3=0 xFF00-R1 RSBS R1,R2,R2,LSL#2RSBS R1,R2,R2,LSL#2 ; ;R1=(R22)-R2=R2R1=(R22)-R2=R23 3 RSB指令指令 47 ADC指令指令將寄存器將寄存器shifter_operand的值加上的值加上Rn表示的數(shù)表示的數(shù)

46、 值,再加上值,再加上CPSR中的中的C條件標志位的值條件標志位的值,將結果保存到目,將結果保存到目 標寄存器標寄存器Rd中,并根據指令的執(zhí)行結果設置中,并根據指令的執(zhí)行結果設置CPSR中相應的中相應的 標志位標志位。 (1)指令的語法格式)指令的語法格式 ADCS , ADC指令指令 (2)ADC指令舉例指令舉例: 例:例:求兩個求兩個128位數(shù)相加。位數(shù)相加。 假設假設128位結果:寄存器位結果:寄存器R0,R1,R2,R3 第一個第一個128位數(shù):寄存器位數(shù):寄存器R4,R5,R6,R7 第二個第二個128位數(shù):寄存器位數(shù):寄存器R8,R9,R10,R11 ADDS R0,R4,R8 A

47、DCS R1,R5,R9 ADCS R2,R6,R10 ADCS R3,R7,R11 48 練習:練習: 使用使用ADCADC實現(xiàn)實現(xiàn)6464位加法,一個數(shù)存于位加法,一個數(shù)存于R1,R0R1,R0中;一個數(shù)存中;一個數(shù)存 于于R3,R2R3,R2中,結果存于中,結果存于R1R1、R0R0中中 ADDS R0,R0,R2ADDS R0,R0,R2 ;R0;R0等于低等于低3232位相加,并影響標位相加,并影響標 志位志位 ADC R1,R1,R3ADC R1,R1,R3;R1;R1等于高等于高3232位相加,并加上低位相加,并加上低 位進位位進位 49 50 SBC(Subtract with

48、 Carry)指令用于執(zhí)行操作數(shù)大于)指令用于執(zhí)行操作數(shù)大于 32位時的減法操作。該指令從寄存器位時的減法操作。該指令從寄存器Rn中減去中減去 shifter_operand表示的數(shù)值,再表示的數(shù)值,再減去寄存器減去寄存器CPSR中中C條件條件 標志位的反碼標志位的反碼NOT(Carry flag),并將結果保存到),并將結果保存到 目標寄存器目標寄存器Rd中,并根據指令的執(zhí)行結果設置中,并根據指令的執(zhí)行結果設置CPSR中相中相 應的標志位。應的標志位。 (1)指令的語法格式)指令的語法格式 SBCS , (2)SBC指令舉例:指令舉例: 下面的程序使用下面的程序使用SBCSBC實現(xiàn)實現(xiàn)646

49、4位減法,(位減法,(R1R1,R0R0)(R3R3,R2R2) ,結果存放到(,結果存放到(R1R1,R0R0) SUBS R0,R0,R2SUBS R0,R0,R2 SBCS R1,R1,R3SBCS R1,R1,R3 SBC指令指令 51 RSC(Reverse Subtract with Carry)指)指從寄存器從寄存器 shifter_operand中減去中減去Rn表示的數(shù)值,再減去寄存器表示的數(shù)值,再減去寄存器CPSR 中中C條件標志位的反碼條件標志位的反碼NOT(Carry Flag),),并將結果并將結果 保存到目標寄存器保存到目標寄存器Rd中,并根據指令的執(zhí)行結果設置中,并

50、根據指令的執(zhí)行結果設置CPSR 中相應的標志位。中相應的標志位。 (1)指令的語法格式)指令的語法格式 RSCS , (2)RSC指令舉例指令舉例 下面程序使用下面程序使用RSCRSC指令實現(xiàn)求指令實現(xiàn)求6464位數(shù)值的負數(shù)。位數(shù)值的負數(shù)。 RSBS R2,R0,RSBS R2,R0,0 0 RSC R3,R1,RSC R3,R1,0 0 RSC指令指令 助記符助記符說明說明操作操作條件碼位置條件碼位置 AND Rd, Rn, operand2AND Rd, Rn, operand2邏輯與操作指令邏輯與操作指令RdRdRn ;保留保留R0R0中的中的0 0位和位和1 1位,丟棄其余的位位,丟棄

51、其余的位 AND R2,R1,R3 AND R2,R1,R3 ; R2 = R1 R2 = R1 R0 = R0 R0 = R0 ;設置設置R0R0中位中位0 0和和1 1 ORR R0,R0,#0 x0FORR R0,R0,#0 x0F ; ;將將R0R0的低的低4 4位置位置1 1 MOV R1,R2,LSRMOV R1,R2,LSR #2 #24 4 ORR R3,R1,R3,LSLORR R3,R1,R3,LSL8 8 ; ; 將將R2R2的高的高8 8位數(shù)據移入到位數(shù)據移入到R3R3的低的低8 8位中位中 ORR指令指令 55 EOR(Exclusive OR)指令將寄存器)指令將寄

52、存器Rn中的值和中的值和 shifter_operand的值執(zhí)行的值執(zhí)行按位按位“異或異或”操作操作,并將執(zhí)行結果,并將執(zhí)行結果 存儲到目的寄存器存儲到目的寄存器Rd中,同時根據指令的執(zhí)行結果更新中,同時根據指令的執(zhí)行結果更新 CPSR中相應的條件標志位。中相應的條件標志位。 (1)指令的語法格式:)指令的語法格式: EORS , (2)指令舉例)指令舉例 EOR R2,R1,R0 ; R2 = R1R0 EOR R2,R1,R0 ; R2 = R1R0 EORS R0,R5, EORS R0,R5,0 x01 ;0 x01 ;將將R5R5和和0 x010 x01進行邏輯異或,結果保進行邏輯異

53、或,結果保 存到存到R0R0,并根據執(zhí)行結果設置標志位,并根據執(zhí)行結果設置標志位 EOR R1,R1,#0 x0F EOR R1,R1,#0 x0F ; ;將將R1R1的低的低4 4位取反位取反 EOR指令指令 56 BIC(Bit Clear)位清零指令,將寄存器)位清零指令,將寄存器Rn的值與第的值與第2個個 源操作數(shù)源操作數(shù)shifter_operand的值的反碼的值的反碼按位做按位做“邏輯與邏輯與” 操作,結果保存到操作,結果保存到Rd中。中。 (1)指令的語法格式)指令的語法格式 BICS , (2)BIC指令舉例指令舉例 BIC R0, R0, #0 x1011BIC R0, R0

54、, #0 x1011 ; ;清除清除R0R0中的位中的位0 0、1 1和和3 3,保持其余的不變,保持其余的不變 BIC R1,R1,#0 x0FBIC R1,R1,#0 x0F ; ;將將R1R1的低的低4 4位清零,其它位不變位清零,其它位不變 BIC R1,R2,R3BIC R1,R2,R3 ; ;將將R3R3的反碼和的反碼和R2R2邏輯與,結果保存到邏輯與,結果保存到R1R1中中 BIC位清零指令位清零指令 助記符助記符說明說明操作操作條件碼位置條件碼位置 CMP Rn, operand2CMP Rn, operand2比較指令比較指令 標志標志N N、Z Z、C C、V VRn-Rn

55、- operand2operand2 CMPcondCMPcond CMN Rn, operand2CMN Rn, operand2負數(shù)比較指令負數(shù)比較指令 標 志標 志 N N 、 Z Z 、 C C 、 V VRn+operand2Rn+operand2 CMNcondCMNcond TST Rn, operand2TST Rn, operand2位測試指令位測試指令 標志標志N N、Z Z、C C、V VRn 10 ;比較比較R1R1和立即數(shù)和立即數(shù)1010并設置相關的標并設置相關的標 志位志位 CMP R1,R2 ;CMP R1,R2 ;比較寄存器比較寄存器R1R1和和R2R2中的值并

56、設置相中的值并設置相 關的標志位關的標志位 CMP CMP指令與指令與SUBSSUBS指令的區(qū)別在于指令的區(qū)別在于CMPCMP指令不保存運算結果,指令不保存運算結果, 在進行兩個數(shù)據大小判斷時,常用在進行兩個數(shù)據大小判斷時,常用CMPCMP指令及相應的條件碼來指令及相應的條件碼來 進行進行操作操作! ! CMP指令指令 59 CMN(Compare Negative)指令)指令使用寄存器使用寄存器Rn的值減去的值減去 operand2的負數(shù)值(加上的負數(shù)值(加上operand2),),根據操作的結果更新根據操作的結果更新 CPSR中相應的條件標志位,以便后面的指令根據相應的條件中相應的條件標志

57、位,以便后面的指令根據相應的條件 標志來判斷是否執(zhí)行。標志來判斷是否執(zhí)行。 (1)指令的語法格式)指令的語法格式 CMN , (2)CMN指令舉例指令舉例 CMP CMP Rn,Rn,0 0 ; ;第第1 1條指令使標志位條指令使標志位C C值為值為1 1 CMN Rn,CMN Rn,0 0 ; ;第第2 2條指令使標志位條指令使標志位C C值為值為0 0 CMN R0,CMN R0,1 1 ; ; 判斷判斷R0R0是否為是否為1 1的補碼,若是,則的補碼,若是,則Z Z置位置位 CMN指令指令 注意注意:CMNCMN指令與指令與ADDSADDS指令的區(qū)別在于指令的區(qū)別在于CMNCMN指令不保

58、存運算結果。指令不保存運算結果。 CMNCMN指令可用于負數(shù)比較,比如指令可用于負數(shù)比較,比如CMN R0,#1CMN R0,#1指令則表示指令則表示R0R0與與-1-1比較,比較, 若若R0R0為為-1(-1(即即1 1的補碼的補碼) ),則,則Z Z置位;否則置位;否則Z Z復位。復位。 60 TST(Test)測試指令用于)測試指令用于將一個寄存器的值和一個算術值將一個寄存器的值和一個算術值 進行比較進行比較。條件標志位根據兩個操作數(shù)。條件標志位根據兩個操作數(shù)做做“邏輯與邏輯與”后的結后的結 果設置。果設置。 (1)指令的語法格式)指令的語法格式 TST , (2)TST指令舉例指令舉例

59、 TST R0,#0 x01TST R0,#0 x01 ; ; 判斷判斷R0R0的最低位是否為的最低位是否為0 0 TST R1,#0 x0F TST R1,#0 x0F ; ; 判斷判斷R1R1的低的低4 4位是否為位是否為0 0 TST測試指令測試指令 注意注意:TSTTST指令與指令與ANDSANDS指令的區(qū)別在于指令的區(qū)別在于TSTTST指令不保存運算結果。指令不保存運算結果。 TSTTST指令通常與指令通常與EQEQ、NENE條件碼配合使用,當所有測試位均為條件碼配合使用,當所有測試位均為0 0時,時,EQEQ 有效,而只要有一個測試位不為有效,而只要有一個測試位不為0 0,則,則N

60、ENE有效。有效。 61 TEQ(Test Equivalence)指令用于將一個寄存器的值和一)指令用于將一個寄存器的值和一 個算術值做比較。條件標志位根據兩個操作數(shù)個算術值做比較。條件標志位根據兩個操作數(shù)做做“邏輯異邏輯異 或或”后后的結果設置。以便后面的指令根據相應的條件標志的結果設置。以便后面的指令根據相應的條件標志 來判斷是否執(zhí)行。來判斷是否執(zhí)行。 (1)指令的語法格式)指令的語法格式 TEQ , (2)TEQ指令舉例指令舉例 TEQ R0,R1TEQ R0,R1 ; ;比較比較R0R0和和R1R1是否相等,該指令不影響是否相等,該指令不影響CPSRCPSR中的中的V V位和位和C

溫馨提示

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

最新文檔

評論

0/150

提交評論