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

下載本文檔

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

文檔簡介

1第3章ARM920T指令系統(tǒng)12本章重點:⑴ARM指令集概述,ARM指令集全部指令編碼及條件域;⑵ARM指令,講述了ARM指令的編碼格式、指令含義、匯編格式和使用舉例。另外,本章指令編碼格式、指令匯編格式請直接看參考書。3S3C2410A嵌入式微處理器片內(nèi)使用了ARM920T內(nèi)核,因此S3C2410A使用ARM920T所支持的指令系統(tǒng)。ARM920T指令系統(tǒng)的指令集結構版本為v4T,ARM920T指令系統(tǒng)含有v4T以上指令集結構版本的基礎指令,在v4T以上指令集結構版本的微處理器中都可以運行。ARM920T處理器支持32位尋址空間。4ARM920T支持指令長度為32位的ARM指令集和指令長度為16位的Thumb指令集。ARM920T處理器總是從ARM狀態(tài)開始,必須用BX指令明確地轉(zhuǎn)換到Thumb狀態(tài)。53.1ARM指令集概述3.1.1ARM指令集概述⒈ARM指令分組⑴分支指令⑵數(shù)據(jù)處理指令⑶狀態(tài)寄存器訪問指令⑷單個寄存器裝入或存儲指令⑸塊數(shù)據(jù)裝入或存儲指令⑹協(xié)處理器指令6⒉ARM指令的能力⑴條件執(zhí)行⑵寄存器訪問⑶對在線式桶形移位器(barrelshifter)的訪問73.1.2ARM指令集全部指令編碼及條件域⒈ARM指令集全部指令編碼格式ARM指令集全部指令編碼格式見圖3.1。89⒉指令編碼中的條件域指令編碼格式中的bit[31:28]稱為條件域。在ARM狀態(tài),所有指令都要根據(jù)CPSR中的條件碼標志和指令中條件域指定的內(nèi)容,有條件地執(zhí)行。指令中條件域bit[31:28]確定在哪一種情況下這條指令被執(zhí)行。如果C、N、Z和V標志的狀態(tài)滿足指令中條件域編碼要求,指令被執(zhí)行;否則指令被忽略。10有15種可能的條件,每一種由2個字符代替,稱為條件碼助記符后綴(簡稱條件碼助記符),可以附加在指令助記符后,如表3.1所示。例如在匯編語言中,分支指令B如果附加條件碼助記符后綴為EQ,寫作BEQ,表示相等(即Z=1)這條指令才執(zhí)行;如果Z<>1,則這條指令不被執(zhí)行,指令被忽略。11表3.1指令條件碼表(1)條件碼助記符標志含義EQZ=1相等NEZ=0不相等CS/HSC=1無符號數(shù)大于或等于CC/LOC=0無符號數(shù)小于MIN=1負數(shù)(minus

)PLN=0正數(shù)或零VSV=1上溢出VCV=0沒有上溢出12表3.1指令條件碼表(2)條件碼助記符標志含義HIC=1,Z=0無符號數(shù)大于LSC=0,Z=l無符號數(shù)小于或等于GEN=V有符號數(shù)大于或等于LTN!=V有符號數(shù)小于GTZ=0,N=V有符號數(shù)大于LEZ=1,N!=V有符號數(shù)小于或等于AL任何無條件執(zhí)行(指令默認條件)NVARMv3之前該指令從不執(zhí)行133.2ARM指令本節(jié)講述的內(nèi)容和先后次序如下:分支并且轉(zhuǎn)換狀態(tài)指令(BX);分支、分支并且連接指令(B、BL);數(shù)據(jù)處理指令;程序狀態(tài)寄存器傳送指令(MRS、MSR);乘、乘累加指令(MUL、MLA);長乘、長乘累加指令(MULL、MLAL);14單個數(shù)據(jù)傳送指令(LDR、STR);半字、帶符號字節(jié)/半字傳送指令(LDRH、STRH、LDRSB、LDRSH);塊數(shù)據(jù)傳送指令(LDM、STM);單個數(shù)據(jù)交換指令(SWP);軟件中斷指令(SWI);協(xié)處理器介紹;15協(xié)處理器數(shù)據(jù)操作指令(CDP);協(xié)處理器數(shù)據(jù)傳送指令(LDC、STC);協(xié)處理器寄存器傳送指令(MRC、MCR);未定義指令。163.2.1分支并且轉(zhuǎn)換狀態(tài)指令(BX)分支并且轉(zhuǎn)換狀態(tài)指令BX,在指令中指定了一個Rn寄存器,將Rn內(nèi)容拷貝到PC,同時使PC[0]=0;把Rn[0]的值送CPSR的T位。如果Rn[0]=1,則T=1,將處理器狀態(tài)轉(zhuǎn)換成Thumb狀態(tài),把目標地址處的代碼解釋為Thumb代碼;如果Rn[0]=0,則T=0,將處理器狀態(tài)轉(zhuǎn)換成ARM狀態(tài),把目標地址處的代碼解釋為ARM代碼。17⒈指令含義通過拷貝一個通用寄存器Rn的內(nèi)容到程序計數(shù)器PC,指令實現(xiàn)分支功能。這條指令也允許指令集被轉(zhuǎn)換,當這條指令被執(zhí)行時,Rn的bit[0]位確定后續(xù)指令代碼被譯碼作為ARM指令或Thumb指令。18⒉指令匯編格式

BX{cond}Rn其中:{cond}表示兩個字符的條件碼助記符;Rn 表示合法的寄存器編號19⒊使用舉例【例3.1】處理器從執(zhí)行ARM指令代碼處分支到標號為Goto_THUMB處,并且執(zhí)行Thumb指令代碼,然后又返回到Back_ARM處,執(zhí)行ARM指令代碼。20;假定處理器當前正在執(zhí)行ARM指令ADRR1,Goto_THUMB+1

BXR1;分支并且轉(zhuǎn)換為Thumb狀態(tài)

CODE16;匯編以下代碼為Thumb指令Goto_THUMB;分支目標地址標號

…;Thumb指令代碼

ADRR2,Back_ARM;將分支目標地址送R2,并且R2的bit[0]=0

BXR2;分支且轉(zhuǎn)換為ARM狀態(tài)

…ALIGN;字對齊

CODE32;匯編以下代碼為ARM指令Back_ARM;分支目標地址標號

…;ARM指令代碼213.2.2分支、分支并且連接指令

(B、BL)分支指令B使程序分支(轉(zhuǎn)移)到確定的地址處執(zhí)行程序。分支并且連接指令BL除了使程序分支(轉(zhuǎn)移)到確定的地址處執(zhí)行程序外,還要保存返回地址到LR寄存器,即把BL指令的下一條指令的地址送LR。使用BL指令可以實現(xiàn)子程序調(diào)用。上述兩條指令分支目標地址處的指令均應該屬于ARM指令集,不允許分支到Thumb指令處。22⒈指令含義對于分支指令B,bit[23:0]是24位帶符號的偏移量,將其左移2位,符號位擴展到bit[31:26]形成一個32位數(shù),與PC相加實現(xiàn)分支。因此指令能在±32MB地址范圍內(nèi)實現(xiàn)分支。分支偏移量必須考慮流水線指令預取操作,PC值是當前正在執(zhí)行指令的地址加8的值。23對于分支并且連接指令BL,執(zhí)行指令會將PC值寫入當前寄存器組的連接寄存器R14,寫入的PC值是經(jīng)過調(diào)整的、跟在分支并且連接指令后的指令的地址,同時R14的bit[1:0]被清0。使用分支并且連接指令BL可以調(diào)用一個子程序,為了從子程序返回,如果R14(LR)在子程序中沒有被修改,可以使用MOVPC,R14指令實現(xiàn)返回。24⒉指令匯編格式B{L}{cond}<expression>

{L}表示分支并且鏈接{cond}條件碼助記符<expression>目標地址25⒊使用舉例

【例3.2】使用分支指令使部分代碼循環(huán)5次。MOVR0,#5;R0值為5Loop1

SUBSR0,#1;R0減1送R0,設置標志位

BNELoop1;使用了條件碼,不為0則分支到標號Loop1處26【例3.3】使用分支并且連接指令調(diào)用不同的子程序。CMPR0,#0;比較,設置標志位

BLEQSUBEQROG;相等,則調(diào)用SUBEQBLGTSUBGTROG;大于,則調(diào)用SUBGT

BLSUBLTROG;小于,則調(diào)用SUBLT273.2.3數(shù)據(jù)處理指令ARM數(shù)據(jù)處理指令可以分為三類:數(shù)據(jù)傳送指令(如MOV和MVN)、算術邏輯操作指令(如ADD、SUB或AND等)比較指令(如CMP和TST等)。數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作,不允許對存儲器中的數(shù)據(jù)進行操作,也不允許指令直接使用存儲器的數(shù)據(jù)或在寄存器與存儲器之間傳送數(shù)據(jù)。28對于數(shù)據(jù)傳送指令MOV和MVN,指令中指定的目的寄存器內(nèi)容被覆蓋,如果目的寄存器指定了PC,如MOVPC,R14,則可以實現(xiàn)程序的轉(zhuǎn)移。數(shù)據(jù)傳送指令可以實現(xiàn)寄存器到寄存器,立即數(shù)到寄存器的傳送。29算術邏輯操作指令通常對指定的兩個寄存器(或1個寄存器、1個立即數(shù))進行操作,結果存到第3個寄存器,允許選擇修改或不修改CPSR中的條件碼標志。比較指令TEQ、TST、CMP和CMN,通常對指定的兩個寄存器(或1個寄存器,1個立即數(shù))進行比較,比較結果不保存到寄存器,只影響CPSR中的條件碼標志。上述指令通常允許對指定的操作數(shù)進行移位操作。30⒈指令編碼格式指令編碼格式見圖3.2。第1操作數(shù)總是寄存器Rn。Rd稱為目的寄存器,TST、TEQ、CMP和CMN指令不送結果到目的寄存器Rd,其他指令產(chǎn)生的結果送Rd。第2操作數(shù)Operand2可以是寄存器Rm的值經(jīng)過移位產(chǎn)生的32位值,或8位立即數(shù)經(jīng)過循環(huán)右移產(chǎn)生的32位的值,指令中bit[25]的值用來選擇Rm或8位立即數(shù)。31圖3.232CPSR中的條件碼可能被保護或由指令的結果設置,取決于指令中bit[20]的值。但是對于指令TST、TEQ、CMP和CMN,匯編器產(chǎn)生的指令編碼一定會把指令的bit[20]置1,在執(zhí)行指令時,由測試結果設置CPSR中的條件碼標志。33⒉指令含義⑴各指令含義數(shù)據(jù)處理指令依指令編碼格式中bit[24:21]分為16條指令,包括:數(shù)據(jù)傳送算術邏輯操作比較指令各條指令含義見表3.2。數(shù)據(jù)傳送操作(MOV、MVN)算術操作(ADD、ADC、SUB、SBC、RSB、RSC)邏輯操作(AND、ORR、EOR、BIC)比較指令(TST、TEQ、CMP和CMN)3435⑵指令對CPSR中條件碼標志位的影響在邏輯操作(AND、ORR、EOR、BIC、TST、TEQ)和數(shù)據(jù)傳送操作(MOV、MVN)指令中,如果S位被置1(并且Rd不是R15),則CPSR中的V標志位不受影響;C標志位由桶形移位器產(chǎn)生的carryout設置;當指令操作結果為全0時Z標志位被設置;N標志位由指令操作結果的bit[31]的值設置。36算術操作(ADD、ADC、SUB、SBC、RSB、RSC、CMP、CMN)指令中,每個操作數(shù)被看作32位整數(shù)(無符號數(shù)或帶符號數(shù)的2進制補碼),如果指令中S位被置1(并且Rd不是R15),在發(fā)生溢出時,CPSR中的V標志位被設置;C標志位由ALU的bit[31]產(chǎn)生的進位設置;如果指令操作結果為全0時,Z標志位被設置;N標志位將被設置成指令操作結果的bit[31]的值。37⑶對寄存器Rm內(nèi)容進行移位,結果作為Operand2的值圖3.3桶形移位器38ALU桶形移位器Rd結果N預處理未預處理RmRn39①使用指令中bit[11:7]指定的移位量對Rm移位·邏輯左移(LSL)圖3.4邏輯左移(LSL#6)

40·邏輯右移(LSR)圖3.5邏輯右移(LSR#6)

41·算術右移(ASR)圖3.6算術右移(ASR#6)

42·循環(huán)右移(ROR)圖3.7循環(huán)右移(ROR#6)

43圖3.8擴展循環(huán)右移(RRX)RRX循環(huán)右移1位,帶擴展44在使用指令中bit[11:7]指定對Rm的移位量,bit[6:5]指定移位類型時,指令匯編格式舉例見表3.3。45表3.3指令bit[11:7]和bit[6:5]指定Rm移位量和移位類型舉例

指定對Rm的移位量和移位類型指令舉例指令含義Rm,LSL#5bit_shift_ImmADDR0,R2,R3,LSL#1R3的值邏輯左移1位,加R2,和送R0Rm,LSR#5bit_shift_ImmSUBR0,R2,R3,LSR#2R3的值邏輯右移2位,從R2中減去,差送R0Rm,ASR#5bit_shift_ImmMOVR1,R0,ASR#2R0的值算術右移2位,送R1Rm,ROR#5bit_shift_ImmSUBR1,R2,R4,ROR#6R4的值循環(huán)右移6位,從R2中減去,差送R1Rm,RRXANDR2,R3,R4,RRXR4的值擴展循環(huán)右移,和R3與的結果送R246②使用指令中bit[11:8]指定Rs寄存器,且用Rs中最低字節(jié)指定移位量參見圖3.2和圖3.3,由指令中bit[11:8]指定Rs寄存器,移位量保存在Rs寄存器的最低字節(jié),對Rm寄存器的內(nèi)容進行移位,產(chǎn)生的結果作為Operand2的值。如果Rs中指定的移位次數(shù)為0,那么不改變Rm的內(nèi)容作為Operand2,并且CPSR中C位的值作為carryout,即C位的值不變。如果Rs中最低字節(jié)指定的移位次數(shù)在1~31之間,進行的移位操作與產(chǎn)生的結果參閱圖3.4、3.5、3.6、3.7。47如果Rs中最低字節(jié)指定的移位次數(shù)大于、等于32,產(chǎn)生的結果如下:·對LSL,如果移位次數(shù)等于32,移位結果Operand2為全0,Rm[0]作為carryout?!SL,如果移位次數(shù)大于32,移位結果Operand2為全0,carryout為0?!SR,如果移位次數(shù)等于32,移位結果Operand2為全0,Rm[31]作為carryout?!SR,如果移位次數(shù)大于32,移位結果Operand2為全0,carryout為0?!SR,如果移位次數(shù)大于、等于32,用Rm[31]填充Operand2各位,用Rm[31]作為carryout。48·對ROR,如果移位次數(shù)等于32,移位結果Operand2等于Rm的值,carryout等于Rm[31]?!τ赗OR,如果移位次數(shù)大于32,用移位次數(shù)重復減32,直到它們的差在1~32之間,用這個值作為移位次數(shù),移位結果如前述。對于上述各種情況,carryout的值,均送往CPSR中的進位標志C。使用Rs指定移位量時,指令中bit[6:5]指定移位類型,指令匯編格式舉例見表3.4。49表3.4用Rs指定Rm的移位量和指令中bit[6:5]指定移位類型舉例指定Rm的移位量和移位類型指令舉例指令含義Rm,LSLRsADDR0,R1,R2,LSLR3移位量在R3中,R2邏輯左移,加R1,和送R0Rm,LSRRsSUBR0,R1,R2,LSRR4移位量在R4中,R2邏輯右移,從R1中減去,差送R0Rm,ASRRsANDR1,R2,R3,ASRR0移位量在R0中,R3算術右移,和R2邏輯與,結果送R1Rm,RORRsMOVR2,R4,RORR0移位量在R0中,R4循環(huán)右移,送R250⑷對指令中bit[7:0]指定的8位無符號立即數(shù)循環(huán)右移參見圖3.2,對指令中bit[7:0]指定的8位無符號立即數(shù)進行循環(huán)右移時,用bit[11:8]指定移位量,它是一個4位無符號整數(shù)。進行移位操作時,要把指令中bit[7:0]指定的8位無符號立即數(shù)作為最低字節(jié),高位bit[31:8]用0擴展,形成一個32位數(shù),對這個32位數(shù)進行循環(huán)右移。移位的次數(shù),由指令中bit[11:8]指定的4位無符號數(shù)乘以2得到,分別為0,2,4,…30。此外,移位過程可參見圖3.7。⑸關于R15和CPSR中的條件碼標志51⒊指令匯編格式數(shù)據(jù)傳送操作(MOV、MVN)opcode{cond}{S}Rd,<op2>算術操作(ADD、ADC、SUB、SBC、RSB、RSC)和邏輯操作(AND、ORR、EOR、BIC)opcode{cond}{S}Rd,<op2>比較指令(TST、TEQ、CMP和CMN)opcode{cond}Rd,<op2>52⒋使用舉例

⑴數(shù)據(jù)傳送和數(shù)據(jù)求反傳送指令舉例

MOVSR4,R3,LSL#2;R4等于R3邏輯左移2位的值,設置標志位

MOVSPC,R14;PC=R14,且CPSR=SPSR_<mode>,用于從;異常返回

MOVR15,LR;PC=R14,用于從子程序返回

MVNR0,R1;R1的值求反送R0

MVNR2,#0xf0;R2=0xffffff0f

MVNR0,#0;R0=0xffffffff,即R0=-153以下舉例見參考書⑵算術操作指令舉例⑶邏輯操作指令舉例⑷比較與測試指令舉例⑸使用移位操作的指令舉例⑹程序舉例54以下舉例見參考書【例3.4】如果R0=1或者R1=2,則程序分支到標號為Label0處;否則,執(zhí)行標號為Label1處的代碼?!纠?.5】求R0的絕對值,再求R1的絕對值,將這兩個絕對值相加,和存R2。求絕對值的方法是:當Rn>=0時,Rn的值不變;否則,將Rn的值求補。【例3.6】對于R1中的無符號數(shù),判斷其值的不同范圍,作不同的計算。55以下舉例見參考書【例3.7】求R0*4+R1*5-R2*7的值,假定它們都是無符號數(shù),運算結果也不會產(chǎn)生進位,結果存R3中。【例3.8】從子程序返回和從異常返回的區(qū)別。3.2.4程序狀態(tài)寄存器傳送指令(MRS、MSR)只有程序狀態(tài)寄存器傳送指令MRS、MSR,才允許讀/寫程序狀態(tài)寄存器CPSR或SPSR_<mode>。程序中不允許通過MSR指令直接修改CPSR中的T控制位來實現(xiàn)ARM/Thumb狀態(tài)的轉(zhuǎn)換,只能通過BX指令去實現(xiàn)ARM/Thumb狀態(tài)的轉(zhuǎn)換56⒈指令編碼格式指令編碼格式見圖3.9、3.10和3.11。⒉指令含義MRS指令允許將CPSR或SPSR_<mode>的內(nèi)容傳送到一個通用寄存器。MSR指令允許將一個通用寄存器的內(nèi)容傳送到CPSR或SPSR_<mode>寄存器。MSR指令也允許將一個立即數(shù)或寄存器的內(nèi)容只傳送到CPSR或SPSR_<mode>寄存器的條件碼標志(N、Z、C和V),而不影響其他控制位。在這種情況下,指定寄存器的最高4位或立即數(shù)的最高4位的內(nèi)容被寫入CPSR或SPSR_<mode>的最高4位(條件碼標志)。57⒊指令匯編格式MRS{cond}Rd,<psr>MSR{cond}<psr>,RmMSR{cond}<psrf>,RmMSR{cond}<psrf>,<#expression>⒋使用舉例

在User(用戶)方式和特權方式,某些相同格式的指令,產(chǎn)生的作用是不相同的。58

;在用戶方式MSRCPSR,R0;R0[31:28]送CPSR[31:28]

MSRCPSR_flg,R0;R0[31:28]送CPSR[31:28]

MSRCPSR_flg,#0xf0000000;0xf送CPSR[31:28]

MRSR0,CPSR;CPSR[31:0]送R0[31:0]

;在特權方式

MSRCPSR,R0;R0[31:0]送CPSR[31:0]

MSRCPSR_flg,R0;R0[31:28]送CPSR[31:28]

MSRCPSR_flg,#0xf0000000;0xf送CPSR[31:28]

MSRSPSR,R0;R0[31:0]送SPSR_<mode>[31:0]

MSRSPSR_flg,R0;R0[31:28]送SPSR_<mode>[31:28]

MSRSPSR_flg,#0x30000000;0x3送SPSR_flg[31:28]

MRSR1,SPSR;SPSR_<mode>[31:0]送R1[31:0]59【例3.9】允許FIQ中斷,禁止FIQ中斷。ENABLE_FIQ MRSR0,CPSR BICR0,R0,#0x40 MSRCPSR,R0 MOVPC,LRDISABLE_FIQ MRSR0,CPSR ORRR0,R0,#0x40 MSRCPSR,R0 MOVPC,LR

603.2.5乘、乘累加指令(MUL、MLA)乘指令MUL實現(xiàn)32位數(shù)乘32位數(shù),只保留積的低32位,操作數(shù)和結果均在指定的寄存器中。乘累加指令MLA實現(xiàn)32位數(shù)乘32位數(shù),積的低32位與另外一個32位數(shù)累加,結果保留32位。操作數(shù)和結果均在指定的寄存器中。61⒈指令含義乘指令的結果存Rd中,即Rd=Rm*Rs,為了與以后的指令集兼容,Rn應設置為0。乘累加的結果存Rd中,即Rd=Rm*Rs+Rn。⒉指令匯編格式MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn623.2.6長乘、長乘累加指令

(MULL、MLAL)長乘指令實現(xiàn)32位數(shù)乘32位數(shù),積保留64位,操作數(shù)和結果均在指定的寄存器中。長乘累加指令實現(xiàn)32位數(shù)乘32位數(shù),積保留64位,與另一個64位數(shù)相加,結果保留64位。操作數(shù)和結果均在指定的寄存器中。UMULL為無符號數(shù)長乘、SMULL為帶符號數(shù)長乘、UMLAL為無符號數(shù)長乘累加、SMLAL為帶符號數(shù)長乘累加指令。63⒈指令含義長乘指令64位結果中,高32位存RdHi、低32位存RdLo寄存器中,即RdHi、RdLo=Rm*Rs。長乘累加指令64位結果存RdHi和RdLo中,即RdHi、RdLo=Rm*Rs+RdHi、RdLo。指令中RdHi和RdLo事先要保存進行加法的一個64位操作數(shù),分別保存高、低32位。R15不能使用。RdHi、RdLo和Rm必須指定不同的寄存器。64⒉指令匯編格式UMULL{cond}{S}RdLo,RdHi,Rm,RsUMLAL{cond}{S}RdLo,RdHi,Rm,RsSMULL{cond}{S}RdLo,RdHi,Rm,RsSMLAL{cond}{S}RdLo,RdHi,Rm,Rs65⒊使用舉例【例3.10】檢測長乘指令結果是否超過32位。

方法1:對無符號數(shù)32位乘32位運算,指令產(chǎn)生的結果是64位無符號數(shù),如果結果的高32位為全0,那么結果的有效值僅使用低32位即可;如果結果的高32位不為全0,那么結果的有效值應該使用64位。66

UMULLR1,R2,R3,R4;R2、R1=R3*R4TEQR2,#0;測試結果高32位是否為全0

BNEResult64;不是全0,分支到結果使用64位有效值處;結果有效值使用32位

…Result64

…67

方法2:對帶符號數(shù)32位乘32位運算,指令產(chǎn)生的結果是64位帶符號數(shù),存于RdHi和RdLo中。如果RdHi為全0,并且RdLo[31]=0,那么結果的有效值僅使用RdLo中的低32位即可;如果RdHi為全1,并且RdLo[31]=1,那么結果的有效值僅使用RdLo中的低32位即可。如果不是這兩種情況,那么結果的有效值應該使用64位。(程序見參考書)683.2.7單個數(shù)據(jù)傳送指令(LDR、STR)

3.2.8半字、帶符號字節(jié)/半字傳送指令(LDRH、STRH、LDRSB、LDRSH)執(zhí)行一條單個數(shù)據(jù)傳送指令只能在存儲器和寄存器之間傳送一字節(jié)或一個字數(shù)據(jù)。半字、帶符號字節(jié)/半字傳送指令允許在寄存器與存儲器之間裝入和存儲半字數(shù)據(jù)、裝入帶符號擴展的字節(jié)或半字數(shù)據(jù)69單寄存器傳送指令LDR把一個字裝入一個寄存器Rd←mem32[address]STR從一個寄存器保存一個字或者一個字節(jié)Rd→mem32[address]LDRB把一個字節(jié)裝入一個寄存器Rd←mem8[address]STRB從一個寄存器保存一個字節(jié)Rd→mem8[address]LDRH把一個半字節(jié)裝入一個寄存器Rd←mem16[address]STRH從一個寄存器保存一個半字Rd→mem16[address]LDRSB把一個有符號字節(jié)裝入寄存器Rd←signExtent(mem8[address])STRSH把一個有符號半字裝入寄存器Rd←signExtent(mem16[address])70LDR指令從存儲器指定地址裝入一個字數(shù)據(jù)到目的寄存器。LDRB指令從存儲器指定地址裝入一字節(jié)數(shù)據(jù)到目的寄存器的bit[7:0],bit[31:8]填0。STR指令保存寄存器一個字數(shù)據(jù)到存儲器指定地址。STRB指令保存寄存器的低8位數(shù)據(jù)到存儲器指定地址。存儲器的地址通過計算得到,需要對基址寄存器加偏移量,或從基址寄存器減偏移量產(chǎn)生。71指令含義--1LDRH指令從存儲器裝入半字數(shù)據(jù)到寄存器低16位,高16位用0擴展;STRH指令保存寄存器中的低半字數(shù)據(jù)到存儲器;LDRSB指令從存儲器裝入一字節(jié)數(shù)據(jù)到寄存器bit[7:0],用符號位bit[7]擴展寄存器的bit[31:8];LDRSH指令從存儲器裝入半字數(shù)據(jù)到寄存器bit[15:0],用符號位bit[15]擴展寄存器的bit[31:16]。72指令含義--2指令匯編格式LDR{cond}{B}Rd,AddressSTR{cond}{B}Rd,AddressLDR{cond}H|SH|SBRd,AddressSTR{cond}HRd,Address{cond}條件碼助記符B、SB字節(jié)、裝入字節(jié)符號擴展H、SH半字、裝入半字符號擴展Address如以下所述73數(shù)據(jù)傳送指令

–關于地址數(shù)據(jù)傳送使用的存儲器地址Address,由基址寄存器加或減一個偏移量計算形成。計算出的地址可以回寫/不回寫基址寄存器。計算地址可以在數(shù)據(jù)傳送前或傳送后進行。相對基址寄存器的偏移量,有兩種指定方法,一種是指令中指定的8位無符號立即數(shù)作為偏移量,另一種是指令中指定寄存器Rm,Rm的值作為偏移量。74數(shù)據(jù)傳送指令

–關于地址尋址寄存器偏移:地址

=基址

寄存器偏移立即數(shù)偏移:地址=基址

立即數(shù)常數(shù)后變址Post-indexing:modifyaddressafteruse前變址Pre-indexing:modifyaddressbeforeuse回寫如果可能,更新基址寄存器75尋址方式變址模式數(shù)據(jù)基址寄存器示例回寫前變址mem[base+offset]基址寄存器加上偏移LDRr0,[r1,#4]!前變址mem[base+offset]不變LDRr0,[r1,#4]后變址mem[base]基址寄存器加上偏移LDRr0,[r1],#4注:若有“!”,則將包含偏移量的地址寫回到基址寄存器Rn76例子PREr0=0x00000000,r1=0x00009000,Mem32[0x00009000]=0x01010101Mem32[0x00009004]=0x02020202回寫型前變址尋址:LDRr0,[r1,#0x4]!POSTr0=0x02020202,r1=0x00009004前變址尋址:LDRr0,[r1,#0x4]POSTr0=0x02020202,r1=0x00009000后變址尋址:LDRr0,[r1],#0x4POSTr0=0x01010101,r1=0x00009004數(shù)據(jù)傳送指令

–應用

COPY: ADRr1,TABLE1 ;r1pointstoTABLE1 ADRr2,TABLE2 ;r2pointstoTABLE2LOOP: LDRr0,[r1] STRr0,[r2] ADDr1,r1,#4 ADDr2,r2,#4 ...TABLE1: ...TABLE2:...COPY: ADRr1,TABLE1 ;r1pointstoTABLE1 ADRr2,TABLE2 ;r2pointstoTABLE2LOOP: LDRr0,[r1],#4 STRr0,[r2],#4 ...TABLE1: ...TABLE2:...78

LDRR0,[R1,R2];先索引,R1+R2內(nèi)容作地址,讀字數(shù)據(jù)送R0,不回寫LDRR0,[R1,R2]!;先索引,R1+R2內(nèi)容作地址,讀字數(shù)據(jù)送R0,;R1+R2回寫R1

LDRR0,[R1,-R2];先索引,不回寫,地址由R1-R2的內(nèi)容指定

LDRR0,[R1],R2;后索引,R1內(nèi)容作地址,讀字數(shù)據(jù)送R0,;R1+R2回寫R1

STRR0,[R1],#8;后索引,R0數(shù)據(jù)送以R1內(nèi)容作地址的存儲器單元,;R1+8回寫R1

STRR0,[R1,#8];先索引,R0數(shù)據(jù)寫入R1+8作地址的存儲器,不回寫

LDREQBR1,[R6,#5];條件執(zhí)行,R6+5內(nèi)容作地址,讀一字節(jié)數(shù)據(jù)送;R1[7:0],R1[31:8]填0STRBR0,[R1,#4];存R0[7:0]到R1+4內(nèi)容作地址的存儲器,不回寫79使用舉例

LDRHR0,[R1-R2]!;R1-R2內(nèi)容作地址,裝入半字數(shù)據(jù)到R0低16位,;高16位用0擴展,地址回寫R1STRHR2,[R3,#04];R3+04內(nèi)容作地址,存R2中低16位,不回寫

LDRSBR7,[R1],#230;R1內(nèi)容作地址,裝入1字節(jié)數(shù)據(jù)到R7低8位,;符號擴展,R1+230回寫R1

LDRNESHR10,[R1];條件執(zhí)行,R1內(nèi)容作地址,裝入半字數(shù)據(jù)到;R10低16位,符號擴展

STRHR1,[R0,#2]!;R1中低16位存R0+2地址中,R0+2回寫R0使用舉例80塊數(shù)據(jù)傳送指令也稱為多寄存器裝入/存儲指令,它可以實現(xiàn)多個寄存器與存儲器多個單元之間的數(shù)據(jù)傳送。LDM指令從存儲器裝入數(shù)據(jù)到寄存器;STM指令保存寄存器內(nèi)容到存儲器。允許使用一條指令傳送16個寄存器中的任何一個子集或全部寄存器,但不允許寄存器的個數(shù)為0。LDM/STM指令用于堆棧操作或塊數(shù)據(jù)傳送,主要用途為保護現(xiàn)場、塊數(shù)據(jù)復制、參數(shù)傳送或上下文切換。813.2.9塊數(shù)據(jù)傳送指令(LDM、STM)多數(shù)據(jù)傳送指令

(LDM,STM)load(LDM)或

store(STM)當前可訪問寄存器的任意子集

使用堆棧:maintainingfulloremptystackswhichcangrowupordownmemory上下文切換:保存或重新存儲工作寄存器塊拷貝:在主存儲器中移動大數(shù)據(jù)塊尋址Pre/PostindexingAutoincrementordecrement回寫到基址寄存器Writebackthebaseregister82塊數(shù)據(jù)傳送指令匯編格式LDM\STM{cond}IA\IB\DA\DBRn{!},<RList>{^}LDM\STM{cond}FD\ED\FA\EASP!,<RList>{^}{cond}條件碼助記符FD\ED\FA\EA尋址模式—堆棧操作IA\IB\DA\DB尋址模式—塊操作Rn基址寄存器編號{!}回寫選擇<RList>用大括號括起來的寄存器列表{^}表示設置S位83多寄存器傳送指令的尋址模式尋址模式描述起始地址結束地址Rn!IA執(zhí)行后增加RnRn+4*N-4Rn+4*NIB執(zhí)行前增加Rn+4Rn+4*NRn+4*NDA執(zhí)行后減少Rn-4*N+4RnRn-4*NDB執(zhí)行前減少Rn-4*NRn-4Rn-4*N注:!決定Rn的值是否隨著傳送而改變84多寄存器傳送尋址模式r5r1r9’r0r9STMIAr9!,{r0,r1,r5}100016100c16101816r1r5r9STMDAr9!,{r0,r1,r5}r0r9’100016100c16101816r5r9STMDBr9!,{r0,r1,r5}r1r0r9’100016100c16101816r5r1r0r9’r9STMIBr9!,{r0,r1,r5}100016100c1610181685例子要求:保存r1~r3到內(nèi)存地址0x9000~0x900c,并且更新基址寄存器r4PRE:r1=0x00000001,r2=0x00000002,r3=0x00000003,r4=0x9000執(zhí)行操作:STMIAr4!,{r1,r2,r3}(執(zhí)行后增加)POST:mem32[0x9000]=0x00000001mem32[0x9004]=0x00000002mem32[0x9008]=0x00000003r4=0x900c86例1:將存儲器中的連續(xù)數(shù)據(jù)裝載到寄存器PREmem32[0x80018]=0x03,mem32[0x80014]=0x02,mem32[0x80010]=0x01,r0=0x00080010,r1=0x00000000,r2=0x00000000,r3=0x00000000執(zhí)行指令:LDMIAr0!,{r1-r3}POSTr0=0x0008001c,r1=0x00000001,r2=0x00000002,r3=0x000000030x800200x000000050x8001c0x000000040x800180x000000030x800140x000000020x800100x000000010x8000c0x00000000地址指針存儲地址數(shù)據(jù)r3=0x00000000r2=0x00000000r1=0x00000000r0=0x8001087例2:完成一個存儲器數(shù)據(jù)塊拷貝注:r9——存放源數(shù)據(jù)的起始地址

r10——存放目標起始地址

r11——存放源結束地址

loopLDMIAr9!,{r0-r7};裝載32字節(jié)并更新r9指針

STMIAr10!,{r0-r7};存儲32字節(jié)并更新r10指針

CMPr9,r11;是否到達結束地址

BNEloop;不相等跳轉(zhuǎn)目的源高地址低地址拷貝存儲地址r9r11r1088多寄存器數(shù)據(jù)傳送指令的要點多寄存器Load/Store指令會增加中斷的延遲,因為ARM不會打斷正在執(zhí)行的指令去響應中斷,而必須等到指令執(zhí)行完成;一般編譯器將提供一個選項以控制Load/Store指令可以傳送的最大寄存器數(shù)目,以限制最大中斷延遲。89堆棧操作ARM使用多寄存器Load/Store指令來完成堆棧操作;使用堆棧時,需要確定堆棧在存儲空間中是向上生長遞增的還是向下生長遞減的;遞增(“A”):堆棧向存儲器地址增大方向生長。遞減(“D”):堆棧向存儲器地址減小方向生長。滿堆棧(“F”)是指堆棧指針指向堆棧的最后一個已使用的地址或滿位置;空堆棧(“E”)是指SP指向堆棧的第一個沒有使用的地址或空位置;遞增或遞減方式的地址修改偏移量為4。90堆棧操作尋址方式尋址方式說明pop=LDMpush=STMFA滿遞增堆棧LDMFALDMDASTMFASTMIBFD滿遞減堆棧LDMFDLDMIASTMFDSTMDBEA空遞增堆棧LDMEALDMDBSTMEASTMIAED空遞減堆棧LDMEDLDMIBSTMEDSTMDA91LDMFDsp!,{r4-r7,pc}SP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆棧r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存儲器頂SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆棧操作通過塊傳送指令來完成:STMFD

(Push) 塊存儲-FullDescendingstack[STMDB]LDMFD

(Pop) 塊裝載-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}92例:把寄存器內(nèi)容放入堆棧,更新sp0x800180x000000010x800140x000000020x80010Empty0x8000cEmpty0x800180x000000010x800140x000000020x800100x000000030x8000c0x00000002PRE地址數(shù)據(jù)POST地址數(shù)據(jù)SPSPPRE:r1=0x00000002,r4=0x00000003,sp=0x00080014執(zhí)行指令:STMFDsp!,{r1,r4}POST:r1=0x00000002,r4=0x00000003,sp=0x0008000c93使用舉例

LDMFDSP!,{R1,R2,R3};將SP指向的存儲器單元多字數(shù)據(jù),裝入到;R1、R2和R3,滿遞減堆棧,回寫SPSTMIAR0,{R0-R15};保存全部寄存器內(nèi)容到R0指向的存儲器單元,;R0值不變

LDMFDSP!,{R15};將SP指向的存儲器單元字數(shù)據(jù),裝入到R15,;不改變CPSR,回寫SP

LDMFDSP!,{R15}^;將SP指向的存儲器單元字數(shù)據(jù),裝入R15,同時;將SPSR_<mode>的值送CPSR,回寫SP,;只允許在特權方式使用

STMFDR13,{R0-R14}^;用戶方式寄存器R0-R14的內(nèi)容存入堆棧,;只允許在特權方式使用94【例3.13】如下子程序首先在分支前,保存工作寄存器R0-R7和連接寄存器R14的值到堆棧,然后BL指令分支到另外的程序,破壞了原R14的值,之后LDMED指令從堆棧出棧到工作寄存器R0-R7,將原R14連接寄存器的值出棧到R15(PC),實現(xiàn)了從這個子程序返回的目的。(見參考書)【例3.14】將存儲器源數(shù)據(jù)緩沖區(qū)SrcBuff的8個字傳送到目的數(shù)據(jù)緩沖區(qū)DstBuff。(見參考書)953.2.10單個數(shù)據(jù)交換指令(SWP)單個數(shù)據(jù)交換指令允許寄存器與存儲器之間交換字節(jié)/字數(shù)據(jù)。SWP指令為字交換指令,允許讀出存儲器中指定地址的一個字數(shù)據(jù),裝入一個寄存器,而將另一個寄存器的內(nèi)容寫入存儲器的同一個地址中。SWPB指令為字節(jié)交換指令,允許讀出存儲器中指定地址的一字節(jié)數(shù)據(jù),裝入一個寄存器的低8位,而將另一個寄存器低8位的內(nèi)容寫入存儲器的同一個地址中。SWP和SWPB指令中,允許兩個寄存器有相同的寄存器名,這樣指令的功能就變成了一個寄存器與存儲器確定單元之間的字/字節(jié)數(shù)據(jù)交換。96單數(shù)據(jù)交換指令

-SWP在寄存器和外部存儲器之間交換字節(jié)或字讀存儲器和寫存儲器是放在一起的原子指令執(zhí)行時不能中斷當‘LOCK’

信號輸出操作時,外部存儲器管理單元被鎖定,當多線程操作時使程序同步(OS支持)鎖定信號量97在寄存器和存儲器之間,由一次存儲器讀和一次存儲器寫組成的原子操作。完成一個字節(jié)或字的交換。語法:

SWP{<cond>}{B}Rd,Rm,[Rn]可用作信號量不能由armcc編譯產(chǎn)生,必須使用匯編器。RmRd321temp存儲器RnSWP98SWAP指令的用法PREmem32[0x9000]=0x12345678,r0=0x00000000,r1=0x11112222,r2=0x00009000執(zhí)行操作:SWPr0,r1,[r2]POST:mem32[0x9000]=0x11112222,r0=0x12345678,r1=0x11112222,r2=0x00009000交換指令多用于實現(xiàn)操作系統(tǒng)中的信號量和互斥操作,該指令有修飾符B,即有字交換和字節(jié)交換兩種形式;99SWP指令應用示例SpinMOVr1,=semaphoreMOVr2,#1SWPr3,r2,[r1]CMPr3,#1BEQspin注:信號量指向的單元是0或1,如果為1,則表示該服務被另一個過程使用,程序繼續(xù)循環(huán),直至為0100使用舉例

SWPR1,R2,[R3];地址在R3中,讀存儲器內(nèi)容裝入R1,存R2的內(nèi)容;到R3確定的存儲器地址中,字交換

SWPBR3,R4,[R5];地址在R5中,裝入一字節(jié)到R3,存R4[7:0];到R5確定的存儲器地址中

SWPEQR1,R1,[R2];條件執(zhí)行。條件成立時,將R1的內(nèi)容與R2作為;地址的存儲器單元的內(nèi)容作字交換1013.2.11

軟件中斷(SWI)執(zhí)行SWI指令引起軟件中斷陷阱被產(chǎn)生,這將改變處理器方式,PC被強制成固定值0x08,CPSR被存到SPSR_svc。進入軟件中斷陷阱時,首先將PC值保存到R14_svc中,保存的PC值被調(diào)整到跟隨在SWI指令后的那一個字的地址。從管理方式返回時,使用MOVSPC,R14_svc指令,返回到調(diào)用程序斷點處并恢復CPSR。SWI處理程序可以檢測SWI號,從而決定采取何種操作。軟件中斷指令作為一種控制方法,用來實現(xiàn)從用戶方式進入(轉(zhuǎn)換)到管理方式。在其他方式也可以使用SWI指令,處理器同樣進入到管理方式。語法:

SWI{<cond>}<SWInumber>102軟件中斷(SWI)執(zhí)行的操作指令名稱執(zhí)行操作SWI軟件中斷Lr_svc=SWI指令后面的指令地址spsr_svc=cpsrpc=vectors+0x8cpsr模式=SVCcpsrI=1(屏蔽IRQ中斷)103SWI中斷處理程序處理軟件中斷的代碼段稱為中斷處理程序(SWIHandler),中斷處理程序是通過執(zhí)行指令的地址獲取軟件中斷號,指令地址是從lr計算出來的;SWI號的確定方法:

SWI_Number=<SWIinstruction>andNOT(0xff00000000)283124270Cond1111SWInumber(ignoredbyprocessor)23條件域104①只使用中斷立即數(shù)傳送信息SWI0;中斷立即數(shù)為0SWI0x123456;中斷立即數(shù)為0x123456②使用中斷立即數(shù)傳送中斷請求類型,參數(shù)通過寄存器傳送MOVR0,#34;子功能號為34SWI12;中斷類型號為12③指令中24位中斷立即數(shù)被忽略,由寄存器傳送參數(shù)MOVR0,#12;中斷類型號

MOVR1,#34;子功能號

SWI0;中斷立即數(shù)將被忽略105使用舉例使用舉例【例3.15】用SWI指令的bit[23:0]給管理方式的代碼傳送信息。假定由SWI指令bit[23:8]表示中斷類型號,進入管理方式后,由這個類型號轉(zhuǎn)換成相應的地址偏移量,據(jù)此查找對應的中斷例程入口地址。同時假定bit[7:0]作為傳送給管理方式的數(shù)據(jù)。106SWI處理程序應用示例SWI_handler ;保存寄存器r0~r12和lr

STMFDsp!,{r0-r12,lr} ;readtheSWIinstructionLDRr10,[lr,#-4] ;makeofftop8bitsBICr10,r10,#0xff000000 ;r10-containstheSWInumberBLservice_routine ;returnfromSWIhandlerLDMFDsp!,{r0-r12,pc}^1073.2.12~3.2.15協(xié)處理器ARM體系結構允許使用協(xié)處理器來擴展指令集。常用的協(xié)處理器有控制片內(nèi)功能的系統(tǒng)協(xié)處理器、用于浮點運算的ARM協(xié)處理器等。允許各生產(chǎn)廠商根據(jù)需要開發(fā)自己的專用協(xié)處理器,與ARM處理器配合工作。ARM協(xié)處理器有自己專用的寄存器組。

ARM全部協(xié)處理器指令只能與數(shù)據(jù)處理和數(shù)據(jù)傳送有關。數(shù)據(jù)處理與傳送指令有不同的指令格式108協(xié)處理器指令ARM體系支持16個協(xié)處理器在程序執(zhí)行過程中,ARM執(zhí)行的協(xié)處理器指令,要指定某一個協(xié)處理器進行某種操作,其他協(xié)處理器將忽略這條指令。如果相應的協(xié)處理器不存在,ARM920T產(chǎn)生一個未定義

溫馨提示

  • 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

提交評論