第3章第三部分 ARM偽指令(東北電力大學(xué))_第1頁
第3章第三部分 ARM偽指令(東北電力大學(xué))_第2頁
第3章第三部分 ARM偽指令(東北電力大學(xué))_第3頁
第3章第三部分 ARM偽指令(東北電力大學(xué))_第4頁
第3章第三部分 ARM偽指令(東北電力大學(xué))_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

3ARM偽操作和偽指令第三章ARM指令分類偽操作,宏指令和偽指令A(yù)RM匯編語言源程序語句,一般由指令,偽操作,宏指令和偽指令組成.偽操作,是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種準(zhǔn)備工作,在源程序運(yùn)行匯編程序處理,而不是在計(jì)算機(jī)運(yùn)行期間有機(jī)器執(zhí)行.也就是說,這些偽操作只是匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命也就隨之消失.

宏指令,是一段獨(dú)立的程序代碼,可以插在程序中,它通過偽操作來定義,宏在被使用之前必須提前定義好,宏之間可以互相調(diào)用,也可自己遞歸調(diào)用.通過直接書寫宏名來使用宏.宏定義本身不產(chǎn)生代碼,只是在調(diào)用它時(shí)把宏體插入到原程序中.宏與C語言中的子函數(shù)形參和實(shí)參的調(diào)用相似,但宏的調(diào)用與子程序的調(diào)用有本質(zhì)的區(qū)別,既宏并不會(huì)節(jié)省程序的空間,其優(yōu)點(diǎn)是簡化程序代碼,提高程序的可讀性以及宏內(nèi)容可以同步修改.

偽操作,宏指令一般與編譯程序有關(guān),因此ARM匯編語言的偽操作,宏指令在不同的編譯環(huán)境下有不同的編寫形式和規(guī)則.

偽指令也是ARM匯編語言程序里的特殊助記符,也不在處理器運(yùn)行期間由機(jī)器執(zhí)行,它們在匯編時(shí)將被合適的機(jī)器指令代替成ARM或Thumb指令,從而實(shí)現(xiàn)真正的指令操作.

1.符號定義偽操作符號定義偽指令用于定義ARM匯編程序的變量,對變量進(jìn)行賦值以及定義寄存器名稱。該類偽指令定義如下:全局變量聲明:GBLA,GBLL,GBLS局部變量聲明:LCLA,LCLL,LCLS變量賦值:SETA,SETL,SETSGBLA,GBLL,GBLS全局變量聲明偽操作GBLA偽操作用于聲明一個(gè)全局的算術(shù)變量,并將其初始化為0;GBLL偽操作用于聲明一個(gè)全局的邏輯變量,并將其初始化為FALSEGBLS為操作用于聲明一個(gè)全局的字符串變量,并將其初始化為空語法格式:GBLAvariableGBLLvariableGBLSvariable其中,variable定義的全局變量名,在其作用范圍內(nèi)必須唯一,全局變量的作用范圍為包含該變量的源程序.舉例如下:GBLLcodedbgcodedbgSETL{TRUE}LCLA,LCLL,LCLS局部變量聲明偽操作,用于宏定義中.LCLA用于聲明一個(gè)局部的算術(shù)變量,并將其初始化為0;LCLL用于聲明一個(gè)局部的邏輯變量,并初始化為{FALSE}LCLS用于聲明一個(gè)局部的字符串變量,并初始化為空.語法格式如下:LBLAvariableLBLLvariableLBLSvariable其中,variable定義的局部變量名,在其作用范圍內(nèi)必須唯一。局部變量的作用范圍為包含該局部變量的宏中進(jìn)行聲明和使用。應(yīng)用舉例:MACRO;宏定義的開始SENDDAT$dat;宏名的定義和宏的參數(shù)LCLAbitno…BitnoSETA8…MEND;宏定義的結(jié)束SETA,SETL,SETS變量賦值偽操作,用于對已定義的全局變量,局部變量賦值SETA用于給一個(gè)全局/局部的算術(shù)變量賦值SETL用于給一個(gè)全局/局部的邏輯變量賦值SETS用于給一個(gè)全局/局部的字符串變量賦值格式:Variable_aSETAexpr_aVariable_lSETLexpr_lVariable_sSETSexpr_s例:GBLSErrStr…ErrStrSETS“hello”…2.數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于數(shù)據(jù)表定義,文字池定義,數(shù)據(jù)空間分配,聲明一個(gè)文字池:LTORG定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址:MAP定義結(jié)構(gòu)化內(nèi)存表中的一個(gè)數(shù)據(jù)域:FIELD分配一塊內(nèi)存空間,并用0初始化:SPACE分配一段字節(jié)的內(nèi)存單元,并用指令的數(shù)據(jù)初始化:DCB分配一段字的內(nèi)存單元,并用指令的數(shù)據(jù)初始化:DCD和DCDULTORGLTORG用于聲明一個(gè)文字池,在使用LDR偽指令時(shí),要在適當(dāng)?shù)牡刂芳尤隠TORG聲明文字池,這樣就會(huì)把要加載的數(shù)據(jù)保存到文字池內(nèi),在用ARM的加載指令讀出數(shù)據(jù).(若沒有使用LTORG聲明文字池,則匯編器會(huì)在程序末尾自動(dòng)聲明)舉例:LDRR0,=0X12345678ADDR1,R1,R0;MOVPC,LR;LTORG;聲明文字池,此地址存儲0X12345678MAPMAP用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址.此時(shí),內(nèi)存表的位置計(jì)數(shù)器設(shè)置成該地址值為指令格式:MAPexpr,{vbase_register}其中,expr為數(shù)字表達(dá)式或者是程序的標(biāo)號,當(dāng)指令中沒有vbase_register時(shí),expr即為結(jié)構(gòu)化內(nèi)存表的首地址.當(dāng)指令中包含這一項(xiàng)時(shí)候,結(jié)構(gòu)化內(nèi)存表的首地址為expr與vbase_register寄存器值的和.應(yīng)用舉例:MAP0X00,R9;定義內(nèi)存表的首地址為R9TimerFIELD4;定義數(shù)據(jù)域Timer,長度為4字節(jié)AttribFIELD4;定義數(shù)據(jù)域Attrib,長度為4字節(jié)StringFIELD100;定義數(shù)據(jù)域String,長度為100字節(jié)…ADRR9,DataStart;LDRR0,Attrib;FIELDFIELD用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域?yàn)橹噶罡袷饺缦拢簕lable}FIELDexpr其中,lable當(dāng)指令中包含這一項(xiàng)時(shí),lable的值為當(dāng)前內(nèi)存表的位置計(jì)數(shù)器的值,匯編編譯器處理了這條FIELD偽指令后,內(nèi)存表計(jì)數(shù)器的值將加上exprexpr表示本數(shù)據(jù)域在內(nèi)存表中所占用的字節(jié)數(shù)SPACESPACE用于分配一塊內(nèi)存單元,并用0初始化,偽指令格式:{lable}SPACEexpr其中,lable內(nèi)存塊起的始地址標(biāo)號expr所要分配內(nèi)存的字節(jié)數(shù)DataBufSPACE1000DCBDCB用于分配一段字節(jié)內(nèi)存單元,并用偽指令中的expr初始化,一般用于定義數(shù)據(jù)表格,或文字符串偽指令格式如下:{lable}DCBexpr{,expr}{expr}…其中,lable內(nèi)存塊起始地址標(biāo)號,expr可以為-128-255的數(shù)值或字符串,內(nèi)存分配的字節(jié)數(shù)由expr個(gè)數(shù)決定應(yīng)用舉例:DISPTABDCB0X33,0X43,0X76,0X12DCB-130,20,36,55ERRSTRDCB“SENDDATAISERROR”,0DCDDCD用于分配一段內(nèi)存單元,并用偽指令中的expr初始化,DCD偽指令分配的內(nèi)存需要字對齊,一般用來定義數(shù)據(jù)表格或其他常數(shù).偽指令格式如下:{lable}DCDexpr{,expr}{,expr}…其中,lable內(nèi)存塊起始地址標(biāo)號。expr常數(shù)表達(dá)式或程序中的標(biāo)號,內(nèi)存分配字節(jié)數(shù)由expr個(gè)數(shù)決定VectorsLDRPC,ResetvAddrLDRPC,UndefinedAddr…ResetvAddrDCDResetUndefinedAddrDCDUndefined…Reset…Undefined

3.匯編控制偽操作匯編控制偽操作用于條件編譯,宏定義,重復(fù)匯編控制,該類偽指令如下:條件匯編控制:IF,ELSE和ENDIF宏定義:MACRO和MEND重復(fù)匯編:WHILE和WENDIF,ELSE和ENDIFIF,ELSE,和ENDIF偽指令能夠根據(jù)條件把一段代碼包括在匯編程序內(nèi)或?qū)⑵渑懦诔绦蛑?偽指令格式如下:IFlogical_expr{ELSE}ENDIF其中,logical_expr用于控制的邏輯表達(dá)式,若條件成立,則代碼段落在源程序中有效,若條件不成立,代碼段1無效,同時(shí)若使用ELSE偽指令,代碼段有效,應(yīng)用舉例如下:…IF{CONFIG}=16BNE_rt_udiv_1LDRR0,=_rt_div0BXR0ELSEBEQ_rt_div0MACRO和MENDMACRO和MEND偽指令用于宏定義。MACRO標(biāo)識宏定義的開始,MEND標(biāo)識宏定義的結(jié)束。用MACRO和MEND定義的一段代碼,成為宏定義體,這樣在程序中就可以通過宏指令多次調(diào)用該代碼段。MACRO{$lable}macroname{$parameter}{$parameter}……;宏定義體MEND其中,$lable宏指令被展開時(shí)候,lable可被替換成相應(yīng)的符號,通常為一個(gè)標(biāo)號前使用$標(biāo)識被匯編時(shí)將使用相應(yīng)的值替代$后的符號,macroname為所定義的宏的名稱。$parameter當(dāng)宏指令被展開時(shí)將被替換成相應(yīng)的值,類似于函數(shù)中的形式參數(shù)。宏的使用,首先要使用MACRO和MEND偽指令定義宏,包括宏定義體代碼。在MACRO偽指令之后的第一行聲明宏的原型,其中包含該宏定義的名稱,及需要的參數(shù)。在匯編程序中可以通過該宏定義的名稱來調(diào)用它。當(dāng)源程序被匯編時(shí)候,匯編器將展開每個(gè)宏調(diào)用,用宏定義體代替源程序中的宏定義的名稱,并用實(shí)際的參數(shù)值代替宏定義時(shí)的形式參數(shù)。無參數(shù)宏應(yīng)用舉例MACROCSI_SETBLDRR0,=RpdatgLDRR1,[R0]ORRR1,R1,#0x0xSTRR1,[R0]MEND帶參數(shù)的宏定義程序舉例:MACRO$IRQ_LableHANDLER$IRQ_ExceptionEXPORT$IRQ_LableIMPORT$IRQ_Exception$IRQ_LableSUBLR,LR,#4STMFDSP!,{R0-R3,R12,LR}MRSR3,CPSRSTMFDSP!,{R3}…MENDWHILE和WENDWHILE和WEND偽指令用于根據(jù)條件重復(fù)匯編相同的或幾乎相同的一段源程序.偽指令格式:WHILElogical_expr;指令或偽指令代碼段WEND其中,logical_expr用于控制的邏輯表達(dá)式,若條件成立,則代碼段在匯編源程序中有效,并不斷重復(fù)這段代碼直到條件不成立應(yīng)用舉例如下:WHILEno<5noSETAno+1…WEND4.雜項(xiàng)偽操作雜項(xiàng)偽操作在匯編程序設(shè)計(jì)較為常用,如段定義操作,入口點(diǎn)設(shè)置偽操作,包含文件偽操作等。該類偽指令如下:邊界對齊:ALIGN段定義:AREA指令集定義:CODE16和CODE32程序入口:ENTRY程序結(jié)束:END常量定義:EQU聲明一個(gè)符號可以被其他文件引用:EXPORT和GLOBAL聲明一個(gè)外部符號:IMPORT和EXTERN包含文件:GET和INCLUDEALIGNALIGN偽指令通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式ALIGN{expr{,offset}}其中,expr數(shù)字表達(dá)式,用于指定對齊的方式。取值為2的n次冪,如1,2,4,8等,不能為0,沒有expr,則默認(rèn)為字對齊方式。Offset數(shù)字表達(dá)式,當(dāng)前位置對齊到下面形式的地址處:offset+n×expr偽指令應(yīng)用舉例:通過ALIGN偽指令使程序中的地址標(biāo)號字對齊:AREAExample,CODE,READONLY…SARTLDRR0,=Sdfjk…MOVPC,LRSdfjkDCB0X58ALIGNMOVR1,R3;…

在段定義AREA中,也可使用ALIGN偽指令對齊,AREAMyStack,DATA,NOINIT,ALIGN=2IrqStackSpaceSPACEIRQ_STACK_legth*4FiqStackSpaceSPACEFIQ_STACK_LEGTH*4AbtStackSpaceSPACEABT_STACK_LEGTH*4UndtStackSpaceSPACEUND_STACK_LEGTH*4AREAAREA偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段,ARM匯編程序設(shè)計(jì)采用分段式設(shè)計(jì),一個(gè)ARM源程序至少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段,偽指令格式:AREAsectionname{,attr}{,attr}…其中,sectionname所定義的代碼段或數(shù)據(jù)段的名稱,如果該名稱是以數(shù)字開頭的,則該名字必須用“︱︱”括起來,如︱1_datasec︱,還有些代碼段具有約定的名字,如︱text︱表示C語言編譯器產(chǎn)生的代碼段或者C語言庫相關(guān)的代碼段。Attr表示代碼段或數(shù)據(jù)段的屬性。在AREA偽指令中,各屬性之間用逗號隔開,各屬性如下:ALIGN=expr。默認(rèn)的情況下,ELF的代碼段和數(shù)據(jù)段是4字節(jié)對齊的,expr可以取0-31的數(shù)值。CODE定義代碼段,默認(rèn)屬性為READONLY;DATA定義為數(shù)據(jù)段,默認(rèn)屬性為READWRITE;NOINIT指定本數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒有將各初始值寫入內(nèi)存單元,或者將內(nèi)存單元值初始化為0;READONLY,指定本段為只讀,代碼段的默認(rèn)屬性為READONLYREADWRITE,指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為READWRITE為指令應(yīng)用舉例如下:AREAExample,CODE,READONLYCODE16和CODE32CODE16偽指令指示匯編編譯器后面的指令為16位的Thumb指令CODE32偽指令指示匯編編譯器后面的指令為32位的ARM指令偽指令格式:CODE16CODE32CODE16和CODE32偽指令只是指示匯編編譯器后面的指令的類型,偽指令本身并不進(jìn)行程序狀態(tài)的切換,要進(jìn)行狀態(tài)切換,可以使用BX指令操作.為指令應(yīng)用舉例:AREAExample,CODE,READONLYCODE32…使用CODE16和CODE32定義Thumb指令及ARM指令并用BX指令進(jìn)行切換.AREAArmThumb,CODE,READONLYCODE32ADRR0,ThumbStart+1BXR0CODE16ThumbStartMOVR0,#10…ENDENDEND指令用于指示匯編編譯器源文件已結(jié)束。每一個(gè)匯編源文件均要使用一個(gè)END偽指令,指示本源程序結(jié)束。偽指令格式:ENDENTRYENTRY偽指令用于指定程序的入口點(diǎn)。偽指令格式:ENTRY一個(gè)程序(可以包含多個(gè)源文件)中至少要有一個(gè)ENTRY,可以有多個(gè)ENTRY,但一個(gè)源文件中最多只有一個(gè)ENTRY偽指令應(yīng)用舉例如下:AREAExample,CODE,READONLYENTRYCODE32STARTMOVR1,#0X5FEQUEQU偽指令為數(shù)字常量,基于寄存器的值和程序中的標(biāo)號定義一個(gè)名稱.指令格式如下:NameEQUexpr{,type}其中,name要定義的常量的名稱expre基于寄存器的地址值,程序中的標(biāo)號,32位地址常量或32位常量Type當(dāng)expr為32位常量時(shí),可用type指示expr表示的數(shù)據(jù)類型,偽指令應(yīng)用舉例:T_bitEQU0X20PLLCONEQU0XE01FC080ABCEEQUlable+8EXPORT和GLOBALEXPORT聲明一個(gè)符號可以被其他文件引用,相當(dāng)于聲明了一個(gè)全局變量.GLOBAL與EXPORT相同。指令格式:EXPORTsymbol{[WEAK]}GLOBAL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論