版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)教案,2020/9/18,2,提綱,1,3,2,4,ARM 指令系統(tǒng),ARM和THUMB混合調(diào)用,ATPCS 介紹,THUMB 指令系統(tǒng),第四章 ARM指令系統(tǒng)及匯編程序設(shè)計,3,跳轉(zhuǎn)指令,跳轉(zhuǎn)指令用于實現(xiàn)程序流程的跳轉(zhuǎn),在ARM程序中有兩種方法可以實現(xiàn)程序流程的跳轉(zhuǎn): 使用專門的跳轉(zhuǎn)指令。 直接向程序計數(shù)器PC寫入跳轉(zhuǎn)地址值。 ARM指令集中的跳轉(zhuǎn)指令可以完成從當(dāng)前指令向前或向后的32MB的地址空間的跳轉(zhuǎn),包括以下4條指令: B跳轉(zhuǎn)指令 BL帶返回的跳轉(zhuǎn)指令 BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令 BX帶狀態(tài)切換的跳轉(zhuǎn)指令,ARM 指令系統(tǒng),4,B指令,B指令的格式為: B條件目標(biāo)地址
2、B指令是最簡單的跳轉(zhuǎn)指令。一旦遇到一個 B 指令,ARM 處理器將立即跳轉(zhuǎn)到給定的目標(biāo)地址,從那里繼續(xù)執(zhí)行。注意存儲在跳轉(zhuǎn)指令中的實際值是相對當(dāng)前PC值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算。它是24位有符號數(shù),左移兩位后有符號擴展為 32 位,表示的有效偏移為 26 位(前后32MB的地址空間)。如: BLabel /*程序無條件跳轉(zhuǎn)到標(biāo)號Label處執(zhí)行*/,ARM 指令系統(tǒng),5,BL指令,BL指令的格式為: BL條件 目標(biāo)地址 BL 是另一個跳轉(zhuǎn)指令,但跳轉(zhuǎn)之前,會在寄存器R14中保存PC的當(dāng)前內(nèi)容,因此,可以通過將R14 的內(nèi)容重新加載到PC中,來返回到跳轉(zhuǎn)指令之后的那
3、個指令處執(zhí)行。該指令是實現(xiàn)子程序調(diào)用的一個基本但常用的手段。以下指令: BLLabel /*當(dāng)程序無條件跳轉(zhuǎn)到標(biāo)號Label處執(zhí)行時,同時將當(dāng)前的PC值保存到R14中 */,ARM 指令系統(tǒng),6,BLX指令,BLX指令的格式為: BLX 目標(biāo)地址 BLX指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)由ARM狀態(tài)切換到Thumb狀態(tài),該指令同時將PC的當(dāng)前內(nèi)容保存到寄存器R14中。因此,當(dāng)子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時,可以通過BLX指令實現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時,子程序的返回可以通過將寄存器R14值復(fù)制到PC中來完成。,ARM 指
4、令系統(tǒng),7,BX指令,BX指令的格式為: BX條件 目標(biāo)地址 BX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的指令既可以是ARM指令,也可以是Thumb指令。,ARM 指令系統(tǒng),8,數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運算指令和比較指令等。 數(shù)據(jù)傳送指令用于在寄存器和存儲器之間進行數(shù)據(jù)的雙向傳輸。 算術(shù)邏輯運算指令完成常用的算術(shù)與邏輯的運算,該類指令不但將運算結(jié)果保存在目的寄存器中,同時更新CPSR中的相應(yīng)條件標(biāo)志位。 比較指令不保存運算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。,ARM 指令系統(tǒng),9,數(shù)據(jù)處理指令靈活的第二操作數(shù),如:ADDcondS Rd, Rn, Ope
5、rand2 Operand2可能的形式: #immed_8r Rm,shift ADD r0, r1, #100 ADD r0, r1, r2 ADD r0, r1, r2, ASR #1,ARM 指令系統(tǒng),R0 = r1 + 100,R0 = r1 + r2,R0 = r1 + (r2算術(shù)右移一位),若指定S,則根據(jù)操作結(jié)果更新條件碼標(biāo)志,10,數(shù)據(jù)處理指令Shift 移位模式,ASRn 算術(shù)右移n位(1=n=32) LSLn 邏輯左移n位(1=n=32) LSRn 邏輯右移n位(1=n=32) RORn 循環(huán)右移n位(1=n=32) RRX 帶擴展的循環(huán)右移1位 type Rs type
6、= ASR/LSL/LSR/ROT,ARM 指令系統(tǒng),11,ASR,算術(shù)右移n位即Rm中的內(nèi)容除以2的n次方。將原來的位31拷貝到寄存器左邊的n位中,即空出的最高位補符號位。,ARM 指令系統(tǒng),12,LSR和LSL,邏輯右移n位,即將Rm的內(nèi)容除以2的n次方。寄存器左邊的n位清零。 邏輯左移n位,即將Rm的內(nèi)容乘以2的n次方。寄存器右邊的n位清零。,ARM 指令系統(tǒng),13,ROR,循環(huán)右移n位,把寄存器右邊的n位移動到結(jié)果的左邊n位。,ARM 指令系統(tǒng),14,RRX,帶擴展的循環(huán)右移將Rm的內(nèi)容循環(huán)右移一位。進位標(biāo)志拷貝到Rm的位31。,ARM 指令系統(tǒng),15,MOV指令,MOV指令的格式為:
7、 MOV條件S目的寄存器,源操作數(shù) MOV指令可完成從另一個寄存器、被移位的寄存器或?qū)⒁粋€立即數(shù)加載到目的寄存器。其中S選項決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時指令不更新CPSR中條件標(biāo)志位的值。指令示例: MOVR1,R0 MOV R1,R0,LSL 3,ARM 指令系統(tǒng),16,MVN指令,MVN指令的格式為: MVN條件S目的寄存器,源操作數(shù) MVN指令可完成從另一個寄存器、被移位的寄存器、或?qū)⒁粋€立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時
8、指令不更新CPSR中條件標(biāo)志位的值。 MVNR0,0,ARM 指令系統(tǒng),17,CMP指令,CMP指令的格式為: CMP條件 操作數(shù)1,操作數(shù)2 CMP指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行比較,同時更新CPSR中條件標(biāo)志位的值。該指令進行一次減法運算,但不存儲結(jié)果,只更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1與操作數(shù)2的關(guān)系(大、小、相等),例如,當(dāng)操作數(shù)1大于操作操作數(shù)2,則此后的有GT 后綴的指令將可以執(zhí)行。 CMPR1,R0 CMPR1,100,ARM 指令系統(tǒng),18,CMN指令,CMN指令的格式為: CMN條件 操作數(shù)1,操作數(shù)2 CMN指令用于把一個寄存器的內(nèi)容和另一
9、個寄存器的內(nèi)容或立即數(shù)取反后進行比較,同時更新CPSR中條件標(biāo)志位的值。該指令實際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結(jié)果更改條件標(biāo)志位。 CMNR1,R0 CMNR1,100,ARM 指令系統(tǒng),19,TST指令,TST指令的格式為: TST條件 操作數(shù)1,操作數(shù)2 TST指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位的與運算,并根據(jù)運算結(jié)果更新CPSR中條件標(biāo)志位的值。操作數(shù)1是要測試的數(shù)據(jù),而操作數(shù)2是一個位掩碼,該指令一般用來檢測是否設(shè)置了特定的位。 TSTR1,1 TSTR1,0 xffe,ARM 指令系統(tǒng),20,TEQ指令,TEQ指令的格式為: TEQ條件 操作數(shù)1,操
10、作數(shù)2 TEQ指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位的異或運算,并根據(jù)運算結(jié)果更新CPSR中條件標(biāo)志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等。 TEQR1,R2,ARM 指令系統(tǒng),21,ADD指令,ADD指令的格式為: ADD條件S 目的寄存器,操作數(shù)1,操作數(shù)2 ADD指令用于把兩個操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。 ADD R0,R1,R2 ADD R0,R1,#256 ADD R0,R2,R3,LSL#1,ARM 指令系統(tǒng),22,ADC指令,ADC指令的格式為: AD
11、C條件S 目的寄存器,操作數(shù)1,操作數(shù)2 ADC指令用于把兩個操作數(shù)相加,再加上CPSR中的C條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。 以下指令序列完成兩個128位數(shù)的加法,第一個數(shù)存放在寄存器R7R4,第二個數(shù)存放在寄存器R11R8,運算結(jié)果存放在寄存器R3R0: ADDS R0,R4,R8 ; 加低端的字 ADCS R1,R5,R9 ; 加第二個字,帶進位 ADCS R2,R6,R10 ; 加第三個字,帶進位 ADC R3,R7,R11 ; 加第四個字,帶進位,ARM 指令系統(tǒng),23,SUB指令,SUB指令
12、的格式為: SUB條件S 目的寄存器,操作數(shù)1,操作數(shù)2 SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。 SUB R0,R1,R2 ; R0 = R1 - R2 SUB R0,R1,#256 ; R0 = R1 - 256 SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 1),ARM 指令系統(tǒng),24,SBC指令,SBC指令的格式為: SBC條件S 目的寄存器,操作數(shù)1,操作數(shù)2 SBC指令用于把操作數(shù)1減去操作數(shù)2,再減去CPSR中
13、的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。 SUBS R0,R1,R2,ARM 指令系統(tǒng),25,RSB指令,RSB指令的格式為: RSB條件S 目的寄存器,操作數(shù)1,操作數(shù)2 RSB指令稱為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。 RSB R0,R1,R2 RSB R0,R1,#256 RSB R0,R2,R3,LSL#1,ARM 指令系統(tǒng),26,RSC指令,RSC指令的格式為: RSC條件S 目的
14、寄存器,操作數(shù)1,操作數(shù)2 RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令使用進位標(biāo)志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來更改進位標(biāo)志。 RSC R0,R1,R2,ARM 指令系統(tǒng),27,AND指令,AND指令的格式為: AND條件S 目的寄存器,操作數(shù)1,操作數(shù)2 AND指令用于在兩個操作數(shù)上進行邏輯與運算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令
15、常用于屏蔽操作數(shù)1的某些位。 AND R0,R0,3,ARM 指令系統(tǒng),28,ORR指令,ORR指令的格式為: ORR條件S 目的寄存器,操作數(shù)1,操作數(shù)2 ORR指令用于在兩個操作數(shù)上進行邏輯或運算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。 ORR R0,R0,3,ARM 指令系統(tǒng),29,EOR指令,EOR指令的格式為: EOR條件S 目的寄存器,操作數(shù)1,操作數(shù)2 EOR指令用于在兩個操作數(shù)上進行邏輯異或運算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被
16、移位的寄存器,或一個立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。 EOR R0,R0,3,ARM 指令系統(tǒng),30,BIC指令,BIC指令的格式為: BIC條件S 目的寄存器,操作數(shù)1,操作數(shù)2 BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。操作數(shù)2為32位的掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位。未設(shè)置的掩碼位保持不變。 BIC R0,R0,0 x0b,ARM 指令系統(tǒng),31,乘法指令與乘加指令,ARM微處理器支持的乘法指令與乘加指令共有6條,可分為運算結(jié)果為32位和運算結(jié)果為64位兩類,與前
17、面的數(shù)據(jù)處理指令不同,指令中的所有操作數(shù)、目的寄存器必須為通用寄存器,不能對操作數(shù)使用立即數(shù)或被移位的寄存器,同時,目的寄存器和操作數(shù)1必須是不同的寄存器。 乘法指令與乘加指令共有以下6條: MUL32位乘法指令 MLA32位乘加指令 SMULL64位有符號數(shù)乘法指令 SMLAL64位有符號數(shù)乘加指令 UMULL64位無符號數(shù)乘法指令 UMLAL64位無符號數(shù)乘加指令,ARM 指令系統(tǒng),32,MUL指令,MUL指令的格式為: MUL條件S目的寄存器,操作數(shù)1,操作數(shù)2 MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果放置到目的寄存器中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。
18、其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。 MULR0,R1,R2 MULSR0,R1,R2,ARM 指令系統(tǒng),33,MLA指令,MLA指令的格式為: MLA條件S 目的寄存器,操作數(shù)1,操作數(shù)2,操作數(shù)3 MLA指令完成將操作數(shù)1與操作數(shù)2的乘法運算,再將乘積加上操作數(shù)3,并把結(jié)果放置到目的寄存器中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。 MLAR0,R1,R2,R3 MLASR0,R1,R2,R3,ARM 指令系統(tǒng),34,SMULL指令,SMULL指令的格式為: SMULL條件S目的寄存器Low,目的寄存器
19、低High,操作數(shù)1,操作數(shù)2 SMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)。 SMULLR0,R1,R2,R3,ARM 指令系統(tǒng),35,SMLAL指令,SMLAL指令的格式為: SMLAL條件S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2 SMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器Hi
20、gh中的值相加后又放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)。 對于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。 對于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。 SMLALR0,R1,R2,R3,ARM 指令系統(tǒng),36,UMULL指令,UMULL指令的格式為: UMULL條件S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2 UMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位放置到目的寄存器Low中
21、,結(jié)果的高32位放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號數(shù)。 UMULLR0,R1,R2,R3,ARM 指令系統(tǒng),37,UMLAL指令,UMLAL指令的格式為: UMLAL條件S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2 UMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均
22、為32位的無符號數(shù)。 對于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。 對于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。 UMLALR0,R1,R2,R3,ARM 指令系統(tǒng),38,程序狀態(tài)寄存器訪問指令,ARM微處理器支持程序狀態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條: MRS程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令 MSR通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令,ARM 指令系統(tǒng),39,程序狀態(tài)寄存器(PSR)處理指令 MRS/MSR,MRS 狀態(tài)寄
23、存器的內(nèi)容讀取到通用寄存器 MSR 立即數(shù)或通用寄存器內(nèi)容寫到狀態(tài)寄存器的制定區(qū)域 MSR cond _, #immed_8r MSR cond _, rm fields:c控制域(PSR7:0) x擴展域(PSR15:8) s狀態(tài)域(PSR23:16) f標(biāo)志域(PSR31:24),ARM 指令系統(tǒng),40,MRS指令,MRS指令的格式為: MRS條件通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR) MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下幾種情況: 當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時,可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。
24、 當(dāng)在異常處理或進程切換時,需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。 MRSR0,CPSR MRSR0,SPSR,ARM 指令系統(tǒng),41,MSR指令,MSR指令的格式為: MSR條件程序狀態(tài)寄存器(CPSR或SPSR)_,操作數(shù) MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(shù)。用于設(shè)置程序狀態(tài)寄存器中需要操作的位,32位的程序狀態(tài)寄存器可分為4個域: 位31:24為條件標(biāo)志位域,用f表示; 位23:16為狀態(tài)位域,用s表示; 位15:8為擴展位域,用x表示; 位7:0為控制位域,用c表示; 該指令通常用于恢復(fù)或
25、改變程序狀態(tài)寄存器的內(nèi)容,在使用時,一般要在MSR指令中指明將要操作的域。 MSRCPSR,R0 MSRCPSR_c,R0,ARM 指令系統(tǒng),42,加載/存儲指令及批量數(shù)據(jù)加載/存儲指令,ARM微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數(shù)據(jù),加載指令用于將存儲器中的數(shù)據(jù)傳送到寄存器,存儲指令則完成相反的操作。常用的加載存儲指令如下: LDR字?jǐn)?shù)據(jù)加載指令 LDRB字節(jié)數(shù)據(jù)加載指令 LDRH半字?jǐn)?shù)據(jù)加載指令 STR字?jǐn)?shù)據(jù)存儲指令 STRB字節(jié)數(shù)據(jù)存儲指令 STRH半字?jǐn)?shù)據(jù)存儲指令 LDM批量數(shù)據(jù)加載指令 STM批量數(shù)據(jù)存儲指令,ARM 指令系統(tǒng),43,加載/存儲指令(LDR/STR/
26、LDM/STM),LDR/STR:采用寄存器間接尋址和基變址尋址的方式 零偏移; LDR r0, r1 STR r0, r1 程序相對偏移; LDR r0, =0 x12345678 后索引偏移; LDR r0, r13, #0 x04 LDR r1, r13, #0 x04,ARM 指令系統(tǒng),44,加載/存儲指令(LDR/STR/LDM/STM),前索引偏移; OPcond Rd, Rn, offset ! Offset 就是數(shù)據(jù)處理指令中的第二操作數(shù); !為一個可選的后綴,即是否修改Rn Rn為R15時不能選擇該后綴; LDR r0, r1, #0 x04 LDR r0, r1, #0 x
27、04! LDR r0, r1, r2, ASR #0 x04!,ARM 指令系統(tǒng),45,LDM/STM可以傳送R0-R15的任意組合,OP cond mode Rn!, reglist mode: IA每次傳送后地址加1FD 滿遞減堆棧 IB每次傳送前地址加1ED 空遞減堆棧 DA每次傳送后地址減1FA 滿遞增堆棧 DB每次傳送前地址減1EA 空遞增堆棧,ARM 指令系統(tǒng),46,LDM/STM后綴描述,! 回寫使能標(biāo)志 是否拷貝SPSR到CPSR LDMIA r0, r1, r2, r3, r4 LDMIA r0!, r1, r2, r3, r4 STMFD r13!, r0, r4-r7,
28、LR;子程序入口 LDMFD r13!, r0, r4-r7, PC;子程序返回,ARM 指令系統(tǒng),47,LDR指令,LDR指令的格式為: LDR條件 目的寄存器, LDR指令用于從存儲器中將一個32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲器中讀取32位的字?jǐn)?shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。當(dāng)程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。該指令在程序設(shè)計中比較常用,且尋址方式靈活多樣,請讀者認真掌握。 LDR R0,R1 LDR R0,R1,R2 LDR R0,R1,8 LDR R0,R1,R2 !,ARM 指令系統(tǒng),48,
29、LDRB指令,LDRB指令的格式為: LDR條件B 目的寄存器, LDRB指令用于從存儲器中將一個8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高24位清零。該指令通常用于從存儲器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。當(dāng)程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。 LDRB R0,R1 LDRB R0,R1,8,ARM 指令系統(tǒng),49,LDRH指令,LDRH指令的格式為: LDR條件H 目的寄存器, LDRH指令用于從存儲器中將一個16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時將寄存器的高16位清零。該指令通常用于從存儲器中
30、讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。當(dāng)程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。 LDRH R0,R1 LDRH R0,R1,8 LDRH R0,R1,R2,ARM 指令系統(tǒng),50,STR指令,STR指令的格式為: STR條件 源寄存器, STR指令用于從源寄存器中將一個32位的字?jǐn)?shù)據(jù)傳送到存儲器中。該指令在程序設(shè)計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。 STRR0,R1,8 STRR0,R1,8,ARM 指令系統(tǒng),51,STRB指令,STRB指令的格式為: STR條件B 源寄存器, STRB指令
31、用于從源寄存器中將一個8位的字節(jié)數(shù)據(jù)傳送到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。 STRB R0,R1 STRB R0,R1,8,ARM 指令系統(tǒng),52,STRH指令,STRH指令的格式為: STR條件H 源寄存器, STRH指令用于從源寄存器中將一個16位的半字?jǐn)?shù)據(jù)傳送到存儲器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。 STRH R0,R1 STRH R0,R1,8,ARM 指令系統(tǒng),53,批量數(shù)據(jù)加載/存儲指令,ARM微處理器所支持批量數(shù)據(jù)加載/存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)存儲指令則完成
32、相反的操作。常用的加載存儲指令如下: LDM批量數(shù)據(jù)加載指令 STM批量數(shù)據(jù)存儲指令,ARM 指令系統(tǒng),54,LDM(或STM)指令,LDM(或STM)指令的格式為: LDM(或STM)條件類型 基址寄存器!,寄存器列表 LDM(或STM)指令用于從由基址寄存器所指示的一片連續(xù)存儲器到寄存器列表所指示的多個寄存器之間傳送數(shù)據(jù),該指令的常見用途是將多個寄存器的內(nèi)容入?;虺鰲?LDM R0!, r0-r4,ARM 指令系統(tǒng),55,類型為以下幾種情況,IA每次傳送后地址加1;IB每次傳送前地址加1;DA每次傳送后地址減1;DB每次傳送前地址減1;FD滿遞減堆棧;ED空遞減堆棧;FA滿遞增堆棧;EA空
33、遞增堆棧;,ARM 指令系統(tǒng),56,后綴,!為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。 基址寄存器不允許為R15,寄存器列表可以為R0R15的任意組合。 為可選后綴,當(dāng)指令為LDM且寄存器列表中包含R15,選用該后綴時表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。同時,該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存器。 STMFD R13!,R0,R4-R12,LR LDMFD R13!,R0,R4-R12,PC,ARM 指令系統(tǒng),57,數(shù)據(jù)交換指令,ARM微處理器所支持?jǐn)?shù)據(jù)交換指令能在存儲器和寄存
34、器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令有如下兩條: SWP字?jǐn)?shù)據(jù)交換指令 SWPB字節(jié)數(shù)據(jù)交換指令,ARM 指令系統(tǒng),58,SWP指令,SWP指令的格式為: SWP條件 目的寄存器,源寄存器1,源寄存器2 SWP指令用于將源寄存器2所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指向的存儲器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。 SWP R0,R1,R2 SWP R0,R0,R1,ARM 指令系統(tǒng),59,SWPB指令,SWPB指令的格式為: SWP條件B 目的寄存器,源寄存器1,源寄存器2 SWPB指令用于將源寄存器2
35、所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24清零,同時將源寄存器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。 SWPB R0,R1,R2 SWPB R0,R0,R1,ARM 指令系統(tǒng),60,移位指令(操作),ARM微處理器內(nèi)嵌的桶型移位器(Barrel Shifter),支持?jǐn)?shù)據(jù)的各種移位操作,移位操作在ARM指令集中不作為單獨的指令使用,它只能作為指令格式中是一個字段,在匯編語言中表示為指令中的選項。例如,數(shù)據(jù)處理指令的第二個操作數(shù)為寄存器時,就可以加入移位操作選項對它進行各種移位操作。移
36、位操作包括如下6種類型,ASL和LSL是等價的,可以自由互換: LSL 邏輯左移 ASL 算術(shù)左移 LSR 邏輯右移 ASR 算術(shù)右移 ROR 循環(huán)右移 RRX 帶擴展的循環(huán)右移,ARM 指令系統(tǒng),61,LSL(或ASL)操作,LSL(或ASL)操作的格式為: 通用寄存器,LSL(或ASL) 操作數(shù) LSL(或ASL)可完成對通用寄存器中的內(nèi)容進行邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。 MOV R0, R1, LSL#2,ARM 指令系統(tǒng),62,LSR操作,LSR操作的格式為: 通用寄存器,LSR 操作數(shù)
37、 LSR可完成對通用寄存器中的內(nèi)容進行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。 MOV R0, R1, LSR#2,ARM 指令系統(tǒng),63,ASR操作,ASR操作的格式為: 通用寄存器,ASR 操作數(shù) ASR可完成對通用寄存器中的內(nèi)容進行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用第31位的值來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。 MOV R0, R1, ASR#2,ARM 指令系統(tǒng),64,ROR操作,ROR操作的格式為: 通用寄存器,ROR 操作數(shù) ROR可完成對通用寄存器中的內(nèi)容進行循環(huán)
38、右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。顯然,當(dāng)進行32位的循環(huán)右移操作時,通用寄存器中的值不改變。 MOV R0, R1, ROR#2,ARM 指令系統(tǒng),65,RRX操作,RRX操作的格式為: 通用寄存器,RRX 操作數(shù) RRX可完成對通用寄存器中的內(nèi)容進行帶擴展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進位標(biāo)志位C來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。 MOV R0, R1, RRX#2,ARM 指令系統(tǒng),66,協(xié)處理器指令,ARM微處理器可支持多達16個協(xié)處理
39、器,用于各種協(xié)處理操作,在程序執(zhí)行的過程中,每個協(xié)處理器只執(zhí)行針對自身的協(xié)處理指令,忽略ARM處理器和其他協(xié)處理器的指令。 ARM的協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在ARM協(xié)處理器的寄存器和存儲器之間傳送數(shù)據(jù)。ARM協(xié)處理器指令包括以下5條: CDP協(xié)處理器數(shù)操作指令 LDC協(xié)處理器數(shù)據(jù)加載指令 STC協(xié)處理器數(shù)據(jù)存儲指令 MCR寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令 MRC協(xié)處理器寄存器到寄存器的數(shù)據(jù)傳送指令,ARM 指令系統(tǒng),67,CDP指令,CDP指令的格式為: CDP條件 協(xié)處理器編碼,協(xié)處理
40、器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。 CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲器。 CDP P3,2,C12,C10,C3,4,ARM 指令系統(tǒng),68,LDC指令,LDC指令的格式為: LDC條件L 協(xié)處理器編碼,目的寄存器,源寄存器 LDC指令用于將源寄存器所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令
41、異常。其中,L選項表示指令為長讀取操作,如用于雙精度數(shù)據(jù)的傳輸。 LDC P3,C4,R0,ARM 指令系統(tǒng),69,STC指令,STC指令的格式為: STC條件L 協(xié)處理器編碼,源寄存器,目的寄存器 STC指令用于將源寄存器中的字?jǐn)?shù)據(jù)傳送到目的寄存器所指向的存儲器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,L選項表示指令為長讀取操作,如用于雙精度數(shù)據(jù)的傳輸。 STC P3,C4,R0,ARM 指令系統(tǒng),70,MCR指令,MCR指令的格式為: MCR條件 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2。 MCR指令用于將ARM處理器寄存
42、器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協(xié)處理器的寄存器。 MCR P3,3,R0,C4,C5,6,ARM 指令系統(tǒng),71,MRC指令,MRC指令的格式為: MRC條件 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。 MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行
43、的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協(xié)處理器的寄存器。 MRC P3,3,R0,C4,C5,6,ARM 指令系統(tǒng),72,異常產(chǎn)生指令,ARM微處理器所支持的異常指令有如下兩條: SWI軟件中斷指令 BKPT斷點中斷指令,ARM 指令系統(tǒng),73,SWI指令,SWI指令的格式為: SWI條件 24位的立即數(shù) SWI指令用于產(chǎn)生軟件中斷,以便用戶程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。操作系統(tǒng)在SWI的異常處理程序中提供相應(yīng)的系統(tǒng)服務(wù),指令中24位的立即數(shù)指定用戶程序調(diào)用系統(tǒng)例程的類型,相關(guān)參數(shù)通過通用寄存器傳遞,當(dāng)指令中24位的立即數(shù)被忽略時,用戶程序調(diào)用系統(tǒng)例程的類型由通用
44、寄存器R0的內(nèi)容決定,同時,參數(shù)通過其他通用寄存器傳遞。 SWI 0 x02,ARM 指令系統(tǒng),74,BKPT指令,BKPT指令的格式為: BKPT 16位的立即數(shù) BKPT指令產(chǎn)生軟件斷點中斷,可用于程序的調(diào)試。,ARM 指令系統(tǒng),75,Thumb指令集,Thumb指令集是針對代碼密度的問題而提出的。可以看作是ARM指令集的子集。 所有Thumb指令均有對應(yīng)的ARM指令,而Thumb編程模型也對應(yīng)于Thumb模型。 Thumb是一個不完整的體系結(jié)構(gòu),不能指望處理器只執(zhí)行Thumb代碼而不支持ARM指令集。一般Thumb代碼只需支持通用功能,必要時可以借助ARM指令集(例:所有異常自動進入AR
45、M模式) 應(yīng)用程序可以靈活的將ARM指令和Thumb程序混合,以便提高性能和代碼密度。同時達到降低功耗、節(jié)約成本和提高性能的目的。,THUMB 指令系統(tǒng),76,Thumb指令集的執(zhí)行,在任何時刻,對指令流的解釋取決于CPSR的第5位,即位T,若T置位,則認為指令流為16位的Thumb指令;否則為標(biāo)準(zhǔn)的ARM指令。 并不是所有的ARM處理器都支持Thumb指令。只有在命名中有字母T的才支持,例如以上提到的ARM7TDMI。,THUMB 指令系統(tǒng),77,Thumb模式的進入和退出,復(fù)位后,ARM啟動并執(zhí)行ARM指令。轉(zhuǎn)向執(zhí)行Thumb指令的通常方法是執(zhí)行一條交換轉(zhuǎn)移指令BX。若BX指令指定的寄存器
46、的最低位為1,則將T置位,并將程序計數(shù)器切換為寄存器其他位給出的地址。 異常返回也可以將微處理器從ARM狀態(tài)轉(zhuǎn)換為Thumb狀態(tài)。通常這種指令用于返回到進入異常前所執(zhí)行的指令流,而不是特地用于轉(zhuǎn)換到Thumb模式。 執(zhí)行Thumb BX指令可以顯式地返回到ARM指令流。,THUMB 指令系統(tǒng),78,Thumb轉(zhuǎn)移指令,ARM指令有一個大的(24位)偏移域(offsetfield),這不可能在16位Thumb指令格式中表示。為此,Thumb指令集有多種方法實現(xiàn)其于功能。 格式 B cond B BL BLX BLXRm 轉(zhuǎn)移指令的典型用法如下: 1)短距離條件轉(zhuǎn)移指令可用于控制循環(huán)的退出。 2)
47、中等距離的無條件轉(zhuǎn)移指令用于實現(xiàn)goto功能。 3)長距離子程序調(diào)用,THUMB 指令系統(tǒng),79,Thumb轉(zhuǎn)移指令 B 指令,B cond /*8位偏移,目標(biāo)為Thumb代碼 */ B /*11位偏移,目標(biāo)為Thumb代碼 */ 這兩種格式是條件域和偏移長度的折衷。指令首先將偏移值左移1位,實現(xiàn)16位對齊,然后擴展到32位,因此他們的偏移量分別為256字節(jié)和2K字節(jié)。,THUMB 指令系統(tǒng),80,Thumb轉(zhuǎn)移指令 BL 指令,BL/*11位偏移,目標(biāo)為Thumb代碼 */ 轉(zhuǎn)移鏈接子程序通常需要一個大的范圍,很難用16位指令 格式實現(xiàn)為此,Thumb采用兩條這樣格式的指令組合成22位半字偏
48、移(符號擴展為32位),使指令轉(zhuǎn)移范圍為4MB。 為了使這兩條轉(zhuǎn)移指令相互獨立,以致使他們之間也能響應(yīng)中斷等,將鏈接寄存器LR作為暫存器使用,LR在這兩條指令執(zhí)行完成后會被覆蓋,因此,LR中不能裝有有效內(nèi)容。這個指令對的操作如下: (第一條) LR:PC+(偏移量左移12后符號擴展至32位) (第二條) PC:LR+(偏移量左移1位) LRoldPC+3,THUMB 指令系統(tǒng),81,Thumb轉(zhuǎn)移指令 BLX 指令,BLX /*目標(biāo)為ARM代碼 */ 該指令只在v5T結(jié)構(gòu)中有效。它使用與上面BL指令同樣的第一步,即 (第一條) LR:PC+(偏移量左移12后符號擴展至32位) (第二條) PC
49、:LR+(偏移量左移1位) &0 xffff_fffc LRoldPC+3 Thumb位清0。 應(yīng)注意轉(zhuǎn)移的目標(biāo)是ARM指令,偏移地址只需要10位,而且PC值的位1可能為1,因此,必須進行清0操作。,THUMB 指令系統(tǒng),82,Thumb轉(zhuǎn)移指令 BLX Rm指令,BLXRm 目標(biāo)為ARM代碼或Thumb代碼 與上一條代碼不同的就是r14的值為后續(xù)地址加1,以表示被Thumb代碼調(diào)用。,THUMB 指令系統(tǒng),83,Thumb軟中斷指令,Thumb軟中斷指令的行為與ARM等價指令完全相同。進入異常的指令使微處理器進入ARM執(zhí)行狀態(tài)。 該代碼使用8位立即數(shù),這將會把Thumb代碼的SWI指令限制到
50、前256種,而ARM的SWI指令可以達到l 600萬種。,THUMB 指令系統(tǒng),84,Thumb數(shù)據(jù)處理指令,Thumb數(shù)據(jù)處理指令包括一組高度優(yōu)化且相當(dāng)復(fù)雜的指令,范圍涵蓋編譯器通常需要的大多數(shù)操作。 在Thumb指令集中有等價指令的ARM數(shù)據(jù)處理指令如下所列: 使用低8個通用寄存器(r0-r7)的指令: ARM指令 Thumb指令 MOVS Rd# MOV Rd,# MVNS Rd,Rm MVN Rd,Rm CMP Rn# CMP Rn,#,THUMB 指令系統(tǒng),85,Thumb數(shù)據(jù)處理指令與等價的 ARM指令,ARM指令 Thumb指令 CMP Rn,Rm CMP Rn,Rm CMN R
51、n,Rm CMN Rn,Rm TST Rn,Km TST Rn,Rm ADDS Rd,Rn,# ADD Rd,Rn,# ADDS Rd,Rd,# ADD Rd,# ADDS Rd,Rn,Rm ADD Rd,Rn,Rm ADCS Rd,Rd,Rm ADC Rd,Rm SUBS Rd, Rn,# SUB Rd,Rn,# SUBS Rd,Rd,# SUB Rd,#,THUMB 指令系統(tǒng),86,Thumb數(shù)據(jù)處理指令與等價的 ARM指令,ARM指令 Thumb指令 SUBS Rd,Rn,Rm SUB Rd,Rn,Rm SBCS Rd,RdRm SBC Rd,Rm RSBS Rd,Rn,#0 NEG R
52、dRn MOVS Rd,Rm,LSL # LSL Rd,Rm# MOVS Rd,Rd,LSL Rs LSL Rd,R9 MOVS Rd,Rm,LSR# LSR Rd,Rm,# MOVS Rd,Rd,LSR Rs LSR Rd,Rs MOVS Rd,Rm, ASR# ASR Rd,Rm,# MOVS Rd,Rd,ROR Rs ASR Rd, Rs,THUMB 指令系統(tǒng),87,Thumb數(shù)據(jù)處理指令與等價的 ARM指令,ARM指令 Thumb 指令 MOVS Rd,Rd,ROR Rs ROR Rd, Rs ANDS Rd,Rd,Rm AND Rd, Rm EORS Rd,Rd,Rm EOR Rd,
53、Rm ORRS Rd,RdRm ORR Rd,Rm BICS Rd,Rd,Rm BIC Rd,Rm MULS Rd,Rm,Rd MUL Rd,Rm,THUMB 指令系統(tǒng),88,Thumb數(shù)據(jù)處理指令與等價的 ARM指令,使用高8個寄存器(r8r15)的指令,在有些情況下結(jié)合低8個寄存器使用: ARM指令 Thumb 指令 ADD Rd,Rd,Rm ADD Rd,Rm(1/2 Hi regs) CMP Rn,Rm CMP Rn,Rm(1/2 Hi regs) MOV Rd,Rm ADD Rd,Rm(1/2 Hi regs) ADD Rd, pc,# ADD Rd,pc,#(#imm8 ADD R
54、d,sp,# ADD Rd,sp,# ADD sp,sp,# ADD sp,sp,# SUB sp,sp,# SUB sp,sp,#,THUMB 指令系統(tǒng),89,Thumb數(shù)據(jù)處理指令與等價的 ARM指令,注意事項: 所有對低8個寄存器操作的數(shù)據(jù)處理指令都更新條件碼位(等價的ARM指令位s置位)。 對高8個寄存器操作的指令不改變條件碼位。CMP指令除外,它只改變條件碼。 上面的指令中“1/2 Hi regs表示至少有1個寄存器操作數(shù)是高8位寄存器。 #imm3、#imm7、#imm8分別表示3位、7位和8位立即數(shù)域。#sh表示5位的移位數(shù)域。,THUMB 指令系統(tǒng),90,Thumb單寄存器數(shù)據(jù)
55、傳送指令,LDR|STRB Rd,Rn, #off5 LDRH | STRH Rd,Rn,#off5 LDR|STRSH|BRd,Rn,Rm LDR Rd, pc, #off8 LDR |STR Rd,sp,#off8 說 明 這些指令是從ARM單寄存器傳送指令中精心導(dǎo)出的子集,并且與等價的ARM指令有嚴(yán)格相同的語義。 在所有的指令中,對偏移量需要根據(jù)數(shù)據(jù)類型按比例調(diào)整。例如,5位偏移量的范圍在字節(jié)Load和Store指令中是32字節(jié),在半字Load和Store指令中是64字節(jié),在字Load和Store指令中是128字節(jié),THUMB 指令系統(tǒng),91,Thumb多寄存器數(shù)據(jù)傳送指令,同ARM指令
56、一樣,Thumb多寄存器數(shù)據(jù)傳送指令可以用于過程調(diào)用與返回以及存儲器塊拷貝。但為了編碼的緊湊性,這兩種用法由分開的指令實現(xiàn),其尋址方式的數(shù)量也有所限制,在其他方面,這些指令的性質(zhì)與等價的ARM指令相同。 LDMIA Rn!, STMIA Rn!, POP ,pc PUSH ,1r,THUMB 指令系統(tǒng),92,Thumb多寄存器數(shù)據(jù)傳送指令,指令的塊拷貝形式使用LDMIA和STMlA尋址模式。寄存器 (低8個寄存器r0r7)中的任何一個可以作為基址寄存器。 寄存器列表可以是這些寄存器的任意子集,但不應(yīng)包括基址寄存器,因為總是選擇回寫。 堆棧形式使用SP(r13)作為基址寄存器,并且也總是使用回寫
57、。堆棧的模式也固定為滿棧遞減。寄存器列表除了可以是8個Lo寄存器外,鏈接寄存器LR可以出現(xiàn)在PUSH指令中,PC可以出現(xiàn)在POP指令中,以優(yōu)化過程調(diào)用及返回程序。,THUMB 指令系統(tǒng),93,Thumb的應(yīng)用,高端的32位ARM系統(tǒng)可以用Thumb代碼實現(xiàn)特定的非關(guān)鍵程序,以節(jié)省功耗或降低對存儲器的需求。 低端的16位系統(tǒng)可以有小規(guī)模的32位片上RAM供運行ARM代碼的關(guān)鍵程序使用,所有非關(guān)鍵程序使用片外Thumb代碼。 上面第二種情況或許更接近于Thumb所適宜的應(yīng)用。在移動電話和尋呼機的應(yīng)用中,需要ARM最大處理能力的實時信號處理(DSP)功能但這些程序可以緊湊編碼井放在小規(guī)模的片上存儲器
58、中。那些控制用戶界面、電池管理系統(tǒng)等等復(fù)雜的比較長的代碼是非實時的,可由Thumb代碼放在片外ROM中,由8位或16位總線就可以得到好的性能,同時降低成本和延長電池壽命。,THUMB 指令系統(tǒng),94,ATPCS,為了使單獨編譯的c語言程序和匯編程序之間能夠相互調(diào)用,必須為于程序間的調(diào)用規(guī)定一定的規(guī)則。ATPCS就是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則。 ATPCS規(guī)定了一些子程序間調(diào)用的基本規(guī)則。這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則,數(shù)據(jù)棧的使用規(guī)則,參數(shù)的傳遞規(guī)則。 為適應(yīng)一些特定的需要,對這些基本的調(diào)用規(guī)則進行一些修改得到幾種不同的子程序調(diào)用規(guī)則。這些特定的調(diào)用規(guī)則
59、包括:,ATPCS介紹,95,支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS。 支持只讀段位置無關(guān)(ROPl)的ATPCS。 支持可讀寫段位置無關(guān)(RWPl)的ATPCS。 支持ARM程序和Thumb程序混合使用的ATPCS。 處理浮點運算的ATPCS。 有調(diào)用關(guān)系的所有子程序必須遵守同一種ATPCS。編譯器或者匯編器在ELF格式的目標(biāo)文件中設(shè)置相應(yīng)的屬性,標(biāo)識用戶選定的ATPCS類型。 對應(yīng)于不同類型的ATPCS規(guī)則,有相應(yīng)的c語言庫,連接器根據(jù)用戶指定的ATPCS類型連接相應(yīng)的c語言庫。,ATPCS介紹,96,使用C語言編澤器編譯的C語言子程序滿足用戶指定的ATPCS類型而對于匯編語言程序來說,完全要依賴用戶來保證各子程序滿足選定的ATPCS類型。具體來說,匯編語言子程序必須滿足下面3個條件: 在于程序編寫時必須遵守相應(yīng)的ATPCS規(guī)則。 數(shù)據(jù)棧的使用要遵守相應(yīng)的ATPCS規(guī)則 在匯編編譯器中使甩atpcs選項。,ATPCS介紹,97,基本ATPCS,基本ATPCS規(guī)定了在子程序調(diào)用時的一些基本規(guī)則,包括下面3方面的內(nèi)容: 各寄存器的使用規(guī)則及其相應(yīng)的名稱。 數(shù)據(jù)棧的使用規(guī)則。 參數(shù)傳遞的規(guī)則。,ATPCS介紹,98,相對于其他類型的
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年工程稅收與結(jié)算合同
- 2024年度電競游戲開發(fā)與發(fā)行合同
- 2024年丙方法律咨詢與代理合同
- 2024年應(yīng)急出口指示牌制作安裝合同
- 2024年城市道路泥水施工合同
- 2024年建筑工程所需材料采購協(xié)議
- 2024年度無人機制造與銷售合同
- 2024園林綠化工程綠化帶規(guī)劃與設(shè)計合同
- 2024騰訊朋友圈廣告合同
- 2024年度醫(yī)院醫(yī)療設(shè)備采購與安裝合同
- 口腔常見疾病的診治
- MOOC 人像攝影-中國傳媒大學(xué) 中國大學(xué)慕課答案
- MOOC 計算機組成原理-電子科技大學(xué) 中國大學(xué)慕課答案
- 2024年江蘇無錫市江陰市江南水務(wù)股份有限公司招聘筆試參考題庫含答案解析
- 中學(xué)教材、教輔征訂管理制度
- (高清版)DZT 0213-2002 冶金、化工石灰?guī)r及白云巖、水泥原料礦產(chǎn)地質(zhì)勘查規(guī)范
- 消防安全評估消防安全評估方案
- 工程造價專業(yè)《工程經(jīng)濟》課程標(biāo)準(zhǔn)
- ZARA服裝市場營銷策略研究分析 市場營銷專業(yè)
- 設(shè)備維保的市場化運作與服務(wù)模式創(chuàng)新
- 幼兒園科普知識宣傳
評論
0/150
提交評論