




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章基于ARM的嵌入式
軟件開發(fā)基礎(chǔ)
基于ARM的嵌入式軟件開發(fā)基礎(chǔ)嵌入式程序一般都采用匯編語言、C(或C++)語言以及匯編語言與C語言的混合編程。為了更好的進(jìn)行基于ARM的嵌入式軟件開發(fā),本章密切結(jié)合第四章具體開發(fā)例程,對基于ARM的嵌入式軟件開發(fā)中所涉及到的基礎(chǔ)內(nèi)容進(jìn)行了簡述。通過對本章的學(xué)習(xí),使大家能夠掌握基于ARM嵌入式程序設(shè)計(jì)的基本知識。
基于ARM的嵌入式軟件開發(fā)基礎(chǔ)ARM指令集Thumb指令集ARM匯編語言程序設(shè)計(jì)基礎(chǔ)嵌入式C語言程序設(shè)計(jì)基礎(chǔ)嵌入式C語言程序設(shè)計(jì)技巧C與匯編語言混合編程3.1ARM指令集基本內(nèi)容:3.1.1ARM指令集概述3.1.2ARM尋址方式3.1.3ARM指令的詳細(xì)介紹學(xué)習(xí)目的:對ARM指令集有初步認(rèn)知如何使用ARM指令集3.1.1ARM指令集概述
ARM指令集的特點(diǎn):由于ARM處理器是基于精簡指令集原理設(shè)計(jì)的,其指令集及譯碼機(jī)制相對較簡單。ARM指令集是32位的,程序的啟動都是從ARM指令集開始,包括所有的異常中斷都自動轉(zhuǎn)化為ARM狀態(tài)。所有的ARM指令集都可以是有條件執(zhí)行的。本節(jié)從指令集編碼、條件執(zhí)行、指令分類及指令格式等幾個(gè)方面對于ARM指令集進(jìn)行概述。一ARM指令集編碼ARM指令集編碼特點(diǎn):ARM指令集是以32位二進(jìn)制編碼的方式給出的。大部分的指令編碼中定義了第一操作數(shù)、第二操作數(shù)、目的操作數(shù)、條件標(biāo)志影響位以及每條指令所對應(yīng)的不同功能實(shí)現(xiàn)的二進(jìn)制位。每條32位ARM指令都具有不同的二進(jìn)制編碼方式來和不同的指令功能相對應(yīng)。二條件執(zhí)行在ARM的指令編碼表中,統(tǒng)一占用編碼的最高四位[31:28]來表示“條件碼。每種“條件碼”用兩個(gè)英文縮寫字符表示它的含義,可以添加在指令助記符的后面表示指令執(zhí)行時(shí)必須要滿足的條件。ARM指令根據(jù)CPSR中的條件位自動判斷是否執(zhí)行指令,在條件滿足時(shí),指令執(zhí)行;否則指令被忽略(可以認(rèn)為執(zhí)行了一條NOP偽指令)。程序狀態(tài)寄存器CPSR和程序狀態(tài)保存寄存器SPSR(1)條件碼標(biāo)志:N、Z、C、V
N——在結(jié)果是帶符號的二進(jìn)制補(bǔ)碼情況下,如果結(jié)果為負(fù)數(shù),則N=1;如果結(jié)果為非負(fù)數(shù),則N=0。Z——如果結(jié)果為0,則Z=1;如果結(jié)果為非0,則Z=0。C——它的設(shè)置分以下幾種情況;對于加法指令(包括比較指令CMN),如果產(chǎn)生進(jìn)位,則C=1;否則C=0。對于減法指令(包括比較指令CMP),如果產(chǎn)生借位,則C=0;否則C=1。對于有移位操作的非加減法指令,C為移位操作中最后移出位的值。對于其他指令,C通常不變。V——它的設(shè)置也分為以下兩種情況:對于加減法指令,在操作數(shù)和結(jié)果是帶符號的整數(shù)時(shí),如果發(fā)生溢出,則V=1;如果無溢出發(fā)生,則V=0。對于其他指令,V通常不發(fā)生變化。二條件執(zhí)行例如,數(shù)據(jù)傳送指令MOV加上條件后綴EQ后成為MOVEQ,表示“相等則執(zhí)行傳送”,“不相等則本條指令不執(zhí)行”,即只有當(dāng)CPRS中的Z標(biāo)志為“1”時(shí),才會發(fā)生數(shù)據(jù)傳送。下表列舉了四位條件碼“cond”的16種編碼中能為用戶所使用的15種,而編碼“1111”為系統(tǒng)暫不使用的保留編碼。三指令分類及指令格式指令分類簡述ARM指令集是Load/Store型的,只能通過Load/Store指令實(shí)現(xiàn)對系統(tǒng)存儲器的訪問,而其它類型的指令是基于處理器內(nèi)部的寄存器完成操作的。ARM指令集可以分為六大類:數(shù)據(jù)處理指令、Load/Store指令、跳轉(zhuǎn)指令、程序狀態(tài)寄存器處理指令、協(xié)處理器指令和異常產(chǎn)生指令。三指令分類及指令格式指令格式ARM指令使用的基本格式如下:〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}指令格式使用舉例LDR R0,[R1];讀取R1地址上的存儲單元內(nèi)容給R0,執(zhí)行條件AL。BEQ DATAEVEN;條件執(zhí)行分支指令,執(zhí)行條件EQ,即相等則跳轉(zhuǎn);到DATAEVEN。ADDSR2,R1,#1 ;加法指令,R2<—R1+1,影響CPSR寄存器(S)。SUBNES R2,R1,#0x20;條件執(zhí)行的減法運(yùn)算,執(zhí)行條件NE,;R1-0x20=>R2影響CPSR寄存器(S)。3.1.2ARM尋址方式尋址方式是根據(jù)指令編碼中給出的地址碼字段來尋找真實(shí)操作數(shù)的方式。ARM處理器支持的基本尋址方式有以下七種方式。
立即尋址
寄存器尋址寄存器間接尋址
基址加偏移尋址堆棧尋址
塊拷貝尋址
相對尋址
堆棧尋址從內(nèi)存管理角度看,堆棧是一塊用于保存數(shù)據(jù)的連續(xù)內(nèi)存,也就是一種按特定順序進(jìn)行數(shù)據(jù)存取的存儲區(qū),這種特定的順序可以歸結(jié)為“后進(jìn)先出”(LIFO)或“先進(jìn)后出”(FILO)。指向堆棧的地址寄存器稱為堆棧指針(SP),堆棧的訪問是通過堆棧指針(R13,ARM處理器的不同工作模式對應(yīng)的物理寄存器各不相同)指向一塊存儲器區(qū)域(堆棧)來實(shí)現(xiàn)的。
堆棧尋址堆棧既可以向下增長(向內(nèi)存低地址),也可以向上增長,這就是堆棧的兩種生長方式:向上生長:即訪問存儲器時(shí),存儲器的地址向高地址方向生長,稱為遞增堆棧(ascendingstack)。向下生長:即訪問存儲器時(shí),存儲器的地址向低地址方向生長,稱為遞減堆棧(descendingstack)。
堆棧尋址根據(jù)堆棧指針指向的數(shù)據(jù)位置的不同,它又可以分為:滿堆棧(FullStack):堆棧指針指向最后壓入堆棧的數(shù)據(jù)或者指向第一個(gè)要讀出的數(shù)據(jù)??斩褩#‥mptyStack):堆棧指針指向最后壓入堆棧的數(shù)據(jù)的上或下一個(gè)空位置或者指向第一個(gè)要讀出的數(shù)據(jù)的上或下一個(gè)空位置(根據(jù)堆棧的生長方向而定)。堆棧尋址根據(jù)以上的描述說明,堆棧有四種形式,分別是由遞增、遞減、滿棧、空棧組成的所有組合。ARM處理器支持這四種形式的堆棧:滿遞增:堆棧隨著存儲器地址的增大而向上增長,基址寄存器指向存儲有效數(shù)據(jù)的最高地址或者指向第一個(gè)要讀出的數(shù)據(jù)的位置??者f增:堆棧隨著存儲器地址的增大而向上增長,基址寄存器指向存儲有效數(shù)據(jù)的最高地址的上一個(gè)空位置或者是指向?qū)⒁x出的第一個(gè)數(shù)據(jù)位置的上一個(gè)空位置。滿遞減:堆棧隨著存儲器地址的減小而向下增長,基址寄存器指向存儲有效數(shù)據(jù)的最低地址或者是指向第一個(gè)要讀出的數(shù)據(jù)的位置??者f減:堆棧隨著存儲器地址的減小而向下增長,基址寄存器指向最后壓入堆棧的數(shù)據(jù)的下一個(gè)空位置或者指向?qū)⒁x出的第一個(gè)數(shù)據(jù)位置的下一個(gè)空位置。3.1.3ARM指令的詳細(xì)介紹ARM指令集總體分為以下6類:數(shù)據(jù)處理指令;程序狀態(tài)寄存器與通用寄存器之間的傳送指令;Load/Store指令;轉(zhuǎn)移指令;異常中斷指令;協(xié)處理器指令。數(shù)據(jù)處理指令A(yù)RM的數(shù)據(jù)處理指令主要完成寄存器中數(shù)據(jù)的算術(shù)和邏輯運(yùn)算操作。ARM數(shù)據(jù)處理指令的基本原則為:所有的操作數(shù)都是32位寬,或來自寄存器,或是在指令中定義的立即數(shù)(符號或0擴(kuò)展);如果數(shù)據(jù)操作有結(jié)果,則結(jié)果為32位寬,放在一個(gè)寄存器中。(有一個(gè)例外:長乘指令產(chǎn)生64位的結(jié)果);ARM指令中使用“3地址模式”,即每一個(gè)操作數(shù)寄存器和結(jié)果寄存器在指令中分別指定。數(shù)據(jù)處理指令根據(jù)指令實(shí)現(xiàn)處理功能可分為以下六類:數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測試指令;乘法指令。數(shù)據(jù)處理指令根據(jù)第二操作數(shù)的類型,其匯編格式分為以下兩種:<op>{<cond>}{S}Rd,Rn,#<32位立即數(shù)><op>{<cond>}{S}Rd,Rn,Rm,{<shift>}ARM數(shù)據(jù)處理指令使用兩個(gè)源操作數(shù)和一個(gè)目的寄存器(Rd)的“3地址模式”,一個(gè)源操作數(shù)(Rn)總是寄存器,第二個(gè)被稱為“靈活的第二操作數(shù)operand2”,它可以是寄存器、移位后的寄存器或立即數(shù)。如果第二操作數(shù)是寄存器Rm,它的移位可能是邏輯移位、算術(shù)移位或是循環(huán)移位,移位的位數(shù)可以是立即數(shù),也可以是寄存器的內(nèi)容。當(dāng)指令為僅需要一個(gè)源操作數(shù)的指令(如MOV、MVN)時(shí),省略Rn;當(dāng)指令為僅產(chǎn)生條件碼輸出的比較測試指令(CMP、CMN、TST、TEQ)時(shí)省略Rd。這些指令中不需要全部的可用操作數(shù),這種不用的寄存器在二進(jìn)制編碼中的寄存器域中應(yīng)該設(shè)置為0(詳見ARM指令集編碼)。數(shù)據(jù)處理中r15的使用r15(PC)作為特殊的寄存器,控制程序的運(yùn)行地址,同時(shí)它也可以作為一般寄存器,但使用時(shí)必須注意細(xì)節(jié)問題。寄存器r15可以用作源操作數(shù),但是不能用來指定移位位數(shù)。在使用寄存器指定移位位數(shù)的情況下,三個(gè)源操作數(shù)都不能是r15。當(dāng)r15用作源操作數(shù)時(shí),三級流水線操作使得真實(shí)PC值為當(dāng)前指令的地址加8個(gè)字節(jié)。r15用作目的寄存器時(shí),指令的功能相當(dāng)于某種形式的轉(zhuǎn)移指令,執(zhí)行轉(zhuǎn)移到結(jié)果對應(yīng)的地址執(zhí)行程序,常用來作為子程序返回。若r15作為目的寄存器且使用了后綴“S”,即設(shè)置了S位,則將當(dāng)前模式的SPSR拷貝到CPSR,這可能影響到中斷使能標(biāo)志位和處理器操作模式。這種機(jī)制自動恢復(fù)PC和CPSR,是實(shí)現(xiàn)異常返回的標(biāo)準(zhǔn)方式。因?yàn)樵谟脩艏跋到y(tǒng)模式?jīng)]有SPSR,在這兩種模式下這種形式的指令無效,如果使用,則指令執(zhí)行的結(jié)果是不可預(yù)知的,但匯編器在匯編時(shí)并不發(fā)出警告。二Load/Store指令A(yù)RM處理器是Load/store型的,即它對數(shù)據(jù)的操作是通過將數(shù)據(jù)從存儲器加載到片內(nèi)寄存器中進(jìn)行處理,處理完成后的結(jié)果經(jīng)過寄存器存回到存儲器中,以加快對片外存儲器進(jìn)行數(shù)據(jù)處理的執(zhí)行速度。ARM的數(shù)據(jù)存取指令Load/Store是唯一用于寄存器和存儲器之間進(jìn)行數(shù)據(jù)傳送的指令。在ARM系統(tǒng)中,輸入/輸出(I/O)功能是通過存儲器映射的可尋址外圍寄存器和中斷輸入的組合來實(shí)現(xiàn)的。外圍設(shè)備中有一些寄存器,在存儲器映射系統(tǒng)中,這些寄存器映射為存儲器的地址(也就是外設(shè)寄存器與存儲器統(tǒng)一編址),對這些寄存器的操作(例如讀寫)可以像對存儲器的操作一樣。處理器對于外設(shè)的操作也是使用Load/Store指令通過類似存儲器操作一樣操作。二Load/Store指令A(yù)RM指令集中有三種基本的數(shù)據(jù)存取指令:單寄存器存取指令(LDR,STR)單寄存器的存取指令提供ARM寄存器和存儲器間最靈活的單數(shù)據(jù)項(xiàng)傳送方式,傳送的數(shù)據(jù)可以是8位字節(jié)、16位的半字或32位字。多寄存器存取指令(LDM,STM)雖然與單寄存器的存取指令相比,這些指令的靈活性要差一些,但它們可以更有效地用于大批數(shù)據(jù)的傳送。單寄存器交換指令(SWP)信號量是最早出現(xiàn)的用來解決進(jìn)程同步與互斥問題的機(jī)制,包括一個(gè)稱為信號量的變量及對它進(jìn)行的兩個(gè)原語操作。通過PV原語對信號量的操作可以完成進(jìn)程間的同步和互斥,對信號量的操作要求在一條指令中完成讀取和修改(具體解釋請參見專業(yè)書籍)。
狀態(tài)寄存器與通用寄存器之間的傳送指令A(yù)RM指令中有兩條指令MSR和MRS,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過“讀?。薷模瓕懟亍比齻€(gè)步驟的操作來實(shí)現(xiàn)的。需要注意的是不能通過該指令直接修改CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過BX等指令來完成程序狀態(tài)的切換。狀態(tài)寄存器到通用寄存器的傳送指令(MRS)MRS指令用于將狀態(tài)寄存器的內(nèi)容傳到通用寄存器中,它主要用于以下三種場合:通過“讀?。薷模瓕懟亍辈僮餍蛄行薷臓顟B(tài)寄存器的內(nèi)容。MRS指令用于將狀態(tài)寄存器的內(nèi)容讀到通用寄存器中;當(dāng)異常中斷允許嵌套時(shí),需要在進(jìn)入異常中斷之后,嵌套中斷發(fā)生之前保存當(dāng)前處理器模式對應(yīng)的SPSR。這時(shí)需要先通過MRS指令讀出SPSR的值,再用其他指令將SPSR值保存起來;當(dāng)進(jìn)程切換時(shí)也需要保存當(dāng)前寄存器值。通用寄存器到狀態(tài)寄存器的傳送指令(MSR)當(dāng)需要保存或修改當(dāng)前模式下CPSR或SPSR的內(nèi)容時(shí),這些內(nèi)容首先必須傳送到通用寄存器中,再對選擇的位進(jìn)行修改,然后將數(shù)據(jù)回寫到狀態(tài)寄存器。這里講述的MSR指令完成這一過程的最后一步,即將立即數(shù)常量或通用寄存器的內(nèi)容加載CPSR或SPSR的指定區(qū)域。通用寄存器到狀態(tài)寄存器的傳送指令(MSR)MSR{<cond>}CPSR_f|SPSR_f,#<32-bitimmediate>MSR{<cond>}CPSR_<field>|SPSR_<field>,Rm這里<field>表示下列情況之一:c-控制域-PSR[7:0]。x-擴(kuò)展域-PSR[15:8](在當(dāng)前ARM中未使用)。s-狀態(tài)域-PSR[23:16](在當(dāng)前ARM中未使用)。f-標(biāo)志位域-PSR[31:24]。通用寄存器到狀態(tài)寄存器的傳送指令(MSR)舉例僅設(shè)置C標(biāo)志位,保存N、Z和V:MRS r0,CPSR ;將CPSR傳送到r0ORR r0,r0,#&20000000 ;設(shè)置r0的29位MSR CPSR_f,r0 ;傳送回CPSR從監(jiān)控模式切換到IRQ模式(例如,啟動時(shí)初始化IRQ堆棧指針):MRS r0,CPSR ;將CPSR傳送到r0BIC r0,r0,#&1f ;低5位清0ORR r0,r0,#&12 ;設(shè)置為IRQ模式MSR CPSR_c,r0 ;傳送回CPSR三轉(zhuǎn)移指令在ARM中有兩種方法可以實(shí)現(xiàn)程序的轉(zhuǎn)移:一種是用前面我們講過的傳送指令直接向PC寄存器(r15)中寫入轉(zhuǎn)移的目標(biāo)地址值,通過改變PC的值實(shí)現(xiàn)程序的跳轉(zhuǎn);另一種是下面我們要講的轉(zhuǎn)移指令。ARM的轉(zhuǎn)移指令可以從當(dāng)前指令向前或向后的32MB的地址空間跳轉(zhuǎn),根據(jù)完成的功能它可以分為以下4種:B轉(zhuǎn)移指令;BL帶鏈接的轉(zhuǎn)移指令;BX帶狀態(tài)切換的轉(zhuǎn)移指令;BLX帶鏈接和狀態(tài)切換的轉(zhuǎn)移指令。轉(zhuǎn)移和轉(zhuǎn)移鏈接指令(B,BL)轉(zhuǎn)移指令B在程序中完成簡單的跳轉(zhuǎn)指令,可以跳轉(zhuǎn)到指令中指定的目的地址。在一個(gè)程序中通常需要轉(zhuǎn)移到子程序,并且當(dāng)子程序執(zhí)行完畢時(shí)能確?;謴?fù)到原來的代碼位置。這就需要把執(zhí)行轉(zhuǎn)移前之程序計(jì)數(shù)器PC的值保存下來。ARM使用轉(zhuǎn)移鏈接指令BL來提供這一功能。BL指令完全象轉(zhuǎn)移指令一樣地執(zhí)行轉(zhuǎn)移,同時(shí)把轉(zhuǎn)移后面緊接的一條指令的地址保存到鏈接寄存器LR(r14)。四異常中斷產(chǎn)生指令軟件中斷指令SWI用于產(chǎn)生SWI異常中斷,用來實(shí)現(xiàn)在用戶模式下對操作系統(tǒng)中特權(quán)模式的程序的調(diào)用;斷點(diǎn)中斷指令BKPT主要用于產(chǎn)生軟件斷點(diǎn),供調(diào)試程序用。軟件中斷指令(SWI)SWI(SoftWareInterrupt)代表“軟件中斷”,用于用戶調(diào)用操作系統(tǒng)的系統(tǒng)例程,常稱為“監(jiān)控調(diào)用”。它將處理器置于監(jiān)控(SVC)模式,從地址0x08開始執(zhí)行指令。二進(jìn)制編碼軟件中斷指令(SWI)注意事項(xiàng):當(dāng)處理器已經(jīng)處于監(jiān)控模式,只要原來的返回地址(在r14_svc)和SPSR_svc已保存,就可以執(zhí)行SWI;否則當(dāng)執(zhí)行SWI時(shí),這些寄存器將被覆蓋。24位立即數(shù)代表的服務(wù)類型依賴于系統(tǒng),但大多數(shù)系統(tǒng)支持一個(gè)標(biāo)準(zhǔn)的子集,用于字符輸入輸出及類似的基本功能。立即數(shù)可以指定為常數(shù)表達(dá)式,但是通常最好是在程序的開始處為所需要的調(diào)用進(jìn)行聲明并設(shè)置它們的值,或者導(dǎo)入一個(gè)文件,該文件為局部操作系統(tǒng)聲明它們的值,然后在代碼中使用它們的名字。在監(jiān)控模式下執(zhí)行的第一條指令位于0x08,一般是一條指向SWI處理程序的轉(zhuǎn)移指令,而SWI處理程序則位于存儲器內(nèi)附近某處。因?yàn)榇鎯ζ髦形挥?x0C的下一個(gè)字正是取指中止處理程序的入口,所以不能在0x08處開始寫SWI處理程序。3.2Thumb指令集ARM開發(fā)工具完全支持Thumb指令,應(yīng)用程序可以靈活的將ARM和Thumb子程序混合編程以便在例程的基礎(chǔ)上提高性能或代碼密度。在編寫Thumb指令時(shí),先要用偽指令CODE16聲明(ADS的編譯環(huán)境下),而且在ARM指令中要使用BX指令跳轉(zhuǎn)到Thumb指令,以切換處理器狀態(tài)。編寫ARM指令時(shí),則可使用偽指令CODE32聲明(ADS的編譯環(huán)境下)。3.3ARM匯編語言程序設(shè)計(jì)基礎(chǔ)ARM匯編語言的偽操作、宏指令與偽指令A(yù)RM匯編語言程序設(shè)計(jì)ARM匯編語言編程的重點(diǎn)ARM匯編程序?qū)嵗?.3.1ARM匯編語言的偽操作、宏指令與偽指令A(yù)RM匯編語言源程序中語句一般由指令、偽操作、宏指令和偽指令組成偽操作是ARM匯編語言程序里的一些特殊指令助記符,它的作用主要是為完成匯編程序做各種準(zhǔn)備工作,在源程序進(jìn)行匯編時(shí)由匯編程序處理,而不是在計(jì)算機(jī)運(yùn)行期間由機(jī)器執(zhí)行。宏指令是一段獨(dú)立的程序代碼,可以插在源程序中,它通過偽操作來定義。宏在被使用之前必須提前定義好,宏之間可以互相調(diào)用,也可以自己遞歸調(diào)用。通過直接書寫宏名來使用宏,并根據(jù)宏指令的格式設(shè)置相應(yīng)的輸入?yún)?shù)。宏定義本身不會產(chǎn)生代碼,只是在調(diào)用它時(shí)把宏體插入到源程序中。偽指令也是ARM匯編語言程序里的特殊指令助記符,也不在處理器運(yùn)行期間由機(jī)器執(zhí)行,它們在匯編時(shí)將被合適的機(jī)器指令代替成ARM或Thumb指令,從而實(shí)現(xiàn)真正指令操作。兩種編譯模式的集成開發(fā)環(huán)境IDE介紹ADS/SDTIDE開發(fā)環(huán)境它由ARM公司開發(fā),使用了CodeWarrior公司的編譯器;集成了GNU開發(fā)工具的IDE開發(fā)環(huán)境它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。ADS編譯環(huán)境下的ARM偽操作和宏指令
ADS編譯環(huán)境下的偽操作有如下幾種:符號定義(SymbolDefinition)偽操作數(shù)據(jù)定義(DataDefinition)偽操作匯編控制(AssemblyControl)偽操作框架描述(FrameDescription)偽操作信息報(bào)告(Reporting)偽操作其他(Miscellaneous)偽操作符號定義偽操作
符號定義偽操作用于定義ARM匯編程序中的變量,對變量進(jìn)行賦值以及定義寄存器名稱。1.GBLA,GBLL及GBLSGBLA,GBLL及GBLS偽操作用于聲明一個(gè)ARM程序中的全局變量并在默認(rèn)情況下將其初始化。GBLA偽操作聲明一個(gè)全局的算術(shù)變量,并將其初始化成0GBLL偽操作聲明一個(gè)全局的邏輯變量,并將其初始化成{FALSE}GBLS偽操作聲明一個(gè)全局的字符串變量,并將其初始化成空串“”語法格式<GBLX>Variable
其中:<GBLX>是GBLA,GBLL或GBLS3種偽操作之一;Variable是全局變量的名稱。在其作用范圍內(nèi)必須惟一,即同一個(gè)變量名只能在作用范圍內(nèi)出現(xiàn)一次。示例變量定義舉例GBLA arithmetic ;聲明一個(gè)全局的算術(shù)變量Arithmatic SETA0xef ;向該變量賦值SPACE arithmetic ;使用該變量GBLL logical ;聲明一個(gè)全局的邏輯變量logicalLogical SETL{TRUE}
;向該變量賦值2.LCLA,LCLL及LCLSLCLA,LCLL及LCLS偽操作用于聲明一個(gè)ARM程序中的局部變量,并在默認(rèn)情況下將其初始化。LCLA偽操作聲明一個(gè)局部的算術(shù)變量,并將其初始化成0。LCLL偽操作聲明一個(gè)局部的邏輯變量,并將其初始化成{FALSE}LCLS偽操作聲明一個(gè)局部的串變量,并將其初始化成空串“”語法格式<LCLX>Variable
其中:<LCLX>是LCLA,LCLL或LCLS3種偽操作之一;Variable是局部變量的名稱。在其作用范圍內(nèi)必須唯一,即同一個(gè)變量名只能在作用范圍內(nèi)出現(xiàn)一次。3.SETA,SETL及SETSSETA,SETL及SETS偽操作用于給一個(gè)ARM程序中的全局或局部變量賦值。SETA偽操作給一個(gè)全局或局部算術(shù)變量賦值SETL偽操作給一個(gè)全局或局部邏輯變量賦值SETS偽操作給一個(gè)全局或局部字符串變量賦值語法格式<SETX>Variableexpr
其中:<SETX>是SETA,SETL或SETS3種偽操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定義的變量的名稱,在其作用范圍內(nèi)必須唯一;expr為表達(dá)式,即賦予變量的值。變量賦值舉例GBLAarithmetic ;聲明一個(gè)全局的算術(shù)變量arithmeticSETA0xef ;向該算術(shù)變量賦值SPACEarithmetic ;引用該算術(shù)變量GBLLlogical ;聲明一個(gè)全局的邏輯變量logicallogicalSETL{TRUE}
;向該變邏輯量賦值
;保存寄存器列表List數(shù)據(jù)定義偽操作數(shù)據(jù)定義(DataDefinition)偽操作用于數(shù)據(jù)緩沖池定義、數(shù)據(jù)表定義、數(shù)據(jù)空間分配等,包括以下的偽操作。4.LTORGLTORG用于聲明一個(gè)數(shù)據(jù)緩沖池(也稱為文字池)的開始。在使用偽指令LDR時(shí),常常需要在適當(dāng)?shù)牡胤郊尤隠TORG聲明數(shù)據(jù)緩沖池,LDR加載的數(shù)據(jù)暫時(shí)放于數(shù)據(jù)緩沖池。語法格式LTORG使用說明當(dāng)程序中使用LDR之類的指令時(shí),數(shù)據(jù)緩沖池的使用可能越界。為防止越界發(fā)生可以使用LTORG偽操作定義數(shù)據(jù)緩沖池。通常大的代碼段可以使用多個(gè)數(shù)據(jù)緩沖池。ARM匯編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個(gè)代碼段開始之前,或者END偽操作之前。LTORG偽操作通常放在無條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器就不會錯(cuò)誤地將數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來執(zhí)行。5.SPACESPACE用于分配一塊連續(xù)內(nèi)存單元,并用0初始化。SPACE可以用“%”代替。語法格式{label}
SPACEexpr其中:{label}是一個(gè)標(biāo)號,是可選的,expr表示本偽操作分配的內(nèi)存字節(jié)數(shù)。6.DCD及DCDUDCD用于分配一段字內(nèi)存單元(分配的內(nèi)存都是字對齊的),并用偽操作中的expr初始化。DCDU與DCD的不同之處在于DCDU分配的內(nèi)存單元并不嚴(yán)格字對齊。DCD和DCDU一般用來定義數(shù)據(jù)表格或其它常數(shù)。DCD可以用“&”代替。語法格式{label}DCDexpr{,expr}…{label}DCDUexpr{,expr}…其中:{label}為可選的標(biāo)號。expr可以為數(shù)字表達(dá)式或程序中的標(biāo)號。內(nèi)存分配的字節(jié)數(shù)由expr的個(gè)數(shù)決定。使用說明DCD偽操作分配的內(nèi)存都是字對齊的,為了保證分配的內(nèi)存是字對齊的,可能在分配的第一個(gè)內(nèi)存單元前插入填補(bǔ)字節(jié)(padding)。DCDU分配的內(nèi)存單元?jiǎng)t不需要字對齊。匯編控制偽操作
匯編控制偽操作用于條件匯編、宏定義、重復(fù)匯編控制等IF,ELSE及ENDIF語法格式IFlogicalexpression…
;指令或偽指令代碼段1{ELSE…
;指令或偽指令代碼段2}ENDIF其中,logicalexpression是用于控制選擇的邏輯表達(dá)式。
ELSE偽操作為可選的。MACRO、MENDMACRO偽操作標(biāo)識宏定義的開始,MEND標(biāo)識宏定義的結(jié)束。用MACRO和MEND定義的一段代碼,稱為宏定義體,這樣在程序中就可以通過宏名多次調(diào)用該代碼段來完成相應(yīng)的功能。語法格式 MACRO {$label}macroname{$parameter{,$parameter}…}
…
;宏代碼 MENDmacroname為所定義的宏的名稱;$label在宏指令被展開時(shí),label可被替換成相應(yīng)的符號,通常是一個(gè)標(biāo)號。(在一個(gè)符號前使用$表示程序被匯編時(shí)將使用相應(yīng)的值來替代$后的符號);$parameter為宏指令的參數(shù),當(dāng)宏指令被展開時(shí)將被替換成相應(yīng)的值,類似于函數(shù)中的形式參數(shù)??梢栽诤甓x時(shí)為參數(shù)指定相應(yīng)的默認(rèn)值。信息報(bào)告?zhèn)尾僮鰽SSERT斷言錯(cuò)誤偽操作。在匯編編譯器對匯編程序的第二遍掃描中,如果其中ASSERT中條件不成立,ASSERT偽操作將報(bào)告該錯(cuò)誤信息。語法格式
ASSERTlogicalexpression其中,logicalexpression為一個(gè)邏輯表達(dá)式。其他的偽操作CODE16及CODE32CODE16偽操作告訴匯編編譯器后面的指令序列為16位的Thumb指令;CODE32偽操作告訴匯編編譯器后面的指令序列為32位的ARM指令。語法格式
CODE16 CODE32EQUEQU偽操作為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(基于PC的值)定義一個(gè)字符名稱。語法格式nameEQUexpr{,type}其中: expr為基于寄存器的地址值、程序中的標(biāo)號、32位的地址常量或者32位的常量;name為EQU偽操作為expr定義的字符名稱;type當(dāng)expr為32位常量時(shí),可以使用type指示expr表示的數(shù)據(jù)的類型。type有下面3種取值。CODE16表明該地址處為Thumb指令CODE32表明該地址處為ARM指令DATA表明該地址處為數(shù)據(jù)區(qū)AREAAREA偽操作用于定義一個(gè)代碼段或者數(shù)據(jù)段。ARM匯編程序中一般采用分段式設(shè)計(jì),一個(gè)ARM源程序至少有一個(gè)代碼段。語法格式 AREAsectionname{,attr}{,attr}…使用說明
通??梢杂肁REA偽操作將程序分為多個(gè)ELF格式的段。一個(gè)大的程序可以包括多個(gè)代碼段和數(shù)據(jù)段。一個(gè)匯編程序至少包含一個(gè)代碼段。ENTRYENTRY偽操作指定程序的入口點(diǎn)。語法格式 ENTRY使用說明
一個(gè)程序可以包含多個(gè)源文件,而一個(gè)源文件中最多只能有一個(gè)ENTRY(也可以沒有ENTRY),所以一個(gè)程序可以有多個(gè)ENTRY,但至少要有一個(gè)ENTRYENDEND偽操作告訴編譯器已經(jīng)到了源程序結(jié)尾。語法格式 END使用說明
每一個(gè)匯編源程序都包含END偽操作,來表示本源程序的結(jié)束。
EXPORT及GLOBALEXPRORT聲明一個(gè)符號可以被其他文件引用,相當(dāng)于聲明了一個(gè)全局變量。GLOBAL是EXPORT的同義詞。語法格式 EXPORTsymbol{[WEAK]} GLOBALsymbol{[WEAK]}其中,symbol為聲明的符號的名稱。它是區(qū)分大小寫的。[WEAK]選項(xiàng)聲明其他的同名符號優(yōu)先于本符號被引用。使用說明
使用EXPORT偽操作聲明一個(gè)源文件中的符號,使得該符號可以被其他源文件引用。IMPORTIMPORT偽操作告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號,而且不論本源文件是否實(shí)際引用該符號,該符號都將被加入到本源文件的符號表中。語法格式 IMPORTsymbol{[WEAK]}其中:symbol為聲明的符號的名稱。它是區(qū)分大小寫的。[WEAK]指定這個(gè)選項(xiàng)后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會到當(dāng)前沒有被INCLUDE進(jìn)來的庫中去查找該符號。EXTERNEXTERN偽操作告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。這與IMPORT偽操作的作用相同,不同之處在于,如果本源文件沒有實(shí)際引用該符號,該符號都將不會被加入到本源文件的符號表中。語法格式EXTERNsymbol{〔WEAK〕}其中,symbol為聲明的符號的名稱,它是區(qū)分大小寫的。[WEAK]指定該選項(xiàng)后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會到當(dāng)前沒有被INCLUDE進(jìn)來的庫中去查找該符號。GET及INCLUDEGET偽操作將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。INCLUDE是GET的同義詞。語法格式GETfilenameINCLUDEfilename其中:filename為被包含的源文件的名稱。這里可以使用路徑信息。注意路徑信息中可以包含空格。3.3.2ARM匯編語言程序設(shè)計(jì)
ARM匯編中的文件格式3.3.2.2ARM匯編語言語句格式ARM匯編語言語句格式如下所示:{symbol}{instruction|directive|pseudo-instruction}
{;comment}其中:instruction為指令。在ARM匯編語言中,指令不能從一行的行頭開始。在一行語句中,指令的前面必須有空格或者符號。directive為偽操作。pseudo-instruction為偽指令。symbol為符號。在ARM匯編語言中,符號必須從一行的行頭開始,并且符號中不能包含空格。在指令和偽指令中符號用作地址標(biāo)號(label);在有些偽操作中,符號用作變量或者常量。comment為語句的注釋。在ARM匯編語言中注釋以分號(;)開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可以單獨(dú)占用一行。ARM匯編語言中的符號符號的命名規(guī)則如下:符號由大小寫字母、數(shù)字以及下劃線組成。局部標(biāo)號(例如在ADS編譯環(huán)境下,ROUT之間的標(biāo)號為局部標(biāo)號)以數(shù)字開頭,其他的符號都不能以數(shù)字開頭。符號是區(qū)分大小寫的。符號在其作用范圍內(nèi)必須惟一,即在其作用范圍內(nèi)不可有同名的符號。程序中的符號不能與系統(tǒng)內(nèi)部變量或者系統(tǒng)預(yù)定義的符號同名。程序中的符號通常不要與指令助記符或者偽操作同名。變量變量有數(shù)字變量、邏輯變量和串變量變量的類型在程序中是不能改變的。數(shù)字變量的取值范圍為數(shù)字常量和數(shù)字表達(dá)式所能表示的數(shù)值的范圍。關(guān)于數(shù)字常量和數(shù)字表達(dá)式在后面有介紹。邏輯變量的取值范圍為{true}和{false}。串變量的取值范圍為串表達(dá)式可以表示的范圍。使用GBLA,GBLL及GBLS偽操作聲明全局變量;使用LCLA,LCLL及LCLS偽操作聲明局部變量;使用SETA,SETL及SETS偽操作為這些變量賦值數(shù)字常量數(shù)字常量一般有3種表示方式:十進(jìn)制數(shù),如:43,6,112;十六進(jìn)制數(shù),如:0x3425,0xFE,0x1;n進(jìn)制數(shù),用n_XXX表示,其中n為2~9,XXX為具體數(shù),如:2_01001101,8_4326標(biāo)號在ARM匯編語言中,標(biāo)號是表示程序中的指令或者數(shù)據(jù)地址的符號,一般它代表一個(gè)地址。標(biāo)號的生成方式有以下3種:基于PC的標(biāo)號:是位于(將要跳轉(zhuǎn)到的)目標(biāo)指令前或者程序中數(shù)據(jù)定義偽操作前的標(biāo)號,在匯編時(shí)將被處理成PC值加上(或減去)一個(gè)數(shù)字常量。它常用于表示跳轉(zhuǎn)指令的目標(biāo)地址,或者代碼段中所嵌入的少量數(shù)據(jù)。基于寄存器的標(biāo)號:通常用MAP和FILED偽操作定義該標(biāo)號,也可以用EQU偽操作定義(參見偽操作一節(jié))。這種標(biāo)號在匯編時(shí)將被處理成寄存器的值加上(或減去)一個(gè)數(shù)字常量。它常用于訪問位于數(shù)據(jù)段中的數(shù)據(jù)。絕對地址:是一個(gè)32位的數(shù)字量,尋址的范圍為0~232-1,即直接可以尋址整個(gè)內(nèi)存空間。局部標(biāo)號局部標(biāo)號主要用于局部范圍代碼。它由一個(gè)0~99之間的數(shù)字和一個(gè)通常表示該局部標(biāo)號作用范圍的符號組成,可以重復(fù)定義。局部標(biāo)號的作用范圍通常為當(dāng)前段,也可用偽操作ROUT來定義局部標(biāo)號的作用范圍。局部標(biāo)號定義的語法格式如下:N{routname}其中:N為0~99之間的數(shù)字。routname為符號,通常為該標(biāo)號作用范圍的名稱(用ROUT偽操作定義的)。局部標(biāo)號引用的語法格式如下:%{F|B}{A|T}
N{routname}其中:
%表示引用操作;F指示編譯器只向前搜索;B指示編譯器只向后搜索;A指示編譯器搜索宏的所有嵌套層次;T指示編譯器搜索宏的當(dāng)前層次。如果F和B都沒有指定,編譯器先向前搜索,再向后搜索;如果A和T都沒有指定,編譯器搜索所有從當(dāng)前層次到宏的最高層次,比當(dāng)前層次低的層次不再搜索;如果指定了routname,編譯器向前搜索最近的ROUT偽操作,若routname與該ROUT偽操作定義的名稱不匹配,編譯器報(bào)告錯(cuò)誤,匯編失敗。ARM匯編語言中的表達(dá)式表達(dá)式是由符號、數(shù)值、單目或多目操作符以及括號組成的。在一個(gè)表達(dá)式各種元素的優(yōu)先級如下所示:括號內(nèi)的表達(dá)式優(yōu)先級最高。各種操作符有一定的優(yōu)先級。相鄰的單目操作符的執(zhí)行順序?yàn)橛捎业阶?,單目操作符?yōu)先級高于其他操作符。優(yōu)先級相同的雙目操作符執(zhí)行順序?yàn)橛勺蟮接?。ARM匯編語言程序格式ARM匯編語言是以段(section)為單位來組織源文件的。段是相對獨(dú)立的、具有特定名稱的、不可分割的指令或者數(shù)據(jù)序列。段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)ARM源程序至少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段ARM匯編語言源程序經(jīng)過匯編處理后生成一個(gè)可執(zhí)行的映像文件,它通常包括下面3部分:一個(gè)或多個(gè)代碼段。代碼段通常是只讀的。零個(gè)或多個(gè)包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段通常是可讀寫的。零個(gè)或多個(gè)不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,通常是可讀寫的。連接器根據(jù)一定的規(guī)則將各個(gè)段安排到內(nèi)存中的相應(yīng)位置。源程序中段之間的相鄰關(guān)系與執(zhí)行的映像文件中段之間的相鄰關(guān)系并不一定相同。下面通過一個(gè)簡單的例子,說明ARM匯編語言源程序的基本結(jié)構(gòu)。AREAEXAMPLE,CODE,READONLYENTRYstartMOVr0,#10MOVr1,#3ADDr0,r0,r1ENDARM匯編語言編程的重點(diǎn)簡單的寄存器操作
ADDr0,
r1,
r2;r0:=r1+r2r0第一個(gè)是結(jié)果寄存器r1第一操作數(shù)r2第二操作數(shù)立即數(shù)操作在數(shù)據(jù)處理指令中,第二操作數(shù)除了可以是寄存器,還可以是一個(gè)立即數(shù)。如果我們只是希望把一個(gè)常數(shù)加到寄存器,而不是兩個(gè)寄存器相加,我們可以用立即數(shù)值取代第二操作數(shù),如下面例子。立即數(shù)用前面加一個(gè)“#”的數(shù)值常量來表示。
ADDR3,
r3,#1;r3:=r3+1
ANDR8,
r7,#&ff;r8:=r7[7:0]寄存器移位操作在ARM數(shù)據(jù)處理指令中,第二操作數(shù)還有一種特有的形式-寄存器移位操作,即允許第二個(gè)寄存器操作數(shù)在同第一操作數(shù)運(yùn)算之前完成移位操作,例如:
ADDr3,
r2,r1,LSL#3;r3:=r2+8×r1設(shè)置條件碼ARM的任何數(shù)據(jù)處理指令都能通過增加“S”操作碼來設(shè)置條件碼(N,Z,C和V)數(shù)據(jù)處理指令加了“S”后,算術(shù)操作(在此包含CMP和CMN)根據(jù)算術(shù)運(yùn)算的結(jié)果設(shè)置所有的標(biāo)志位條件轉(zhuǎn)移轉(zhuǎn)移解釋一般應(yīng)用BBAL無條件的總是總是執(zhí)行轉(zhuǎn)移總是執(zhí)行轉(zhuǎn)移BEQ相等比較的結(jié)果為相等或零BNE不等比較的結(jié)果為不等或非零BPL正結(jié)果為正數(shù)或零BMIBCC負(fù)無進(jìn)位結(jié)果為負(fù)數(shù)算術(shù)操作未得到進(jìn)位BLO低于無符號數(shù)比較,結(jié)果為低于BCSBHS有進(jìn)位高于或相等算術(shù)操作得到了進(jìn)位無符號數(shù)比較,結(jié)果為高于或相等BVC無溢出有符號整數(shù)操作,未出現(xiàn)溢出BVS有溢出有符號整數(shù)操作,出現(xiàn)溢出BGT大于有符號整數(shù)比較,結(jié)果為大于BGE大于或相等有符號整數(shù)比較,結(jié)果為大于或相等BLT小于有符號整數(shù)比較,結(jié)果為小于BLE小于或相等有符號整數(shù)比較,結(jié)果為小于或相等BHI高于無符號數(shù)比較,結(jié)果為高于BLS低于或相等無符號數(shù)比較,結(jié)果為低于或相等匯編語言子程序調(diào)用及返回在ARM匯編語言中,子程序調(diào)用是通過BL指令來完成的。BL指令的語法格式如下: BLsubname其中,subname是被調(diào)用的子程序的名稱。BL指令完成兩個(gè)操作:將子程序的返回地址放在LR寄存器(r14)中,同時(shí)將PC寄存器值設(shè)置成目標(biāo)子程序的第一條指令地址。在返回調(diào)用子程序時(shí),轉(zhuǎn)移鏈接指令保存到LR寄存器(r14)中的值需要拷貝回程序寄存器PC(r15)。ARM與Thumb之間的狀態(tài)轉(zhuǎn)換及函數(shù)的相調(diào)用ARM/Thumb之間的狀態(tài)切換是通過一條專用的轉(zhuǎn)移交換指令BX來實(shí)現(xiàn)的。BX指令以通用寄存器(R0~R15)為操作數(shù),通過拷貝Rn到PC來實(shí)現(xiàn)4GB空間范圍內(nèi)的一個(gè)絕對跳轉(zhuǎn)。BX利用Rn寄存器中目的地址值的最后一位來判斷跳轉(zhuǎn)后的狀態(tài)。當(dāng)最后一位為0時(shí),表示轉(zhuǎn)移到ARM狀態(tài);當(dāng)最后一位為1時(shí),表示轉(zhuǎn)移到Thumb狀態(tài)下面是一段直接進(jìn)行狀態(tài)切換的例程。
;從ARM狀態(tài)開始CODE32 ;表明以下是ARM指令A(yù)DRR0,Into-_Thumb+1 ;得到目標(biāo)地址,末位置1,表示轉(zhuǎn)移到ThumbBXR0 ;轉(zhuǎn)向Thumb…
;執(zhí)行其它代碼CODE16 ;表明以下是Thumb指令I(lǐng)nto-_Thumb …
;Thumb代碼ADRR5,Back_to_ARM ;得到目標(biāo)地址,末位缺省為0,轉(zhuǎn)移到ARMBXR5 ;轉(zhuǎn)向ARM…
;執(zhí)行其它代碼CODE32 ;表明以下是ARM指令Back_to_ARM ;ARM代碼段起始地址ARM的狀態(tài)寄存器CPSR中的狀態(tài)控制位T-bit(位[5])決定了當(dāng)前處理器的運(yùn)行狀態(tài),因此,可以通過MSR和MRS指令來直接修改CPSR的狀態(tài)位,也能夠改變處理器運(yùn)行狀態(tài)但由于ARM采用多級流水線的結(jié)構(gòu),這樣做會造成流水線上預(yù)取指令的執(zhí)行錯(cuò)誤,而如果用BX指令,則不會出現(xiàn)這樣的問題C與匯編語言混合編程ATPCS介紹內(nèi)嵌匯編C和ARM匯編程序間相互調(diào)用ATPCS介紹ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則,目的是為了使單獨(dú)編譯的C語言程序和匯編程序之間能夠相互調(diào)用。這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則和參數(shù)的傳遞規(guī)則。寄存器的使用規(guī)則子程序間通過寄存器R0~R3來傳遞參數(shù),這時(shí),寄存器R0~R3可以記作A1~A4。被調(diào)用的子程序在返回前無需恢復(fù)寄存器R0~R3的內(nèi)容;在子程序中,使用寄存器R4~R11來保存局部變量。這時(shí),寄存器
R4~R11可以記作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序進(jìn)入時(shí)必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值;對于子程序中沒有用到的寄存器則不必進(jìn)行這些操作。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量;寄存器R12用作子程序間的scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出棧),記作ip。在子程序間的連接代碼段中常有這種使用規(guī)則;寄存器R13用作數(shù)據(jù)棧指針,記作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等;寄存器R14稱為鏈接寄存器,記作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以用作其他用途;寄存器R15是程序計(jì)數(shù)器,記作pc。它不能用作其他用途。ATPCS中各寄存器的使用規(guī)則及其名稱寄存器別名特殊名使用規(guī)則R0a1參數(shù)/結(jié)果/scratch寄存器1R1a2參數(shù)/結(jié)果/scratch寄存器2R2a3參數(shù)/結(jié)果/scratch寄存器3R3a4參數(shù)/結(jié)果/scratch寄存器4R4v1ARM狀態(tài)局部變量寄存器1R5v2ARM狀態(tài)局部變量寄存器2R6v3ARM狀態(tài)局部變量寄存器3R7v4wrARM狀態(tài)局部變量寄存器4Thumb狀態(tài)工作寄存器R8v5ARM狀態(tài)局部變量寄存器5R9v6sbARM狀態(tài)局部變量寄存器6,在支持RWPI的ATPCS中為靜態(tài)基址寄存器R10v7slARM狀態(tài)局部變量寄存器7,在支持?jǐn)?shù)據(jù)棧檢查的ATPCS中為數(shù)據(jù)棧限制指針R11v8fpARM狀態(tài)局部變量寄存器8/幀指針R12ip子程序內(nèi)部調(diào)用的scratch寄存器R13sp數(shù)據(jù)棧指針R14lr連接寄存器R15pc程序計(jì)數(shù)器數(shù)據(jù)棧使用規(guī)則滿(FULL)棧當(dāng)堆棧指針指向棧頂元素,即指向最后一個(gè)入棧的數(shù)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 帕金森居家護(hù)理實(shí)務(wù)指南
- 輻照機(jī)構(gòu)質(zhì)量協(xié)議書
- 輔導(dǎo)機(jī)構(gòu)加盟協(xié)議書
- 車輛使用調(diào)度協(xié)議書
- 代理批發(fā)或銷售協(xié)議書
- Brand KPIs for shoes Johnston Murphy in the United States-外文版培訓(xùn)課件(2025.2)
- 超市加盟合同協(xié)議書
- 青蟹買賣合同協(xié)議書
- kva箱變技術(shù)協(xié)議書
- 農(nóng)村房基地轉(zhuǎn)讓協(xié)議書
- 江蘇醫(yī)療美容主診醫(yī)師
- DB50T 1579-2024 大米生產(chǎn)加工技術(shù)規(guī)范
- 家電售后服務(wù)管理辦法
- 《工程造價(jià)管理 第2版》 課件 第一章 工程造價(jià)管理概論
- 2023年中考語文非連續(xù)性文本閱讀練習(xí)題匯編(含答案)
- 經(jīng)典音樂配樂課
- 南宋官窯教學(xué)課件
- 呼吸功能的監(jiān)測與護(hù)理
- 嬰兒椅設(shè)計(jì)研究報(bào)告總結(jié)
- 自動化機(jī)構(gòu)設(shè)計(jì)基礎(chǔ)
- 厭學(xué)怎么辦-主題班會課件
評論
0/150
提交評論