版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、常用ARM v4指令集及匯編VI前 言零零散散用了大概一周的時(shí)間,在常用ARM指令集及匯編(2003年12月1日)的基礎(chǔ)上,大致學(xué)習(xí)了一遍ARM指令集和匯編,看的過程當(dāng)中更正了一些錯(cuò)誤的地方,并結(jié)合其它資料適當(dāng)添加了一些內(nèi)容,也做了一些刪減,現(xiàn)分享出來,希望能幫助到需要的人。文中必然還有一些錯(cuò)誤還有待改進(jìn),有些地方還需要解釋的更加詳細(xì),本人精力有限,希望有心的讀者,訂正并增加注釋,最好也分享出來,以方便大家對ARM指令的深入理解。作為剛?cè)胄械男率?,不謙虛的推薦幾本書:ARM體系結(jié)構(gòu)與編程-杜春雷,嵌入式系統(tǒng)體系結(jié)構(gòu)、編程與設(shè)計(jì)-Raj Kamal著,賈建斌譯,嵌入式系統(tǒng):采用公開源代碼和Str
2、ongARM_XScale處理器-毛德操。這幾本書到底好不好,看個(gè)人需求和喜好吧,仁者見仁智者見智。最后,感謝常用ARM指令集及匯編的原作者和其它資料的作者讓我有機(jī)會學(xué)習(xí)我不熟悉的東西,謝謝。learllp2015-11-09目 錄常用ARM v4指令集及匯編I前 言II目 錄IIIARM v4指令集及匯編1一、ARM處理器尋址方式1寄存器尋址1立即尋址1寄存器偏移尋址2寄存器間接尋址2基址尋址3多寄存器尋址3堆棧尋址3塊拷貝尋址4相對尋址4二、指令集介紹5ARM指令集5指令格式5基本格式5第2個(gè)操作數(shù)51.immed_8r常數(shù)表達(dá)式52.Rm 寄存器方式63.Rm,shift寄存器移位方式6
3、條件碼7ARM 存儲器訪問指令8LDR和STR8LDM和STM11SWP14ARM 數(shù)據(jù)處理指令15數(shù)據(jù)傳送指令15算術(shù)邏輯運(yùn)算指令16比較指令18乘法指令19ARM 跳轉(zhuǎn)指令21ARM 協(xié)處理器指令22ARM 雜項(xiàng)指令24ARM 偽指令26Thumb 指令集29Thumb 指令集與 ARM 指令集的區(qū)別29跳轉(zhuǎn)指令29數(shù)據(jù)處理指令29單寄存器加載和存儲指令29批量寄存器加載和存儲指令30Thumb 存儲器訪問指令30偽指令31符號定義偽指令32數(shù)據(jù)定義偽指令34報(bào)告?zhèn)沃噶?9匯編控制偽指令41雜項(xiàng)偽指令43AREA45CODE16 和 CODE3246END46ENTRY46EQU47EXP
4、ORT 和 GLOBAL47IMPORT 和 EXTERN47GET 和 INCLUDE48INCBIN48KEEP49NOFP49REQUIRE49PEQUIRE8 和 PRESERVE849RN49ROUT50ARM 偽指令50ADR50ADRL50LDR51NOP51LDFD51LDFS51三、ARM匯編程序設(shè)計(jì)51文件格式51ARM 匯編的一些規(guī)范52匯編語句格式52標(biāo)號52基于PC 的標(biāo)號53基于寄存器的標(biāo)號53絕對地址53局部標(biāo)號53符號54常量54數(shù)字常數(shù)54字符常量54布爾常量55段定義55宏定義及其作用55子程序的調(diào)用56數(shù)據(jù)比較跳轉(zhuǎn)57循環(huán)57數(shù)據(jù)塊復(fù)制57棧操作58特殊寄
5、存器定義及應(yīng)用58散轉(zhuǎn)功能58查表操作58長跳轉(zhuǎn)59對信號量的支持59偽指令使用59一個(gè)完整的例子59外圍部件控制60四、C與匯編混合編程60內(nèi)嵌匯編60內(nèi)嵌匯編的指令用法62內(nèi)嵌匯編器與 armasm 匯編器的差異63內(nèi)嵌匯編注意事項(xiàng)63訪問全局變量65C與匯編相互調(diào)用65寄存器的使用規(guī)則66堆棧使用規(guī)則66參數(shù)傳遞規(guī)則66C程序調(diào)用匯編程序67調(diào)用匯編的C函數(shù):67匯編程序調(diào)用C程序68五、ARM 指令集列表69ARM 存儲器訪問指令表列表69ARM 數(shù)據(jù)處理指令列表70ARM 乘法指令列表71ARM 跳轉(zhuǎn)指令列表72ARM 協(xié)處理器指令列表73ARM 雜項(xiàng)指令列表74ARM 偽指令列表7
6、5六、Thumb 指令集列表120Thumb 存儲器訪問指令列表120Thumb 數(shù)據(jù)處理指令列表121Thumb 跳轉(zhuǎn)指令及軟中斷指令列表122Thumb 偽指令列表123七、匯編預(yù)定義變量及偽指令124預(yù)定義的寄存器和協(xié)處理器名124通用寄存器124程序狀態(tài)寄存器124浮點(diǎn)數(shù)寄存器124協(xié)處理器及協(xié)處理器寄存器125八、內(nèi)置變量列表125九、偽指令列表126十、指令條件碼列表128十一、CPSR 和 SPSR 分配圖129ARM v4指令集及匯編ARM 處理器是基于精簡指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡單,具有 32 位 ARM 指令集和 16 位 Thumb
7、指令集。ARM 指令集效率高,但是代碼密度低,而 Thumb 指令集具有更好的代碼密度,卻仍然保持 ARM 的大多數(shù)性能上的優(yōu)勢,它是 ARM 指令集的子集,主要用于編譯器設(shè)計(jì)。所有 ARM 指令都是可以有條件執(zhí)行的,而 Thumb 指令僅有一條指令具備條件執(zhí)行功能。ARM 程序和 Thumb 程序可相互調(diào)用,相互之間的狀態(tài)切換開銷幾乎為零。一、ARM處理器尋址方式尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式,ARM 處理器有 9 種基本尋址方式。寄存器尋址操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時(shí)直接取出寄存器值操作。寄存器尋址指令舉例如下:
8、MOVR1,R2;R2 -> R1SUBR0,R1,R2;R1 - R2->R0立即尋址立即尋址指令中的操作碼字段后面的地址碼部分就是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1 ;R01 ->R0MOVR0,#0xff00;0xff00 ->R0立即數(shù)要以“”為前綴,表示 16 進(jìn)制數(shù)值時(shí)以“0x”表示。寄存器偏移尋址寄存器偏移尋址是 ARM 指令集特有的尋址方式,當(dāng)?shù)?2 操作數(shù)是寄存器偏移方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器偏移
9、尋址方式指令舉例如下:MOVR0,R2,LSL #3;R2 的值左移 3 位,結(jié)果放入 R0,即 R0 = R2 * 8 ANDS R1,R1,R2,LSL R3;R2 的值左移 R3 位,然后和 R1 相與操作,結(jié)果放入 R1 可采用的移位操作如下:LSL:邏輯左移(Logical Shift Left),寄存器中字的低端空出的位補(bǔ) 0。LSR:邏輯右移(Logical Shift Right),寄存器中字的高端空出的位補(bǔ) 0。ASR:算術(shù)右移(Arithmetic Shift Right),移位過程中保持符號位不變,即如果源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ) 0,否則補(bǔ) 1。ROR:循環(huán)右
10、移(Rotate Right),由字的低端移出的位填入字的高端空出的位。RRX:帶擴(kuò)展的循環(huán)右移(Rotate Right extended by 1place),操作數(shù)右移一位,高端空出的位用原 C 標(biāo)志值填充。各移位操作如下圖所示:寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器編號,所需要的操作數(shù)保 存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDRR1,R2;將 R2 中的數(shù)值作為地址,取出此地址中的數(shù)據(jù)保存在 R1 中SWPR1,R1,R2;將如中的數(shù)值作為地址,取出此地址中的數(shù)值與 R1 中的值交換基址尋址基址尋址是將基址
11、寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址,基址尋址用于訪問基址附近的存儲單元,常用于查表,數(shù)組操作,功能部件寄存器訪問等?;穼ぶ分噶钆e例如下:LDRR2,R3,#0x0F ;將R3中的數(shù)值加0x0F作為地址,將該地址保存在R2中STRR1,R0,#-2 ;將R0中的數(shù)值減2作為地址,把R1中的內(nèi)容保存到此地址多寄存器尋址多寄存器尋址就是一次可以傳送幾個(gè)寄存器值,允許一條指令傳送 16 個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,R2-R7,R12 ;將 R1 單元中的數(shù)據(jù)讀出到 R2R7,R12,R1自動加 1STMIA R0!,R3-R6
12、,R10;將R3-R6,R10中的數(shù)據(jù)保存到R0,R0自動加1 使用多寄存器尋址指令時(shí),寄存器子集的順序由小到大的順序排列,連續(xù)的寄存器可用“”連接,否則用“,”分隔書寫。堆棧尋址堆棧是特定順序進(jìn)行存取的存儲區(qū),操作順序分為“后進(jìn)先出”和“先進(jìn)后出”,堆棧尋址是隱含的,它使用一個(gè)專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針?biāo)赶虻拇鎯卧褪嵌褩5臈m?。存儲器堆??煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧。向下生長:向低地址方向生長,稱為遞減堆棧。堆棧指針指向最后壓入堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧;堆棧指針指向下一個(gè)要放入的空位置,稱為空堆棧。這樣就有 4種類型的堆棧表示。滿
13、遞增:堆棧通過遞增存儲器的地址向上增長,堆棧指針指向堆棧內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址。指令如 LDMFA,STMFA 等??者f增:堆棧通過遞增存儲器的地址向上增長,堆棧指針指向堆棧內(nèi)的第一個(gè)空位置。指令如 LDMEA,STMEA 等。滿遞減:堆棧通過遞減存儲器的地址向下增長,堆棧指針指向堆棧內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址。指令如 LDMFD,STMFD 等。 空遞減:堆棧通過遞減存儲器的地址向下增長,堆棧指針指向堆棧下的第一個(gè)空位置。指令如 LDMED,STMED 等。 堆棧尋址指令舉例如下:STMFDSP!,R1-R7,LR;將 R1R7,LR 入棧LDMFDSP!,R1-R7,LR;數(shù)據(jù)出棧,放入
14、R1R7,LR 寄存器塊拷貝尋址多寄存器傳送指令用于一塊數(shù)據(jù)從存儲器的某一位置拷貝到另一位置。 塊拷貝尋址指令舉例如下:STMIAR0!,R1-R7;將 R1R7 的數(shù)據(jù)保存到存儲器中,存儲器指針在保存第一;個(gè)值之后增加,增長方向?yàn)橄蛏显鲩LSTMIBR0!,R1-R7;將 R1R7 的數(shù)據(jù)保存到存儲器中,存儲器指針在保存第一;個(gè)值之前增加,增長方向?yàn)橄蛏显鲩LSTMDAR0!,R1-R7;將 R1R7 的數(shù)據(jù)保存到存儲器中,存儲器指針在保存第一;個(gè)值之后增加,增長方向?yàn)橄蛳略鲩LSTMDBR0!,R1-R7;將 R1R7 的數(shù)據(jù)保存到存儲器中,存儲器指針在保存第一;個(gè)值之前增加,增長方向?yàn)橄蛳略鲩L
15、相對尋址相對尋址是基址尋址的一種變通,由程序計(jì)數(shù)器 PC 提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下:BLROUTE1;調(diào)用 ROUTE1 子程序BEQLOOP;條件跳轉(zhuǎn)到 LOOP 標(biāo)號處LOOPMOV R2,#2ROUTE1二、指令集介紹ARM指令集指令格式基本格式<opcode><cond>S <Rd>,<Rn>,<opcode2> 其中,<>內(nèi)的項(xiàng)是必須的,內(nèi)的項(xiàng)是可選的,如<opcode>是指令助記符,是必須的,而<cond>
16、為指令執(zhí)行條件,是可選的,如果不寫則使用默認(rèn)條件 AL(無條件執(zhí)行)。 opcode指令助記符,如 LDR,STR 等cond執(zhí)行條件,如 EQ,NE 等S是否影響 CPSR 寄存器的值,帶S則影響 CPSR,否則不影響Rd目標(biāo)寄存器Rn第一個(gè)操作數(shù)的寄存器operand2第二個(gè)操作數(shù)指令格式舉例如下:SUBNES R1,R1,#0xD;條件執(zhí)行減法運(yùn)算(NE),R1-0xD=>R1,影響CPSR寄存器,帶有S第2個(gè)操作數(shù)在 ARM 指令中,靈活的使用第 2 個(gè)操作數(shù)能提高代碼效率,第 2 個(gè)操作數(shù)形式如有3種形式:1.immed_8r常數(shù)表達(dá)式該常數(shù)必須對應(yīng) 8 位位圖,即常數(shù)是由一個(gè)
17、 8 位的常數(shù)循環(huán)移位偶數(shù)位得到。此處immed_8r可以是一個(gè)32位的立即數(shù),但這不是一個(gè)任意的32位立即數(shù),它必須是一個(gè)8位立即數(shù)在32位范圍內(nèi)進(jìn)行偶數(shù)次循環(huán)右移能夠獲得的數(shù),否則編譯時(shí)會出錯(cuò)。在12位的operand2中:后8位存數(shù)據(jù),前4位存移位的次數(shù)。8位存數(shù)據(jù):解釋了“該常數(shù)必須對應(yīng)8位位圖”。4位存移位的次數(shù):解釋了為什么只能移偶數(shù)位。4位只有16種可能值,而32位數(shù)可以循環(huán)移位32次(32種可能),那就只好限制:只能移偶數(shù)位,一次移動兩位,好像一個(gè)16位數(shù)在移位,16種移位可能。合法常量: 0x3FC、0、0xF0000000、200,0xF0000001非法常量: 0x1FE
18、、511、0xFFFF、0x1010、0xF0000010解釋:0x3FC,可以通過對0xFF循環(huán)右移30次獲得。0xF0000001,可以通過對0x1F循環(huán)右移4次獲得。0x1010,不能通過對某個(gè)8位數(shù)循環(huán)右移偶數(shù)次得到,所以非法。常數(shù)表達(dá)式應(yīng)用舉例如下:MOVR0,#1;R0=1ANDR1,R2,#0x0F;R2 與 0x0F,結(jié)果保存在 R1LDRR0,R1,#-4 ;讀取R1 地址上的存儲器單元內(nèi)容,且R1R142.Rm 寄存器方式在寄存器方式下操作數(shù)即為寄存器的數(shù)值。寄存器方式應(yīng)用舉例:SUBR1,R1,R2;R1 =R1-R2MOVPC,R0;PC=R0,程序跳轉(zhuǎn)到指定地址LDR
19、R0,R1,-R2;先讀取 R1 的內(nèi)容并存入R0,后R1=R1-R23.Rm,shift寄存器移位方式 將寄存器的移位結(jié)果作為操作數(shù),但 RM 值保存不變,移位方法如下:ASR#n 算術(shù)右移 n 位(1n32) LSL #n 邏輯左移 n 位(1n31) LSR #n 邏輯左移 n 位(1n32) ROR #n 循環(huán)右移 n 位(1n31) RRX帶擴(kuò)展的循環(huán)右移 1 位寄存器偏移方式應(yīng)用舉例:ADD R1,R1,R1,LSL #3;R1=R1*9,此處Rs位置為一個(gè)立即數(shù)SUB R1,R1,R2,LSR #2;R1=R1-R2*4R15 為處理器的程序計(jì)數(shù)器PC,一般不要對其進(jìn)行操作,而且
20、有些指令是不允許使用 R15,如 UMULL 指令。條件碼使用指令條件碼,可實(shí)現(xiàn)高效的邏輯操作,提高代碼效率。條件碼表?xiàng)l件碼助記符CPRS標(biāo)志含義EQZ1相等NEZ0不相等CS/HSC=1無符號數(shù)大于或等于CC/LOC=0無符號數(shù)小于MIN=1負(fù)數(shù)PLN=0正數(shù)或零VSV=1溢出VCV=0沒有溢出HIC=1,Z=0無符號數(shù)大于LSC=0,Z=1無符號數(shù)小于或等于GEN=V帶符號數(shù)大于或等于LTN!=V帶符號數(shù)小于GTZ=0,N=V帶符號數(shù)大于LEZ=1,N!=V帶符號數(shù)小于或等于AL任何無條件執(zhí)行(指令默認(rèn)條件)對于 Thumb 指令集,只有 B 指令具有條件碼執(zhí)行功能,此指令條件碼同上表,但
21、如果為無條件執(zhí)行時(shí),條件碼助記符“AL”不能在指令中書寫。條件碼應(yīng)用舉例如下: 比較兩個(gè)值大小,并進(jìn)行相應(yīng)加 1 處理,C 代碼為 if(ab)a+;elseb+;對應(yīng)的 ARM 指令如下。其中R0 為 a,R1 為 b。CMP R0,R1;R0 與 R1 比較ADDHIR0,R0,#1;若 R0R1,則 R0=R0+1ADDLSR1,R1,#1;若 R0=R1,則 R1=R1+1若兩個(gè)條件均成立,則將這兩個(gè)數(shù)值相加,C 代碼為If(a!=10)&&(b!=20) a=a+b;對應(yīng)的 ARM 指令如下,其中R0為 a,R1 為 b。CMP R0,#10;比較 R0 是否為 10
22、CMPNER1,#20;若 R0 不為 10,則比較 R1 是否 20ADDNER0,R0,R1;若 R0 不為 10 且 R1 不為 20,指令執(zhí)行,R0=R0+R1ARM 存儲器訪問指令A(yù)RM 處理是加載/存儲體系結(jié)構(gòu)的典型的 RISC 處理器,對存儲器的訪問只能使用加載和存儲指令實(shí)現(xiàn)。ARM 的加載/存儲指令是可以實(shí)現(xiàn)字、半字、無符/有符字節(jié)操作;批量加載/存儲指令可實(shí)現(xiàn)一條指令加載/存儲多個(gè)寄存器的內(nèi)容,大大提高效率;SWP 指令是一條寄存器和存儲器內(nèi)容交換的指令,可用于信號量操作等。ARM 處理器是馮.諾依曼或者哈佛存儲結(jié)構(gòu),程序空間、RAM 空間及 IO 映射空間統(tǒng)一編址,除對 R
23、AM 操作以外,對外圍 IO、程序數(shù)據(jù)的訪問也均要通過加載/存儲指令進(jìn)行。ARM 存儲訪問指令表助記符說明操作條件碼位置LDRRd,addressing加載字?jǐn)?shù)據(jù)Rdaddressing,addressing 索引LDRcondLDRBRd,addressing加載無符字節(jié)數(shù)據(jù)Rdaddressing,addressing 索引LDRcondBLDRTRd,addressing以用戶模式加載字?jǐn)?shù)據(jù)Rdaddressing,addressing 索引LDRcondTLDRBT Rd,addressing以用戶模式加載無符號字?jǐn)?shù)據(jù)Rdaddressing,addressing 索引LDRcondB
24、TLDRHRd,addressing加載無符半字?jǐn)?shù)據(jù)Rdaddressing,addressing 索引LDRcondHLDRSB Rd,addressing加載有符字節(jié)數(shù)據(jù)Rdaddressing,addressing 索引LDRcondSBLDRSH Rd,addressing加載有符半字?jǐn)?shù)據(jù)Rdaddressing,addressing 索引LDRcondSHSTRRd,addressing存儲字?jǐn)?shù)據(jù)addressingRd,addressing 索引STRcondSTRBRd,addressing存儲字節(jié)數(shù)據(jù)addressingRd,addressing 索引STRcondBSTRTR
25、d,addressing以用戶模式存儲字?jǐn)?shù)據(jù)addressingRd,addressing 索引STRcondTSRTBT Rd,addressing以用戶模式存儲字節(jié)數(shù)據(jù)addressingRd,addressing 索引STRcondBTSTRHRd,addressing存儲半字?jǐn)?shù)據(jù)addressingRd,addressing 索引STRcondHLDMmode Rn!,reglist批量(寄存器)加載reglistRn,Rn 回存等LDMcondmoreSTMmode Rn!,rtglist批量(寄存器)存儲Rn reglist,Rn 回存等STMcondmoreSWPRd,Rm,Rn
26、寄存器和存儲器字?jǐn)?shù)據(jù)交換RdRd,RnRm(RnRd 或 Rm)SWPcondSWPBRd,Rm,Rn寄存器和存儲器字節(jié)數(shù)據(jù)交換RdRd,RnRm(RnRd 或 Rm)SWPcondBLDR和STR單一加載/存儲字和無符號字節(jié)指令。使用單一數(shù)據(jù)傳送指令(STR和LDR)來裝載和存儲單一字節(jié)或字的數(shù)據(jù)從/到內(nèi)存。LDR 指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中;STR 指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存。指令格式如下:LDRcondTRd,<地址> ;加載指定地址上的數(shù)據(jù)(字),放入 Rd 中 STRcondTRd,<地址> ;存儲數(shù)據(jù)(字)到指定地址的存儲單元,要存儲的數(shù)據(jù)
27、在 Rd 中 LDRcondBTRd,<地址>;加載字節(jié)數(shù)據(jù),放入 Rd 中,即 Rd 最低字節(jié)有效,高 24 位清零STRcondBTRd,<地址>;存儲字節(jié)數(shù)據(jù),要存儲的數(shù)據(jù)在 Rd,最低字節(jié)有效其中,T 為可選后綴,若指令有 T,那么即使處理器是在特權(quán)模式下,存儲系統(tǒng)也將訪問看成是處理器是在用戶模式下。T 在用戶模式下無效,不能與前索引偏移一起使用 T。 LDR/STR 指令尋址是非常靈活的,由兩部分組成,一部分為一個(gè)基址寄存器,可以為任一 個(gè)通用寄存器,另一部分為一個(gè)地址偏移量。地址偏移量有以下 3 種格式:(1)立即數(shù)。立即數(shù)可以是一個(gè)無符號數(shù)值,這個(gè)數(shù)據(jù)可以
28、加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。指令舉例如下:LDRR1,R0,#0x12;將 R0+0x12 地址處的數(shù)據(jù)讀出,保存到 R1 中(R0 的值不變) LDRR1,R0,#-0x12;將 R0-0x12 地址處的數(shù)據(jù)讀出,保存到 R1 中(R0 的值不變) LDRR1,R0;將 R0 地址處的數(shù)據(jù)讀出,保存到 R1 中(零偏移) (2)寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。指令舉例如下:LDRR1,R0,R2;將 R0+R2 地址的數(shù)據(jù)計(jì)讀出,保存到 R1 中(R0 的值不變) LDRR1,R0,-R2;將 R0-R2 地址處的數(shù)據(jù)計(jì)讀出,
29、保存到 R1 中(R0 的值不變)(3)寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。指令舉例如下:LDRR1,R0,R2,LSL #2 ;將 R0+R2*4 地址處的數(shù)據(jù)讀出,保存到 R1 中(R0,R2 的值不變) LDRR1,R0,-R2,LSL #2;將 R0-R2*4 地址處的數(shù)據(jù)計(jì)讀出,保存到 R1 中(R0,R2 的值不變) 從尋址方式的地址計(jì)算方法劃分,加載/存儲指令有以下 4 種形式:(1)零偏移。Rn 的值作為傳送數(shù)據(jù)的地址,即地址偏移量為 0。指令舉例如下:LDRRd,Rn(2)前索引偏移。在數(shù)據(jù)傳送之前,將偏移量加到 Rn 中,
30、其結(jié)果作為傳送數(shù)據(jù)的存儲地址。若使用后綴“!”,則結(jié)果寫回到 Rn 中,且Rn 值不允許為 R15。指令舉例如下:LDR Rd,Rn,#0x04!LDR Rd,Rn,#-0x04(3)程序相對偏移。程序相對偏移是索引形式的另一個(gè)版本。匯編器根據(jù) PC 寄存器計(jì)算偏移量,并將 PC 寄存器作為 Rn 生成前索引指令。不能使用后綴“!”。指令舉例如下:LDRRd,label;label 為程序標(biāo)號,label 必須是在當(dāng)前指令的±4KB范圍內(nèi)(4)后索引偏移。Rn 的值用做傳送數(shù)據(jù)的存儲地址。在數(shù)據(jù)傳送后,將偏移量與 Rn相加,結(jié)果寫回到 Rn 中。Rn 不允許是 R15。指令舉例如下:
31、LDRRd,Rn,#0x04地址對齊大多數(shù)情況下,必須保證用于32位傳送的地址是32位對齊的。(所謂對齊,通常理解就是變量存儲的首地址要能夠整除變量的字節(jié)數(shù),這樣有助于CPU高效率的讀取數(shù)據(jù)。對于C語言,結(jié)構(gòu)體本身按照結(jié)構(gòu)體成員中最大的變量類型所占的字節(jié)數(shù)對齊,比如,變量中有8位的long long 型成員,最終,結(jié)構(gòu)體就按照8位對齊。例,/AMD 32位CPU,DEV-C+ 5.4.0編譯器,XP2系統(tǒng)struct test char x19;/占10個(gè)字節(jié)short x2;/占2個(gè)字節(jié)char x313;/占20個(gè)字節(jié)doublex4;/占8個(gè)字節(jié)char x55;/占8個(gè)字節(jié),為了結(jié)構(gòu)體
32、對齊;/結(jié)構(gòu)體共占48個(gè)字節(jié)各變量起始地址分別為:0x22fea8,0x22feb2,0x22feb4,0x22fec8,0x22fed0)加載/存儲字和無符號字節(jié)指令舉例如下:LDRR2,R5;加載 R5 指定地址上的數(shù)據(jù)(字),放入 R2 中STRR1,R0,#0x04;將 R1 的數(shù)據(jù)存儲到 R0+0x04 存儲單元,R0 值不變LDRB R3,R2,#1;讀取R2地址上的一個(gè)字節(jié)的數(shù)據(jù),并保存到R3中,R2=R3+1STRB R6,R7;讀R6的數(shù)據(jù)保存到R7指定的地址中,只存儲一個(gè)字節(jié)加載/存儲半字和帶符號字節(jié)。這類 LDR/STR 指令可能加載帶符字節(jié)加載帶符號半字、加載/存儲無符
33、號半字。偏移量格式、尋址方式與加載/存儲字和無符號字節(jié)指令相同。指令格式如下:LDRcondSBRd,<地址>;加載指定地址上的數(shù)據(jù)(帶符號字節(jié)),放入Rd 中LDRcondSHRd,<地址>;加載指定地址上的數(shù)據(jù)(帶符號半字),放入Rd 中LDRcondHRd,<地址>;加載半字?jǐn)?shù)據(jù),放入Rd中,低16位有效,高16位清零STRcondHRd,<地址>;存儲半字?jǐn)?shù)據(jù),要存儲的數(shù)據(jù)在Rd,低 16 位有效說明:帶符號位半字/字節(jié)加載是指帶符號位加載擴(kuò)展到32 位;無符號位半字加載是指零擴(kuò)展到 32 位。地址對齊,對半字傳送的地址必須為偶數(shù)。非半字
34、對齊的半字加載將使 Rd 內(nèi)容不可靠,非半字對齊的半字存儲將使指定地址的 2字節(jié)存儲內(nèi)容不可靠。加載/存儲半字和帶符號字節(jié)指令舉例如下:LDRSBR1 R0,R3;將R0+R3上的字節(jié)數(shù)據(jù)讀出到R1,高24位用符號位擴(kuò)展LDRSHR1,R9;將R9地址上的半字?jǐn)?shù)據(jù)讀出到R1,高16位用符號位擴(kuò)展LDRHR6,R2,#2; 將R2地址上的半字?jǐn)?shù)據(jù)讀出到R6,高16位用零擴(kuò)展,R2=R2+1 SHRHR1,R0,#2! ;將R1的數(shù)據(jù)保存到R0+2,只存儲低2字節(jié)數(shù)據(jù),R0=R0+2 LDR/STR 指令用于對內(nèi)存變量的訪問,內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件的控制操作等等,若使用 LDR 指令
35、加載數(shù)據(jù)到PC寄存器,則實(shí)現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實(shí)現(xiàn)了程序散轉(zhuǎn)。變量的訪問NumCountEQU0x40003000;定義變量 NumCount GPIO 設(shè)置 LDRR0,=NumCount ;使用 LDR 偽指令裝載NumCount的地址到R0LDRR1,R0;取出變量值A(chǔ)DDR1,R1,#1;NumCount=NumCount+1STRR1,R0;保存變量值GPIO-BASEEQU0Xe0028000;定義GPIO寄存器的基地址LDRR0,=GPIO-BASELDRR1,=0x00FFFF00;裝載32位立即數(shù),即設(shè)置值STRR1,R0,#0x0C;IODIR=0x00FFFF00,
36、IODIR 的地址為 0xE002800CMOV R1,#0x00F00000STRR1,R0,#0x04;IOSET=0x00F00000,IOSET 的地址為 0xE0028004程序散轉(zhuǎn)MOVR2,R2,LSL #2;功能號乘上 4,以便查表LDRPC,PC,R2;查表取得對應(yīng)功能子程序地址,并跳轉(zhuǎn)NOPFUN-TABDCDFUN-SUB0DCDFUN-SUB1DCDFUN-SUB2LDM和STM批量加載/存儲指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個(gè)寄存器,STM為存儲多個(gè)寄存器。允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。指令格式如下:LDMc
37、ond<模式>Rn!,reglistSTMcond<模式>Rn!,reglistLDM /STM 的主要用途是現(xiàn)場保護(hù)、數(shù)據(jù)復(fù)制、參數(shù)傳送等。其模式有8種,如下:(前面4種用于數(shù)據(jù)塊的傳輸,后面 4 種是堆棧操作)(1)IA:每次傳送后地址加 4(2)IB:每次傳送前地址加 4(3)DA:每次傳送后地址減 4(4)DB:每次傳送前地址減 4(5)FD:滿遞減堆棧(6)ED:空遞增堆棧(7)FA:滿遞增堆棧(8)EA:空遞增堆棧其中,寄存器 Rn 為基址寄存器,裝有傳送數(shù)據(jù)的初始地址,Rn 不允許為 R15;后綴“!”表示最后的地址寫回到Rn中;寄存器列表 reglist
38、 可包含多于一個(gè)寄存器或寄存器范圍,使用“,”分開,如R1,R2,R6-R9,寄存器排列由小到大排列;“”后綴不允許在用戶模式和系統(tǒng)模式下使用,若在LDM指令用寄存器列表中包含有PC時(shí)使用,那么除了正常的多寄存器傳送外,將SPSR拷貝到CPSR中,這可用于異常處理返回;使用“”后綴進(jìn)行數(shù)據(jù)傳送且寄存器列表不包含 PC 時(shí),加載/存儲的是用戶模式的寄存器,而不是當(dāng)前模式的寄存器。地址對準(zhǔn)這些指令忽略地址的位1:0 批量加載/存儲指令舉例如下:LDMIAR0!,R3-R9;加載 R0 指向的地址上的多字?jǐn)?shù)據(jù),保存到R3R9 中,R0 值更新 STMIAR1!,R3-R9;將 R3R9 的數(shù)據(jù)存儲到
39、R1指向的地址上,R1值更新 STMFDSP!,R0-R7,LR ;現(xiàn)場保存,將 R0R7、LR 入棧LDMFDSP!,R0-R7,PC ;恢復(fù)現(xiàn)場,異常處理返回在進(jìn)行數(shù)據(jù)復(fù)制時(shí),先設(shè)置好源數(shù)據(jù)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、 LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB 進(jìn)行讀取和存儲。而進(jìn)行堆棧操作時(shí),則要先設(shè)置堆棧指針,一般使用 SP 然后使用堆棧尋址指令STMFD/LDMFD、STMED。LDMED、 STMFA/LDMFA、STMEA/LDMEA 實(shí)現(xiàn)堆棧操作。多寄存器傳送指令示意圖如下圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指
40、令執(zhí)行完后的基址寄存器。 a)指令STMIA R1!,R5-R7b)指令STMIB R1!,R5-R7c)指令STMDA R1!, R5-R7d)指令STMDB R1!,R5-R7數(shù)據(jù)是存儲在基址寄存器的地址之上還是之下,地址是在存儲第一個(gè)值之前還是之后增加還是減少。多寄存器傳送指令映射向上生長向下生長滿空滿空增加之前STMIBLDMIBSTMFALDMED之后STMIALDMIASTMEALDMFD增加之前LDMDBSTMDBLDMEASTMFD之后LDMDASTMDALDMFASTMED使用 LDM/STM 進(jìn)行數(shù)據(jù)復(fù)制:LDRR0,=SrcData;設(shè)置源數(shù)據(jù)地址LDRR1,=DstDa
41、ta;設(shè)置目標(biāo)地址LDMIAR0,R2-R9;加載 8 字?jǐn)?shù)據(jù)到寄存器R2-R9TMIAR1,R2R9;存儲寄存器 R2R9 到目標(biāo)地址使用 LDM/STM 進(jìn)行現(xiàn)場寄存器保護(hù),常在子程序中或異常處理使用:SENDBYTESTMFDSP!,R0-R7,LR;寄存器入堆BLDELAY;調(diào)用DELAY子程序LDMFDSP!,R0-R7,PC;恢復(fù)寄存器,并返回SWP寄存器和存儲器交換指令。SWP 指令用于將一個(gè)內(nèi)存單元(該單元地址放在寄存器 Rn 中)的內(nèi)容讀取到一個(gè)寄存器 Rd 中,同時(shí)將另一個(gè)寄存器 Rm 的內(nèi)容寫入到該內(nèi)存單元中。使用 SWP可實(shí)現(xiàn)信號量操作。指令格式如下: SWPcondB
42、 Rd,Rm,Rn其中,B 為可選后綴,若有 B,則交換字節(jié),否則交換 32 位字:Rd 為數(shù)據(jù)從存儲器加載到的寄存器;Rm 的數(shù)據(jù)用于存儲到存儲器中,若 Rd 與 Rm 相同,則為寄存器與存儲器內(nèi)容進(jìn)行交換;Rn 為要進(jìn)行數(shù)據(jù)交換的存儲器地址,Rn 不能與 Rd 和 Rm 相同。SWP 指令舉例如下:SWP R1,R1,R0 ;將 R1的內(nèi)容與 R0指向的存儲單元的內(nèi)容進(jìn)行交換SWPB R1,R2,R0 ;將 R0指向的存儲單元內(nèi)容讀取一字節(jié)數(shù)據(jù)到R1中;(高24 位清零),并將R2的內(nèi)容寫入到該內(nèi)存單元中;(最低字節(jié)有效)使用 SWP 指令可以方便地進(jìn)行信號量的操作:12C_SEMEQU0
43、x4000300012C_SEM_WAITMOV R0,#0LDRR0,=12C_SEMSWP R1,R1,R0;取出信號量,并設(shè)置其為 0CMP R1,#0;判斷是否有信號BEQ12C_SEM_WAIT ;若沒有信號,則等待ARM 數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為 3 類;數(shù)據(jù)傳送指令(如 MOV、MVN),算術(shù)邏輯運(yùn)算指令 (如 ADD,SUM,AND),比較指令(如 CMP,TST)。數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進(jìn)行操作。 所有 ARM 數(shù)據(jù)處理指令均可選擇使用 S 后綴,以影響狀態(tài)標(biāo)志。比較指令 CMP,CMN,TST 和 TEQ 不需要后綴 S,它們會直接影響狀態(tài)標(biāo)志。ARM 數(shù)
44、據(jù)處理指令助記符號說明操作條件碼位置MOV Rd ,operand2數(shù)據(jù)轉(zhuǎn)送Rdoperand2MOV condSMVN Rd ,operand2數(shù)據(jù)非轉(zhuǎn)送Rd(operand2)MVN condSADD Rd,Rn operand2加法運(yùn)算指令RdRn+operand2ADD condSSUB Rd,Rn operand2減法運(yùn)算指令RdRn-operand2SUB condSRSB Rd,Rn operand2逆向減法指令Rdoperand2-RnRSB condSADC Rd,Rn operand2帶進(jìn)位加法RdRn+operand2+carryADC condSSBC Rd,Rn op
45、erand2帶進(jìn)位減法指令RdRn-operand2-(NOT)CarrySBC condSRSC Rd,Rn operand2帶進(jìn)位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSC condSAND Rd,Rn operand2邏輯與操作指令RdRn&operand2AND condSORR Rd,Rn operand2邏輯或操作指令RdRn|operand2ORR condSEOR Rd,Rn operand2邏輯異或操作指令RdRnoperand2EOR condSBIC Rd,Rn operand2位清除指令RdRn&(operand2)BIC con
46、dSCMP Rn,operand2比較指令標(biāo)志 N、Z、C、VRn-operand2CMP condCMN Rn,operand2負(fù)數(shù)比較指令標(biāo)志 N、Z、C、VRnoperand2CMN condTST Rn,operand2位測試指令標(biāo)志 N、Z、C、VRnoperand2TST condTEQ Rn,operand2相等測試指令標(biāo)志 N、Z、C、VRnoperand2TEQ cond數(shù)據(jù)傳送指令MOV數(shù)據(jù)傳送指令。將 8 位立即數(shù)或寄存器(operant2)傳送到目標(biāo)寄存器 Rd,可用于移位運(yùn)算等操作。指令格式如下:MOVcondSRd,operand2 MOV 指令舉例如下:MOVR1
47、#0x10;R1=0x10MOVR0,R1;R0=R1MOVSR3,R1,LSL#2;R3=R12,并影響標(biāo)志位MOVPC,LR;PC=LR ,子程序返回MVN數(shù)據(jù)非傳送指令。將 8 位立即數(shù)或寄存器(operand2)按位取反后傳送到目標(biāo)寄存器(Rd),因?yàn)槠渚哂腥》垂δ?,所以可以裝載范圍更廣的立即數(shù)。指令格式如下:MVNcondSRd,operand2 MVN指令舉例如下:MVNR1,#0xFF;R1=0xFFFFFF00MVNR1,R2;將 R2 取反,結(jié)果存到R1算術(shù)邏輯運(yùn)算指令A(yù)DD加法運(yùn)算指令。將 operand2 數(shù)據(jù)與 Rn 的值相加,結(jié)果保存到 Rd 寄存器。指令格式如下:A
48、DDcondSRd,Rn,operand2 ADD指令舉例如下:ADDSR1,R1,#1;R1=R1+1ADDR1,R1,R2;R1=R1+R2ADDSR3,R1,R2,LSL #2 ;R3=R1+R22SUB減法運(yùn)算指令。用寄存器 Rn 減去 operand2。結(jié)果保存到 Rd 中。指令格式如下: SUBcondS Rd,Rn,operand2SUB 指令舉例如下SUBSR0,R0,#1;R0=R0-1SUBSR2,R1,R2;R2=R1-R2SUBR6,R7,#0x10;R6=R7-0x10RSB逆向減法指令。用寄存器 operand2 減法 Rn,結(jié)果保存到 Rd 中。指令格式如下: R
49、SBcondSRd,Rn,operand2SUB 指令舉例如下:RSBR3,R1,#0xFF00;R3=0xFF00-R1RSBS R1,R2,R2,LSL #2;R1=R22-R2=R2×3RSB R0,R1,#0;R0=-R1 ADC帶進(jìn)位加法指令。將 operand2 的數(shù)據(jù)與 Rn 的值相加,再加上 CPSR 中的 C 條件標(biāo)志位。結(jié)果保存到 Rd 寄存器。指令格式如下;ADCcondSRd,Rn,operand2ADC指令舉例如下:ADDSR0,R0,R2ADCR1,R1,R3;使用 ADC 實(shí)現(xiàn) 64 位加法,(R1、R0)=(R1、R0)+(R3、R2)SBC帶進(jìn)位減法
50、指令。用寄存器 Rn 減去 operand2,再減去 CPSR 中的 C 條件標(biāo)志位的非(即若 C 標(biāo)志清零,則結(jié)果減去 1),結(jié)果保存到 Rd 中。指令格式如下:SBCcondSRd,Rn,operand2 SBC指令舉例如下:SUBSR0,R0,R2SBCR1,R1,R3;使用 SBC 實(shí)現(xiàn) 64 位減法,(R1,R0)-(R3,R2)RSC帶進(jìn)位逆向減法指令。用寄存器 operand2 減去 Rn,再減去 CPSR 中的 C 條件標(biāo)志位, 結(jié)果保存到 Rd 中。指令格式如下:RSCcondSRd,Rn,operand2RSC指令舉例如下:RSBSR2,R0,#0RSCR3,R1,#0;使
51、用 RSC 指令實(shí)現(xiàn)求 64 位數(shù)值的負(fù)數(shù)AND邏輯與操作指令。將 operand2 值與寄存器 Rn 的值按位作邏輯與操作,結(jié)果保存到 Rd 中。指令格式如下:ANDcondSRd,Rn,operand2AND指令舉例如下:ANDSR0,R0,#x01;R0=R0&0x01,取出最低位數(shù)據(jù)ANDR2,R1,R3;R2=R1&R3ORR邏輯或操作指令。將 operand2 的值與寄存器 Rn 的值按位作邏輯或操作,結(jié)果保存到 Rd 中。指令格式如下:ORRcondSRd,Rn,operand2 ORR指令舉例如下:ORRR0,R0,#x0F;將 R0 的低 4 位置 1MOVR1,R2,LSR #4ORRR3,R1,R3,LSL #8 ;使用ORR指令將近R2的高8位數(shù)據(jù)移入到R3低8位中EOR邏輯異或操作指令。將 operand2 的值與寄存器 Rn 的值按位作邏輯異或操作,結(jié)果保 存到 Rd 中。指令格式如下:EORcondSRd,Rn,operand2 EOR指令舉例如下:EOR1,R1,#0x0F ;將 R1 的低 4 位取反EOR2,R1,R0;R2=R1R0EORSR0
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省鄭州市金水區(qū)實(shí)驗(yàn)中學(xué)2025屆高三第一次調(diào)研測試數(shù)學(xué)試卷含解析
- 山南市重點(diǎn)中學(xué)2025屆高考適應(yīng)性考試英語試卷含解析
- 山大附屬中學(xué)2025屆高三適應(yīng)性調(diào)研考試英語試題含解析
- 四川省青神中學(xué)2025屆高三第四次模擬考試英語試卷含解析
- 福建省龍巖市連城一中2025屆高考沖刺英語模擬試題含解析
- 內(nèi)蒙古呼倫貝爾市2025屆高考英語三模試卷含解析
- 2023年城市馬拉松投資申請報(bào)告
- 年終工作總結(jié)復(fù)盤模板
- 酒店餐飲衛(wèi)生管理制度
- 《頂尖導(dǎo)購培訓(xùn)》課件
- 江西宏柏新材料股份有限公司功能性氣凝膠生產(chǎn)基地建設(shè)項(xiàng)目環(huán)評報(bào)告書
- DB33∕T 1230-2020 金屬面板保溫裝飾板外墻外保溫系統(tǒng)應(yīng)用技術(shù)規(guī)程
- 水泥物資供應(yīng)、運(yùn)輸及售后服務(wù)方案
- DB13∕T 5023-2019 有限空間作業(yè)安全規(guī)范
- 日本隧道與地下工程新技術(shù)(PPT142頁)
- Tekla節(jié)點(diǎn)示例已全
- 胸膜間皮瘤的診治新進(jìn)展
- 菌群移植途徑的選擇與建立臨床應(yīng)用中國專家共識
- 可愛的嘉興三年級教材分析與教案(共23頁)
- 管理學(xué)試題庫--十三套試題及答案匯總
- 小學(xué)語文五年級下冊期末綜合練習(xí)試題含答案(共2套)
評論
0/150
提交評論