第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ù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、名:TEST1.S ;功能:實現(xiàn)兩個寄存器相加功能:實現(xiàn)兩個寄存器相加 ;說明:使用說明:使用ARMulate軟件仿真調(diào)試軟件仿真調(diào)試 AREAExample1,CODE,READONLY ;聲明代碼段聲明代碼段Example1 ENTRY ;標識程序入口標識程序入口 CODE32 ;聲明聲明32位位ARM指令指令START MOVR0,#0 ;設置參數(shù)設置參數(shù) MOVR1,#10LOOPBLADD_SUB ;調(diào)用子程序調(diào)用子程序ADD_SUB BLOOP ;跳轉(zhuǎn)到跳轉(zhuǎn)到LOOPADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回子程序返回 EN

5、D ;文件結(jié)束文件結(jié)束 使用“;”進行注釋標號頂格寫實際代碼段聲明文件結(jié)束5主要內(nèi)容主要內(nèi)容一、立即尋址一、立即尋址二、寄存器尋址二、寄存器尋址三、寄存器移位尋址三、寄存器移位尋址四、寄存器間接尋址四、寄存器間接尋址五、基址尋址五、基址尋址六、堆棧尋址六、堆棧尋址 七、塊拷貝尋址七、塊拷貝尋址八、相對尋址八、相對尋址3.1 ARM處理器的尋址方式處理器的尋址方式尋址方式:尋址方式:處理器根據(jù)指令中給出的(地址)信息,尋找處理器根據(jù)指令中給出的(地址)信息,尋找操作數(shù)(物理地址)的方式。操作數(shù)(物理地址)的方式。67 這是一種特殊的尋址方式,這是一種特殊的尋址方式,操作數(shù)本身就在指令中操作數(shù)本身

6、就在指令中給出給出,只要取出指令也就取到了操作數(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 xFF000000、0 xF000000F下面是一些無效的立即數(shù):下面是一些無效的立即數(shù):0 x101、0 x102、0 xFF

7、1、0 xFF04、0 xFF003、0 xFFFFFFFF、0 xF000001F1立即數(shù)尋址方式立即數(shù)尋址方式應用立即數(shù)的指令:應用立即數(shù)的指令:MOV R0,0 ;送送0到到R0ADD R3,R3,1 ;R3的值加的值加1CMP R7,1000 ;R7的值和的值和1000比較比較BIC R9,R8,0 xFF00 ;將將R8中中815位清零,位清零,結(jié)果保存在結(jié)果保存在R9中中在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要求求以以“”為前綴為前綴,對于以十六進制表示的立即數(shù),對于以十六進制表示的立即數(shù),還要求在還要求在“”后加上后加上“0 x

8、”0 x”或或“&”&”89 寄存器尋址寄存器尋址就是就是利用寄存器中的數(shù)值作為操作數(shù)。利用寄存器中的數(shù)值作為操作數(shù)。這種尋址方式是各類處理器經(jīng)常采用的一種方式,這種尋址方式是各類處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式也是一種執(zhí)行效率較高的尋址方式。如:ADDADD R0, R1, R2 R0, R1, R2;該指令的執(zhí)行效果是將寄存器;該指令的執(zhí)行效果是將寄存器R1R1和和R2R2的內(nèi)容相加,其結(jié)果存放在寄存器的內(nèi)容相加,其結(jié)果存放在寄存器R0R0中中 MOV R1,R2MOV R1,R2 ; ;將將R2R2的值存入的值存入R1 R1 SUB R0,R1,R

9、2SUB R0,R1,R2 ; ;將將R1R1的值減去的值減去R2R2的值,結(jié)果保存到的值,結(jié)果保存到R0R02寄存器尋址方式寄存器尋址方式10 寄存器移位尋址寄存器移位尋址是是ARMARM指令集特有的尋址方式。當指令集特有的尋址方式。當?shù)诘? 2個操作數(shù)是寄存器移位方式時,第個操作數(shù)是寄存器移位方式時,第2 2個寄存器個寄存器操作數(shù)在與第操作數(shù)在與第1 1個操作數(shù)結(jié)合之前,選擇進行移位個操作數(shù)結(jié)合之前,選擇進行移位操作。操作。寄存器移位尋址指令舉例如下:寄存器移位尋址指令舉例如下:MOVMOVR0,R2,LSL #3R0,R2,LSL #3 ;R2;R2的值左移的值左移3 3位,結(jié)果放入位,

10、結(jié)果放入R0R0, ; ;即是即是R0=R2R0=R28 8 ANDSANDSR1,R1,R2,LSL R3 R1,R1,R2,LSL R3 ;R2;R2的值左移的值左移R3R3位,然后和位,然后和R1R1相相 ;“;“與與”操作,結(jié)果放入操作,結(jié)果放入R1R13寄存器移位尋址方式寄存器移位尋址方式移位操作(1)寄存器移位尋址的寄存器移位尋址的5 5種移位操作:種移位操作:lLSLLSL:邏輯左移(:邏輯左移(Logical Shift LeftLogical Shift Left)。寄存器中字的低端)。寄存器中字的低端空出的位補空出的位補0 0。 lLSRLSR:邏輯右移(:邏輯右移(Log

11、ical Shift RightLogical Shift Right)。寄存器中字的高)。寄存器中字的高端空出的位補端空出的位補0 0。 lASRASR:算術右移(:算術右移(Arithmetic Shift RightArithmetic Shift Right)。算術移位的對)。算術移位的對象是帶符號數(shù),在移位過程中必須保持操作數(shù)的符號不變。若象是帶符號數(shù),在移位過程中必須保持操作數(shù)的符號不變。若源操作數(shù)為正數(shù),源操作數(shù)為正數(shù),則字的高端空出的位補則字的高端空出的位補0 0。若源操作數(shù)為負。若源操作數(shù)為負數(shù),則字的高端空出的位補數(shù),則字的高端空出的位補1 1。 lRORROR:循環(huán)右移(

12、:循環(huán)右移(Rotate RightRotate Right)。從字的最低端移出的位填)。從字的最低端移出的位填入字的高端空出的位。入字的高端空出的位。 lRRXRRX:寄存器擴展循環(huán)右移(:寄存器擴展循環(huán)右移(Rotate Right Extended by 1 Rotate Right Extended by 1 placeplace)。操作數(shù)右移一位,空位(位)。操作數(shù)右移一位,空位(位3131)用原)用原C C標志填充。標志填充。 移位操作(2)移位操作移位操作u邏輯移位邏輯移位LSL:LSL:邏輯左移字的最小位空位清零邏輯左移字的最小位空位清零LSR:LSR:邏輯右移字的最大位空位清

13、零邏輯右移字的最大位空位清零. .12u算術移位算術移位uASR:ASR:算術右移算術右移uASL:ASL:算術左移算術左移移位操作(3)13寄存器間接尋址寄存器間接尋址就是就是以寄存器中的值作為操作數(shù)的地址,而操作以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲器數(shù)本身存放在存儲器中。中。例如例如ADDADD R0, R1, R2 R0, R1, R2 ; R0R1 ; R0R1R2R2LDRLDR R0, R1 R0, R1 ; R0R1 ; R0R1STRSTR R0, R1R0, R1 ; R1R0 ; R1R0在第一條指令中,以寄存器在第一條指令中,以寄存器R2R2的值作為操作

14、數(shù)的地址,在存的值作為操作數(shù)的地址,在存儲器中取得一個操作數(shù)后與儲器中取得一個操作數(shù)后與R1R1相加,結(jié)果存入寄存器相加,結(jié)果存入寄存器R0R0中。中。但是這種用法是否允許呢?但是這種用法是否允許呢?4寄存器間接尋址方式寄存器間接尋址方式14l基址尋址基址尋址就是將就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地,從而得到一個操作數(shù)的有效地址址l基址尋址方式常用于基址尋址方式常用于訪問某基地址附近的單元訪問某基地址附近的單元采用基址尋址方式的指令常見有以下幾種形式采用基

15、址尋址方式的指令常見有以下幾種形式LDRLDR R0, R1, R0, R1, 4 4 ; R0R1 ; R0R144LDRLDR R0, R1, R0, R1, 4!4! ; R0R1 ; R0R144、R1R1R1R14 4LDRLDR R0, R1, R0, R1, 4 4 ; R0R1 ; R0R1、R1R1R1R14 4LDRLDR R0, R1, R2 R0, R1, R2 ; R0R1 ; R0R1R2R25基址尋址方式基址尋址方式LDRLDR R0,R1, R0,R1,4!4! ; R0R1 ; R0R14 4、R1R1R1R14 4說明說明:“!”表示寫回或更新基址寄存器表示

16、寫回或更新基址寄存器15l相對尋址相對尋址以程序計數(shù)器以程序計數(shù)器PCPC的當前值為基地址的當前值為基地址,指令中的地址標指令中的地址標號作為偏移量號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址,將兩者相加之后得到操作數(shù)的有效地址l以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令BLBL采用了相采用了相對尋址方式對尋址方式 BLBL SORT SORT; ; 跳轉(zhuǎn)到子程序處執(zhí)行跳轉(zhuǎn)到子程序處執(zhí)行 SORTSORT MOVMOV PC, LR PC, LR; ; 從子程序返回從子程序返回 6相對尋址方式相對尋址方式167多寄存器尋址方式多寄存器尋址方式l采用

17、采用多寄存器尋址方式多寄存器尋址方式,一條指令可以完成多個寄存器值的傳一條指令可以完成多個寄存器值的傳送,最多送,最多傳送傳送1616個通用寄存器個通用寄存器的值的值l例如例如LDMLDMIAIA R0!, R1, R2, R3, R4 R0!, R1, R2, 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+4l指令后綴指令后綴IAIA表示在每次執(zhí)行操作后表示在每次執(zhí)行操作后R0R0按字長度增加按字

18、長度增加l注意注意:在寄存器列表中在寄存器列表中同一寄存器僅能指定一次同一寄存器僅能指定一次;加載;加載/ /存存儲操作按照儲操作按照寄存器固定次序寄存器固定次序進行,所以寄存器排列先后關系進行,所以寄存器排列先后關系隨意隨意LDMLDMIAIA R1, R0, R2, R5 R1, R0, R2, R5 ; ; R0R1,R2R1+4,R5R1+8R0R1,R2R1+4,R5R1+817尋址模式尋址模式描述描述起始地址起始地址結(jié)束地址結(jié)束地址Rn!Rn!IAIA執(zhí)行后增加執(zhí)行后增加RnRnRn+4Rn+4* *N-4N-4Rn+4Rn+4* *N NIBIB執(zhí)行前增加執(zhí)行前增加Rn+4Rn+

19、4Rn+4Rn+4* *N NRn+4Rn+4* *N NDADA執(zhí)行后減少執(zhí)行后減少Rn-4Rn-4* *N+4N+4RnRnRn-4Rn-4* *N NDBDB執(zhí)行前減少執(zhí)行前減少Rn-4Rn-4* *N NRn-4Rn-4Rn-4Rn-4* *N N注:!決定注:!決定RnRn的值是否隨著傳送而改變的值是否隨著傳送而改變多寄存器傳送指令的尋址模式18例例1:要求:保存要求:保存r1r3到內(nèi)存地址到內(nèi)存地址0 x90000 x900c,并且更新基址寄存,并且更新基址寄存器器r4PRE: r1=0 x00000001, r2=0 x00000002, r3=0 x00000003, r4=0

20、 x9000執(zhí)行操作:執(zhí)行操作: STMIA r4!, r1, r2, r3(執(zhí)行后增加執(zhí)行后增加)POST: mem320 x9000=0 x00000001 mem320 x9004=0 x00000002 mem320 x9008=0 x00000003 r4=0 x900c19例2:將存儲器中的連續(xù)數(shù)據(jù)裝載到寄存器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í)行指令

21、: LDMIA r0!, r1-r3POST r0=0 x0008001c, r1=0 x00000001, r2=0 x00000002, r3=0 x000000030 x800200 x000000050 x8001c0 x000000040 x800180 x000000030 x800140 x000000020 x800100 x000000010 x8000c0 x00000000地址指針地址指針 存儲地址存儲地址 數(shù)據(jù)數(shù)據(jù)r3=0 x00000000r2=0 x00000000r1=0 x00000000r0=0 x8001020l堆棧堆棧按先進后出(按先進后出(FILOFIL

22、O)的方式工作)的方式工作l根據(jù)堆棧的生成方式根據(jù)堆棧的生成方式l堆棧指針遞增計數(shù)堆棧指針遞增計數(shù)遞增堆棧遞增堆棧l堆棧指針遞減計數(shù)堆棧指針遞減計數(shù)遞減堆棧遞減堆棧8堆棧尋址方式堆棧尋址方式21棧底棧頂棧區(qū)SP堆棧存儲區(qū)棧頂棧底棧區(qū)SP向下增長向上增長0 x123456780 x12345678堆棧壓棧堆棧壓棧22l根據(jù)堆棧指針指向來分根據(jù)堆棧指針指向來分l堆棧指針指向最后一個壓入堆棧的數(shù)據(jù)時,稱為堆棧指針指向最后一個壓入堆棧的數(shù)據(jù)時,稱為滿堆棧滿堆棧l堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為空空堆棧堆棧棧頂SP棧頂SP棧底空堆棧棧底滿堆棧0

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

24、向下一個將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成且由低地址向高地址生成LDMLDMEAEA, , STMSTMEAEA l空遞減堆??者f減堆棧:堆棧指針指向下一個將要放入數(shù)據(jù)的空位置,堆棧指針指向下一個將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成且由高地址向低地址生成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例:把寄存器內(nèi)容放入堆

25、棧,更新SP0 x800180 x000000010 x800140 x000000020 x80010Empty0 x8000cEmpty0 x800180 x000000010 x800140 x000000020 x800100 x000000030 x8000c0 x00000002PRE 地址地址 數(shù)據(jù)數(shù)據(jù)POST 地址地址 數(shù)據(jù)數(shù)據(jù)SPSPPRE : r1=0 x00000002, r4=0 x00000003, sp=0 x00080014執(zhí)行指令:執(zhí)行指令: STMFD sp!, r1,r425POST: r1=0 x00000002, r4=0 x00000003, sp=0

26、 x0008000c尋址方式習題尋址方式習題1.下列指令的作用和采用了哪種尋址方式:下列指令的作用和采用了哪種尋址方式:MOV R0, #0 x04MOV R0, R1MOV R0,R1, LSL#4LDR R0, R1LDR R0,R1,#0 x04LDR R0,R1,#0 x0426LDMIA R0,R1R3STMFD SP!,R1R3BL Loop27選擇題選擇題1:下列哪條指令屬于寄存器尋址?:下列哪條指令屬于寄存器尋址?A、MOV R1 ,#0 x198 B、LDR R0 , R1 , #4 C、MOV R3 , R0 D、MOV R0 , R2 ,#428l數(shù)據(jù)處理指令數(shù)據(jù)處理指令

27、l存儲器訪問存儲器訪問Load/StoreLoad/Store指令指令l程序狀態(tài)寄存器處理指令程序狀態(tài)寄存器處理指令l跳轉(zhuǎn)指令跳轉(zhuǎn)指令l協(xié)處理器指令協(xié)處理器指令l異常產(chǎn)生指令異常產(chǎn)生指令3.2 ARM處理器的指令集處理器的指令集2932位的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_operandARM指令的編碼格式介紹30ARMARM指令典型的編碼格式為:指令典型的編碼格式為:每條每條ARMARM指令占有指令占有4 4個個字節(jié),其指令長度為字節(jié),其指令長度為3232位。位。指令結(jié)構(gòu):指令結(jié)構(gòu): 例:例:ADDS R2,R1,#1 SUBNES R2,R1,#0 x20 LDR R0,R1CondOpcodeSRnRdOperand201112151619202124252728317831指令的條件碼指令的條件碼 S , , 所有的所有的ARMARM指令都可以條件執(zhí)行指

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

30、標標 志志00000000EQEQ相等相等Z=1Z=100010001NENE不相等不相等Z=0Z=000100010CS/HSCS/HS無符號數(shù)大于或等于無符號數(shù)大于或等于C=1C=100110011CC/LOCC/LO無符號數(shù)小于無符號數(shù)小于C=0C=001000100MIMI負數(shù)負數(shù)N=1N=101010101PIPI非負數(shù)非負數(shù)N=0N=001100110VSVS溢出溢出V=1V=101110111VCVC沒有溢出沒有溢出V=0V=010001000HIHI無符號數(shù)大于無符號數(shù)大于C=1C=1且且Z=0Z=010011001LSLS無符號數(shù)小于或等于無符號數(shù)小于或等于C=0C=0或或Z

31、=1Z=110101010GEGE有符號數(shù)大于或等于有符號數(shù)大于或等于N=VN=V10111011LTLT有符號數(shù)小于有符號數(shù)小于N!=VN!=V11001100GTGT有符號數(shù)大于有符號數(shù)大于Z=0Z=0且且N=VN=V11011101LELE有符號數(shù)小于或等于有符號數(shù)小于或等于Z=1Z=1或或N!=VN!=V11101110ALAL無條件執(zhí)行無條件執(zhí)行任意任意11111111保留保留v5v5以下版本總執(zhí)行以下版本總執(zhí)行,v5,v5及以上版本有用及以上版本有用指令的條件碼表指令的條件碼表33ARMARM指令可以通過添加適當?shù)臈l件碼后綴來達到條件執(zhí)行的指令可以通過添加適當?shù)臈l件碼后綴來達到條件

32、執(zhí)行的目的。目的。這樣可以提高代碼密度,減少分支跳轉(zhuǎn)指令數(shù)目,提高性這樣可以提高代碼密度,減少分支跳轉(zhuǎn)指令數(shù)目,提高性能。能。C C代碼:代碼:If(a b)a+;Elseb+;對應的匯編代碼:對應的匯編代碼:CMPR0,R1 ;R0與與R1比較比較ADDHI R0,R0,#1 ;若若R0R1,則,則R0=R0+1ADDLS R1,R1,#1 ;若若R011,則則R1=R1+1例例1:34例例2 2: CMP r3,#0 CMP r3,#0CMP r3,#0 CMP r3,#0 BEQBEQ skipskip ADDNEADDNE r0,r1,r2 r0,r1,r2 ADD r0,r1,r2

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

34、中的數(shù)據(jù)進行操作的指令進行操作的指令。數(shù)據(jù)處理指令可分為:數(shù)據(jù)處理指令可分為:u數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令進行數(shù)據(jù)的傳輸進行數(shù)據(jù)的傳輸:MOV:MOV、MVNMVNu算術邏輯運算指令算術邏輯運算指令完成常用的算術與邏輯的運算,同時完成常用的算術與邏輯的運算,同時更新更新CPSRCPSR中的相應條件中的相應條件標志位標志位u比較指令比較指令不保存運算結(jié)果,只不保存運算結(jié)果,只更新更新CPSRCPSR中相應的條件標志中相應的條件標志3.2.1 數(shù)據(jù)操作指令數(shù)據(jù)操作指令37助記符說明操作條件碼位置MOV Rd,operand2MOV Rd,operand2數(shù)據(jù)傳送數(shù)據(jù)傳送RdRdoperand2 op

35、erand2 MOVcondSMOVcondSMVN Rd,operand2MVN Rd,operand2數(shù)據(jù)非傳送數(shù)據(jù)非傳送RdRd(operand2)(operand2)MVNcondSMVNcondSARMARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令數(shù)據(jù)傳送數(shù)據(jù)傳送3839 MOV指令多用于指令多用于設置初始值設置初始值或者或者在寄存器間傳送數(shù)據(jù)在寄存器間傳送數(shù)據(jù)(1)指令的語法格式:)指令的語法格式:MOVS ,(2)指令舉例)指令舉例MOVMOV R0, R0 R0, R0; R0 = R0 ; R0 = R0 NOP NOP 指令指令MOV R0, R0, LSL#3MOV R0, R0, LS

36、L#3; R0 = R0 ; R0 = R0 * * 8 8MOV PC, R14MOV PC, R14 ; ; 退出到調(diào)用者,用于普退出到調(diào)用者,用于普通函數(shù)返回,通函數(shù)返回,PCPC即是即是R15R15MOVS PC, R14MOVS PC, R14 ; ; 退出到調(diào)用者并恢復標退出到調(diào)用者并恢復標志位,用于異常函數(shù)返回志位,用于異常函數(shù)返回MOV指令指令(3)指令的使用)指令的使用 將數(shù)據(jù)從一個寄存器傳送到另一個寄存器將數(shù)據(jù)從一個寄存器傳送到另一個寄存器 將一個將一個常數(shù)值常數(shù)值傳送到寄存器中。傳送到寄存器中。 實現(xiàn)無算術和邏輯運算的實現(xiàn)無算術和邏輯運算的單純移位操作單純移位操作,操作數(shù)

37、乘以,操作數(shù)乘以2 2n n可以用左移可以用左移n n位來實現(xiàn)。位來實現(xiàn)。 當當PCPC(R15R15)用作目的寄存器時,可以實現(xiàn)程序跳轉(zhuǎn)。)用作目的寄存器時,可以實現(xiàn)程序跳轉(zhuǎn)。如如“MOV PCMOV PC,LR”LR”。 當當PCPC作為目標寄存器且指令中作為目標寄存器且指令中S S位被設置時,指令在位被設置時,指令在執(zhí)行跳轉(zhuǎn)操作的同時,將當前處理器模式的執(zhí)行跳轉(zhuǎn)操作的同時,將當前處理器模式的SPSRSPSR寄存器寄存器的內(nèi)容復制到的內(nèi)容復制到CPSRCPSR中。這種指令中。這種指令“MOVS PC LR”MOVS PC LR”可以實可以實現(xiàn)從某些異常中斷中返回?,F(xiàn)從某些異常中斷中返回。4

38、041 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取反,結(jié)果存到取反,結(jié)果存到R1 這是邏輯非操作而不是算術操作,這個取反的值這是邏輯非操作而不是算術操作,這個取反的值加加1 1才是它的取負的值。才是它的取負的值。MVN指令指令(3)指令的使用)

39、指令的使用 向寄存器中傳送一個向寄存器中傳送一個負數(shù)負數(shù),或者說是一個更大范圍的,或者說是一個更大范圍的立即數(shù)立即數(shù)。 生成生成位掩碼位掩碼(Bit MaskBit Mask)。)。 求一個數(shù)的求一個數(shù)的反碼反碼。42助記符助記符說明說明操作操作條件碼位置條件碼位置ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法運算指令加法運算指令RdRdRn+operand2Rn+operand2ADDcondSADDcondSSUB Rd, Rn, operand2SUB Rd, Rn, operand2減法運算指令減法運算指令RdRdRn-operand2Rn-ope

40、rand2SUBcondSSUBcondSRSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向減法指令逆向減法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondSADC Rd, Rn, operand2ADC Rd, Rn, operand2帶進位加法帶進位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSADCcondSSBC Rd, Rn, operand2SBC Rd, Rn, operand2帶進位減法指令帶進位減法指令RdRdRn-operand2-Rn-operand2

41、-(NOT)Carry(NOT)CarrySBCcondSSBCcondSRSC Rd, Rn, operand2RSC Rd, Rn, operand2帶進位逆向減法帶進位逆向減法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondSARMARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令算術運算算術運算4344 ADDADD指令指令將寄存器將寄存器shifter_operandshifter_operand的值加上的值加上RnRn表示的數(shù)值表示的數(shù)值,并將結(jié)果保存到目標寄存器,并將結(jié)果保存到目標寄存器RdRd中,并根據(jù)指令的執(zhí)行

42、結(jié)中,并根據(jù)指令的執(zhí)行結(jié)果設置果設置CPSRCPSR中相應的標志位。中相應的標志位。(1 1)指令的語法格式)指令的語法格式ADDS ,ADDS ,(2 2)ADDADD指令舉例指令舉例ADD R0, R1, R2ADD R0, R1, R2; R0 = R1 + R2; R0 = R1 + R2ADD R0, R1, #256ADD R0, R1, #256; R0 = R1 + 256; R0 = R1 + 256ADD R0, R2, R3,LSL#1ADD R0, R2, R3,LSL#1; R0 = R2 + (R3 1); R0 = R2 + (R3 1)ADD指令指令45 SUB

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

44、SUB R0, R2, R3,LSL#1 ; R0 = R2SUB R0, R2, R3,LSL#1 ; R0 = R2 (R31) (R31) SUB指令指令46 RSB(Reverse Subtract)指令)指令從寄存器從寄存器shifter_operand中減去中減去Rn表示的數(shù)值表示的數(shù)值,并將結(jié)果保存到目標寄存器,并將結(jié)果保存到目標寄存器Rd中中,并根據(jù)指令的執(zhí)行結(jié)果設置,并根據(jù)指令的執(zhí)行結(jié)果設置CPSR中相應的標志位。中相應的標志位。(1)指令的語法格式)指令的語法格式RSBS ,(2)RSB指令舉例指令舉例 RSB R3,R1,#0 xFF00 RSB R3,R1,#0 xFF

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

46、令指令(2)ADC指令舉例指令舉例:例:例:求兩個求兩個128位數(shù)相加。位數(shù)相加。假設假設128位結(jié)果:寄存器位結(jié)果:寄存器R0,R1,R2,R3第一個第一個128位數(shù):寄存器位數(shù):寄存器R4,R5,R6,R7第二個第二個128位數(shù):寄存器位數(shù):寄存器R8,R9,R10,R11ADDS R0,R4,R8ADCS R1,R5,R9ADCS R2,R6,R10ADCS R3,R7,R1148練習:練習:使用使用ADCADC實現(xiàn)實現(xiàn)6464位加法,一個數(shù)存于位加法,一個數(shù)存于R1,R0R1,R0中;一個數(shù)存中;一個數(shù)存于于R3,R2R3,R2中,結(jié)果存于中,結(jié)果存于R1R1、R0R0中中 ADDS

47、R0,R0,R2ADDS R0,R0,R2 ;R0;R0等于低等于低3232位相加,并影響標位相加,并影響標志位志位 ADC R1,R1,R3ADC R1,R1,R3;R1;R1等于高等于高3232位相加,并加上低位相加,并加上低位進位位進位4950 SBC(Subtract with Carry)指令用于執(zhí)行操作數(shù)大于)指令用于執(zhí)行操作數(shù)大于32位時的減法操作。該指令從寄存器位時的減法操作。該指令從寄存器Rn中減去中減去shifter_operand表示的數(shù)值,再表示的數(shù)值,再減去寄存器減去寄存器CPSR中中C條件條件標志位的反碼標志位的反碼NOT(Carry flag),并將結(jié)果保存到),

48、并將結(jié)果保存到目標寄存器目標寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設置中,并根據(jù)指令的執(zhí)行結(jié)果設置CPSR中相中相應的標志位。應的標志位。(1)指令的語法格式)指令的語法格式SBCS ,(2)SBC指令舉例:指令舉例:下面的程序使用下面的程序使用SBCSBC實現(xiàn)實現(xiàn)6464位減法,(位減法,(R1R1,R0R0)(R3R3,R2R2),結(jié)果存放到(,結(jié)果存放到(R1R1,R0R0)SUBS R0,R0,R2SUBS R0,R0,R2SBCS R1,R1,R3SBCS R1,R1,R3SBC指令指令51 RSC(Reverse Subtract with Carry)指)指從寄存器從寄存器shift

49、er_operand中減去中減去Rn表示的數(shù)值,再減去寄存器表示的數(shù)值,再減去寄存器CPSR中中C條件標志位的反碼條件標志位的反碼NOT(Carry Flag),),并將結(jié)果并將結(jié)果保存到目標寄存器保存到目標寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設置中,并根據(jù)指令的執(zhí)行結(jié)果設置CPSR中相應的標志位。中相應的標志位。(1)指令的語法格式)指令的語法格式RSCS ,(2)RSC指令舉例指令舉例下面程序使用下面程序使用RSCRSC指令實現(xiàn)求指令實現(xiàn)求6464位數(shù)值的負數(shù)。位數(shù)值的負數(shù)。RSBS R2,R0,RSBS R2,R0,0 0RSC R3,R1,RSC R3,R1,0 0RSC指令指令助記符助

50、記符說明說明操作操作條件碼位置條件碼位置AND Rd, Rn, operand2AND Rd, Rn, operand2邏輯與操作指令邏輯與操作指令RdRdRn & operand2Rn & operand2ANDcondSANDcondSORR Rd, Rn, operand2ORR Rd, Rn, operand2邏輯或操作指令邏輯或操作指令RdRdRn | operand2Rn | operand2ORRcondSORRcondSEOR Rd, Rn, operand2EOR Rd, Rn, operand2邏輯異或操作指邏輯異或操作指令令RdRdRn operand2R

51、n operand2EORcondSEORcondSBIC Rd, Rn, operand2BIC Rd, Rn, operand2位清除指令位清除指令RdRdRn & (operand2)Rn & (operand2)BICcondSBICcondSARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令邏輯運算指令邏輯運算指令5253 AND指令將指令將shifter_operand表示的數(shù)值與寄存器表示的數(shù)值與寄存器Rn的值的值按位(按位(bitwise)做邏輯與操作)做邏輯與操作,并將結(jié)果保存到,并將結(jié)果保存到目標寄存器目標寄存器Rd中,同時根據(jù)操作的結(jié)果更新中,同時根據(jù)操作的結(jié)果更新CPSR寄

52、寄存器。存器。(1)指令的語法格式:)指令的語法格式:ANDS ,(2)指令舉例)指令舉例AND R0, R0, #3 ;AND R0, R0, #3 ;保留保留R0R0中的中的0 0位和位和1 1位,丟棄其余的位位,丟棄其余的位AND R2,R1,R3 ; R2AND R2,R1,R3 ; R2 = = R1&R3 R1&R3 ANDS R0,R0,#0 x01 ; R0ANDS R0,R0,#0 x01 ; R0 = = R0&0 x01R0&0 x01,取出最低位數(shù)據(jù),取出最低位數(shù)據(jù)AND指令指令54 ORR(Logical OR)為)為邏輯或邏輯或操作指

53、令,它將第操作指令,它將第2個源個源操作數(shù)操作數(shù)shifter_operand的值與寄存器的值與寄存器Rn的值按位做的值按位做“邏輯邏輯或或”操作,結(jié)果保存到操作,結(jié)果保存到Rd中。中。(1)指令的語法格式)指令的語法格式ORRS ,(2)ORR指令舉例指令舉例ORR R0, R0, #3ORR R0, R0, #3 ; ;設置設置R0R0中位中位0 0和和1 1ORR R0,R0,#0 x0FORR R0,R0,#0 x0F ; ;將將R0R0的低的低4 4位置位置1 1MOV R1,R2,LSRMOV R1,R2,LSR #2 #24 4ORR R3,R1,R3,LSLORR R3,R1,

54、R3,LSL8 8 ; ; 將將R2R2的高的高8 8位數(shù)據(jù)移入到位數(shù)據(jù)移入到R3R3的低的低8 8位中位中ORR指令指令55 EOR(Exclusive OR)指令將寄存器)指令將寄存器Rn中的值和中的值和shifter_operand的值執(zhí)行的值執(zhí)行按位按位“異或異或”操作操作,并將執(zhí)行結(jié)果,并將執(zhí)行結(jié)果存儲到目的寄存器存儲到目的寄存器Rd中,同時根據(jù)指令的執(zhí)行結(jié)果更新中,同時根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應的條件標志位。中相應的條件標志位。(1)指令的語法格式:)指令的語法格式:EORS ,(2)指令舉例)指令舉例 EOR R2,R1,R0 ; R2 EOR R2,R1,R0 ; R

55、2 = = R1R0R1R0 EORS R0,R5, EORS R0,R5,0 x01 ;0 x01 ;將將R5R5和和0 x010 x01進行邏輯異或,結(jié)果保進行邏輯異或,結(jié)果保存到存到R0R0,并根據(jù)執(zhí)行結(jié)果設置標志位,并根據(jù)執(zhí)行結(jié)果設置標志位 EOR R1,R1,#0 x0F EOR R1,R1,#0 x0F ; ;將將R1R1的低的低4 4位取反位取反EOR指令指令56 BIC(Bit Clear)位清零指令,將寄存器)位清零指令,將寄存器Rn的值與第的值與第2個個源操作數(shù)源操作數(shù)shifter_operand的值的反碼的值的反碼按位做按位做“邏輯與邏輯與”操作,結(jié)果保存到操作,結(jié)果保

56、存到Rd中。中。(1)指令的語法格式)指令的語法格式BICS ,(2)BIC指令舉例指令舉例BIC R0, R0, #0 x1011BIC R0, R0, #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邏輯與,結(jié)果保存到邏輯與,結(jié)果保存到R1R1中中BIC位清零指令位清零指令助記符助記符說明說明操作操作條件碼位

57、置條件碼位置CMP Rn, operand2CMP Rn, operand2比較指令比較指令標志標志N N、Z Z、C C、V VRn-Rn-operand2operand2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2負數(shù)比較指令負數(shù)比較指令標 志標 志 N N 、 Z Z 、 C C 、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位測試指令位測試指令標志標志N N、Z Z、C C、V VRn & Rn & operand2opera

58、nd2TSTcondTSTcondTEQ Rn, operand2TEQ Rn, operand2相等測試指令相等測試指令標志標志N N、Z Z、C C、V VRn Rn operand2operand2TEQcondTEQcondARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令比較指令比較指令5758 CMP(Compare)指令使用)指令使用寄存器寄存器Rn的值減去的值減去operand2的值,根據(jù)操作的結(jié)果更新的值,根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位中相應的條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。(1)指令的語法格式)指令的語法

59、格式CMP ,(2)CMP指令舉例指令舉例CMP R1,#10 ;CMP R1,#10 ;比較比較R1R1和立即數(shù)和立即數(shù)1010并設置相關的標并設置相關的標志位志位CMP R1,R2 ;CMP R1,R2 ;比較寄存器比較寄存器R1R1和和R2R2中的值并設置相中的值并設置相關的標志位關的標志位 CMP CMP指令與指令與SUBSSUBS指令的區(qū)別在于指令的區(qū)別在于CMPCMP指令不保存運算結(jié)指令不保存運算結(jié)果,在進行兩個數(shù)據(jù)大小判斷時,常用果,在進行兩個數(shù)據(jù)大小判斷時,常用CMPCMP指令及相應的條指令及相應的條件碼來進行操作件碼來進行操作! !CMP指令指令59 CMN(Compare

60、Negative)指令)指令使用寄存器使用寄存器Rn的值減去的值減去operand2的負數(shù)值(加上的負數(shù)值(加上operand2),),根據(jù)操作的結(jié)果更新根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位,以便后面的指令根據(jù)相應的條件中相應的條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。標志來判斷是否執(zhí)行。(1)指令的語法格式)指令的語法格式CMN ,(2)CMN指令舉例指令舉例CMP CMP Rn,Rn,0 0 ; ;第第1 1條指令使標志位條指令使標志位C C值為值為1 1CMN Rn,CMN Rn,0 0 ; ;第第2 2條指令使標志位條指令使標志位C C值為值為0 0CMN R0,CMN R0,1 1 ; ; 判斷判斷R0R0是否為是否為1 1的補碼,若是,則的補

溫馨提示

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

評論

0/150

提交評論