




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第2章ARM指令系統(tǒng)5學(xué)時本章的主要內(nèi)容1、指令的尋址方式;2、條件指令;3、指令對CPSR標志位的影響;4、寄存器之間的數(shù)據(jù)傳送指令及算術(shù)、邏輯運算指令;5、寄存器與存儲器之間數(shù)據(jù)傳送指令;1共142頁6、程序跳轉(zhuǎn)指令;7、Thumb指令集簡介。本章的主要內(nèi)容(續(xù))本章教學(xué)要求掌握ARM的尋址方式、ARM指令系統(tǒng)。2共142頁1、什么叫指令?
指令是用來指示處理器進行操作的命令。處理器的指令集合叫做該處理器的指令系統(tǒng)。
程序設(shè)計人員使用指令來編寫程序。2、什么叫指令系統(tǒng)?第2章ARM指令系統(tǒng)3共142頁4、ARM核具有的指令3、不同類型的處理器具有不同的指令集合,即不同的指令系統(tǒng)
ARM核具有兩種指令集:(1)32位的ARM
指令集;(2)16位的Thumb
指令集。
Thumb指令集是ARM指令集的子集。第2章ARM指令系統(tǒng)(續(xù))4共142頁2.1尋址方式
操作數(shù)總是被存放在指令、寄存器
或存儲器
這三個地方。
指令是用提供操作數(shù)存放位置的方式(尋址方式)來提供操作數(shù)的。1、ARM
提供了4
種尋址方式;2、INTEL的8031系列單片機有
7
種尋址方式;3、INTEL的80X86系列機有7種尋址方式。5共142頁
在指令中直接提供操作數(shù)的方式叫做立即尋址方式,被提供的操作數(shù)叫做立即數(shù)。在ARM指令中,必須用前綴“#”
來表示一個立即數(shù)。ADDR0,R1,#4;R0←(R1)+4
立即數(shù)可以用十六進制、二進制或十進制,在立即數(shù)的前面加上“0x”、“0b”、“0d”,缺省為十進制。2.1.1立即尋址方式特別注意:字母不分大小寫,但0b、0d在工具中不能用。6共142頁ADDR0,R1,#0x3F;R0←(R1)+0x3FADDR0,R1,#4;R0←(R1)+42.1.2寄存器尋址方式
指令用操作數(shù)所在的寄存器名稱來提供操作數(shù)的方式叫做寄存器尋址。ADDR0,R1,R2;R0←(R1)+(R2)2.1.1立即尋址方式(續(xù))7共142頁2.1.3寄存器間接尋址方式
寄存器中的數(shù)據(jù)并不是操作數(shù)本身,而是操作數(shù)的地址。
提供操作數(shù)地址的寄存器叫做間接尋址寄存器,簡稱間址寄存器。由于這個間址寄存器指向了一個數(shù)據(jù),所以它也常常叫做指針。8共142頁LDRR0,[R1];R0←((R1))2.1.3寄存器間接尋址方式(續(xù))9共142頁2.1.4變址尋址
變址尋址方式實質(zhì)上是間接尋址的一種變形方式。在這種尋址方式中,間址寄存器提供的是一個基準地址(基地址)。這個基地址與指令中給出的另一個叫做偏移量的數(shù)據(jù)相加之后,得到的才是操作數(shù)的地址。10共142頁LDRR0,[R1,#4];R0←((R1)+4)2.1.4變址尋址(續(xù))LDRR0,[R1,R2];R0←((R1)+(R2))11共142頁
偏移量可以是立即數(shù),也可以是寄存器
尋址的操作數(shù)。2.1.4變址尋址(續(xù))12共142頁2.2ARM指令集概述
ARM
指令系統(tǒng)屬于32位RISC
指令系統(tǒng),所有指令的長度均為32
位。
指令分為:(1)數(shù)據(jù)處理指令;(2)程序跳轉(zhuǎn)指令;(3)程序狀態(tài)寄存器操作指令;(4)Load/Store指令;(5)協(xié)處理器指令;(6)異常產(chǎn)生指令。13共142頁
當程序狀態(tài)寄存器CPSR
的標志位T=0(ARM狀態(tài))時,處理器運行ARM
指令程序。2.2.1指令的基本格式
ARM指令的助記符格式為:<opcode>{<cond>}{s}<Rd>,<Rn>,<operand2>Opcode——指令基本操作碼助記符;2.2ARM指令集概述(續(xù))14共142頁Cond——指令的條件碼(可選);S——決定指令操作是否影響程序狀態(tài)寄存器CPSR內(nèi)容的標志(可選);Rd——目標操作數(shù)寄存器名稱;Rn——第1源操作數(shù)寄存器名稱;Operand2——第2源操作數(shù)。2.2.1指令的基本格式(續(xù))15共142頁2.2.2指令的可選操作指令操作碼部分被分成三段:基本操作碼、條件碼和S標志。
ARM指令代碼的一般格式:16共142頁1、指令條件碼
需要滿足一定前提條件才能被執(zhí)行的指令,叫做條件指令。
ARM指令用條件碼或條件助記符來提供指令的執(zhí)行條件。大多數(shù)ARM指令都可以通過在基本操作碼助記符后面使用條件助記符的方法而成為條件指令。2.2.2指令的可選操作(續(xù))17共142頁
ARM指令的條件碼及助記符如下:條件碼條件碼助記符條件碼的含義CPSR標志位值的含義0000EQZ=1相等0001NEZ=0不相等0010CSC=1無符號數(shù)大于或等于0011CCC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出1、指令條件碼(續(xù))18共142頁條件碼條件碼助記符條件碼的含義CPSR標志位值的含義0111VCV=0未溢出1000HIC=1且Z=0無符號數(shù)大于1001LSC=0或Z=1無符號數(shù)小于或等于1010GEN=V帶符號數(shù)大于或等于1011LTN<>V帶符號數(shù)小于1100GTZ=0且N=V帶符號數(shù)大于1101LEZ=1或(N<>V)帶符號數(shù)小于或等于1110AL忽略CPSR的所有值無條件執(zhí)行1111--系統(tǒng)保留ARM指令的條件碼及助記符如下:(續(xù))19共142頁
當處理器執(zhí)行一條條件指令之前,如果CPSR
的當前值滿足指令條件碼的要求,那么該指令將被執(zhí)行,否則就忽略這條指令。2、指令的S標志
S標志就是一個開關(guān)控制信號,它控制了程序狀態(tài)寄存器CPSR
與ALU
之間的開關(guān)。1、指令條件碼(續(xù))20共142頁
如果指令操作碼助記符的后面使用了S
標志,指令的操作結(jié)果能夠修改程序狀態(tài)寄存器CPSR
的相關(guān)內(nèi)容。否則指令的操作結(jié)果不能影響程序狀態(tài)寄存器CPSR
的任何內(nèi)容。2.2.3指令的第2源操作數(shù)
ARM
指令的目標操作數(shù)Rd
和第1源操作數(shù)Rn
通常為寄存器尋址。2、指令的S標志(續(xù))21共142頁
第2源操作數(shù)operand2比較復(fù)雜,可以有3種方式:立即尋址、寄存器尋址、帶移位預(yù)處理的寄存器尋址。1、立即尋址方式
第2源操作數(shù)operand2只有12
位。2.2.3指令的第2源操作數(shù)(續(xù))22共142頁1、立即尋址方式(續(xù))23共142頁因此對立即數(shù)有特定的要求,如0X3F0
就是一個合法
的立即數(shù)。
Immed_8=0x3F
Rotate_imm=0xE
但是0X101
就是一個非法的立即數(shù)。
ARM
已經(jīng)提供了一些偽指令來處理立即數(shù)問題。1、立即尋址方式(續(xù))24共142頁2、寄存器尋址方式第2源操作數(shù)可以存放在一個通用寄存器Rm(m=0,1,2,3…..,15)中。MOVR0,R1ADDR0,R1,R2
;R0中的數(shù)據(jù)為R1和R2
中的數(shù)據(jù)的和25共142頁3、帶移位預(yù)處理的寄存器尋址方式
以Rm為第2源操作數(shù)的指令,還可以通過桶形移位寄存器對Rm進行移位預(yù)處理。移位的種類有:邏輯左移(LSL)、算術(shù)左移(ASL)、邏輯右移(LSR)、循環(huán)右移(ROR)、擴展循環(huán)右移(RRX)等。26共142頁(1)邏輯左移(LSL)3、帶移位預(yù)處理的寄存器尋址方式(續(xù))27共142頁例:MOVR0,R1,LSL#2
;將R1中的內(nèi)容左移兩位后傳送到R0中ADDR0,R2,R3,LSL#1
;R0←
(R2)+(R3<<1)(2)算術(shù)左移(ASL)(1)邏輯左移(LSL)(續(xù))28共142頁
ASL
和LSL
是等價的。(3)邏輯右移(LSR)例:MOVR0,R1,LSR#2
;將R1中的內(nèi)容右移兩位后傳送R0中,左端用零來填充(2)算術(shù)左移(ASL)(續(xù))29共142頁(4)算術(shù)右移(ASR)例:MOVR0,R1,ASR#2
;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用第31位來填充。30共142頁(5)循環(huán)右移(ROR)例:MOVR0,R1,ROR#2
;將R1中的內(nèi)容循環(huán)右移兩位后傳送到R0中31共142頁(6)擴展循環(huán)右移(RRX)例:MOVR0,R1,RRX#2
;將R1中的內(nèi)容進行擴展的循環(huán)右移兩位后傳送到R0中。32共142頁
移位操作的移動位數(shù)除了可以用立即數(shù)來表示之外,還可以存放在一個通用寄存器Rs(s=0,1,2…..,15)中。例:MOVR0,R1,LSR#2MOVR1,R0,LSRR2(6)擴展循環(huán)右移(RRX)(續(xù))33共142頁2.3ARM指令集2.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令的作用是在處理器的寄存器之間進行數(shù)據(jù)傳送。1、8031有
111
條指令;2、8088有100
多條指令。34共142頁1、MOV指令及其功能
MOV指令的格式為:
MOV{<cond>}{S}<Rd>,<operand2>
MOV指令的功能是將源操作數(shù)operand2傳送到目的操作數(shù)Rd。35共142頁例:MOVR2,#0x67E
;將立即數(shù)0x67E傳送到寄存器R2中MOVR1,R0;將寄存器R0中的數(shù)據(jù)傳送到寄存器R1受影響的CPSR標志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0,則Z=1,否則Z=0CC=01、MOV指令及其功能(續(xù))立即數(shù)超出范圍36共142頁2、源操作數(shù)按位取反數(shù)據(jù)傳送指令MVN
MVN指令的格式為:MVN{<cond>}{S}<Rd>,<operand2>
MVN指令在進行數(shù)據(jù)傳送之前,先把源操作數(shù)operand2按位取反,然后再傳送到目的寄存器Rd。MVNR0,#0;將立即數(shù)0取反傳送到寄存器R0中,完成后R0=-1。37共142頁
標志修改同MOV指令,只修改N、Z、C。2.3.2算術(shù)運算指令
能完成數(shù)據(jù)的加、減、乘、除運算的指令,叫做算術(shù)運算指令。1、加法運算指令A(yù)DD
加法指令A(yù)DD的格式為:ADD{<cond>}{S}<Rd>,<Rn>,<operand2>2、源操作數(shù)按位取反數(shù)據(jù)傳送指令MVN(續(xù))38共142頁
ADD
指令把第1
源操作數(shù)Rn
和第2
源操作數(shù)operand2
相加后,將結(jié)果存放到目的操作數(shù)Rd。
Rn
為寄存器尋址;operand2
可以為寄存器尋址、立即尋址、帶移位預(yù)處理的寄存器尋址。1、加法運算指令A(yù)DD(續(xù))39共142頁
ADD指令的執(zhí)行如下:40共142頁ADDR0,R1,R2;R0←(R1)+(R2)ADDR0,R1,#256
;R0←(R1)+256ADDR0,R2,R3,LSL#1;R0←(R2)
+(R3<<1)受影響的CPSR標志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0,則Z=1,否則Z=0C運算結(jié)果有進位C=1,否則C=0V運算結(jié)果有溢出V=1,否則V=01、加法運算指令A(yù)DD(續(xù))改為OX256行嗎?41共142頁2、帶進位位加法指令A(yù)DC
ADC指令的格式為:ADC{<cond>}{S}<Rd>,<Rn>,<operand2>
ADC指令把三個數(shù)進行加法運算。即把Rn與operand2相加,然后再加上CPRS中的
C標志位的值,最后將結(jié)果存放到目的操作數(shù)Rd中。42共142頁
Rn為寄存器尋址;operand2可以為寄存器尋址、立即數(shù)尋址、帶移位預(yù)處理的寄存器尋址。2、帶進位位加法指令A(yù)DC(續(xù))43共142頁
ADC
通常用來實現(xiàn)字長大于32
位的加法運算。
標志位的修改同ADD、只修改N、Z、C、V。例:有兩個128位數(shù),第一個數(shù)由高到低存放在寄存器R7~R4中,第二個數(shù)由高到低存放在寄存器R11~R8中,請編寫程序把兩個數(shù)相加,運算結(jié)果由高到低存放到寄存器R3~R0中。2、帶進位位加法指令A(yù)DC(續(xù))44共142頁ADDSR0,R4,R8;加低位字,不帶進位ADCSR1,R5,R9;加第二個字,帶進位ADCSR2,R6,R10;加第三個字,帶進位ADCSR3,R7,R11;加第四個字,帶進位3、減法指令SUB
SUB指令的格式為:SUB{<cond>}{S}<Rd>,<Rn>,<operand2>2、帶進位位加法指令A(yù)DC(續(xù))這段程序有缺陷嗎?能否不要這些S
?45共142頁
SUB指令把Rn
作為被減數(shù),operand2作為減數(shù)進行減法運算,然后將結(jié)果存放在Rd。
operand2可以是寄存器尋址方式、立即尋址方式、帶移位預(yù)處理的寄存器尋址方式。3、減法指令SUB(續(xù))46共142頁
SUB的執(zhí)行流程為:47共142頁SUBR0,R1,R2;R0←(R1)-(R2)SUBR0,R1,#256;R0←(R1)-256SUBR0,R2,R3,LSL#1;R0←(R2)-
(R3<<1)受影響的CPSR標志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0則Z=1,否則Z=0C運算結(jié)果有借位則C=0,否則C=1V運算結(jié)果有溢出則V=1,否則V=03、減法指令SUB(續(xù))48共142頁4、帶進位減法指令SBC
SBC指令的格式為:SBC{<cond>}{S}<Rd>,<Rn>,<operand2>
SBC指令把Rn
作為被減數(shù),operand2
作為減數(shù)進行減法運算,然后再減去CPSR中C
條件標志位的反碼,最后將結(jié)果存入Rd。49共142頁
SBC指令執(zhí)行流程為:50共142頁SBCSR0,R1,R2;R0←(R1)-(R2)-!C該指令主要用于字長大于32
位的數(shù)據(jù)的減法運算。
標志位的修改同SUB。5、逆向減法指令RSB
RSB指令的格式為:RSB{<cond>}{S}<Rd>,<Rn>,<operand2>4、帶進位減法指令SBC(續(xù))51共142頁
RSB指令之所以被稱為逆向減法指令,是因為該指令把operand2
作為被減數(shù),而把Rn
作為減數(shù)來進行減法運算,運算結(jié)果仍然被存入Rd。RSBR0,R1,R2;R0←(R2)-(R1)RSBR0,R1,#256;R0←256-(R1)RSBR0,R2,R3,LSL#1;R0←(R3<<1)-
(R2)5、逆向減法指令RSB(續(xù))52共142頁6、帶進位逆向減法指令RSC
RSC指令的格式為:RSC{<cond>}{S}<Rd>,<Rn>,<operand2>
RSC指令把operand2作為被減數(shù),而把Rn作為減數(shù),然后再減去CPSR中的C條件標志位的反碼,最后將結(jié)果存入Rd。
RSCR0,R1,R253共142頁7、32位積的32位乘法運算指令MUL
MUL指令的格式為:MUL{<cond>}{S}<Rd>,<Rm>,<Rs>
MUL指令把Rm
作為被乘數(shù),Rs作為乘數(shù)進行乘法運算,并把結(jié)果存入Rd。54共142頁
MUL的執(zhí)行流程如下:55共142頁MULR0,R1,R2;R0←(R1)X(R2)MULSR0,R1,R2;R0←(R1)X(R2),同時更新CPSR相關(guān)標志位受影響的CPSR標志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0則Z=1,否則Z=07、32位積的32位乘法運算指令MUL(續(xù))56共142頁8、帶加法運算的32位積的32位乘法指令MLA
MLA指令的格式為:MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>
MLA指令把Rm
作為被乘數(shù),Rs
作為乘數(shù),然后再將乘積加上Rn,最后將結(jié)果存入Rd。MLAR0,R1,R2,R3;R0←(R1)X(R2)+(R3)57共142頁MLASR0,R1,R2,R3;R0←(R1)X(R2)+(R3),并更新CPSR標志位
標志位的修改同MUL。9、64位積的32乘法運算指令SMULL
SMULL指令的格式為:SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>8、帶加法運算的32位積的32位乘法指令MLA(續(xù))58共142頁
SMULL指令把Rm
作為被乘數(shù),Rs作為乘數(shù)進行乘法運算,并把結(jié)果的低32
為存入目的寄存器RdLo,結(jié)果的高32
位存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址。
SMULLR0,R1,R2,R3;R0←(R2)X(R3)的低32位,R1←(R2)X(R3)的高32位9、64位積的32乘法運算指令SMULL(續(xù))59共142頁受影響的CPSR標志位取值N寄存器RdHi[31]被復(fù)制到NZ如果RdHi且Rdlo為0,則Z=1,否則Z=010、帶加法運算的64位積32位乘法運算指令SMLALSMLAL指令格式為:SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>9、64位積的32乘法運算指令SMULL(續(xù))60共142頁
SMLAL指令把Rm作為被乘數(shù),Rs作為乘數(shù)進行乘法運算,并把結(jié)果的低32位同RdLo原有的值相加后再存入目的寄存器RdLo;同樣結(jié)果的高32位同RdHi原有的值相加后再存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址。
SMLALR0,R1,R2,R3;R0←(R2)X(R3)的低32位+R0,R1←(R2)X(R3)的高32位+R110、帶加法運算的64位積32位乘法運算指令SMLAL(續(xù))61共142頁標志的修改同SMULL。11、無符號數(shù)的64位積32位乘法指令UMULL
UMULL指令的格式為:UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>
UMULL指令把Rm作為被乘數(shù),Rs作為乘數(shù)進行乘法運算,并把結(jié)果的低32位存入目的寄存器RdLo;結(jié)果的高32位存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址,且兩個源操作數(shù)應(yīng)為無符號數(shù)。10、帶加法運算的64位積32位乘法運算指令SMLAL(續(xù))62共142頁
UMULLR0,R1,R2,R3;
R0←(R2)X(R3)的低32位,
R1←(R2)X(R3)的高32位
標志的修改同SMULL。12、無符號數(shù)的帶加法運算的64位積32位乘法指令UMLAL
UMLAL指令格式為:UMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>11、無符號數(shù)的64位積32位乘法指令UMULL(續(xù))63共142頁
UMLAL指令把Rm作為被乘數(shù),Rs作為乘數(shù)進行乘法運算,并把結(jié)果的低32位同RdLo原有的值相加后再存入目的寄存器RdLo;同樣結(jié)果的高32位同RdHi原有的值相加后再存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址,且兩個源操作數(shù)應(yīng)為無符號數(shù)。12、無符號數(shù)的帶加法運算的64位積32位乘法指令UMLAL(續(xù))64共142頁
UMLALR0,R1,R2,R3;
R0←(R2)X(R3)的低32位+(R0),R1←(R2)X(R3)的高32位+(R1)
標志的修改同SMULL。12、無符號數(shù)的帶加法運算的64位積32位乘法指令UMLAL(續(xù))65共142頁2.3.3邏輯運算指令1、邏輯“與”運算指令A(yù)ND
AND指令的格式為:AND{<cond>}{S}<Rd>,<Rn>,<operand2>
AND
指令把Rn
和operand2
按位進行邏輯“與”運算,并把結(jié)果存入Rd。66共142頁1、邏輯“與”運算指令A(yù)ND(續(xù))67共142頁
ANDR0,R0,#3;該指令保持R0的0、1位,其余位清零受影響的CPSR標志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0則Z=1,否則Z=0CC=01、邏輯“與”運算指令A(yù)ND(續(xù))68共142頁2、邏輯“或”運算指令ORR
ORR指令的格式為:ORR{<cond>}{S}<Rd>,<Rn>,<operand2>
ORR
指令把
Rn
和operand2按位進行邏輯“或”運算,并把結(jié)果存入Rd。ORRR0,R0,#3;該指令設(shè)置R0的0、1位,其余位不變69共142頁例:請把寄存器R2中的高8位數(shù)據(jù)傳送到寄存器R3的低8位。MOVR0,R2,LSR#24;將R2右移24位,即將其高8位移至低8位送R0。ORRR3,R0,R3,LSL#8;將R3左移8位后將R0低8位送至R3。
標志位的影響同AND。2、邏輯“或”運算指令ORR(續(xù))注意:R2原來的內(nèi)容沒有變注意:R3原來的高24位內(nèi)容變了70共142頁3、邏輯“異或”指令EOR
EOR指令的格式為:EOR{<cond>}{S}<Rd>,<Rn>,<operand2>
EOR指令把Rn
和operand2
按位進行邏輯“異或”運算,并把結(jié)果存入Rd。EORR0,R0,#3;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變。標志位的修改同AND。71共142頁4、位清除指令BIC
BIC指令的格式為:BIC{<cond>}{S}<Rd>,<Rn>,<operand2>
BIC
指令的功能是清除Rn
的某些位,并把結(jié)果存入Rd。72共142頁
Rn為寄存器尋址方式;operand2可以是寄存器尋址方式,也可以是立即數(shù)尋址方式。operand2為32位掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位,未設(shè)置的掩碼位保持不變。BICR0,R0,#0xB;該指令清除R0中的0、1和3位,其余位保持不變。標志位的修改同AND。4、位清除指令BIC(續(xù))73共142頁2.3.4測試與比較指令
測試與比較指令的共同特點是:只對操作數(shù)進行運算并修改CPSR標志位,但不保存結(jié)果。1、“與”測試指令TST
TST指令的格式為:TST{<cond>}<Rd>,<operand2>74共142頁
TST
指令的功能是把Rd
和operand2
按位進行邏輯“與”運算,并根據(jù)運算結(jié)果更新CPSR
中的條件標志位的值。Rd是要測試的數(shù)據(jù),operand2
是一個掩碼。該指令一般用來檢測是否設(shè)置了特定的位。TSTR1,#0x5;測試寄存器R1中的第0位和第2位是否是1。1、“與”測試指令TST(續(xù))75共142頁
TEQ指令的格式為:TEQ{<cond>}<Rd>,<operand2>
TEQ指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位“異或”運算,并根據(jù)運算結(jié)果更新CPSR
中條件標志位的值。該指令通常用于比較Rd
和Rn
是否相等。TEQR1,R2;將R1的值與R2的值按位“異或”,并根據(jù)結(jié)果設(shè)置CPSR的標志位。2、“異或”測試指令TEQ76共142頁3、比較指令CMP
CMP指令的格式為:CMP{<cond>}<Rd>,<operand2>
CMP
指令把Rd
作為被減數(shù)和operand2進行一次減法運算操作,但不存儲運算結(jié)果,只根據(jù)結(jié)果來更新CPSR
的相應(yīng)條件標志位N、Z、C、V。77共142頁受影響的CPSR報紙標志位取值N運算結(jié)果的第31位被復(fù)制到NZ運算結(jié)果為0則Z=1,否則Z=0C運算結(jié)果有借位則C=0,否則C=1V運算結(jié)果有溢出則V=1,否則V=0CMPR1,R0;(R1)-(R0);根據(jù)結(jié)果設(shè)置CPSR的標志位。3、比較指令CMP(續(xù))78共142頁CMPR1,#100;(R1)-100;根據(jù)結(jié)果設(shè)置CPSR的標志位。注意:比較類指令本身帶有更新CPSR的功能,故在該指令中不能使用后綴S。4、操作數(shù)取反比較指令CMN
CMN指令的格式為:CMN{<cond>}<Rd>,<operand2>3、比較指令CMP(續(xù))79共142頁
CMN
指令把Rd
作為被減數(shù)與operand2
的反進行一次減法運算,但不存儲結(jié)果,只更新CPSR
中條件標志位。2.3.5跳轉(zhuǎn)指令1、B和BL指令4、操作數(shù)取反比較指令CMN(續(xù))80共142頁
B指令與BL指令的編碼格式如下:81共142頁
從代碼中看到L
控制了PC與LR
寄存器之間的開關(guān)。當L=0
時,該開關(guān)斷開,指令為B
指令;當L=1
時,該開關(guān)接通,指令為BL
指令。
B和BL指令的助記符格式為:B{<cond>}<target>和BL{<cond>}<target>
跳轉(zhuǎn)指令也叫程序轉(zhuǎn)移指令。1、B和BL指令(續(xù))82共142頁
B
指令和BL
指令都是以一個24
位有符號數(shù)
signed_immed_24
間接提供目標地址,真正的目標地址是由處理器根據(jù)這個有符號數(shù)和當前的PC
值計算出來的。
具體計算為:先將signed_immed_24
左移兩位并擴展為32位有符號數(shù),然后再將這32位有符號數(shù)與PC
的當前值相加并回送PC。1、B和BL指令(續(xù))83共142頁
Bforward
ADDR1,R2,#4forwardSUBR1,R2,#56
B和BL指令轉(zhuǎn)移的偏移量為26
位,即轉(zhuǎn)移的跨度為前后32MB
地址空間。例:現(xiàn)已知寄存器R0中存放了數(shù)據(jù)a,寄存器R1中存放了數(shù)據(jù)b,編寫一個程序段,求取a和b的最大公約數(shù)并將其存入寄存器R0。1、B和BL指令(續(xù))84共142頁
gcbCMPR0,R1;比較a和b的大小
SUBGTR0,R0,R1;如果a>b,則a=a-b
SUBLTR1,R1,R0;如果a<b,則b=b-aBNEgcb
;如果a!=b,則返回gcb
MOVPC,LR;如果a=b,則返回主程序
B和BL的區(qū)別在于:BL在跳轉(zhuǎn)之前會把BL指令的下一條指令地址(斷點地址)保存到連接寄存器LR(R14),因此程序在必要的時候可以通過將LR的內(nèi)容進行計算并加載到PC中使程序返回到跳轉(zhuǎn)點。1、B和BL指令(續(xù))85共142頁
BL指令經(jīng)常被用來調(diào)用一個子程序。1、B和BL指令(續(xù))86共142頁2、跳轉(zhuǎn)并切換處理器狀態(tài)指令BX
BX指令的格式為:
BX{<cond>}Rm
BX
指令的目標地址由Rm
值與#0XFFFFFFFE
進行“與”運算得到。根據(jù)Rm
最低位的值,目標地址處的指令既可以是ARM指令,也可以是Thumb
指令。87共142頁2、跳轉(zhuǎn)并切換處理器狀態(tài)指令BX(續(xù))88共142頁3、跳轉(zhuǎn)并切換處理器狀態(tài)指令BLX
BLX指令的格式有兩種:BLX<target>和BLX{<cond>}Rm
以target方式提供目標地址的BLX指令的功能是,把程序跳轉(zhuǎn)到指令中所指定的目標地址繼續(xù)執(zhí)行,并同時將處理器的工作狀態(tài)從ARM狀態(tài)切換到Thumb狀態(tài)和將PC的當前內(nèi)容保存到寄存器LR中。89共142頁
而以Rm
方式提供目標地址的BLX指令,除了跳轉(zhuǎn)和將PC保存到LR之外,也可進行狀態(tài)切換,但其切換的依據(jù)是Rm
最低位的值。如果值為0,則目標地址處應(yīng)為ARM指令,如果值為1,則目標地址處應(yīng)為Thumb指令。2.3.6程序狀態(tài)寄存器訪問指令3、跳轉(zhuǎn)并切換處理器狀態(tài)指令BLX(續(xù))90共142頁
MRS指令的格式為:
MRS{<cond>}<Rd>,CPSR
MRS{<cond>}<Rd>,SPSR
MRS指令的功能是將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器Rn。MRSR0,CPSR;傳送CPSR的內(nèi)容到R0MRSR0,SPSR;傳送SPSR的內(nèi)容到R01、MRS指令91共142頁
32位的程序狀態(tài)寄存器可以分為4個域,這4個域在指令中可以分別用f、s、x、c來表示。域在指令中的表示位域說明f[31:24]條件標志域
s[23:16]狀態(tài)位域
x[15:8]擴展位域
c[7:0]控制位域2、MSR指令92共142頁程序狀態(tài)寄存器常用的兩個域為:條件標志位域和控制位域。2、MSR指令(續(xù))在ARMV5及以上版本的E系列處理器中,用Q標志位指示增強的DSP運算指令是否發(fā)生了溢出。在其他版本的處理器中,Q標志位無定義。93共142頁
MSR指令的格式為:MSR{<cond>}CPSR_<fields>,<operand2>MSR{<cond>}SPSR_<fields>,<operand2>
MSR
指令可以把operand2
的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中operand2
可以為通用寄存器或立即數(shù),fields
用于指定程序狀態(tài)寄存器中需要操作的位域,為f、s、x、c。2、MSR指令(續(xù))94共142頁MSRCPSR,R0;傳送R0的內(nèi)容到CPSRMSRSPSR,R0;傳送R0的內(nèi)容到SPSRMSRCPSR_c,R0;傳送R0的內(nèi)容到CPSR,但僅僅修改CPSR中的控制位域2.3.7加載/存儲指令在寄存器和存儲器之間傳送數(shù)據(jù)的指令叫做加載(Load)/存儲(Store)指令。2、MSR指令(續(xù))95共142頁
由存儲器向寄存器傳送數(shù)據(jù)的指令叫做加載指令;而由寄存器向存儲器傳送數(shù)據(jù)的指令叫做存儲指令。
Load指令的基本格式為:LDR{cond}<Rd>,<address_mode>
Store指令的基本格式為:STR{cond}<Rd>,<address_mode>2.3.7加載/存儲指令(續(xù))96共142頁1、address_mode的尋址方式
address_mode具有:寄存器變址尋址和比例寄存器變址尋址兩種方式。
變址尋址方式的操作數(shù)地址由兩部分組成:操作數(shù)地址=基地址+偏移量(有符號數(shù))
基地址由Rn提供,偏移量由立即數(shù)、寄存器Rm或?qū)m進行移位來提供。97共142頁
address_mode有下表列的兩種基本方式。尋址方式說明[<Rn>,<#offset_12>|<Rm>]偏移量為立即數(shù)或寄存器中的數(shù)據(jù)[<Rn>,<Rm,<shift>#<shift_imm>>]偏移量為進行了移位運算的寄存器中的數(shù)
根據(jù)數(shù)據(jù)傳送的時機以及在指令執(zhí)行后基址寄存器是否被更新,寄存器變址又有:前變址、回寫前變址和后變址三種方式。1、address_mode的尋址方式(續(xù))98共142頁
執(zhí)行指令時,如果先進行變址運算,后傳送數(shù)據(jù),那么這種方式就叫做前變址方式。1、address_mode的尋址方式(續(xù))99共142頁LDRR0,[R1,R2];R0←((R1)+(R2))LDRR0,[R1,#8];R0←((R1)+8)
如果先傳送數(shù)據(jù),后進行變址運算的方式就叫做后變址方式。從指令格式上來看,后變址指令的格式如下:
LDRR0,[R1],#81、address_mode的尋址方式(續(xù))100共142頁LDRR0,[R1],#8;R0←((R1))
R1←(R1)+8后變址的執(zhí)行過程如下:101共142頁
ARM在前變址方式中又增加了一種回寫前變址尋址方式。為了與前變址方式進行區(qū)別,回寫前變址尋址方式要求在第2操作數(shù)的方括號后邊添加符號“!”。LDRR0,[R1,R2]!;R1←(R1)+(R2)R0←((R1))LDRR0,[R1,#8]!;R1←(R1)+8R0←((R1))1、address_mode的尋址方式(續(xù))102共142頁
回寫前變址尋址方式指令的執(zhí)行過程如下:1、address_mode的尋址方式(續(xù))103共142頁2、字加載指令LDR和字存儲指令STR
字加載指令LDR的格式為:LDR{<cond>}<Rd>,<address_mode>
LDR指令的功能是把存儲在存儲器中的一個32位字數(shù)據(jù)傳送到目的操作數(shù)Rd。104共142頁例:已知(R0)=0X00000000和(R1)=0X00009000,并已知在存儲器中首地址為0X00009000的區(qū)域中存放了數(shù)據(jù)0X01010101,在首地址為0X00009004的區(qū)域存放了數(shù)據(jù)0X02020202。試寫出執(zhí)行了指令LDRR0,[R1,#4]后R0和R1中的數(shù)據(jù)。2、字加載指令LDR和字存儲指令STR(續(xù))(R0)=0X02020202(R1)=0X00009000105共142頁例:條件如上題,試寫出執(zhí)行了指令LDRR0,[R1,#4]!后的R0和R1中的數(shù)據(jù)。2、字加載指令LDR和字存儲指令STR(續(xù))(R0)=0X02020202(R1)=0X00009004例:條件如上題,試寫出執(zhí)行了指令LDRR0,[R1],#4
后R0和R1中的數(shù)據(jù)。(R0)=0X01010101(R1)=0X00009004106共142頁
字存儲指令STR的格式如下:
STR<Rd>,<address_mode>2、字加載指令LDR和字存儲指令STR(續(xù))
STR
指令的功能是把一個32
位源操作數(shù)傳送到存儲器中。STRR0,[R1,#8];(R0)→((R1)+8)107共142頁2、字加載指令LDR和字存儲指令STR(續(xù))LDRR0,OX12345678把12345678這個地址中的值放到R0。LDR還有一種指令形式,LDRRd,label,只能在4K
范圍內(nèi)把label這個地址里的內(nèi)容賦值給Rd。仿真工具中不認這種方式108共142頁3、字節(jié)加載指令LDRB和字節(jié)存儲指令STRB
字節(jié)加載指令LDRB的格式為:
LDR{cond}B<Rd>,<address_mode>
LDRB指令的功能是從存儲器中將一個8
位的字節(jié)數(shù)據(jù)傳輸?shù)絉d,同時將寄存器的高24位清零。LDRBR0,[R1,#8];R0←((R1)+8),并將R0的高24位清零。109共142頁
字節(jié)存儲指令STRB的格式為:
STR{cond}B<Rd>,<address_mode>3、字節(jié)加載指令LDRB和字節(jié)存儲指令STRB(續(xù))
STRB指令的功能是把一個32位源操作數(shù)的低
8位傳送到存儲器中。STRBR0,[R1,#8];(R0)的低8位→((R1)+8)110共142頁4、半字加載指令LDRH和半字存儲指令STRH
半字加載指令LDRH的格式為:
LDR{cond}H<Rd>,<address_mode>
LDRH指令的功能是把存儲器中的16位半字數(shù)據(jù)傳送到Rd,同時將寄存器的高16位清零。LDRHR0,[R1,#8];R0←((R1)+8),并將
R0的高16位清零111共142頁LDRHR0,[R1,R2];R0←((R1)+(R2)),并將R0的高16位清零4、半字加載指令LDRH和半字存儲指令STRH(續(xù))
半字存儲指令STRH的格式為:
STR{cond}H<Rd>,<address_mode>
STRH指令的功能是把一個32位源操作數(shù)的低16位傳送到存儲器中。STRHR0,[R1,#8];(R0)→((R1)+8)112共142頁2.3.8批量數(shù)據(jù)加載/存儲指令1、批量數(shù)據(jù)加載/存儲指令加載指令LDM
用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器;批量數(shù)據(jù)存儲指令STM
則完成相反的功能。
LDM和STM指令的格式分別為:LDM{<cond>}{mode}<Rd>{!},<reglist>{^}STM{<cond>}{mode}<Rd>{!},<reglist>{^}113共142頁
Rd為數(shù)據(jù)塊的基地址寄存器,除R15之外其他寄存器都可以作為基地址寄存器。1、批量數(shù)據(jù)加載/存儲指令(續(xù))
reglist為存儲數(shù)據(jù)塊的寄存器列表,其中包含一個或多個序號從小到大排列的寄存器。當寄存器不連續(xù)時,中間使用“,”隔開。114共142頁
“!”為可選后綴。若選用該后綴,則當數(shù)據(jù)塊傳送完畢之后,基址寄存器
Rd
會保存數(shù)據(jù)塊最后地址;否則基地址寄存器Rd
的內(nèi)容不變。1、批量數(shù)據(jù)加載/存儲指令(續(xù))115共142頁
“^”為可選后綴。當指令為LDM且寄存器列表中包含R15(PC)時,選用該后綴表示除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR;而當寄存器列表中不包含R15(PC)時,使用該后綴則表示在用戶模式中進行寄存器與存儲器的數(shù)據(jù)傳遞。注意:在系統(tǒng)模式下禁用該后綴。1、批量數(shù)據(jù)加載/存儲指令(續(xù))116共142頁
mode為模式選項,其含義如下:類型每次基址寄存器的操作傳送起始地址Rn序號的變化IA先傳送數(shù)據(jù),后基地址加4(Rn)增加IB先基地址加4,后傳送數(shù)據(jù)(Rn)+4增加DA先傳送數(shù)據(jù),后基地址減4(Rn)減少DB先基地址減4,后傳送數(shù)據(jù)(Rn)-4減少1、批量數(shù)據(jù)加載/存儲指令(續(xù))117共142頁例:數(shù)據(jù)在存儲器中的存儲情況如下圖所示?,F(xiàn)已知作為基地址寄存器R0的內(nèi)容為0X00000018,試分析如下指令執(zhí)行后的結(jié)果。1、批量數(shù)據(jù)加載/存儲指令(續(xù))118共142頁(1)LDMIAR0!,{R1—R3}解:(R0)=0X00000024
(R1)=0X00000004
(R2)=0X00000005
(R3)=0X000000061、批量數(shù)據(jù)加載/存儲指令(續(xù))119共142頁(2)LDMIBR0!,{R1—R3}解:(R0)=0X00000024
(R1)=0X00000005
(R2)=0X00000006
(R3)=0X000000071、批量數(shù)據(jù)加載/存儲指令(續(xù))120共142頁(3)LDMDAR0!,{R1—R3}解:(R0)=0X0000000C
(R1)=0X00000004
(R2)=0X00000003
(R3)=0X000000021、批量數(shù)據(jù)加載/存儲指令(續(xù))121共142頁(4)LDMDBR0!,{R1—R3}解:(R0)=0X0000000C
(R1)=0X00000003
(R2)=0X00000002
(R3)=0X000000011、批量數(shù)據(jù)加載/存儲指令(續(xù))122共142頁2、堆棧操作指令
為了方便寄存器與堆棧之間的數(shù)據(jù)交換。ARM專門提供了堆棧操作指令:LDM{<cond>}{mode}<Rd>{!},<reglist>{^}STM{<cond>}{mode}<Rd>{!},<reglist>{^}123共142頁類型堆棧類型彈出(pop)指令壓入(push)指令FA遞增滿堆棧LDMFASTMFAFD遞減滿堆棧LDMFDSTMFDEA遞增空堆棧LDMEASTMEAED遞減空堆棧LDMEDSTMED堆棧操作指令與數(shù)據(jù)加載/存儲指令的主要區(qū)別是mode
模式選項,其含義如下:124共142頁STMFDR13!,{R0,R4-R12,LR};壓入堆棧,
對應(yīng)指令STMDBLDMFDR13!,{R0,R4-R12,LR};彈出堆棧,
對應(yīng)指令LDMIA
R13為堆棧指針。2、堆棧操作指令(續(xù))125共142頁尋址方式說明pop=LDMpush=STMFA遞增滿LDMFALDMDASTMFASTMIBFD遞減滿LDMFDLDMIASTMFDSTMDBEA遞增空LDMEALDMDBSTMEASTMIAED遞減空LDMEDLDMIBSTMEDSTMDA堆棧操作與批量傳輸?shù)膶?yīng)126共142頁
ARM處理器所支持的數(shù)據(jù)交換指令能在存儲器和寄存器之間交換數(shù)據(jù)。1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司運營流程與規(guī)章制度詳解手冊
- 生物信息學(xué)實驗手冊
- 三農(nóng)災(zāi)害應(yīng)急管理指南
- 三農(nóng)工作者的實踐指南
- 生物質(zhì)顆粒燃料蒸汽發(fā)生器
- 重大項目進度協(xié)調(diào)會議紀要記錄
- 育嬰師復(fù)習(xí)試題含答案
- 藝術(shù)鑒賞油畫技法分析題集
- 茶藝師復(fù)習(xí)試題含答案(一)
- 外科總論復(fù)習(xí)測試有答案
- 2024版義務(wù)教育小學(xué)科學(xué)課程標準
- MBTI16種人格類型及其通常具有的特征和職業(yè)傾向
- 人教版四年級上冊語文《一單元》測試卷【及答案】
- 復(fù)數(shù)算符在圖像處理中的應(yīng)用
- 百融云創(chuàng)風(fēng)險決策引擎V5產(chǎn)品操作手冊
- GB 15979-2024一次性使用衛(wèi)生用品衛(wèi)生要求
- 2024年合肥市軌道交通集團有限公司招聘筆試沖刺題(帶答案解析)
- CJJT8-2011 城市測量規(guī)范
- 故事繪本后羿射日
- 產(chǎn)前篩查標準技術(shù)操作規(guī)程
- ISO27001:2022信息安全管理手冊+全套程序文件+表單
評論
0/150
提交評論