




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第2章章 ARM指令分類(lèi)及其尋址方式指令分類(lèi)及其尋址方式在本章中,將介紹在本章中,將介紹ARM指令分類(lèi)以及各類(lèi)指令對(duì)指令分類(lèi)以及各類(lèi)指令對(duì)應(yīng)的尋址方式。應(yīng)的尋址方式。22.1 ARM指令集概要介紹指令集概要介紹在本節(jié)中,將介紹在本節(jié)中,將介紹ARM指令相關(guān)的一些基本概念,指令相關(guān)的一些基本概念,包括指令的分類(lèi)、指令的一般編碼格式以及包括指令的分類(lèi)、指令的一般編碼格式以及ARM指令中的條件碼。指令中的條件碼。32.1.1 ARM指令的分類(lèi)指令的分類(lèi)ARM指令集可以分為跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、指令集可以分為跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器程序狀態(tài)寄存器(PSR)傳輸指令、傳輸指令、Load
2、/Store指令、協(xié)處理器指令和異常中斷產(chǎn)生指令指令、協(xié)處理器指令和異常中斷產(chǎn)生指令6類(lèi)。類(lèi)。42.1.2 ARM指令的一般編碼格式指令的一般編碼格式ARM指令字長(zhǎng)為固定的指令字長(zhǎng)為固定的32位。一條典型的位。一條典型的ARM指指令編碼格式如下:令編碼格式如下:31 28 27 25 24 21 20 19 16 15 12 11 8 7 0其中的符號(hào)及參數(shù)說(shuō)明如下。其中的符號(hào)及參數(shù)說(shuō)明如下。opcode:指令操作符編碼。cond:指令執(zhí)行的條件編碼。S:決定指令的操作是否影響CPSR的值。Rd:目標(biāo)寄存器編碼。Rn:包含第1個(gè)操作數(shù)的寄存器編碼。shifter_operand:表示第2個(gè)操作
3、數(shù)。5cond0 0 1opcodeS Rn Rdshifter_operand2.1.3 ARM指令的條件碼域指令的條件碼域條件碼共有條件碼共有16個(gè),各條件碼的含義和助記符如表個(gè),各條件碼的含義和助記符如表2.1所示??蓷l件執(zhí)行的指令可以在其助記符的擴(kuò)所示??蓷l件執(zhí)行的指令可以在其助記符的擴(kuò)展域加上條件碼助記符,從而在特定的條件下執(zhí)行。展域加上條件碼助記符,從而在特定的條件下執(zhí)行。參見(jiàn)教材P2362.2 ARM指令的尋址方式指令的尋址方式ARM指令的尋址方式有以下幾種,分別進(jìn)行討論:指令的尋址方式有以下幾種,分別進(jìn)行討論:數(shù)據(jù)處理指令的操作數(shù)的尋址方式。字及無(wú)符號(hào)字節(jié)的Load/Store
4、指令的尋址方式。雜類(lèi)Load/Store指令的尋址方式。批量Load/Store指令的尋址方式。協(xié)處理器Load/Store指令的尋址方式。72.2.1 數(shù)據(jù)處理指令的操作數(shù)的尋址方式數(shù)據(jù)處理指令的操作數(shù)的尋址方式通常數(shù)據(jù)處理指令的格式如下所示:通常數(shù)據(jù)處理指令的格式如下所示: S , 其中的符號(hào)及參數(shù)說(shuō)明如下。其中的符號(hào)及參數(shù)說(shuō)明如下。:是指令助記符,如ADD表示算術(shù)加操作指令。:表示指令執(zhí)行的條件。S:決定指令的操作是否影響CPSR的值。:表示目標(biāo)寄存器。:表示包含第1個(gè)操作數(shù)的寄存器。:表示第2個(gè)操作數(shù)。82.2.1 數(shù)據(jù)處理指令的操作數(shù)的尋址方式數(shù)據(jù)處理指令的操作數(shù)的尋址方式通常有下面
5、通常有下面3種格式。種格式。(1)立即數(shù)方式。(2)寄存器方式。(3)寄存器移位方式。數(shù)據(jù)處理指令操作數(shù)的具體尋址方式有下面數(shù)據(jù)處理指令操作數(shù)的具體尋址方式有下面11種。種。#, LSL #, LSL , LSR #, LSR , ASR #, ASR , ROR #, ROR , RRX92.2.2 字及無(wú)符號(hào)字節(jié)的字及無(wú)符號(hào)字節(jié)的Load/Store指令的尋址方式指令的尋址方式各種類(lèi)型的各種類(lèi)型的Load/Store指令的尋址方式由兩部分組指令的尋址方式由兩部分組成。一部分為一個(gè)的基址寄存器;另一部分為一個(gè)成。一部分為一個(gè)的基址寄存器;另一部分為一個(gè)地址偏移量?;芳拇嫫骺梢詾槿我粋€(gè)通用寄
6、存地址偏移量。基址寄存器可以為任一個(gè)通用寄存器;地址偏移量可以有以下器;地址偏移量可以有以下3種格式:種格式:立即數(shù)。寄存器。寄存器及一個(gè)移位常數(shù)。同樣,尋址方式的地址計(jì)算方法有如下同樣,尋址方式的地址計(jì)算方法有如下3種:種:偏移量方法。事先更新方法。事后更新方法。102.2.2 字及無(wú)符號(hào)字節(jié)的字及無(wú)符號(hào)字節(jié)的Load/Store指令的尋址方式指令的尋址方式LDR指令的語(yǔ)法格式如下所示:指令的語(yǔ)法格式如下所示: LDRB T,其中,其中,表示第表示第2個(gè)操作數(shù)的內(nèi)存?zhèn)€操作數(shù)的內(nèi)存地址,共有如下地址,共有如下9種格式:種格式:, #+/, +/, +/,#, #+/!, +/!, +/,#!,
7、 #+/, +/, +/,#112.2.3 雜類(lèi)雜類(lèi)Load/Store指令的尋址方式指令的尋址方式這里所說(shuō)的雜類(lèi)這里所說(shuō)的雜類(lèi)Load/Store指令,包括操作數(shù)為半字指令,包括操作數(shù)為半字(無(wú)符無(wú)符號(hào)數(shù)或帶符號(hào)數(shù)號(hào)數(shù)或帶符號(hào)數(shù))數(shù)據(jù)的數(shù)據(jù)的Load/Store指令;操作數(shù)為帶符號(hào)指令;操作數(shù)為帶符號(hào)的字節(jié)數(shù)據(jù)的的字節(jié)數(shù)據(jù)的Load 指令;雙字的指令;雙字的Load/Store指令。這類(lèi)指指令。這類(lèi)指令的語(yǔ)法格式為:令的語(yǔ)法格式為: LDR|STRH|SH|SB|D , 其中,其中,是指令中內(nèi)存單元的尋址方是指令中內(nèi)存單元的尋址方式,具體有以下式,具體有以下6種格式:種格式:, #+/, +
8、/, #+/!, +/!, #+/, +/122.2.4 批量批量Load/Store指令的尋址方式指令的尋址方式一條批量一條批量Load/Store指令可以實(shí)現(xiàn)在一組寄存器和指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。其語(yǔ)法格式如一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。其語(yǔ)法格式如下:下:DM|STM !, 其中,指令中寄存器和內(nèi)存單元的對(duì)應(yīng)關(guān)系滿足這其中,指令中寄存器和內(nèi)存單元的對(duì)應(yīng)關(guān)系滿足這樣的規(guī)則,即編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中的低地樣的規(guī)則,即編號(hào)低的寄存器對(duì)應(yīng)于內(nèi)存中的低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單址單元,編號(hào)高的寄存器對(duì)應(yīng)于內(nèi)存中的高地址單元,元,中存放地址
9、塊的最低地址值。中存放地址塊的最低地址值。132.2.4 批量批量Load/Store指令的尋址方式指令的尋址方式表示地址的變化方式,有以表示地址的變化方式,有以下下4種方式。種方式。IA (Increment After):事后遞增方式。IB (Increment Before):事先遞增方式。DA (Decrement After):事后遞減方式。DB (Decrement Before):事先遞減方式。批量批量Load/Store指令的編碼格式如下:指令的編碼格式如下:142.2.4 批量批量Load/Store指令的尋址方式指令的尋址方式1. 事后遞增方式事后遞增方式IA2. 事先遞增
10、方式事先遞增方式IB3. 事后遞減方式事后遞減方式DA4. 事先遞減方式事先遞減方式DB5. 對(duì)應(yīng)于棧操作的尋址方式對(duì)應(yīng)于棧操作的尋址方式152.2.5 協(xié)處理器協(xié)處理器Load/Store指令的尋址方式指令的尋址方式一條協(xié)處理器一條協(xié)處理器Load/Store指令可以在指令可以在ARM處理器和協(xié)處理處理器和協(xié)處理器之間傳輸批量數(shù)據(jù)。其語(yǔ)法格式如下:器之間傳輸批量數(shù)據(jù)。其語(yǔ)法格式如下:L ,其中,其中,表示地址的變化方式,有以下表示地址的變化方式,有以下4種格式:種格式:,#+/*4,#+/*4!,#+/*4,協(xié)處理器協(xié)處理器Load/Store指令的編碼格式如下所示。指令的編碼格式如下所示。
11、162.2.5 協(xié)處理器協(xié)處理器Load/Store指令的尋址方式指令的尋址方式1. 偏移量偏移量 ,#+/*42. 事先更新事先更新 ,#+/*4!3. 事先更新事先更新,#+/*44. 非索引非索引 ,17第第3章章 ARM指令集介紹指令集介紹在本章中,將詳細(xì)介紹各在本章中,將詳細(xì)介紹各ARM指令,并給指令,并給出一些典型的出一些典型的ARM功能代碼段。功能代碼段。193.1 ARM指令集指令集ARM指令集可以分為指令集可以分為6類(lèi),即跳轉(zhuǎn)指令、數(shù)據(jù)處理類(lèi),即跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器指令、程序狀態(tài)寄存器(PSR)傳輸指令、傳輸指令、Load/Store指令、協(xié)處理器指令和異常
12、中斷產(chǎn)生指指令、協(xié)處理器指令和異常中斷產(chǎn)生指令。令。為了更清楚地描述這些指令,將一些大類(lèi)的指令進(jìn)為了更清楚地描述這些指令,將一些大類(lèi)的指令進(jìn)一步分為幾個(gè)小類(lèi)分別講述。一步分為幾個(gè)小類(lèi)分別講述。203.1.1 跳轉(zhuǎn)指令跳轉(zhuǎn)指令在在ARM中,有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn):一種是跳轉(zhuǎn)中,有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn):一種是跳轉(zhuǎn)指令;另一種是直接向指令;另一種是直接向PC寄存器寄存器(R15)中寫(xiě)入目標(biāo)地址值。中寫(xiě)入目標(biāo)地址值。在在ARM版本版本5以前的體系中,傳送到以前的體系中,傳送到PC寄存器中的目標(biāo)地寄存器中的目標(biāo)地址值的低兩位址值的低兩位bits1:0被忽略,跳轉(zhuǎn)指令只能在被忽略,跳轉(zhuǎn)指令只能
13、在ARM指令指令集中執(zhí)行,即程序不能從集中執(zhí)行,即程序不能從ARM狀態(tài)切換到狀態(tài)切換到Thumb狀態(tài)。狀態(tài)。非非T系列版本系列版本5的的ARM體系不含體系不含Thumb指令,當(dāng)程序試圖切指令,當(dāng)程序試圖切換到換到Thumb狀態(tài)時(shí),將產(chǎn)生未定義指令異常中斷。狀態(tài)時(shí),將產(chǎn)生未定義指令異常中斷。ARM的跳轉(zhuǎn)指令可以從當(dāng)前指令向前或向后的跳轉(zhuǎn)指令可以從當(dāng)前指令向前或向后32MB的地址空的地址空間跳轉(zhuǎn)。這類(lèi)跳轉(zhuǎn)指令有以下間跳轉(zhuǎn)。這類(lèi)跳轉(zhuǎn)指令有以下4種。種。B:跳轉(zhuǎn)指令。BL:帶返回的跳轉(zhuǎn)指令。BLX:帶返回和狀態(tài)切換的跳轉(zhuǎn)指令。BX:帶狀態(tài)切換的跳轉(zhuǎn)指令。213.1.1 跳轉(zhuǎn)指令跳轉(zhuǎn)指令1. B(跳轉(zhuǎn)指
14、令跳轉(zhuǎn)指令)及及BL(帶返回的跳轉(zhuǎn)指令帶返回的跳轉(zhuǎn)指令)2. BLX(1) 3. BLX(2)4. BX指令指令223.1.2 數(shù)據(jù)處理指令數(shù)據(jù)處理指令數(shù)據(jù)處理指令又可大致分為數(shù)據(jù)處理指令又可大致分為3類(lèi):數(shù)據(jù)傳送指令,類(lèi):數(shù)據(jù)傳送指令,如如MOV;算術(shù)邏輯運(yùn)算指令,如;算術(shù)邏輯運(yùn)算指令,如ADD、SUB和和AND等;比較指令,如等;比較指令,如TST。數(shù)據(jù)處理指令包括以下指令。數(shù)據(jù)處理指令包括以下指令。MOV:數(shù)據(jù)傳送指令。MVN:數(shù)據(jù)求反傳送指令。CMP:比較指令。CMN:基于相反數(shù)的比較指令。TST:位測(cè)試指令。TEQ:相等測(cè)試指令。ADD:加法指令。SUB:減法指令。233.1.2 數(shù)
15、據(jù)處理指令數(shù)據(jù)處理指令RSB:逆向減法指令。ADC:帶位加法指令。SBC:帶位減法指令。RSC:帶位逆向減法指令。AND:邏輯與操作指令。BIC:位清除指令。EOR:邏輯異或操作指令。ORR:邏輯或操作指令。243.1.3 乘法指令乘法指令A(yù)RM有兩類(lèi)乘法指令:一類(lèi)為有兩類(lèi)乘法指令:一類(lèi)為32位的乘法指令,位的乘法指令,即乘法操作的結(jié)果為即乘法操作的結(jié)果為32位;另一類(lèi)為位;另一類(lèi)為64位的乘法指位的乘法指令,即乘法操作的結(jié)果為令,即乘法操作的結(jié)果為64位。兩類(lèi)指令共有以下位。兩類(lèi)指令共有以下6條。條。MUL:32位乘法指令。MLA:32位帶加數(shù)的乘法指令。SMULL:64位有符號(hào)數(shù)乘法指令。
16、SMLAL:64位帶加數(shù)的有符號(hào)數(shù)乘法指令。UMULL:64位無(wú)符號(hào)數(shù)乘法指令。UMLAL:64位帶加數(shù)的無(wú)符號(hào)數(shù)乘法指令。253.1.4 雜類(lèi)的算術(shù)指令雜類(lèi)的算術(shù)指令在在ARMv5及以上的版本中,包含一條特別的指令及以上的版本中,包含一條特別的指令CLZ,用,用于計(jì)算操作數(shù)最高端于計(jì)算操作數(shù)最高端0的個(gè)數(shù)。這條指令主要用于以下兩種的個(gè)數(shù)。這條指令主要用于以下兩種場(chǎng)合:場(chǎng)合:計(jì)算操作數(shù)規(guī)范化(使其最高位為1)時(shí)需要左移的位數(shù)。確定一個(gè)優(yōu)先級(jí)掩碼中的最高優(yōu)先級(jí)(最高位的優(yōu)先級(jí))。CLZ 前導(dǎo)前導(dǎo)0個(gè)數(shù)計(jì)數(shù)指令個(gè)數(shù)計(jì)數(shù)指令CLZ指令用于計(jì)算寄存器中操作數(shù)最高端指令用于計(jì)算寄存器中操作數(shù)最高端0的個(gè)
17、數(shù)。如果操的個(gè)數(shù)。如果操作數(shù)的作數(shù)的bit31為為1,則指令返回,則指令返回0;如果操作數(shù)為;如果操作數(shù)為0,則指令,則指令返回返回32。指令的編碼格式指令的編碼格式263.1.5 狀態(tài)寄存器訪問(wèn)指令狀態(tài)寄存器訪問(wèn)指令A(yù)RM中有兩條指令用于在狀態(tài)寄存器和通用寄存器中有兩條指令用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。之間傳送數(shù)據(jù)。關(guān)于狀態(tài)寄存器,這里僅強(qiáng)調(diào)以下幾點(diǎn)。關(guān)于狀態(tài)寄存器,這里僅強(qiáng)調(diào)以下幾點(diǎn)。(1)狀態(tài)寄存器中,有些位是當(dāng)前沒(méi)有使用的,但在ARM將來(lái)的版本中有可能使用這些位,因此用戶程序不要使用這些位。(2)程序不能通過(guò)直接修改CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必
18、須通過(guò)BX等指令完成程序狀態(tài)的切換。(3)通常修改狀態(tài)寄存器是通過(guò)“讀取-修改-寫(xiě)回”的操作序列來(lái)實(shí)現(xiàn)的。(4)狀態(tài)寄存器訪問(wèn)指令包括以下兩條。MRS:狀態(tài)寄存器到通用寄存器的傳送指令。MSR:通用寄存器到狀態(tài)寄存器的傳送指令。273.1.6 Load/Store 內(nèi)存訪問(wèn)指令內(nèi)存訪問(wèn)指令Load指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中;指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中;Store指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存。指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存。ARM有兩大類(lèi)的有兩大類(lèi)的Load/Store指令:一類(lèi)用于操作指令:一類(lèi)用于操作32位的字類(lèi)型數(shù)據(jù)以及位的字類(lèi)型數(shù)據(jù)以及8位無(wú)符號(hào)的字節(jié)類(lèi)型數(shù)
19、位無(wú)符號(hào)的字節(jié)類(lèi)型數(shù)據(jù);另一類(lèi)用于操作據(jù);另一類(lèi)用于操作16位半字類(lèi)型的數(shù)據(jù)以及位半字類(lèi)型的數(shù)據(jù)以及8位位的有符號(hào)字節(jié)類(lèi)型的數(shù)據(jù)。的有符號(hào)字節(jié)類(lèi)型的數(shù)據(jù)。Load/Store 內(nèi)存訪問(wèn)指令的一個(gè)操作數(shù)放在寄存內(nèi)存訪問(wèn)指令的一個(gè)操作數(shù)放在寄存器中,另一個(gè)操作數(shù)的尋址方式參見(jiàn)器中,另一個(gè)操作數(shù)的尋址方式參見(jiàn)2.2節(jié)。節(jié)。283.1.6 Load/Store 內(nèi)存訪問(wèn)指令內(nèi)存訪問(wèn)指令用于操作用于操作32位的字類(lèi)型數(shù)據(jù)以及位的字類(lèi)型數(shù)據(jù)以及8位無(wú)符號(hào)的字節(jié)類(lèi)型數(shù)據(jù)位無(wú)符號(hào)的字節(jié)類(lèi)型數(shù)據(jù)的的Load/Store指令有以下指令。指令有以下指令。LDR:字?jǐn)?shù)據(jù)讀取指令。LDRB:字節(jié)數(shù)據(jù)讀取指令。LDRBT
20、:用戶模式的字節(jié)數(shù)據(jù)讀取指令。LDRH:半字?jǐn)?shù)據(jù)讀取指令。LDRSB:有符號(hào)的字節(jié)數(shù)據(jù)讀取指令。LDRSH:有符號(hào)的半字?jǐn)?shù)據(jù)讀取指令。LDRT:用戶模式的字?jǐn)?shù)據(jù)讀取指令。STR:字?jǐn)?shù)據(jù)寫(xiě)入指令。STRB:字節(jié)數(shù)據(jù)寫(xiě)入指令。STRBT:用戶模式字節(jié)數(shù)據(jù)寫(xiě)入指令。STRH:半字?jǐn)?shù)據(jù)寫(xiě)入指令。STRT:用戶模式字?jǐn)?shù)據(jù)寫(xiě)入指令。293.1.7 批量批量 Load/Store 內(nèi)存訪問(wèn)指令內(nèi)存訪問(wèn)指令批量批量 Load 內(nèi)存訪問(wèn)指令可以一次從連續(xù)的內(nèi)存單內(nèi)存訪問(wèn)指令可以一次從連續(xù)的內(nèi)存單元中讀取數(shù)據(jù),傳送到指令中的內(nèi)存列表中的各個(gè)元中讀取數(shù)據(jù),傳送到指令中的內(nèi)存列表中的各個(gè)寄存器中。寄存器中。批量批量S
21、tore內(nèi)存訪問(wèn)指令可以將指令中寄存器列表內(nèi)存訪問(wèn)指令可以將指令中寄存器列表中的各個(gè)寄存器值寫(xiě)入到內(nèi)存中,內(nèi)存的地址由指中的各個(gè)寄存器值寫(xiě)入到內(nèi)存中,內(nèi)存的地址由指令中的尋址模式確定。令中的尋址模式確定。批量批量Load/Store內(nèi)存訪問(wèn)指令的語(yǔ)法格式如下:內(nèi)存訪問(wèn)指令的語(yǔ)法格式如下: LDM|STM Rn!, 其中,操作數(shù)的尋址方式參見(jiàn)其中,操作數(shù)的尋址方式參見(jiàn)2.2節(jié)。節(jié)。303.1.7 批量批量 Load/Store 內(nèi)存訪問(wèn)指令內(nèi)存訪問(wèn)指令批量批量 Load/Store 內(nèi)存訪問(wèn)指令主要有以下幾條。內(nèi)存訪問(wèn)指令主要有以下幾條。LDM(1):批量?jī)?nèi)存字?jǐn)?shù)據(jù)讀取指令。LDM(2):用戶模
22、式的批量?jī)?nèi)存字?jǐn)?shù)據(jù)讀取指令。LDM(3):帶狀態(tài)寄存器的批量?jī)?nèi)存字?jǐn)?shù)據(jù)讀取指令。STM(1):批量?jī)?nèi)存字?jǐn)?shù)據(jù)寫(xiě)入指令。STM(2):用戶模式的批量?jī)?nèi)存字?jǐn)?shù)據(jù)寫(xiě)入指令。313.1.8 信號(hào)量操作指令信號(hào)量操作指令信號(hào)量用于進(jìn)程間的同步和互斥。對(duì)信號(hào)量的操作信號(hào)量用于進(jìn)程間的同步和互斥。對(duì)信號(hào)量的操作通常要求是一個(gè)原子操作,即在一條指令中完成信通常要求是一個(gè)原子操作,即在一條指令中完成信號(hào)量的讀取和修改操作。號(hào)量的讀取和修改操作。ARM提供了如下兩條指令提供了如下兩條指令來(lái)完成信號(hào)量的操作。來(lái)完成信號(hào)量的操作。SWP:交換指令。SWPB:字節(jié)交換指令。323.1.9 異常中斷產(chǎn)生指令異常中斷產(chǎn)生指
23、令A(yù)RM有兩條異常中斷產(chǎn)生指令。有兩條異常中斷產(chǎn)生指令。SWI:軟中斷指令。SWI用于產(chǎn)生SWI異常中斷,ARM正是通過(guò)這種機(jī)制實(shí)現(xiàn)在用戶模式中對(duì)操作系統(tǒng)中特權(quán)模式的程序的調(diào)用。BKPT:斷點(diǎn)中斷指令。BKPT在ARMv5及以上的版本中引入,主要用于產(chǎn)生軟件斷點(diǎn),供調(diào)試程序使用。333.1.10 ARM協(xié)處理器指令協(xié)處理器指令A(yù)RM支持支持16個(gè)協(xié)處理器。個(gè)協(xié)處理器。ARM協(xié)處理器可以部分地執(zhí)行一條指令,然后產(chǎn)生異常中協(xié)處理器可以部分地執(zhí)行一條指令,然后產(chǎn)生異常中斷,如像除法運(yùn)算除數(shù)為斷,如像除法運(yùn)算除數(shù)為0的情況。所有這些操作均由的情況。所有這些操作均由ARM協(xié)處理器決定,協(xié)處理器決定,AR
24、M處理器并不參與這些操作。同樣,處理器并不參與這些操作。同樣,ARM協(xié)處理器指令中的協(xié)處理器的寄存器標(biāo)識(shí)符以及操作協(xié)處理器指令中的協(xié)處理器的寄存器標(biāo)識(shí)符以及操作類(lèi)型助記符也有各種不同的實(shí)現(xiàn)定義,程序員可以通過(guò)宏來(lái)類(lèi)型助記符也有各種不同的實(shí)現(xiàn)定義,程序員可以通過(guò)宏來(lái)定義這些指令的語(yǔ)法格式。定義這些指令的語(yǔ)法格式。ARM協(xié)處理器指令包括以下協(xié)處理器指令包括以下3類(lèi):類(lèi):用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作。用于ARM處理器的寄存器和ARM協(xié)處理器的寄存器間的數(shù)據(jù)傳送操作。用于在ARM協(xié)處理器的寄存器和內(nèi)存單元之間傳送數(shù)據(jù)。343.1.10 ARM協(xié)處理器指令協(xié)處理器指令這些指令包括以
25、下這些指令包括以下5條。條。CDP:協(xié)處理器數(shù)據(jù)操作指令。LDC:協(xié)處理器數(shù)據(jù)讀取指令。STC:協(xié)處理器數(shù)據(jù)寫(xiě)入指令。MCR:ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令。MRC:協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令。353.2 一些基本的一些基本的ARM指令功能段指令功能段本節(jié)介紹一些基本的本節(jié)介紹一些基本的ARM指令代碼段。通過(guò)對(duì)這些指令代碼段。通過(guò)對(duì)這些代碼段的分析,進(jìn)一步理解相關(guān)的代碼段的分析,進(jìn)一步理解相關(guān)的ARM指令的用指令的用法,逐步學(xué)習(xí)如何使用法,逐步學(xué)習(xí)如何使用ARM指令編寫(xiě)高效率的程指令編寫(xiě)高效率的程序。本節(jié)主要包括以下幾部分的內(nèi)容:序。本節(jié)主要包括以下幾部分的內(nèi)容:算
26、術(shù)邏輯運(yùn)算指令的應(yīng)用。跳轉(zhuǎn)指令的應(yīng)用。Load/Store指令的應(yīng)用。批量Load/Store指令的應(yīng)用。信號(hào)量指令的應(yīng)用。與系統(tǒng)相關(guān)的一些指令的應(yīng)用。363.2.1 算術(shù)邏輯運(yùn)算指令的應(yīng)用算術(shù)邏輯運(yùn)算指令的應(yīng)用1. 位操作指令應(yīng)用舉例位操作指令應(yīng)用舉例2. 實(shí)現(xiàn)乘法的指令段舉例實(shí)現(xiàn)乘法的指令段舉例3. 64位數(shù)據(jù)運(yùn)算舉例位數(shù)據(jù)運(yùn)算舉例4. 轉(zhuǎn)換內(nèi)存中數(shù)據(jù)存儲(chǔ)方式的指令段轉(zhuǎn)換內(nèi)存中數(shù)據(jù)存儲(chǔ)方式的指令段一種是字?jǐn)?shù)據(jù)中的高位數(shù)據(jù)存放在高地址處,低位數(shù)據(jù)存放在低地址處另一種是字中高位數(shù)據(jù)存放在低地址處,低位數(shù)據(jù)存放在高地址處373.2.2 跳轉(zhuǎn)指令的應(yīng)用跳轉(zhuǎn)指令的應(yīng)用1. 子程序調(diào)用子程序調(diào)用2.
27、條件執(zhí)行條件執(zhí)行3. 條件判斷語(yǔ)句條件判斷語(yǔ)句4. 循環(huán)語(yǔ)句循環(huán)語(yǔ)句5. 多路分支程序語(yǔ)句多路分支程序語(yǔ)句383.2.3 Load/Store指令的應(yīng)用指令的應(yīng)用1. 鏈表操作鏈表操作2. 簡(jiǎn)單的串比較簡(jiǎn)單的串比較3. 長(zhǎng)跳轉(zhuǎn)長(zhǎng)跳轉(zhuǎn)4. 多路跳轉(zhuǎn)多路跳轉(zhuǎn)393.2.4 批量批量Load/Store指令的應(yīng)用指令的應(yīng)用1. 簡(jiǎn)單的塊復(fù)制簡(jiǎn)單的塊復(fù)制2. 子程序進(jìn)入和退出時(shí)數(shù)據(jù)的保存和恢復(fù)子程序進(jìn)入和退出時(shí)數(shù)據(jù)的保存和恢復(fù)403.2.5 信號(hào)量指令的應(yīng)用信號(hào)量指令的應(yīng)用信號(hào)量用于實(shí)現(xiàn)對(duì)臨界區(qū)數(shù)據(jù)訪問(wèn)的同步。下面的信號(hào)量用于實(shí)現(xiàn)對(duì)臨界區(qū)數(shù)據(jù)訪問(wèn)的同步。下面的代碼說(shuō)明了在代碼說(shuō)明了在ARM中如何實(shí)現(xiàn)這
28、一過(guò)程。代碼中用中如何實(shí)現(xiàn)這一過(guò)程。代碼中用進(jìn)程標(biāo)識(shí)符來(lái)表示各信號(hào)量的所有者,代碼執(zhí)行前進(jìn)程標(biāo)識(shí)符來(lái)表示各信號(hào)量的所有者,代碼執(zhí)行前進(jìn)程的標(biāo)識(shí)符保存在進(jìn)程的標(biāo)識(shí)符保存在R1中,信號(hào)量的地址保存在中,信號(hào)量的地址保存在R0中。當(dāng)信號(hào)量值為中。當(dāng)信號(hào)量值為0時(shí),表示與該信號(hào)量相關(guān)的時(shí),表示與該信號(hào)量相關(guān)的臨界區(qū)可用;當(dāng)信號(hào)量值為臨界區(qū)可用;當(dāng)信號(hào)量值為1時(shí),表示當(dāng)前有進(jìn)程時(shí),表示當(dāng)前有進(jìn)程正在查看該信號(hào)量的值。如果當(dāng)前進(jìn)程查看的信號(hào)正在查看該信號(hào)量的值。如果當(dāng)前進(jìn)程查看的信號(hào)量正忙,當(dāng)前進(jìn)程將一直等待該信號(hào)量。為了避免量正忙,當(dāng)前進(jìn)程將一直等待該信號(hào)量。為了避免當(dāng)前進(jìn)程的查詢操作阻塞操作系統(tǒng)的進(jìn)程
29、調(diào)度,可當(dāng)前進(jìn)程的查詢操作阻塞操作系統(tǒng)的進(jìn)程調(diào)度,可以在下一次查詢之前完成操作系統(tǒng)中的系統(tǒng)調(diào)用,以在下一次查詢之前完成操作系統(tǒng)中的系統(tǒng)調(diào)用,使當(dāng)前進(jìn)程休眠一段時(shí)間。使當(dāng)前進(jìn)程休眠一段時(shí)間。參見(jiàn)教材P116413.2.6 與系統(tǒng)相關(guān)的一些指令代碼段與系統(tǒng)相關(guān)的一些指令代碼段1. SWI中斷處理程序示例中斷處理程序示例2. IRQ中斷處理程序示例中斷處理程序示例3. 進(jìn)程切換進(jìn)程切換423.3 Thumb指令介紹指令介紹在在ARM體系結(jié)構(gòu)中,體系結(jié)構(gòu)中,ARM指令集中的指令是指令集中的指令是32位指令,其位指令,其執(zhí)行效率很高。對(duì)于存儲(chǔ)系統(tǒng)數(shù)據(jù)總線為執(zhí)行效率很高。對(duì)于存儲(chǔ)系統(tǒng)數(shù)據(jù)總線為16位的應(yīng)用
30、系位的應(yīng)用系統(tǒng),統(tǒng),ARM體系提供了體系提供了Thumb指令集。指令集。Thumb指令集是對(duì)指令集是對(duì)ARM指令集的一個(gè)子集進(jìn)行重新編碼而得到的,其指令長(zhǎng)指令集的一個(gè)子集進(jìn)行重新編碼而得到的,其指令長(zhǎng)度為度為16位。在位。在ARM體系的體系的T變種變種(T Variant)的版本中,同時(shí)的版本中,同時(shí)支持支持ARM指令集和指令集和Thumb指令集,而且遵守一定的調(diào)用規(guī)指令集,而且遵守一定的調(diào)用規(guī)則時(shí),則時(shí),Thumb子程序和子程序和ARM子程序可以相互調(diào)用。子程序可以相互調(diào)用。通常在處理器執(zhí)行通常在處理器執(zhí)行ARM程序時(shí),稱(chēng)處理器處于程序時(shí),稱(chēng)處理器處于ARM狀態(tài);狀態(tài);在處理器執(zhí)行在處理器執(zhí)
31、行Thumb程序時(shí),稱(chēng)處理器處于程序時(shí),稱(chēng)處理器處于Thumb狀態(tài)。狀態(tài)。注意處理器狀態(tài)和處理器模式指的是不同的概念。注意處理器狀態(tài)和處理器模式指的是不同的概念。Thumb指令集并沒(méi)有改變指令集并沒(méi)有改變ARM體系底層的程序設(shè)計(jì)模型,體系底層的程序設(shè)計(jì)模型,只是在該模型上增加了一些限制條件。只是在該模型上增加了一些限制條件。Thumb指令集中的指令集中的數(shù)據(jù)處理指令的操作數(shù)仍然是數(shù)據(jù)處理指令的操作數(shù)仍然是32位的,指令尋址地址也是位的,指令尋址地址也是32位的。位的。433.3 Thumb指令介紹指令介紹處理器執(zhí)行處理器執(zhí)行Thumb指令時(shí),可以使用的整數(shù)寄存指令時(shí),可以使用的整數(shù)寄存器通常為
32、器通常為R0R7,有些指令還使用到了程序計(jì)數(shù),有些指令還使用到了程序計(jì)數(shù)器寄存器器寄存器PC(R15)、程序返回寄存器、程序返回寄存器LR(R14)以及以及棧指針寄存器棧指針寄存器SP(R13)。在。在Thumb狀態(tài)下,讀取狀態(tài)下,讀取R15寄存器時(shí),位寄存器時(shí),位0值為值為0,位,位31:1包含了程序計(jì)包含了程序計(jì)數(shù)器的值;在向數(shù)器的值;在向R15寄存器寫(xiě)入數(shù)據(jù)時(shí)時(shí),位寄存器寫(xiě)入數(shù)據(jù)時(shí)時(shí),位0被被忽略,位忽略,位31:1被設(shè)置成當(dāng)前程序計(jì)數(shù)器的值。被設(shè)置成當(dāng)前程序計(jì)數(shù)器的值。Thumb指令集沒(méi)有提供訪問(wèn)指令集沒(méi)有提供訪問(wèn)CPSR/SPSR寄存器的寄存器的指令。處理器根據(jù)指令。處理器根據(jù)CPS
33、R寄存器中的寄存器中的T位來(lái)確定指位來(lái)確定指令類(lèi)型:令類(lèi)型:當(dāng)T位為0時(shí),指令為ARM指令。當(dāng)T位為1時(shí),指令為T(mén)humb指令。44第第4章章 ARM匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)本章介紹如何編寫(xiě)本章介紹如何編寫(xiě)ARM和和Thumb匯編語(yǔ)言程序,匯編語(yǔ)言程序,同時(shí)介紹同時(shí)介紹ARM匯編編譯器匯編編譯器armasm的使用方法。的使用方法。464.1 偽偽 操操 作作偽操作不像機(jī)器指令那樣在計(jì)算機(jī)運(yùn)行期間由機(jī)器執(zhí)行,它偽操作不像機(jī)器指令那樣在計(jì)算機(jī)運(yùn)行期間由機(jī)器執(zhí)行,它是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的。宏是一是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的。宏是一段獨(dú)立的程序代碼。在程序
34、中通過(guò)宏指令調(diào)用該宏。當(dāng)程序段獨(dú)立的程序代碼。在程序中通過(guò)宏指令調(diào)用該宏。當(dāng)程序被匯編時(shí),匯編程序?qū)?duì)每個(gè)宏調(diào)用進(jìn)行展開(kāi),用宏定義體被匯編時(shí),匯編程序?qū)?duì)每個(gè)宏調(diào)用進(jìn)行展開(kāi),用宏定義體取代源程序中的宏指令。本節(jié)介紹以下類(lèi)型的取代源程序中的宏指令。本節(jié)介紹以下類(lèi)型的ARM偽操作偽操作和宏指令:和宏指令:符號(hào)定義(Symbol Definition)偽操作。數(shù)據(jù)定義(Data Definition)偽操作。匯編控制(Assembly Control)偽操作。數(shù)據(jù)幀描述(Frame Description)偽操作。信息報(bào)告(Reporting)偽操作。其他(Miscellaneous)偽操作。474
35、.1.1 符號(hào)定義偽操作符號(hào)定義偽操作符號(hào)定義符號(hào)定義(Symbol Definition)偽操作用于定義偽操作用于定義ARM匯編程序中的變量,對(duì)變量進(jìn)行賦值以及定義匯編程序中的變量,對(duì)變量進(jìn)行賦值以及定義寄存器名稱(chēng)。包括以下偽操作。寄存器名稱(chēng)。包括以下偽操作。GBLA、GBLL及GBLS:聲明全局變量。LCLA、LCLL及LCLS:聲明局部變量。SETA、SETL及SETS:給變量賦值。RLIST:為通用寄存器列表定義名稱(chēng)。CN:為協(xié)處理器的寄存器定義名稱(chēng)。CP:為協(xié)處理器定義名稱(chēng)。DN及SN:為VFP的寄存器定義名稱(chēng)。FN:為FPA的浮點(diǎn)寄存器定義名稱(chēng)。484.1.2 數(shù)據(jù)定義偽操作數(shù)據(jù)定
36、義偽操作數(shù)據(jù)定義數(shù)據(jù)定義(Data Definition)偽操作包括以下具體的偽操作包括以下具體的偽操作。偽操作。LTORG:聲明一個(gè)數(shù)據(jù)緩沖池(Literal Pool)的開(kāi)始。MAP:定義一個(gè)結(jié)構(gòu)化的內(nèi)存表(Storage Map)的首地址。FIELD:定義結(jié)構(gòu)化的內(nèi)存表中的一個(gè)數(shù)據(jù)域(Field)。SPACE:分配一塊內(nèi)存單元,并用0初始化。DCB:分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化。DCD及DCDU:分配一段字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化。DCDO:分配一段字的內(nèi)存單元,并將各單元的內(nèi)容初始化成該單元相對(duì)于靜態(tài)基值寄存器的偏移量。494.1.2 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操
37、作DCFD及DCFDU:分配一段雙字的內(nèi)存單元,并用雙精度的浮點(diǎn)數(shù)據(jù)初始化。DCFS及DCFSU:分配一段字的內(nèi)存單元,并用單精度的浮點(diǎn)數(shù)據(jù)初始化。DCI:分配一段字節(jié)的內(nèi)存單元,用指定的數(shù)據(jù)初始化,指定內(nèi)存單元中存放的是代碼,而不是數(shù)據(jù)。DCQ及DCQU:分配一段雙字的內(nèi)存單元,并用64位的整數(shù)數(shù)據(jù)初始化。DCW及DCWU:分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化。DATA:在代碼段中使用數(shù)據(jù)?,F(xiàn)已不再使用,僅用于保持向前兼容。504.1.3 匯編控制偽操作匯編控制偽操作匯編控制匯編控制(Assembly Control)偽操作包括下面?zhèn)尾僮靼ㄏ旅娴膫尾僮鳎旱膫尾僮鳎篒F、ELSE及E
38、NDIFWHILE及WENDMACRO及MENDMEXIT514.1.4 數(shù)據(jù)幀描述偽操作數(shù)據(jù)幀描述偽操作棧中數(shù)據(jù)幀描述偽操作主要用于調(diào)試,這里不棧中數(shù)據(jù)幀描述偽操作主要用于調(diào)試,這里不介紹這部分內(nèi)容。感興趣的讀者可以參考介紹這部分內(nèi)容。感興趣的讀者可以參考ARM的相關(guān)資料。的相關(guān)資料。524.1.5 信息報(bào)告?zhèn)尾僮餍畔?bào)告?zhèn)尾僮餍畔?bào)告信息報(bào)告(Reporting)偽操作包括下列具體的偽操作包括下列具體的偽操作:偽操作:ASSERTINFOOPTTTL及SUBT534.1.6 其他的偽操作其他的偽操作這些雜類(lèi)的偽操作包括:這些雜類(lèi)的偽操作包括:CODE16及CODE32EQUAREAENTR
39、YENDALIGNEXPORT或GLOBALIMPORTEXTERNGET或INCLUDE544.1.6 其他的偽操作其他的偽操作INCBINKEEPNOFPREQUIREREQUIRE8及PRESERVE8RNROUT554.2 ARM匯編語(yǔ)言偽指令匯編語(yǔ)言偽指令A(yù)RM中偽指令不是真正的中偽指令不是真正的ARM指令或者指令或者Thumb指指令,這些偽指令在匯編編譯器對(duì)源程序進(jìn)行匯編處令,這些偽指令在匯編編譯器對(duì)源程序進(jìn)行匯編處理時(shí)被替換成對(duì)應(yīng)的理時(shí)被替換成對(duì)應(yīng)的ARM或者或者Thumb指令指令(序列序列)。ARM偽指令包括偽指令包括ADR、ADRL、LDR和和NOP。1. ADR (小范圍的
40、地址讀取偽指令)2. ADRL(中等范圍的地址讀取偽指令)3. LDR大范圍的地址讀取偽指令4. NOP 空操作偽指令564.3 ARM匯編語(yǔ)言語(yǔ)句的格式匯編語(yǔ)言語(yǔ)句的格式ARM匯編語(yǔ)言語(yǔ)句格式如下:匯編語(yǔ)言語(yǔ)句格式如下:symbol instruction|directive|pseudo-instruction ; comment其中的符號(hào)及參數(shù)說(shuō)明如下:其中的符號(hào)及參數(shù)說(shuō)明如下:instruction為指令。在ARM匯編語(yǔ)言中,指令不能從一行的行頭開(kāi)始。在一行語(yǔ)句中,指令的前面必須有空格或者符號(hào)。directive為偽操作。pseudo-instruction為偽指令。symbol為符號(hào)
41、。在ARM匯編語(yǔ)言中,符號(hào)必須從一行的行頭開(kāi)始,并且符號(hào)中不能包含空格。在指令和偽指令中,符號(hào)用作地址標(biāo)號(hào)(label);在有些偽操作中,符號(hào)用作變量或者常量。comment為語(yǔ)句的注釋。在ARM匯編語(yǔ)言中,注釋以分號(hào)(;)開(kāi)頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可以單獨(dú)占用一行。574.3.1 ARM匯編語(yǔ)言中的符號(hào)匯編語(yǔ)言中的符號(hào)在在ARM匯編語(yǔ)言中,符號(hào)匯編語(yǔ)言中,符號(hào)(Symbols)可以代表地址可以代表地址(Addresses)、變量、變量(Variables)和數(shù)字常量和數(shù)字常量(Numeric Constants)。當(dāng)符號(hào)代表地址時(shí),又。當(dāng)符號(hào)代表地址時(shí),又稱(chēng)為標(biāo)號(hào)稱(chēng)為標(biāo)號(hào)(Lab
42、el)。當(dāng)標(biāo)號(hào)以數(shù)字開(kāi)頭時(shí),其作用范圍為當(dāng)前段。當(dāng)標(biāo)號(hào)以數(shù)字開(kāi)頭時(shí),其作用范圍為當(dāng)前段(沒(méi)有使沒(méi)有使用用ROUT偽操作時(shí)偽操作時(shí)),這種標(biāo)號(hào)又稱(chēng)為局部標(biāo)號(hào),這種標(biāo)號(hào)又稱(chēng)為局部標(biāo)號(hào)(Local Label)。符號(hào)包。符號(hào)包括變量、數(shù)字常量、標(biāo)號(hào)和局部標(biāo)號(hào)。括變量、數(shù)字常量、標(biāo)號(hào)和局部標(biāo)號(hào)。符號(hào)的命名規(guī)則如下:符號(hào)的命名規(guī)則如下:符號(hào)由大小寫(xiě)字母、數(shù)字以及下劃線組成。局部標(biāo)號(hào)以數(shù)字開(kāi)頭,其他的符號(hào)都不能以數(shù)字開(kāi)頭。符號(hào)是區(qū)分大小寫(xiě)的。符號(hào)中的所有字符都是有意義的。符號(hào)在其作用范圍內(nèi)必須惟一,即在其作用范圍內(nèi)不可有同名的符號(hào)。程序中的符號(hào)不能與系統(tǒng)內(nèi)部變量或者系統(tǒng)預(yù)定義的符號(hào)同名。程序中的符號(hào)通常不
43、要與指令助記符或者偽操作同名。當(dāng)程序中的符號(hào)與指令助記符或者偽操作同名時(shí),可用雙豎線將符號(hào)括起來(lái),如|require|,這時(shí)雙豎線并不是符號(hào)的組成部分。584.3.1 ARM匯編語(yǔ)言中的符號(hào)匯編語(yǔ)言中的符號(hào)1. 變量變量2. 數(shù)字常量數(shù)字常量3. 匯編時(shí)的變量替換匯編時(shí)的變量替換4. 標(biāo)號(hào)標(biāo)號(hào)5. 局部標(biāo)號(hào)局部標(biāo)號(hào)594.3.2 ARM匯編語(yǔ)言中的表達(dá)式匯編語(yǔ)言中的表達(dá)式表達(dá)式是由符號(hào)、數(shù)值、單目或多目操作符以及括表達(dá)式是由符號(hào)、數(shù)值、單目或多目操作符以及括號(hào)組成的。在一個(gè)表達(dá)式中,各種元素的優(yōu)先級(jí)如號(hào)組成的。在一個(gè)表達(dá)式中,各種元素的優(yōu)先級(jí)如下所示:下所示:括號(hào)內(nèi)的表達(dá)式優(yōu)先級(jí)最高。各種操作
44、符有一定的優(yōu)先級(jí)。相鄰的單目操作符的執(zhí)行順序?yàn)橛捎业阶?,單目操作符?yōu)先級(jí)高于其他操作符。優(yōu)先級(jí)相同的雙目操作符執(zhí)行順序?yàn)橛勺蟮接摇?04.3.2 ARM匯編語(yǔ)言中的表達(dá)式匯編語(yǔ)言中的表達(dá)式1. 字符串表達(dá)式字符串表達(dá)式(1)字符串(2)字符串變量(3)操作符LEN CHRSTRLEFTRIGHTCC(4)字符變量的聲明和賦值(5)字符串表達(dá)式應(yīng)用舉例614.3.2 ARM匯編語(yǔ)言中的表達(dá)式匯編語(yǔ)言中的表達(dá)式2. 數(shù)字表達(dá)式數(shù)字表達(dá)式(1)整數(shù)數(shù)字量(2)浮點(diǎn)數(shù)字量(3)數(shù)字變量(4)操作符NOT 按位取反+、/及 MOD 算術(shù)操作符ROL、ROR、SHL及SHR移位(循環(huán)移位操作)AND、OR
45、及EOR按位邏輯操作符624.3.2 ARM匯編語(yǔ)言中的表達(dá)式匯編語(yǔ)言中的表達(dá)式3. 基于寄存器和基于基于寄存器和基于PC的表達(dá)式的表達(dá)式(1)BASE(2)INDEX(3)+、4. 邏輯表達(dá)式邏輯表達(dá)式(1)關(guān)系操作符(2)邏輯操作符5. 其他的一些操作符其他的一些操作符(1)?(2)DEF(3)SB_OFFSET_19_12 (4)SB_OFFSET_11_0634.4 ARM匯編語(yǔ)言程序的格式匯編語(yǔ)言程序的格式本小節(jié)介紹本小節(jié)介紹ARM匯編語(yǔ)言程序的基本格式以及匯編語(yǔ)言程序的基本格式以及子程序間調(diào)用的格式。子程序間調(diào)用的格式。644.4.1 匯編語(yǔ)言程序的格式匯編語(yǔ)言程序的格式ARM匯編
46、語(yǔ)言以段匯編語(yǔ)言以段(Section)為單位組織源文件。段是相對(duì)為單位組織源文件。段是相對(duì)獨(dú)立的、具有特定名稱(chēng)的、不可分割的指令或者數(shù)據(jù)序列。獨(dú)立的、具有特定名稱(chēng)的、不可分割的指令或者數(shù)據(jù)序列。段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)ARM源程序至少源程序至少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。ARM匯編語(yǔ)言源程序經(jīng)過(guò)匯編處理后,生成一個(gè)可執(zhí)行的匯編語(yǔ)言源程序經(jīng)過(guò)匯編處理后,生成一個(gè)可執(zhí)行的映
47、像文件映像文件(類(lèi)似于類(lèi)似于Windows系統(tǒng)下的系統(tǒng)下的EXE文件文件)。該可執(zhí)行的。該可執(zhí)行的映像文件通常包括下面映像文件通常包括下面3部分:部分:一個(gè)或多個(gè)代碼段。代碼段通常是只讀的。零個(gè)或多個(gè)包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段通常是可讀寫(xiě)的。零個(gè)或多個(gè)不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,它們通常是可讀寫(xiě)的。654.4.2 匯編語(yǔ)言子程序的調(diào)用匯編語(yǔ)言子程序的調(diào)用在在ARM匯編語(yǔ)言中,子程序調(diào)用是通過(guò)匯編語(yǔ)言中,子程序調(diào)用是通過(guò)BL指令完指令完成的。成的。BL指令的語(yǔ)法格式如下:指令的語(yǔ)法格式如下:BL subname其中,其中,subname是調(diào)用的子程序的名稱(chēng)。是調(diào)用的子程序的
48、名稱(chēng)。BL指令完成兩個(gè)操作:將子程序的返回地址放在指令完成兩個(gè)操作:將子程序的返回地址放在LR寄存器中,同時(shí)將寄存器中,同時(shí)將PC寄存器值設(shè)置成目標(biāo)子程寄存器值設(shè)置成目標(biāo)子程序的第一條指令地址。序的第一條指令地址。在子程序返回時(shí),可以通過(guò)將在子程序返回時(shí),可以通過(guò)將LR寄存器的值傳送寄存器的值傳送到到PC寄存器中來(lái)實(shí)現(xiàn)。寄存器中來(lái)實(shí)現(xiàn)。子程序調(diào)用時(shí),通常使用寄存器子程序調(diào)用時(shí),通常使用寄存器R0R3來(lái)傳遞參來(lái)傳遞參數(shù)和返回結(jié)果,這些在后面的編程模型中還會(huì)有詳數(shù)和返回結(jié)果,這些在后面的編程模型中還會(huì)有詳細(xì)的介紹。細(xì)的介紹。664.5 ARM匯編編譯器的使用匯編編譯器的使用內(nèi)嵌的內(nèi)嵌的ARM匯編編
49、譯器是匯編編譯器是ARM中中C/C+編譯器的一部分,編譯器的一部分,它沒(méi)有自己的命令行格式。在它沒(méi)有自己的命令行格式。在ARMASM命令中,除了文件命令中,除了文件名區(qū)分大小寫(xiě)之外,其他的參數(shù)都不區(qū)分大小寫(xiě)。名區(qū)分大小寫(xiě)之外,其他的參數(shù)都不區(qū)分大小寫(xiě)。ARMASM的語(yǔ)法格式如下所示:的語(yǔ)法格式如下所示:armasm -16|-32 -apcs none|/qualifier/qualifier.-bigend|-littleend -checkreglist -cpu cpu -depend dependfile|-m|-md-errors errorfile -fpu name -g -he
50、lp -i dir ,dir -keep -listlistingfile options -maxcache n -memaccess attributes -nocache-noesc -noregs -nowarn -o filename -predefine directive -split_ldm-unsafe -via file inputfile674.6 匯編程序設(shè)計(jì)舉例匯編程序設(shè)計(jì)舉例在本節(jié)中,將通過(guò)一些例子來(lái)說(shuō)明在本節(jié)中,將通過(guò)一些例子來(lái)說(shuō)明ARM中偽操中偽操作以及指令的用法。作以及指令的用法。4.6.1小節(jié)中給出了一些偽小節(jié)中給出了一些偽操作的實(shí)例,操作的實(shí)例,4.6.2
51、小節(jié)中是一些小節(jié)中是一些ARM匯編程序匯編程序的實(shí)例。的實(shí)例。684.6.1 ARM中偽操作的使用實(shí)例中偽操作的使用實(shí)例程序程序4.1 ARM中偽操作的使用實(shí)例:中偽操作的使用實(shí)例:參見(jiàn)教材P166694.6.2 ARM匯編程序的實(shí)例匯編程序的實(shí)例1. 數(shù)據(jù)塊復(fù)制數(shù)據(jù)塊復(fù)制2. ADR偽操作的使用實(shí)例偽操作的使用實(shí)例3. 利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)4. 偽指令偽指令LDR的使用實(shí)例的使用實(shí)例70第第5章章 ARM的存儲(chǔ)系統(tǒng)的存儲(chǔ)系統(tǒng)與其他的中、低檔單片機(jī)不同,與其他的中、低檔單片機(jī)不同,ARM處理器中處理器中可以包含一個(gè)存儲(chǔ)管理部件。本章介紹可以包含一個(gè)存儲(chǔ)管理部件。本章介紹
52、ARM體體系中兩種典型的存儲(chǔ)管理實(shí)現(xiàn)機(jī)制。并在最后系中兩種典型的存儲(chǔ)管理實(shí)現(xiàn)機(jī)制。并在最后給出一個(gè)實(shí)例。給出一個(gè)實(shí)例。725.1 ARM存儲(chǔ)系統(tǒng)概述存儲(chǔ)系統(tǒng)概述ARM存儲(chǔ)系統(tǒng)的體系結(jié)構(gòu)可以適應(yīng)多種不同的嵌入式應(yīng)用存儲(chǔ)系統(tǒng)的體系結(jié)構(gòu)可以適應(yīng)多種不同的嵌入式應(yīng)用系統(tǒng)。最簡(jiǎn)單的存儲(chǔ)系統(tǒng)使用普通的地址映射機(jī)制,就像在系統(tǒng)。最簡(jiǎn)單的存儲(chǔ)系統(tǒng)使用普通的地址映射機(jī)制,就像在一些簡(jiǎn)單的單片機(jī)系統(tǒng)中一樣,地址空間的分配方式是固定一些簡(jiǎn)單的單片機(jī)系統(tǒng)中一樣,地址空間的分配方式是固定的,系統(tǒng)中各部分都使用物理地址。而一些復(fù)雜的系統(tǒng)可能的,系統(tǒng)中各部分都使用物理地址。而一些復(fù)雜的系統(tǒng)可能包括一種或者多種下面的技術(shù),從
53、而可以提供功能更為強(qiáng)大包括一種或者多種下面的技術(shù),從而可以提供功能更為強(qiáng)大的存儲(chǔ)系統(tǒng):的存儲(chǔ)系統(tǒng):系統(tǒng)中可能包含多種類(lèi)型的存儲(chǔ)器件通過(guò)使用Cache及Write Buffer技術(shù),可以縮小處理器和存儲(chǔ)系統(tǒng)的速度差別,從而提高系統(tǒng)的整體性能。內(nèi)存管理部件使用內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬空間到物理空間的映射引入存儲(chǔ)保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。引入一些機(jī)制,保證將I/O操作映射成內(nèi)存操作后,各種I/O操作能夠得到正確的結(jié)果。735.1 ARM存儲(chǔ)系統(tǒng)概述存儲(chǔ)系統(tǒng)概述本章中主要介紹以下內(nèi)容。在介紹相關(guān)內(nèi)容時(shí),將本章中主要介紹以下內(nèi)容。在介紹相關(guān)內(nèi)容時(shí),將以以LinkUp公司的通用公司的通用ARM芯片芯片L72
54、05作為例子。作為例子。ARM中用于存儲(chǔ)管理的系統(tǒng)控制協(xié)處理器CP15。ARM中的存儲(chǔ)管理部件MMU(Memory Management Unit)。ARM中的Cache及Write Buffer技術(shù)??焖龠M(jìn)程上下文切換技術(shù)。745.2 ARM中用于存儲(chǔ)管理的系統(tǒng)控制協(xié)處理器中用于存儲(chǔ)管理的系統(tǒng)控制協(xié)處理器CP15CP15可以包含可以包含16個(gè)個(gè)32位的寄存器,其編號(hào)為位的寄存器,其編號(hào)為015。實(shí)際。實(shí)際上,對(duì)于某些編號(hào)的寄存器,可能對(duì)應(yīng)有多個(gè)物理寄存器,上,對(duì)于某些編號(hào)的寄存器,可能對(duì)應(yīng)有多個(gè)物理寄存器,在指令中可指定特定的標(biāo)志位來(lái)區(qū)分這些物理寄存器。這種在指令中可指定特定的標(biāo)志位來(lái)區(qū)分這
55、些物理寄存器。這種機(jī)制有些類(lèi)似于機(jī)制有些類(lèi)似于ARM中的寄存器,當(dāng)處于不同的處理器模中的寄存器,當(dāng)處于不同的處理器模式時(shí),某些式時(shí),某些ARM寄存器可能是不同的物理寄存器,比如對(duì)寄存器可能是不同的物理寄存器,比如對(duì)于寄存器于寄存器SPSR,每一種處理器模式下都對(duì)應(yīng)一個(gè)獨(dú)立的物,每一種處理器模式下都對(duì)應(yīng)一個(gè)獨(dú)立的物理寄存器理寄存器(用戶模式和系統(tǒng)模式對(duì)應(yīng)同樣的物理寄存器,這用戶模式和系統(tǒng)模式對(duì)應(yīng)同樣的物理寄存器,這是一個(gè)例外是一個(gè)例外)。CP15中的寄存器可能是只讀的,也可能是只寫(xiě)的,還有一中的寄存器可能是只讀的,也可能是只寫(xiě)的,還有一些是可以讀寫(xiě)的。對(duì)于每一種寄存器,將會(huì)詳細(xì)介紹:些是可以讀寫(xiě)
56、的。對(duì)于每一種寄存器,將會(huì)詳細(xì)介紹:寄存器的訪問(wèn)類(lèi)型(只讀/只寫(xiě)/讀寫(xiě))。各種訪問(wèn)操作對(duì)于寄存器的作用。寄存器是否對(duì)應(yīng)有多個(gè)物理寄存器。寄存器的具體作用。755.2.1 訪問(wèn)訪問(wèn)CP15寄存器的指令寄存器的指令訪問(wèn)訪問(wèn)CP15寄存器的指令有下面兩種。寄存器的指令有下面兩種。MCR:ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令。MRC:協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令。MCR指令和指令和MRC指令只能在處理器模式是系統(tǒng)模指令只能在處理器模式是系統(tǒng)模式時(shí)執(zhí)行,在用戶模式下執(zhí)行式時(shí)執(zhí)行,在用戶模式下執(zhí)行MCR指令和指令和MRC指指令將會(huì)觸發(fā)未定義指令的異常中斷。令將會(huì)觸發(fā)未定義指令的異常中斷
57、。765.2.2 CP15中的寄存器中的寄存器1. CP15中的寄存器中的寄存器C0(1)標(biāo)識(shí)符寄存器ARM7之后的處理器ARM7處理器ARM7之前的處理器(2)Cache類(lèi)型標(biāo)識(shí)符寄存器2. CP15中的寄存器中的寄存器C1CP15中的寄存器C1是一個(gè)控制寄存器,它包括以下控制功能:禁止/使能MMU以及其他的與存儲(chǔ)系統(tǒng)相關(guān)的功能。配置存儲(chǔ)系統(tǒng)以及ARM處理器中的相關(guān)部分的工作方式。775.3 存儲(chǔ)器管理單元存儲(chǔ)器管理單元MMU5.3.1 存儲(chǔ)器管理單元存儲(chǔ)器管理單元MMU概述概述在ARM系統(tǒng)中,存儲(chǔ)器管理單元MMU主要完成以下工作:虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射。在ARM中采用了頁(yè)式虛擬存
58、儲(chǔ)管理。它把虛擬地址空間分成一個(gè)個(gè)固定大小的塊,每一塊稱(chēng)為一頁(yè),把物理內(nèi)存的地址空間也分成同樣大小的頁(yè)。頁(yè)的大小可以分為粗粒度和細(xì)粒度兩種。MMU就要實(shí)現(xiàn)從虛擬地址到物理地址的轉(zhuǎn)換。存儲(chǔ)器訪問(wèn)權(quán)限的控制。設(shè)置虛擬存儲(chǔ)空間的緩沖的特性。785.3.1 存儲(chǔ)器管理單元MMU概述頁(yè)表頁(yè)表(Translate Table)是實(shí)現(xiàn)上述這些功能的重要是實(shí)現(xiàn)上述這些功能的重要手段,它是一個(gè)位于內(nèi)存中的表。手段,它是一個(gè)位于內(nèi)存中的表。頁(yè)表存放在內(nèi)存中,系統(tǒng)通常用一個(gè)寄存器來(lái)保存頁(yè)表存放在內(nèi)存中,系統(tǒng)通常用一個(gè)寄存器來(lái)保存頁(yè)表的基地址。在頁(yè)表的基地址。在ARM中,系統(tǒng)控制協(xié)處理器中,系統(tǒng)控制協(xié)處理器CP15的
59、寄存器的寄存器C2用來(lái)保存頁(yè)表的基地址。用來(lái)保存頁(yè)表的基地址。當(dāng)當(dāng)CPU需要訪問(wèn)內(nèi)存時(shí),先在需要訪問(wèn)內(nèi)存時(shí),先在TLB中查找需要的地中查找需要的地址變換條目。如果該條目不存在,址變換條目。如果該條目不存在,CPU從位于內(nèi)存從位于內(nèi)存中的頁(yè)表中查詢,并把相應(yīng)的結(jié)果添加到中的頁(yè)表中查詢,并把相應(yīng)的結(jié)果添加到TLB中。中。這樣,當(dāng)這樣,當(dāng)CPU下一次又需要該地址變換條目時(shí),就下一次又需要該地址變換條目時(shí),就可以從可以從TLB中直接得到了,從而使地址變換的速度中直接得到了,從而使地址變換的速度大大加快。大大加快。795.3.1 存儲(chǔ)器管理單元MMU概述當(dāng)內(nèi)存中的頁(yè)表內(nèi)容改變,或者通過(guò)修改系統(tǒng)控制協(xié)處理
60、器當(dāng)內(nèi)存中的頁(yè)表內(nèi)容改變,或者通過(guò)修改系統(tǒng)控制協(xié)處理器CP15的寄的寄存器存器C2使用新的頁(yè)表時(shí),使用新的頁(yè)表時(shí),TLB中的內(nèi)容需要全部清除。中的內(nèi)容需要全部清除。MMU提供了相提供了相關(guān)的硬件支持這種操作。系統(tǒng)控制協(xié)處理器關(guān)的硬件支持這種操作。系統(tǒng)控制協(xié)處理器CP15的寄存器的寄存器C8用來(lái)控制用來(lái)控制清除清除TLB內(nèi)容的相關(guān)操作。內(nèi)容的相關(guān)操作。MMU可以將某些地址變換條目鎖定可以將某些地址變換條目鎖定(Locked Down)在在TLB中,從而使中,從而使得進(jìn)行與該地址變換條目相關(guān)的地址變換速度保持很快。在得進(jìn)行與該地址變換條目相關(guān)的地址變換速度保持很快。在MMU中,中,寄存器寄存器C1
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025勞動(dòng)合同期限與試用期條款的關(guān)聯(lián)性分析
- 車(chē)輛使用權(quán)轉(zhuǎn)讓協(xié)議書(shū)范本
- 離婚后子女撫養(yǎng)協(xié)議
- 扶貧項(xiàng)目資金協(xié)議書(shū)
- 2025年03月江蘇無(wú)錫經(jīng)濟(jì)開(kāi)發(fā)區(qū)事業(yè)單位公開(kāi)招聘工作人員8人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2025年03月山東華宇工學(xué)院碩士研究生公開(kāi)招聘(60人)筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2025年03月國(guó)家統(tǒng)計(jì)局雞西調(diào)查隊(duì)公開(kāi)招聘公益性崗位人員1人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2025年上海市15區(qū)高三語(yǔ)文二模試題匯編之現(xiàn)代文一(學(xué)生版)
- 天津市薊州等部分區(qū)2025屆高中畢業(yè)班第二次模擬(語(yǔ)文試題文)試卷含解析
- 湖南藝術(shù)職業(yè)學(xué)院《統(tǒng)計(jì)軟件與應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 變速自行車(chē)拆裝圖解
- 高齡孕產(chǎn)婦的孕期管理課件
- 學(xué)習(xí)課件鑄牢中華民族共同體意識(shí)PPT
- 湖南省對(duì)口招生考試醫(yī)衛(wèi)專(zhuān)業(yè)十年真題(2010-2019年)
- 用Excel求解運(yùn)籌學(xué)中最大流問(wèn)題詳細(xì)操作示例
- 民航客艙服務(wù)藝術(shù)案例分析全套PPT完整教學(xué)課件
- 全國(guó)大學(xué)生市場(chǎng)調(diào)查與分析大賽優(yōu)秀報(bào)告一等獎(jiǎng)
- CET46大學(xué)英語(yǔ)四六級(jí)單詞EXCEL版
- 2022年南通市特殊教育崗位教師招聘考試筆試試題及答案解析
- GB/T 4857.7-2005包裝運(yùn)輸包裝件基本試驗(yàn)第7部分:正弦定頻振動(dòng)試驗(yàn)方法
- GB/T 3051-2000無(wú)機(jī)化工產(chǎn)品中氯化物含量測(cè)定的通用方法汞量法
評(píng)論
0/150
提交評(píng)論