版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、ARM處理器的指令系統(tǒng)處理器的指令系統(tǒng)第3章1.ARM程序的文件類型:ARM開發(fā)中大部分程序使用C語言編寫,文件類型為“”;:涉及到硬件底層操作的代碼有時必須使用匯編語言編寫,文件類型為“”。2.為什么學(xué)習(xí)ARM指令系統(tǒng):本章目標(biāo)本章目標(biāo) 能夠掌握ARM指令的8種尋址方式 能夠掌握ARM基本編程實驗 熟悉ARM指令集 ARM處理器是基于精簡指令集計算機(RISC)原理設(shè)計的,指令集和相關(guān)譯碼機制較為簡單。ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢,它是AR
2、M指令集的子集。 所有的ARM指令都是可以有條件執(zhí)行有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。 ARM程序和Thumb程序可相互調(diào)用,相互之間的狀態(tài)切換開銷幾乎為零。 ARM指令集與Thumb指令集的關(guān)系Thumb指令集具有靈活、小巧的特點ARM指令集支持ARM核所有的特性,具有高效、快速的特點3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類 尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真實操作數(shù)地址的方式。ARM處理器具有8種基本尋址方式。1.寄存器尋址;2.立即尋址;3.寄存器移位尋址;4.寄存器間接尋址;5.基址尋址;6.多寄存器尋址;7.堆棧尋址;8.相對尋址
3、。 操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下: MOV R1,R2 ;將R2的值存入R1 SUB R0,R1,R2 ;將R1的值減去R2的值,結(jié)果保存到R0 0 xAA0 x55R2R13.1 ARM處理器尋址方式處理器尋址方式尋址方式分類寄存器尋址MOV R1,R2MOV R1,R20 xAA 立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下: SUBSR0,R0,#1 ;R0減1,結(jié)果放入R0
4、,并且影響標(biāo)志位MOVR0,#0 xFF000 ;將立即數(shù)0 xFF000裝入R0寄存器 0 x55R0MOV R0,#0 xFF00程序存儲3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類立即尋址MOV R0,#0 xFF00MOV R0,#0 xFF000 xFF00從代碼中獲得數(shù)據(jù) 寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個操作數(shù)是寄存器移位方式時,第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOVR0,R2,LSL #3 ;R2的值左移3位,結(jié)果放入R0, ;即是R0=R28 ANDSR1,R1,R2,LSL R3 ;R2的
5、值左移R3位,然后和R1相 ;“與”操作,結(jié)果放入R10 x55R0R20 x013.1 ARM處理器尋址方式處理器尋址方式尋址方式分類寄存器移位尋址MOV R0,R2,LSL #3MOV R0,R2,LSL #30 x080 x08邏輯左移3位 寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下: LDRR1,R2;將R2指向的存儲單元的數(shù)據(jù)讀出;保存在R1中 SWPR1,R1,R2;將寄存器R1的值和R2指定的存儲;單元的內(nèi)容交換 0 x55R0R2 0 x400000000 xAA
6、0 x400000003.1 ARM處理器尋址方式處理器尋址方式尋址方式分類寄存器間接尋址LDR R0,R2LDR R0,R20 xAA 基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等?;穼ぶ分噶钆e例如下: LDRR2,R3,#0 x0C ;讀取R3+0 x0C地址上的存儲單元 ;的內(nèi)容,放入R2 STRR1,R0,#-4! ;先R0=R0-4,然后把R1的值寄存 ;到保存到R0指定的存儲單元 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類基址尋址0 x55R2R3 0 x4
7、00000000 xAA0 x4000000CLDR R2,R3,#0 x0CLDR R2,R3,#0 x0C0 xAA將R3+0 x0C作為地址裝載數(shù)據(jù) 多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下: LDMIAR1!,R2-R7,R12 ;將R1指向的單元中的數(shù)據(jù)讀出到 ;R2R7、R12中(R1自動加1) STMIAR0!,R2-R7,R12 ;將寄存器R2R7、R12的值保 ;存到R0指向的存儲; 單元中 ;(R0自動加1)0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R
8、60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存儲器3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類多寄存器尋址LDMIA R1!,R2-R4,R6 LDMIA R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010 堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出” 。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針?biāo)赶虻拇鎯卧词嵌褩5臈m?。存儲器堆??煞譃閮煞N: 向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧
9、3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲區(qū)棧頂棧底棧區(qū)SP向下增長向上增長0 x123456780 x12345678堆棧壓棧堆棧壓棧棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址0 x123456780 x12345678棧頂SP0 x12345678棧頂SP壓棧壓棧所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指
10、向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA等; 空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等; 滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址 相對尋址是基址尋址的一種變通。由程序計數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下:BLSUBR1;調(diào)用到SUBR1子程序BEQLOO
11、P;條件跳轉(zhuǎn)到LOOP標(biāo)號處.LOOPMOVR6,#1.SUBR1. 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類相對尋址q1.ARM處理器尋址方式q2.指令集介紹 ARM指令集 Thumb指令集簡單的ARM程序;文件名:TEST1.S ;功能:實現(xiàn)兩個寄存器相加 ;說明:使用ARMulate軟件仿真調(diào)試 AREAExample1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識程序入口 CODE32 ;聲明32位ARM指令START MOVR0,#0 ;設(shè)置參數(shù) MOVR1,#10LOOPBLADD_SUB ;調(diào)用子程序ADD_SUB BLOOP ;跳轉(zhuǎn)
12、到LOOPADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結(jié)束 使用“;”進行注釋標(biāo)號頂格寫實際代碼段聲明文件結(jié)束ARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令 ARM指令的基本格式如下:3.2 指令集介紹指令集介紹ARM指令集指令格式 S , 其中號內(nèi)的項是必須的,號內(nèi)的項是可選的。各項的說明如下:opcode:指令助記符;cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器; Rn:第1個操作數(shù)的寄存器;operand2:第2個操作數(shù); ARM指令的基本格式如下:3.2 指令集介紹指令集介紹ARM指
13、令集第2個操作數(shù) S , 靈活的使用第2個操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r常數(shù)表達式;Rm寄存器方式;Rm,shift寄存器移位方式;3.2 指令集介紹指令集介紹ARM指令集第2個操作數(shù)#immed_8r常數(shù)表達式 該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)。循環(huán)右移10位0 x120 0 0 1 0 0 1 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x
14、801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 0移位前的8位常數(shù)0 x12移位后得到的常數(shù)0 x048000003.2 指令集介紹指令集介紹ARM指令集第2個操作數(shù)#immed_8r常數(shù)表達式 該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)。例如:MOVR0,#1ANDR1,R2,#0 x0FMOVR1,#0 xC000;0 xC000可由0 x03循環(huán)右移16位得到可以由0 x4A循環(huán)右移10位得到2.請列舉2個8位圖立即數(shù)? 思考與練習(xí)?1.以下8位圖立即數(shù)是否合法?0 x0103C0000 x128000000 x4000003B(
15、0 xED循環(huán)右移2位)0 x0016C000(0 x5B循環(huán)右移18位)3.2 指令集介紹指令集介紹ARM指令集第2個操作數(shù)Rm寄存器方式 在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUBR1,R1,R2MOVPC,R03.2 指令集介紹指令集介紹ARM指令集第2個操作數(shù)Rm,shift寄存器移位方式 將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR #n算術(shù)右移n位ROR #n循環(huán)右移n位LSL #n邏輯左移n位RRX帶擴展的循環(huán)右移1位LSR #n邏輯右移n位Type RsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。3.2 指令集
16、介紹指令集介紹ARM指令集第2個操作數(shù)LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C3.2 指令集介紹指令集介紹ARM指令集第2個操作數(shù)Rm,shift寄存器移位方式例如:ADDR1,R1,R1,LSL #3;R1=R1+R1*8=9R1SUBR1,R1,R2,LSR R3;R1=R1-(R2/2R3)ARM指令的特點可條件執(zhí)行、可選擇影響標(biāo)志位、具有非常靈活的第二操作數(shù);ARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令 ARM指令的基本格式如下:3.2 指令集介紹指令集介紹ARM指令集條件碼 S , 使用條件碼“cond”可以實現(xiàn)高效的邏輯操作,
17、提高代碼效率。 絕大部分的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行 功能。如果指令不標(biāo)明條件代碼,將默認為無條件(AL)執(zhí)行。操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于 1011LTN!=V有符號數(shù)小于 1100GTZ=0,N=V有符號數(shù)大于 11
18、01LEZ=1,N!=V有符號數(shù)小于或等于 1110AL任何無條件執(zhí)行 (指令默認條件) 1111NV任何從不執(zhí)行(不要使用) 指令條件碼表3.2 指令集介紹指令集介紹ARM指令集條件碼C代碼:if(a b)a+;elseb+;對應(yīng)的匯編代碼:CMPR0,R1 ;R0與R1比較ADDHI R0,R0,#1 ;若R0R1,則R0=R0+1ADDLS R1,R1,#1 ;若R0R1,則R1=R1+1示例:ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令 為什么要掌握部分常用ARM指令?通過指令的學(xué)習(xí)可以更深入的了解ARM硬件結(jié)構(gòu)的
19、特點;啟動代碼為了滿足大部分系統(tǒng)的順利運行,通常將系統(tǒng)硬件配置在最低性能,通過調(diào)整啟動代碼中的參數(shù)使其更適合自己的硬件系統(tǒng);通過觀察反匯編代碼了解程序執(zhí)行情況,比如某個變量的操作是否被編譯器優(yōu)化掉了。ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令3.2 指令集介紹指令集介紹ARM指令集存儲器訪問指令 ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現(xiàn)。ARM處理器是馮諾依曼存儲結(jié)構(gòu),程序空間、RAM空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數(shù)據(jù)的訪問均要通過加載/存儲指令進行
20、。 存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。 LDR/STR指令用于對內(nèi)存變量的訪問、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實現(xiàn)了程序散轉(zhuǎn)。 所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。3.2 指令集介紹指令集介紹ARM存儲器訪問指令單寄存器存取3.2 指令集介紹指令集介紹ARM存儲器訪問指令單寄存器存取裝載指令:存儲指令:存儲器源地址目標(biāo)寄存器存儲器目標(biāo)地址源寄存器3.2 指令集介紹指令集介紹ARM存儲器訪問指令單寄存器存取裝載指令:存儲指令:xxL
21、DR/STR指令搭配不同的后綴實現(xiàn)不同方式的單寄存器存取操作:字/半字/字節(jié)數(shù)據(jù)控制是/否用戶模式控制無/有符號控制助記符助記符說明說明操作操作條件碼位置條件碼位置LDR Rd,addressing 加載字字數(shù)據(jù)Rdaddressing,addressing索引LDRcondLDRB Rd,addressing 加載無符號字節(jié)字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondBLDRT Rd,addressing以用戶模式用戶模式加載字數(shù)據(jù)Rdaddressing,addressing索引LDRcondTLDRBT Rd, addressing 以用戶模式用戶模式加載無符
22、號無符號字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondBTLDRH Rd, addressing 加載無符號半字無符號半字數(shù)據(jù)Rdaddressing,addressing索引LDRcondHLDRSB Rd, addressing 加載有符號字節(jié)有符號字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondSBLDRSH Rd, addressing加載有符號半字有符號半字數(shù)據(jù) Rdaddressing,addressing索引 LDRcondSH ARM存儲器訪問指令裝載指令助記符助記符說明說明操作操作條件碼位置條件碼位置STR Rd, addre
23、ssing 存儲字字數(shù)據(jù)addressingRd,addressing索引STRcondSTRB Rd,addressing 存儲字節(jié)字節(jié)數(shù)據(jù)addressingRd,addressing索引STRcondBSTRT Rd,addressing 以用戶模式用戶模式存儲字數(shù)據(jù)addressingRd, addressing索引STRcondTSTRBT Rd,addressing 以用戶模式用戶模式存儲字節(jié)字節(jié)數(shù)據(jù)addressingRd,addressing索引STRcondBTSTRH Rd,addressing 存儲半字半字數(shù)據(jù)addressing Rd,addressing索引STRco
24、ndH ARM存儲器訪問指令保存指令 ARM存儲器訪問指令地址形式裝載指令:保存指令:立即數(shù):立即數(shù)可以是一個無符號的數(shù)值。這個數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。 如:LDR R1,R0,#0 x12 寄存器:寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。 如:LDR R1,R0,R2 寄存器及移位常數(shù):寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。 如:LDR R1,R0,R2,LSL #2 ARM存儲器訪問指令尋址方式(地址計算方式)裝載指令:保存指令:零偏移: 如:LDR Rd,Rn前索引偏移:如:LDR Rd,Rn,
25、#0 x04!程序相對偏移:如:LDR Rd,labe1 后索引偏移:如:LDR Rd,Rn,#0 x04注意注意:大多數(shù)情況下,必須保證字數(shù)據(jù)操作的地址是32位對齊的。0 x55R2R5 0 x400000000 x123456780 x40000000存儲器地址應(yīng)用示例:LDRR2,R5 ;將R5指向地址的字數(shù)據(jù)存入R20 x12345678 ARM存儲器訪問指令單寄存器轉(zhuǎn)載應(yīng)用0 x12345678R1R2 0 x400000000 x?0 x40000004存儲器地址應(yīng)用示例:STRR1,R2,#0 x04 ;將R1的數(shù)據(jù)存儲到R0+0 x04地址0 x12345678+4 ARM存儲
26、器訪問指令單寄存器保存應(yīng)用3.2 指令集介紹指令集介紹ARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù)復(fù)制、常數(shù)傳遞等。3.2 指令集介紹指令集介紹ARM存儲器訪問指令多寄存器存取裝載指令:存儲指令:存儲器源地址目標(biāo)寄存器1目標(biāo)寄存器n存儲器目標(biāo)地址源寄存器1源寄存器n3.2 指令集介紹指令集介紹ARM存儲器訪問指令多寄存器存取裝載指令:存儲指令:xxLDM/STM指令搭配不同的后綴實現(xiàn)不同方式地址增長方式:
27、IA: 每次傳送后地址加4IB: 每次傳送前地址加4DA:每次傳送后地址減4DB:每次傳送前地址減4 ARM存儲器訪問指令多寄存器存取數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7
28、R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CH0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存儲器0 x010 x020 x030 x040 x40000010應(yīng)用示例:LDMIA R1!,R2-R4,R6 將R1指向的內(nèi)存數(shù)據(jù)讀取到R0-R4和R6寄存器中 ARM存儲器訪問指令多寄存器存取3.2 指令集介紹指令集介紹ARM存儲器訪問指令多寄存器存取多寄存器存取指令與堆棧操作指令的
29、關(guān)系如下表所示。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作應(yīng)用示例:STMFD SP!,R0-R7,LR ARM存儲器訪問指令滿遞減壓棧操作 棧 頂0 x010 x07ARM7內(nèi)核內(nèi)部寄存器存儲器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC
30、0 x01230 x?0 x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針指向棧頂;應(yīng)用示例:STMFD SP!,R0-R7,LR ARM存儲器訪問指令滿遞減壓棧操作0 x010 x07ARM7內(nèi)核內(nèi)部寄存器存儲器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x01230 x?0 x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針
31、指向棧頂;3.執(zhí)行壓棧操作指令保存R0-R7和LR0 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x3FFC 棧 頂應(yīng)用示例:LDMFD SP!,R0-R7,PC ARM存儲器訪問指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂; 棧 頂0 x?0 x?存儲器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF8
32、0 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?應(yīng)用示例:LDMFD SP!,R0-R7,PC ARM存儲器訪問指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂; 棧 頂0 x?0 x?存儲器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x
33、3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?3.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x0123帶狀態(tài)寄存器恢復(fù)的出棧操作:LDMFD SP!,R0-R7,PC ARM存儲器訪問指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂; 棧 頂0 x?0 x?存儲器0 x?0 x?0 x400
34、40 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x? 棧 頂帶狀態(tài)寄存器恢復(fù)的出棧操作:LDMFD SP!,R0-R7,PC ARM存儲器訪問指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指
35、向棧頂;0 x?0 x?存儲器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x?0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x
36、000 x060 x01230 x01233.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC3.2 指令集介紹指令集介紹 SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內(nèi)容寫入到該內(nèi)存單元中。 ARM存儲器訪問指令寄存器和存儲器交換指令3.2 指令集介紹指令集介紹 ARM存儲器訪問指令寄存器和存儲器交換指令裝載指令:存儲器目標(biāo)地址讀入寄存器輸出寄存器3.2 指令集介紹指令集介紹 ARM存儲器訪問指令寄存器和存儲器交換指令裝載指令:助記符助記符說明說明操作操作條件碼位置條件碼位置SWP Rd,Rm,Rn 寄存器和存儲器字字數(shù)據(jù)交換RdRn,
37、RnRm(RnRd或Rm)SWPcondSWPB Rd,Rm,Rn 寄存器和存儲器字節(jié)字節(jié)數(shù)據(jù)交換RdRn,RnRm(RnRd或Rm)SWPcondB0 x12345678R1R20 x?0 x112233440 x40000000存儲器地址R0 0 x400000003.2 指令集介紹指令集介紹 ARM存儲器訪問指令寄存器和存儲器交換指令應(yīng)用示例:SWPR2,R1,R0將R1的內(nèi)容與R0指向的存儲單元的內(nèi)容進行交換0 x123456780 x11223344ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令3.2 指令集介紹指
38、令集介紹ARM指令集ARM數(shù)據(jù)處理指令 數(shù)據(jù)處理指令大致可分為3類: 數(shù)據(jù)傳送指令;算術(shù)邏輯運算指令;比較指令。 數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作,而不能對內(nèi)存中的數(shù)據(jù)進行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標(biāo)志。 3.2 指令集介紹指令集介紹數(shù)據(jù)傳送指令 MOV指令將8位圖立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運算等操作。裝載指令:目標(biāo)寄存器操作數(shù)3.2 指令集介紹指令集介紹數(shù)據(jù)傳送指令 MOV指令將8位圖立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運算等操作。 同類型的指令還有MVN,它可以實現(xiàn)數(shù)據(jù)的非傳遞,即把操作數(shù)取反后送至目標(biāo)寄存器。目標(biāo)
39、寄存器操作數(shù)取反3.2 指令集介紹指令集介紹數(shù)據(jù)傳送指令應(yīng)用示例:MOV R3,R1,LSL #3 ;R3=R180 x55R3R10 x010 x080 x08邏輯左移3位 思考與練習(xí)?1.MOV指令與LDR指令都是往目標(biāo)寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎? 思考與練習(xí)?1.MOV指令與LDR指令都是往目標(biāo)寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎? MOV指令用于將數(shù)據(jù)從一個寄存器傳送到另一個寄存器中,或者將一個常數(shù)傳送到一個寄存器中,但是不能訪問內(nèi)存。LDR指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中。3.2 指令集介紹指令集介紹算術(shù)邏輯運算指令 算術(shù)邏輯運算指令包括“加/減”以及“與/或/異或
40、”等指令,它們的格式如下:運算寄存器第二操作數(shù)運算符結(jié)果寄存器3.2 指令集介紹指令集介紹算術(shù)邏輯運算指令部分算術(shù)運算符:ADD:加法運算ADC:帶進位加法運算SUB:減法運算RSB:逆向減法運算SBC:帶進位減法運算RSC:帶進位逆向減法運算3.2 指令集介紹指令集介紹算術(shù)邏輯運算指令部分邏輯運算符:AND:邏輯“與”運算ORR :邏輯“或”運算EOR:邏輯“異或”運算BIC:位清除運算3.2 指令集介紹指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:ADD R3,R1, #0 x08 ;R3=R1+80 x000000050 x08加法0 x?R1第二操作數(shù)R30 x0000000D3.2 指令集介紹
41、指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:AND R3,R1, #0 xFF ;R3=R1 & 0 x000000FF0 x123456780 x000000FF與0 x?R1第二操作數(shù)R30 x000000783.2 指令集介紹指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:ORR R3,R1, R2 ;R3=R1|R20 x001122330 xAA000000或0 x?R1R2R30 xAA1122330 x000000FF0 x00000011異或0 x?R1R2R30 x?操作數(shù)3.2 指令集介紹指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:EOR R3,R1, R2,LSL 0 x03 ;R3=R1 (R2
42、8)0 x00000077邏輯左移3位0 x00000088 思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標(biāo)志位?R1R2BYTE2BYTE3BYTE1 BYTE0BYTE2BYTE3BYTE1 BYTE0BYTE0BYTE0 思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標(biāo)志位?AND R1,R1,#0 x000000FFAND R2,R2,#0 xFFFFFF00ORR R2,R2,R13.2 指令集介紹指令集介紹比較指令 比較指令將兩個數(shù)值進行的特定運算,根據(jù)運算結(jié)果影響CPSR的相關(guān)標(biāo)志位,用于后面程序的條件執(zhí)行,但是運
43、算結(jié)果不予保存。運算寄存器操作數(shù)運算符影響標(biāo)志位3.2 指令集介紹指令集介紹比較指令比較運算符:CMP:數(shù)值比較CMN:負數(shù)比較TST:位測試TEQ:相等測試0 x000000050 x08減法條件標(biāo)志R1R33.2 指令集介紹指令集介紹比較指令應(yīng)用示例:CMP R3,R1 ;R3減R1并影響標(biāo)志位無符號小于3.2 指令集介紹指令集介紹比較指令應(yīng)用示例:TSTR3,#0 x02 ;測試R3的第2位并影響標(biāo)志位0 x000000050 x02相與條件標(biāo)志R3操作數(shù)為13.2 指令集介紹指令集介紹比較指令應(yīng)用示例:TEQ R3,R2 ; R3與R2是否相等并影響標(biāo)志位0 x000000AA0 x0
44、00000CC異或條件標(biāo)志R3R2不等 與CMP的區(qū)別在于TEQ不影響C和V位,也就是只能判斷是否相等,而不能判斷是否大于,或小于。ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令3.2 指令集介紹指令集介紹ARM指令集乘法指令 ARM7TDMI具有三種乘法指令,分別為:3232位乘法指令;32 32位乘加指令;32 32位結(jié)果為64位的乘/乘加指令。3.2 指令集介紹指令集介紹ARM指令集乘法指令助記符助記符說明說明操作操作條件碼位置條件碼位置MUL Rd,Rm,Rs 32位乘法指令RdRm*Rs (RdRm)MULcond
45、SMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)Rm*RsUMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondS
46、3.2 指令集介紹指令集介紹ARM指令集3232位乘法指令運算寄存器第二操作數(shù)乘法目標(biāo)寄存器3.2 指令集介紹指令集介紹ARM指令集3232位乘法指令應(yīng)用示例:MUL R3,R2,R1 ; R3=R2R10 x000000020 x00000008乘法0 x?R1R2R30 x000000103.2 指令集介紹指令集介紹ARM指令集3232位乘加法指令運算寄存器1運算寄存器2乘法中間結(jié)果加法第二操作數(shù)目標(biāo)寄存器3.2 指令集介紹指令集介紹ARM指令集3232位乘加法指令應(yīng)用示例:MLA R3,R2,R1,R0 ; R3=R2R1 + R00 x000000020 x00000008乘法中間結(jié)果
47、加法0 x00000005?R2R1R0R30 x000000100 x00000015ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令3.2 指令集介紹指令集介紹ARM指令集程序如何跳轉(zhuǎn)在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn):1.直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn); 例: MOV PC,R142.使用分支指令直接跳轉(zhuǎn)。3.2 指令集介紹指令集介紹ARM指令集分支指令程序代碼跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)程序代碼跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)3.2 指令集介紹指令集介紹ARM指令集分支指令分支指令種類:B:分支指令BL:帶鏈接的分支指令BX:帶狀態(tài)切換的分支指
48、令 ARM指令分支指令因為用來表示目標(biāo)地址的位數(shù)有限,所以B/BL指令無法實現(xiàn)無法實現(xiàn)4G4G(3232位)范圍內(nèi)的任意跳轉(zhuǎn)位)范圍內(nèi)的任意跳轉(zhuǎn)3.2 指令集介紹指令集介紹ARM指令集指令為簡單的跳轉(zhuǎn)指令,不附帶其它功能。跳轉(zhuǎn)范圍限制在當(dāng)前指令的32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。程序代碼B mainxxmain分支指令程序代碼BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC ARM指令分支指令 帶鏈接的分支指令BL指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)之前將下一條指令的地址拷貝到R14(即LR) 鏈接寄存器中,它適用于
49、子程序調(diào)用。跳轉(zhuǎn)范圍限制在當(dāng)前指令的32M字節(jié)地址內(nèi)。指令格式如下:Addr1LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2. 程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行例如: BL DelayNS;調(diào)用子程序DelayNS ARM指令分支指令 帶狀態(tài)切換的分支指令BX指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:最低位為1?YN切換到狀態(tài)切換到狀態(tài) ARM指令分支指令 帶狀態(tài)切換的分支指令B
50、X指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:例如:ADRL R0,T_Fun+1 ;將Thumb程序的入口地址加1存入R0BXR0 ; 跳轉(zhuǎn)到R0指定的地址, ;并根據(jù)R0的最低位來切換處理器狀態(tài)ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.雜項指令6.偽指令 在ARM指令集中雜項指令共有3條,它們非常重要,特別是與操作系統(tǒng)的使用息息相關(guān):1.軟件中斷產(chǎn)生指令:SWI2. 程序狀態(tài)寄存器讀指令:MRS3. 程序狀態(tài)寄存器寫指令:MSR3.2 指令集介紹指令集介紹ARM指令集雜項指令3.2 指令集介紹指令集介紹AR
51、M指令集軟中斷指令 SWI指令用于產(chǎn)生軟中斷,主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù)。執(zhí)行該指令后,處理器將完成以下動作:1. 切換到管理模式2. 將CPSR備份到管理模式下的SPSR寄存器3. 程序跳轉(zhuǎn)到軟件中斷入口用戶模式管理模式任務(wù)1任務(wù)2其它代碼功能1:打開中斷功能2:關(guān)閉中斷功能n:任務(wù)調(diào)度CPSR寄存器SPSR寄存器1.使用操作系統(tǒng)后,為了防止出錯的任務(wù)影響其它任務(wù)的執(zhí)行,通常將任務(wù)放在用戶模式執(zhí)行,以限制其權(quán)限;2.對于一些重要的操作,如中斷的開關(guān),必須由操作系統(tǒng)完成。使用軟件中斷指令即可完成系統(tǒng)功能調(diào)用; ARM雜項指令軟中斷指令3.2 指令集介紹指令集介紹ARM指令集軟中斷指
52、令 SWI指令格式如下所示: 可以利用指令中的這個24位立即數(shù)向軟中斷服務(wù)程序傳遞參數(shù),比如請求的服務(wù)類型 ARM雜項指令軟中斷指令 根據(jù)SWI指令傳遞的參數(shù)SWI異常處理程序可以作出相應(yīng)的處理。SWI指令傳遞參數(shù)有以下兩種方法,指令中的24位立即數(shù)指定了用戶請求的服務(wù)類型,參數(shù)通過通用寄存器傳遞。 MOV R0,#34;設(shè)置子功能號為34 SWI 12;調(diào)用12號軟中斷 指令中的24位立即數(shù)被忽略,用戶請求的服務(wù)類型由寄存器R0的值決定,參數(shù)通過其它的通用寄存器傳遞。 MOV R0,#12;調(diào)用12號軟中斷 MOV R1,#34;設(shè)置子功能號為34 SWI 0 3.2 指令集介紹指令集介紹A
53、RM指令集狀態(tài)寄存器讀指令 在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。指令格式如下所示:目標(biāo)寄存器3.2 指令集介紹指令集介紹ARM指令集狀態(tài)寄存器讀指令 應(yīng)用示例: MRS R1,CPSR ; 讀取CPSR狀態(tài)寄存器到R1 MRS R2,SPSR ; 讀取SPSR狀態(tài)寄存器到R2 ARM雜項指令狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以
54、切換處理器模式等操作。操作數(shù)分為兩種:1.寄存器2.8位圖立即數(shù)PSR寄存器被分為四個8位的域:1.狀態(tài)位域:用 表示2.擴展位域:用 表示3.條件標(biāo)志位域:用 表示4.控制位域:用 表示3.2 指令集介紹指令集介紹ARM指令集狀態(tài)寄存器寫指令示例,將R0的內(nèi)容寫入CPSR寄存器的控制位域MSR CPSR_c,R0條件代碼標(biāo)志保留控制位域Byte0Byte3, Byte2, Byte1R0CPSRNZCV IM0M1M2M3M4TF. . .31 30 29 28 27 26 8 7 6 5 4 3 2 1 0Byte0 ARM雜項指令狀態(tài)寄存器寫指令啟動代碼堆棧初始化應(yīng)用示例:INITSTA
55、CKMOV R0,LR;設(shè)置管理模式堆棧MSR CPSR_C,#0 xD3LDR SP,StackSvc;設(shè)置中斷模式堆棧MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式位狀態(tài)位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD311010011禁止FIQ中斷禁止IRQ中斷ARM狀態(tài)管理模式MSR CPSR_C,#0 xD3CPRS寄存器 ARM雜項指令狀態(tài)寄存器寫指令啟動代碼堆棧初始化應(yīng)用示例: INITSTACKMOV R0,LR;設(shè)置管理模式堆棧MSR CPSR_C,#0 xD3LDR
56、 SP,StackSvc;設(shè)置中斷模式堆棧MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式位狀態(tài)位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD2 211010010禁止FIQ中斷禁止IRQ中斷ARM狀態(tài)IRQIRQ模式MSR CPSR_C,#0 xD2CPRS寄存器 思考與練習(xí)?1. 使用MSR和MRS指令,通過修改CPSR寄存器,實現(xiàn)打開/關(guān)閉IRQ中斷的兩個子程序,注意不能影響其它位? (1)(2)(3)(4);子程序:使能IRQ中斷Enable_IRQ MRS R0, CPSR
57、BIC R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR ;子程序:禁能IRQ中斷Disable_IRQ MRS R0 CPSR ORR R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1.將CPSR寄存器內(nèi)容讀出到R0;2.修改對應(yīng)于CPSR中的I控制位;3.將修改后的值寫回 CPSR寄存器的對應(yīng)控制域;4.返回上一層函數(shù); 思考與練習(xí)?ARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.雜項指令6.偽指令3.2 指令集介紹指令集介紹ARM偽指令 ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的
58、。偽指令可以像其它ARM指令一樣使用,但在編譯時這些指令將被等效的ARM指令代替。反匯編代碼源程序偽指令實際指令編譯器實際指令實際指令3.2 指令集介紹指令集介紹ARM偽指令 常用的ARM偽指令有四條:1.小范圍地址讀取指令:2.中等范圍地址讀取指令:3.大等范圍地址讀取指令:4.空操作指令: ARM偽指令小范圍的地址讀取 偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。目標(biāo)寄存器表達式 ARM偽指令小范圍的地址讀取目標(biāo)寄存器表達式地址表達式expr的取指
59、范圍:當(dāng)?shù)刂分挡皇亲謱R時,其取指范圍為;當(dāng)?shù)刂分凳亲謱R時,其取指范圍為;當(dāng)?shù)刂分凳?6字節(jié)對齊時,其取指范圍將更大。 ARM偽指令小范圍的地址讀取 . ADR R0,Delay .Delay MOV R0,r14 .應(yīng)用示例(源程序):使用偽指令將程序標(biāo)號Delay的地址存入R0 .0 x20 ADD r0,pc,#0 x3c . .0 x64 MOV r0,r14 .編譯后的反匯編代碼:地址程序代碼 ARM偽指令小范圍的地址讀取 . ADR R0,Delay .Delay MOV R0,r14 .應(yīng)用示例(源程序):使用偽指令將程序標(biāo)號Delay的地址存入R0 .0 x20 ADD r0
60、,pc,#0 x3c . .0 x64 MOV r0,r14 .編譯后的反匯編代碼:ADR偽指令被匯編成一條指令 ARM偽指令小范圍的地址讀取 ;查表應(yīng)用示例: ADR R0,DISP_TAB;加載轉(zhuǎn)換表地址 LDRB R1,R0,R2; 使用R2作為參數(shù),進行查表 DISP_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99, 0 x92,0 x82,0 xF8 ARM偽指令中等范圍的地址讀取 偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址 。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條合
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能安防及弱電系統(tǒng)2025年度施工合同
- 2025年天津貨運從業(yè)資格證題
- 2025年廊坊貨運從業(yè)資格證在哪里練題
- 土石方裝卸作業(yè)2025年度物流服務(wù)合同3篇
- 二零二五年度出租房衛(wèi)生應(yīng)急預(yù)案與租戶安全協(xié)議4篇
- 二零二五版教育合同:國防獎學(xué)金項目實施與管理協(xié)議6篇
- 事業(yè)單位市場營銷合作協(xié)議(2024年修訂版)3篇
- 二零二五年高性能混凝土運輸及安裝合同模板3篇
- 二零二五年度彩鋼瓦產(chǎn)品售后維修及保養(yǎng)協(xié)議3篇
- 2025年度窗簾行業(yè)人才培養(yǎng)與就業(yè)服務(wù)合同3篇
- 中國末端執(zhí)行器(靈巧手)行業(yè)市場發(fā)展態(tài)勢及前景戰(zhàn)略研判報告
- 北京離婚協(xié)議書(2篇)(2篇)
- 2025中國聯(lián)通北京市分公司春季校園招聘高頻重點提升(共500題)附帶答案詳解
- Samsung三星SMARTCAMERANX2000(20-50mm)中文說明書200
- 2024年藥品質(zhì)量信息管理制度(2篇)
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 廣東省廣州市2024年中考數(shù)學(xué)真題試卷(含答案)
- 高中學(xué)校開學(xué)典禮方案
- 內(nèi)審檢查表完整版本
- 3級人工智能訓(xùn)練師(高級)國家職業(yè)技能鑒定考試題及答案
- 孤殘兒童護理員技能鑒定考試題庫(含答案)
評論
0/150
提交評論