




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、常用的ARM指令集我們知道CPU能直接識(shí)別的是機(jī)器碼,也就是0和1組合的東東。不同的組合代表不同的含義,CPU就做不同的事情。按照道理來(lái)說(shuō),我們寫的代碼都應(yīng)該是0和1組成的東西,但是如果真的是那樣,那結(jié)果.。人類是聰明的,發(fā)明了匯編語(yǔ)言,匯編語(yǔ)言是用一些助記符,來(lái)代替機(jī)器碼。當(dāng)然,匯編語(yǔ)言是不能給CPU識(shí)別的,需要編譯器將其編譯成機(jī)器碼。匯編語(yǔ)言是和特定的CPU關(guān)聯(lián)的,不同的CPU對(duì)應(yīng)不同的匯編指令。好在,現(xiàn)在大多數(shù)嵌入式CPU都是使用ARM架構(gòu)的,這樣我們只需要學(xué)會(huì)ARM的匯編指令集,我們寫的匯編程序就可以在這些使用ARM架構(gòu)的CPU上運(yùn)行。ARM的匯編指令很多,很難將其全部記住,其實(shí)也沒(méi)必
2、要,我們只需要學(xué)會(huì)一些常用的匯編指令即可。其他的用到再去查即可。下面我們就開(kāi)始,必須知道的ARM指令學(xué)習(xí)。一、ARM指令格式ARM指令的基本格式如下:其中<>號(hào)內(nèi)是必須的,號(hào)內(nèi)的項(xiàng)是可選的。各項(xiàng)的說(shuō)明如下:opcode :指令助記符cond :執(zhí)行條件S :是否影響CPSR寄存器的值Rd :目標(biāo)寄存器(一般用來(lái)存放指令執(zhí)行最后的結(jié)果)Rn :第1個(gè)操作數(shù)的寄存器operand2 :第2個(gè)操作數(shù)1. 其中,我們必須要研究一下operand2這個(gè)操作數(shù),它有如下表現(xiàn)形式(1)#immed_8r常數(shù)表達(dá)式該常數(shù)必須對(duì)應(yīng)8位位圖,即一個(gè)8位的常數(shù)通過(guò)循環(huán)右移偶數(shù)位得到,這個(gè)數(shù)我們也成立即數(shù)
3、。例如:MOV R0,#1AND R1,R2,#0x0例如:0x04800000它可以拿0x12循環(huán)右移位10位得到,所以它是一個(gè)合法的立即數(shù)。有人會(huì)問(wèn),是不是每次我都要去判斷一個(gè)數(shù)是不是立即數(shù),我就需要從0x000xff里面找出一個(gè)數(shù),將它循環(huán)右移偶數(shù)個(gè)位看是否能的得到,那太麻煩了。有沒(méi)有一些快速識(shí)別的方法呢?肯定是有的呀,當(dāng)然也不能完全依賴哦,最好就是拿編譯器驗(yàn)證,不是,編譯器就會(huì)報(bào)錯(cuò)。如何判斷一個(gè)數(shù)是否是合法立即數(shù)?首先將這個(gè)數(shù)轉(zhuǎn)換為32bit 16進(jìn)制形式,例如218=0xDA=0x000000DA1.除零外,僅有一位數(shù)為合法立即數(shù)。2.除零外,僅有二位數(shù),并且相鄰(包括首尾,如0x1
4、000000A)的為合法立即數(shù)。3.除零外,僅有三位數(shù),并且相鄰(包括中間有0相間,例如0x10800000,包括首尾相鄰,如:0x14000003),這三位數(shù)中,最高位取值僅能為1、2、3,最低位取值僅能為4、8、C,中間位0x00xF。這種組合的為合法立即數(shù)。除了以上三種,其他基本是非法立即數(shù)。舉例:0xFF是有效立即數(shù)。0x104是有效立即數(shù)。0xFF0、0xFF00、0xFF000、0xFF000000、0xF000000F都是有效立即數(shù)。反例:0x101是無(wú)效立即數(shù)。0x102是無(wú)效立即數(shù)。0xFF1、0xFF04、0xFF003、0xFFFFFFFF都是無(wú)效立即數(shù)。還有一個(gè)要說(shuō)的就
5、是:只要該數(shù),可以通過(guò)0x00-0xFF中某個(gè)數(shù),循環(huán)右移偶數(shù)位而產(chǎn)生,就是合法的立即數(shù),否則就是非法的立即數(shù)。練習(xí): 下面哪些立即數(shù)是數(shù)據(jù)處理指令中有效的數(shù)據(jù)?a) 0x00AB0000 b) 0x0000FFFF c) 0xF000000Fd) 0x08000012 e) 0x00001f80 f) 0xFFFFFFFF(2)Rm寄存器方式在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUB R1,R1,R2MOV PC,R0(3)Rm,shift寄存器移位方式將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變,移位方法如下:例如:ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8
6、=9R1SUB R1,R1,R2,LSR R3 ;R1=R1-(R2/2R3)2.ARM指令集條件碼使用條件碼“cond”可以實(shí)現(xiàn)高效的邏輯操作,提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行 功能。如果指令不標(biāo)明條件代碼,將默認(rèn)為無(wú)條件(AL)執(zhí)行。其中上圖,紅線括起來(lái)的必須記住,其他不知道的時(shí)候在回過(guò)頭查即可。例如:二、ARM指令1.ARM 數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類:數(shù)據(jù)傳送指令,算術(shù)邏輯運(yùn)算指令,比較指令注意:數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀
7、態(tài)標(biāo)志。(1)數(shù)據(jù)傳送MOV指令將立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。指令格式如下:MOVcondS Rd,operand2MOV指令舉例如下:MOV R1,#0x10 ;R1=0x10MOV R0,R1 ;R0=R1MOVS R3,R1,LSL#2 ;R3=R1<<2,并影響標(biāo)志位MOV PC,LR ;PC=LR,子程序返回MVN指令將8位圖立即數(shù)或寄存器(operand2)按位取反后傳送到目標(biāo)寄存器(Rd),因?yàn)槠渚哂腥》垂δ埽钥梢匝b載范圍更廣的立即數(shù)。指令格式如下: MVNcondS Rd,operand2MVN指令舉例如下:MVN R1,#0x
8、FF ;R1=0xFFFFFF00 MVN R1,R2 ;將R2取反,結(jié)果存到R1(2)算術(shù)運(yùn)算其中,紅線框內(nèi)的必須掌握。A、加法運(yùn)算指令A(yù)DD指令將operand2的值與Rn的值相加,結(jié)果保存到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 應(yīng)用示例: ADDS R1,R1,#1 ;R1=R1+1,并影響標(biāo)志位 ADD R1,R1,R2 ;R1=R1+R2B.減法運(yùn)算指令SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd中。指令格式如下: SUBcondS Rd,Rn,operand2 應(yīng)用示例:SUBS R0,R0,#1 ;R0=R0-1 ,并影響標(biāo)志位
9、 SUBS R2,R1,R2 ;R2=R1-R2 ,并影響標(biāo)志位 C.逆向減法運(yùn)算指令RSB指令將operand2的值減去Rn,結(jié)果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 應(yīng)用示例:RSB R3,R1,#0xFF00 ;R3=0xFF00-R1RSBS R1,R2,R2,LSL #2 ;R1=(R2<<2)-R2=R2×3 D. 帶進(jìn)位加法指令A(yù)DC將operand2的值與Rn的值相加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。指令格式如下: ADCcondS Rd,Rn,operand2 應(yīng)用示例(使用ADC實(shí)現(xiàn)64位加
10、法,結(jié)果存于R1、R0中):ADDS R0,R0,R2 ;R0等于低32位相加,并影響標(biāo)志位ADC R1,R1,R3 ;R1等于高32位相加,并加上低位進(jìn)位E.帶進(jìn)位減法指令SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的非(即若C標(biāo)志清零,則結(jié)果減去1),結(jié)果保存到Rd中。指令格式如下: SBCcondS Rd,Rn,operand2 應(yīng)用示例(使用SBC實(shí)現(xiàn)64位減法,結(jié)果存于R1、R0中):SUBS R0,R0,R2 ; 低32位相減,并影響標(biāo)志位SBC R1,R1,R3 ;高32位相減,并減去低位借位F. 帶進(jìn)位逆向減法指令RSC指令用寄存器operand2減去
11、Rn,再減去CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd中。指令格式如下: RSCcondS Rd,Rn,operand2 應(yīng)用示例(使用RSC指令實(shí)現(xiàn)求64位數(shù)值的負(fù)數(shù) ):RSBS R2,R0,#0 RSC R3,R1,#0(3)邏輯運(yùn)算指令A(yù). 邏輯與操作指令A(yù)ND指令將operand2的值與寄存器Rn的值按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下: ANDcondS Rd,Rn,operand2 應(yīng)用示例:ANDS R0,R0,#0x01 ;R0=R0&0x01,取出最低位數(shù)據(jù) AND R2,R1,R3 ;R2=R1&R3 B. 邏輯或操作指令ORR指令將oper
12、and2的值與寄存器Rn的值按位作邏輯“或”操作,結(jié)果保存到Rd中。指令格式如下: ORRcondS Rd,Rn, operand2 應(yīng)用示例: ORR R0,R0,#0x0F ;將R0的低4位置1 MOV R1,R2,LSR #24 ;使用ORR指令將R2的高8位ORR R3,R1,R3,LSL #8 ;數(shù)據(jù)移入到R3低8位中 C.邏輯異或操作指令EOR指令將operand2的值與寄存器Rn的值按位作邏輯“異或”操作,結(jié)果保存到Rd中。指令格式如下: EORcondS Rd,Rn, operand2 應(yīng)用示例:EOR R1,R1,#0x0F ;將R1的低4位取反 EOR R2,R1,R0 ;
13、R2=R1R0 EORS R0,R5,#0x01 ; 將R5和0x01進(jìn)行邏輯異或,;結(jié)果保存到R0,并影響標(biāo)志位D.位清除指令BIC指令將寄存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下: BICcondS Rd,Rn, operand2 應(yīng)用示例:BIC R1,R1,#0x0F ;將R1的低4位清零,其它位不變 BIC R1,R2,R3 ;將R3的反碼和R2相邏輯“與”,;結(jié)果保存到R1中(4)比較指令 A.比較指令CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志
14、來(lái)判斷是否執(zhí)行。指令格式如下: CMPcond Rn, operand2 應(yīng)用示例:CMP R1,#10 ; R1與10比較,設(shè)置相關(guān)標(biāo)志位CMP R1,R2 ; R1與R2比較,設(shè)置相關(guān)標(biāo)志位注意:CMP指令與SUBS指令的區(qū)別在于CMP指令不保存運(yùn)算結(jié)果。在進(jìn)行兩個(gè)數(shù)據(jù)的大小判斷時(shí),常用CMP指令及相應(yīng)的條件碼來(lái)操作。 B.負(fù)數(shù)比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。指令格式如下: CMNcond Rn, operand2 應(yīng)用示例:CMN R0,#1 ; R0+1,判斷R0
15、是否為1的補(bǔ)碼;如果是,則設(shè)置Z標(biāo)志位注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運(yùn)算結(jié)果。CMN指令可用于負(fù)數(shù)比較,比如CMN R0,#1指令則表示R0與-1比較,若R0為-1(即1的補(bǔ)碼),則Z置位;否則Z復(fù)位。 C.位測(cè)試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。指令格式如下: TSTcond Rn, operand2 應(yīng)用示例:TST R0,#0x01 ; 判斷R0的最低位是否為0 TST R1,#0x0F ; 判斷R1的低4位是否為0 注意:TST
16、指令與ANDS指令的區(qū)別在于TST指令不保存運(yùn)算結(jié)果。TST指令通常與EQ、NE條件碼配合使用,當(dāng)所有測(cè)試位均為0時(shí),EQ有效,而只要有一個(gè)測(cè)試位不為0,則NE有效。 D.相等測(cè)試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。指令格式如下: TEQcond Rn, operand2 應(yīng)用示例:TEQ R0,R1 ; 比較R0與R1是否相等 (不影響V位和C位)注意:TEQ指令與EORS指令的區(qū)別在于TEQ指令不保存運(yùn)算結(jié)果。使用TEQ進(jìn)行相等測(cè)試時(shí),常與EQ、NE條件碼配
17、合使用。當(dāng)兩個(gè)數(shù)據(jù)相等時(shí),EQ有效;否則NE有效。 (5)分支指令A(yù).分支指令B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下:Bcond Label應(yīng)用示例:B WAITA ; 跳轉(zhuǎn)到WAITA標(biāo)號(hào)處 B 0x1234 ; 跳轉(zhuǎn)到絕對(duì)地址0x1234處 B.帶鏈接的分支指令BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR) 連接寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BLcond Label應(yīng)用示例:BL DELAY ;
18、調(diào)用子程序DELAYC.帶狀態(tài)切換的分支指令BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來(lái)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下:BXcond Rm應(yīng)用示例:ADRL R0,ThumbFun+1 ;將Thumb程序的入口地址加1存入R0BX R0 ; 跳轉(zhuǎn)到R0指定的地址, ;并根據(jù)R0的最低位來(lái)切換處理器狀態(tài)2.存儲(chǔ)器訪問(wèn)指令A(yù)RM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪問(wèn)只能使用加載和存儲(chǔ)指令實(shí)現(xiàn)。存儲(chǔ)器訪問(wèn)指令分為單寄存器操作指令(LDR/STR)和多寄存器操作指令(LDM/STM)。 (1)
19、存儲(chǔ)器訪問(wèn)-單寄存器操作指令LDR/STR指令用于對(duì)內(nèi)存訪問(wèn)。所有的單寄存器加載/存儲(chǔ)指令可分為"字和無(wú)符號(hào)字節(jié)加載存儲(chǔ)指令"和"半字和有符號(hào)字節(jié)加載存儲(chǔ)指令"。A.字和無(wú)符號(hào)字節(jié)加載存儲(chǔ)指令LDR指令用于從內(nèi)存中讀取單一字或字節(jié)數(shù)據(jù)存入寄存器中,STR指令用于將寄存器中的單一字或字節(jié)數(shù)據(jù)保存到內(nèi)存。LDRcond Rd,地址 ;將指定地址上的字?jǐn)?shù)據(jù)讀入RdSTRcond Rd,地址 ;將Rd中的字?jǐn)?shù)據(jù)存入指定地址LDRcondB Rd,地址 ;將指定地址上的字節(jié)數(shù)據(jù)讀入RdSTRcondB Rd,地址 ;將Rd中的字節(jié)數(shù)據(jù)存入指定地址LDR/STR指令
20、尋址非常靈活,它由兩部分組成,其中一部分為一個(gè)基址寄存器,它可以為任意一個(gè)通用寄存器;另一部分為一個(gè)地址偏移量。地址偏移量可以有以下三種格式:1)立即數(shù)。立即數(shù)可以是一個(gè)無(wú)符號(hào)的數(shù)值。這個(gè)數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDR R1,R0,#0x12LDR R1,R0,#-0x122)寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDR R1,R0,R2LDR R1,R0,-R23)寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址中減去這個(gè)數(shù)值。如:LDR R1,R0,R2,LSL #2LDR R1,R0,-R2
21、,LSL#2從尋址方式的地址計(jì)算方法分,加載/存儲(chǔ)指令可以由以下4種格式:1)零偏移如:LDR Rd,Rn2)前索引偏移如 : LDR Rd,Rn,#0x04!這里的"!"表示,先將Rn = Rn+0x04,然后在從Rn中加載數(shù)據(jù)到Rd?,F(xiàn)在大家應(yīng)該明白這里的"前"的含義就是先更新Rn的值,然后在Rn所表示的地址取值。3)程序相對(duì)偏移如:LDR Rd,labe14)后索引偏移LDR Rd,Rn,#0x04先將Rn地址的值加載到Rd,然后更新Rn = Rn + 0x04注意:大多數(shù)情況下,必須保證字?jǐn)?shù)據(jù)操作的地址是32位對(duì)齊的。B.半字和有符號(hào)字節(jié)加載/存
22、儲(chǔ)指令LDRcondSB Rd,<地址> ;將指定地址上的有符號(hào)字節(jié)讀入RdLDRcondSH Rd,<地址> ;將指定地址上的有符號(hào)半字讀入RdLDRcondH Rd,<地址> ;將指定地址上的半字?jǐn)?shù)據(jù)讀入RdSTRcondH Rd,<地址> ;將Rd中的半字?jǐn)?shù)據(jù)存入指定地址注意:1.有符號(hào)位半字/字節(jié)加載是指用符號(hào)位加載擴(kuò)展到32位,無(wú)符號(hào)半字加載是指用零擴(kuò)展到32位;2.半字讀寫的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結(jié)果;LDR和STR指令應(yīng)用示例:1.加載/存儲(chǔ)字和無(wú)符號(hào)字節(jié)指令LDR R2,R5 ;將R5指向地址的字?jǐn)?shù)據(jù)存入R2STR
23、 R1,R0,#0x04 ;將R1的數(shù)據(jù)存儲(chǔ)到R0+0x04地址LDRB R3,R2,#1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3,R2R2+1STRB R6,R7 ;將R7指向地址的字節(jié)數(shù)據(jù)存入R62.加載/存儲(chǔ)半字和有符號(hào)字節(jié)指令LDRSB R1,R0,R3 ;將R0+R3地址上的字節(jié)數(shù)據(jù)存入R1,高24位用符號(hào)擴(kuò)展LDRH R6,R2,#2 ;將R2指向地址的半字?jǐn)?shù)據(jù)存入R6,高16位用0擴(kuò)展,讀出后,R2=R2+2STRH R1,R0,#2! ;將R1的半字?jǐn)?shù)據(jù)保存到R0+2地址,;只修改低2字節(jié)數(shù)據(jù),R0=R0+2(2)存儲(chǔ)器訪問(wèn)-多寄存器操作指令多寄存器加載/存儲(chǔ)指令格式如下: LDM
24、cond<模式> Rn!,reglist STMcond<模式> Rn!,reglistcond:指令執(zhí)行的條件;可選模式:控制地址的增長(zhǎng)方式,一共有8種模式;!:表示在操作結(jié)束后,將最后的地址寫回Rn中;可選,通常我們都使用它reglist :表示寄存器列表,可以包含多個(gè)寄存器,它們使用“,”隔開(kāi),如R1,R2,R6-R9,寄存器由小到大排列;:加入該后綴后,進(jìn)行數(shù)據(jù)傳送且寄存器列表不包含PC時(shí),加載/存儲(chǔ)的寄存器是用戶模式下的,而不是當(dāng)前模式的寄存器。若在LDM指令且寄存器列表中包含有PC時(shí)使用,那么除了正常的多寄存器傳送外,還將SPSR也拷貝到CPSR中,這可用
25、于異常處理返回。注意:該后綴不允許在用戶模式或系統(tǒng)模式下使用。多寄存器加載/存儲(chǔ)指令的8種模式如下表所示,左邊四種為數(shù)據(jù)傳送操作、右邊四種為堆棧操作、。A. 數(shù)據(jù)塊傳送指令操作過(guò)程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器B.堆棧操作和數(shù)據(jù)塊傳送指令類似,也有4種模式,它們之間的關(guān)系如下表所示:例如:注意: 兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡(jiǎn)單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空與滿、加與減對(duì)應(yīng)的問(wèn)題。3.狀態(tài)寄存器讀寫指令A(yù).狀態(tài)寄存器讀指令在ARM處理器中,只有MRS指令可以對(duì)狀態(tài)寄存器CP
26、SR和SPSR進(jìn)行讀操作。通過(guò)讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進(jìn)入異常前的處理器狀態(tài)。應(yīng)用示例:MRS R1,CPSR ; 將CPSR狀態(tài)寄存器讀取,保存到R1中MRS R2,SPSR ; 將SPSR狀態(tài)寄存器讀取,保存到R2中B.狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行寫操作。與MRS配合使用,可以實(shí)現(xiàn)對(duì)CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。4.ARM偽指令A(yù)RM偽指令不屬于ARM指令集中的指令,但是編譯器能識(shí)別,是為了編程方便而定義的。偽指令可以像
27、其它ARM指令一樣使用,但在編譯時(shí)這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別為ADR偽指令、ADRL偽指令、LDR偽指令、NOP偽指令。 (1)ADR 小范圍的地址讀取ADR偽指令將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時(shí),ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來(lái)實(shí)現(xiàn)該ADR偽指令的功能,若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。地址表達(dá)式expr的取指范圍:A.當(dāng)?shù)刂分挡皇亲謱?duì)齊時(shí),其取指范圍為-255255;B.當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),其取指范圍為-10201020;C.當(dāng)?shù)刂分凳?/p>
28、16字節(jié)對(duì)齊時(shí),其取指范圍將更大。應(yīng)用舉例:指定鏈接-Ttext 0x30008000 生成的可執(zhí)行文件反匯編后的結(jié)果如下:可以看到, r3 = 當(dāng)前pc - 0x14。ADR這條指令經(jīng)常用來(lái)獲取代碼運(yùn)行的地址。假如,這段代碼放在內(nèi)存中運(yùn)行,其所在的內(nèi)存存儲(chǔ)空間的首地址為0x30008000 。當(dāng)CPU運(yùn)行到紅線框起來(lái)的那條指令時(shí),大家可以思考一下此時(shí)PC的值為多少呀?聰明的你一定還記得,PC指向的永遠(yuǎn)都是預(yù)取指令的地址,即當(dāng)前指令所在的地址+8。呵呵,這樣PC = 0x3000800c + 8 = 0x30008014 。r3 = pc - 0x14 = 0x30008014 - 0x14
29、= 0x30008000。(2)ADRL中等范圍的地址讀取 ADRL偽指令將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址 。在匯編編譯器編譯源程序時(shí),ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。當(dāng)?shù)刂分凳亲止?jié)對(duì)齊時(shí),取值范圍為6464KB;當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),取值范圍為256256KB。(3)LDR 大范圍的地址讀取LDR偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或M
30、VN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對(duì)偏移的LDR指令從文字池讀出常量。從上圖可以知道,ldr r6,=0x12 指令在進(jìn)行處理的時(shí)候,編譯器知道0x12是一個(gè)立即數(shù),就直接將其翻譯成mov 指令的。如果操作的不是立即數(shù),則用文字池的形式進(jìn)行存儲(chǔ),然后通過(guò)ldr指令從對(duì)應(yīng)的地址讀取數(shù)據(jù)。注意:1.從指令位置到文字池的偏移量必須小于4KB;2.與ARM指令的LDR相比,偽指令的LDR的參數(shù)有“=”號(hào)。(4)空操作偽指令NOP偽指令在匯編時(shí)將會(huì)被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延時(shí)操作。應(yīng)用示例(延時(shí)子程序):Dela
31、y NOP ;空操作 NOP NOP SUBS R1,R1,#1 ;循環(huán)次數(shù)減一 BNE Delay ;如果循環(huán)沒(méi)有結(jié)束,跳轉(zhuǎn)Delay繼續(xù) MOV PC,LR ;子程序返回三、ARM 處理器尋址方式尋址方式是根據(jù)指令中給出的地址碼字段來(lái)實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有9種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.塊拷貝尋址;9.相對(duì)尋址。(1)寄存器尋址操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操作。寄存器尋址指令舉例如下: MOV
32、R1,R2 ;將R2的值存入R1 SUB R0,R1,R2 ;將R1的值減去R2的值,結(jié)果保存到R0 (2)立即尋址立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說(shuō),數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下: SUBS R0,R0,#1 ;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOV R0,#0xFF000 ;將立即數(shù)0xFF000裝入R0寄存器 (3)寄存器移位尋址寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL #3 ;R2的值左移3位,結(jié)果放入R0;即是R0=R2×8 ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1;“與”操作,結(jié)果放入R1(4)寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下: LDR R1,R2 ;將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出;保存在R1中 SWP R1,R1,R2 ;將寄存器R1的值和R2指定的存儲(chǔ);單元
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年山西大學(xué)附屬中學(xué)晉中學(xué)校教師招聘考試真題
- 2024年內(nèi)蒙古呼和浩特土默特學(xué)校招聘教師考試真題
- 合伙窗簾合同范本
- 印刷書(shū)刊合同范本
- 2024年甘肅蘭州電源車輛研究所有限公司招聘考試真題
- 衣柜安裝合同范本
- 科技公司如何構(gòu)建有效的知識(shí)產(chǎn)權(quán)管理體系
- 電競(jìng)文化與城市形象塑造的關(guān)聯(lián)性分析
- 學(xué)術(shù)會(huì)議策劃服務(wù)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 勞務(wù)派遣與防水施工合同
- 貴州省就業(yè)失業(yè)登記表
- 秦荻輝科技英語(yǔ)寫作教程練習(xí)答案(共42頁(yè))
- GB∕T 41168-2021 食品包裝用塑料與鋁箔蒸煮復(fù)合膜、袋
- 反興奮劑知識(shí)試題及答案
- 初中八年級(jí)上冊(cè)音樂(lè)課件4.2欣賞沃爾塔瓦河(14張)ppt課件
- 部編版語(yǔ)文一年級(jí)下冊(cè)繪本閱讀課-優(yōu)質(zhì)課件.pptx
- 新人教版九年級(jí)全一冊(cè)物理知識(shí)點(diǎn)填空題匯編
- 人教版五年級(jí)數(shù)學(xué)下冊(cè)每個(gè)單元教材分析(共九個(gè)單元)
- 辦好高水平民辦高中的哲學(xué)思考-教育文檔
- 小學(xué)生如何理解句子的含義(課堂PPT)
- 學(xué)科分類與代碼(管理學(xué))
評(píng)論
0/150
提交評(píng)論