![第3章第三部分 ARM偽指令(東北電力大學)_第1頁](http://file4.renrendoc.com/view/d0f0ec35a13b605c02fdaa46c1c53384/d0f0ec35a13b605c02fdaa46c1c533841.gif)
![第3章第三部分 ARM偽指令(東北電力大學)_第2頁](http://file4.renrendoc.com/view/d0f0ec35a13b605c02fdaa46c1c53384/d0f0ec35a13b605c02fdaa46c1c533842.gif)
![第3章第三部分 ARM偽指令(東北電力大學)_第3頁](http://file4.renrendoc.com/view/d0f0ec35a13b605c02fdaa46c1c53384/d0f0ec35a13b605c02fdaa46c1c533843.gif)
![第3章第三部分 ARM偽指令(東北電力大學)_第4頁](http://file4.renrendoc.com/view/d0f0ec35a13b605c02fdaa46c1c53384/d0f0ec35a13b605c02fdaa46c1c533844.gif)
![第3章第三部分 ARM偽指令(東北電力大學)_第5頁](http://file4.renrendoc.com/view/d0f0ec35a13b605c02fdaa46c1c53384/d0f0ec35a13b605c02fdaa46c1c533845.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
3ARM偽操作和偽指令第三章ARM指令分類偽操作,宏指令和偽指令ARM匯編語言源程序語句,一般由指令,偽操作,宏指令和偽指令組成.偽操作,是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種準備工作,在源程序運行匯編程序處理,而不是在計算機運行期間有機器執(zhí)行.也就是說,這些偽操作只是匯編過程中起作用,一旦匯編結束,偽操作的使命也就隨之消失.
宏指令,是一段獨立的程序代碼,可以插在程序中,它通過偽操作來定義,宏在被使用之前必須提前定義好,宏之間可以互相調用,也可自己遞歸調用.通過直接書寫宏名來使用宏.宏定義本身不產生代碼,只是在調用它時把宏體插入到原程序中.宏與C語言中的子函數(shù)形參和實參的調用相似,但宏的調用與子程序的調用有本質的區(qū)別,既宏并不會節(jié)省程序的空間,其優(yōu)點是簡化程序代碼,提高程序的可讀性以及宏內容可以同步修改.
偽操作,宏指令一般與編譯程序有關,因此ARM匯編語言的偽操作,宏指令在不同的編譯環(huán)境下有不同的編寫形式和規(guī)則.
偽指令也是ARM匯編語言程序里的特殊助記符,也不在處理器運行期間由機器執(zhí)行,它們在匯編時將被合適的機器指令代替成ARM或Thumb指令,從而實現(xiàn)真正的指令操作.
1.符號定義偽操作符號定義偽指令用于定義ARM匯編程序的變量,對變量進行賦值以及定義寄存器名稱。該類偽指令定義如下:全局變量聲明:GBLA,GBLL,GBLS局部變量聲明:LCLA,LCLL,LCLS變量賦值:SETA,SETL,SETSGBLA,GBLL,GBLS全局變量聲明偽操作GBLA偽操作用于聲明一個全局的算術變量,并將其初始化為0;GBLL偽操作用于聲明一個全局的邏輯變量,并將其初始化為FALSEGBLS為操作用于聲明一個全局的字符串變量,并將其初始化為空語法格式:GBLAvariableGBLLvariableGBLSvariable其中,variable定義的全局變量名,在其作用范圍內必須唯一,全局變量的作用范圍為包含該變量的源程序.舉例如下:GBLLcodedbgcodedbgSETL{TRUE}LCLA,LCLL,LCLS局部變量聲明偽操作,用于宏定義中.LCLA用于聲明一個局部的算術變量,并將其初始化為0;LCLL用于聲明一個局部的邏輯變量,并初始化為{FALSE}LCLS用于聲明一個局部的字符串變量,并初始化為空.語法格式如下:LBLAvariableLBLLvariableLBLSvariable其中,variable定義的局部變量名,在其作用范圍內必須唯一。局部變量的作用范圍為包含該局部變量的宏中進行聲明和使用。應用舉例:MACRO;宏定義的開始SENDDAT$dat;宏名的定義和宏的參數(shù)LCLAbitno…BitnoSETA8…MEND;宏定義的結束SETA,SETL,SETS變量賦值偽操作,用于對已定義的全局變量,局部變量賦值SETA用于給一個全局/局部的算術變量賦值SETL用于給一個全局/局部的邏輯變量賦值SETS用于給一個全局/局部的字符串變量賦值格式:Variable_aSETAexpr_aVariable_lSETLexpr_lVariable_sSETSexpr_s例:GBLSErrStr…ErrStrSETS“hello”…2.數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于數(shù)據(jù)表定義,文字池定義,數(shù)據(jù)空間分配,聲明一個文字池:LTORG定義一個結構化的內存表首地址:MAP定義結構化內存表中的一個數(shù)據(jù)域:FIELD分配一塊內存空間,并用0初始化:SPACE分配一段字節(jié)的內存單元,并用指令的數(shù)據(jù)初始化:DCB分配一段字的內存單元,并用指令的數(shù)據(jù)初始化:DCD和DCDULTORGLTORG用于聲明一個文字池,在使用LDR偽指令時,要在適當?shù)牡刂芳尤隠TORG聲明文字池,這樣就會把要加載的數(shù)據(jù)保存到文字池內,在用ARM的加載指令讀出數(shù)據(jù).(若沒有使用LTORG聲明文字池,則匯編器會在程序末尾自動聲明)舉例:LDRR0,=0X12345678ADDR1,R1,R0;MOVPC,LR;LTORG;聲明文字池,此地址存儲0X12345678MAPMAP用于定義一個結構化的內存表的首地址.此時,內存表的位置計數(shù)器設置成該地址值為指令格式:MAPexpr,{vbase_register}其中,expr為數(shù)字表達式或者是程序的標號,當指令中沒有vbase_register時,expr即為結構化內存表的首地址.當指令中包含這一項時候,結構化內存表的首地址為expr與vbase_register寄存器值的和.應用舉例:MAP0X00,R9;定義內存表的首地址為R9TimerFIELD4;定義數(shù)據(jù)域Timer,長度為4字節(jié)AttribFIELD4;定義數(shù)據(jù)域Attrib,長度為4字節(jié)StringFIELD100;定義數(shù)據(jù)域String,長度為100字節(jié)…ADRR9,DataStart;LDRR0,Attrib;FIELDFIELD用于定義一個結構化內存表中的數(shù)據(jù)域為指令格式如下:{lable}FIELDexpr其中,lable當指令中包含這一項時,lable的值為當前內存表的位置計數(shù)器的值,匯編編譯器處理了這條FIELD偽指令后,內存表計數(shù)器的值將加上exprexpr表示本數(shù)據(jù)域在內存表中所占用的字節(jié)數(shù)SPACESPACE用于分配一塊內存單元,并用0初始化,偽指令格式:{lable}SPACEexpr其中,lable內存塊起的始地址標號expr所要分配內存的字節(jié)數(shù)DataBufSPACE1000DCBDCB用于分配一段字節(jié)內存單元,并用偽指令中的expr初始化,一般用于定義數(shù)據(jù)表格,或文字符串偽指令格式如下:{lable}DCBexpr{,expr}{expr}…其中,lable內存塊起始地址標號,expr可以為-128-255的數(shù)值或字符串,內存分配的字節(jié)數(shù)由expr個數(shù)決定應用舉例:DISPTABDCB0X33,0X43,0X76,0X12DCB-130,20,36,55ERRSTRDCB“SENDDATAISERROR”,0DCDDCD用于分配一段內存單元,并用偽指令中的expr初始化,DCD偽指令分配的內存需要字對齊,一般用來定義數(shù)據(jù)表格或其他常數(shù).偽指令格式如下:{lable}DCDexpr{,expr}{,expr}…其中,lable內存塊起始地址標號。expr常數(shù)表達式或程序中的標號,內存分配字節(jié)數(shù)由expr個數(shù)決定VectorsLDRPC,ResetvAddrLDRPC,UndefinedAddr…ResetvAddrDCDResetUndefinedAddrDCDUndefined…Reset…Undefined
3.匯編控制偽操作匯編控制偽操作用于條件編譯,宏定義,重復匯編控制,該類偽指令如下:條件匯編控制:IF,ELSE和ENDIF宏定義:MACRO和MEND重復匯編:WHILE和WENDIF,ELSE和ENDIFIF,ELSE,和ENDIF偽指令能夠根據(jù)條件把一段代碼包括在匯編程序內或將其排除在程序之外.偽指令格式如下:IFlogical_expr{ELSE}ENDIF其中,logical_expr用于控制的邏輯表達式,若條件成立,則代碼段落在源程序中有效,若條件不成立,代碼段1無效,同時若使用ELSE偽指令,代碼段有效,應用舉例如下:…IF{CONFIG}=16BNE_rt_udiv_1LDRR0,=_rt_div0BXR0ELSEBEQ_rt_div0MACRO和MENDMACRO和MEND偽指令用于宏定義。MACRO標識宏定義的開始,MEND標識宏定義的結束。用MACRO和MEND定義的一段代碼,成為宏定義體,這樣在程序中就可以通過宏指令多次調用該代碼段。MACRO{$lable}macroname{$parameter}{$parameter}……;宏定義體MEND其中,$lable宏指令被展開時候,lable可被替換成相應的符號,通常為一個標號前使用$標識被匯編時將使用相應的值替代$后的符號,macroname為所定義的宏的名稱。$parameter當宏指令被展開時將被替換成相應的值,類似于函數(shù)中的形式參數(shù)。宏的使用,首先要使用MACRO和MEND偽指令定義宏,包括宏定義體代碼。在MACRO偽指令之后的第一行聲明宏的原型,其中包含該宏定義的名稱,及需要的參數(shù)。在匯編程序中可以通過該宏定義的名稱來調用它。當源程序被匯編時候,匯編器將展開每個宏調用,用宏定義體代替源程序中的宏定義的名稱,并用實際的參數(shù)值代替宏定義時的形式參數(shù)。無參數(shù)宏應用舉例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ù)條件重復匯編相同的或幾乎相同的一段源程序.偽指令格式:WHILElogical_expr;指令或偽指令代碼段WEND其中,logical_expr用于控制的邏輯表達式,若條件成立,則代碼段在匯編源程序中有效,并不斷重復這段代碼直到條件不成立應用舉例如下:WHILEno<5noSETAno+1…WEND4.雜項偽操作雜項偽操作在匯編程序設計較為常用,如段定義操作,入口點設置偽操作,包含文件偽操作等。該類偽指令如下:邊界對齊:ALIGN段定義:AREA指令集定義:CODE16和CODE32程序入口:ENTRY程序結束:END常量定義:EQU聲明一個符號可以被其他文件引用:EXPORT和GLOBAL聲明一個外部符號:IMPORT和EXTERN包含文件:GET和INCLUDEALIGNALIGN偽指令通過添加補丁字節(jié)使當前位置滿足一定的對齊方式ALIGN{expr{,offset}}其中,expr數(shù)字表達式,用于指定對齊的方式。取值為2的n次冪,如1,2,4,8等,不能為0,沒有expr,則默認為字對齊方式。Offset數(shù)字表達式,當前位置對齊到下面形式的地址處:offset+n×expr偽指令應用舉例:通過ALIGN偽指令使程序中的地址標號字對齊: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偽指令用于定義一個代碼段或數(shù)據(jù)段,ARM匯編程序設計采用分段式設計,一個ARM源程序至少需要一個代碼段,大的程序可以包含多個代碼段和數(shù)據(jù)段,偽指令格式:AREAsectionname{,attr}{,attr}…其中,sectionname所定義的代碼段或數(shù)據(jù)段的名稱,如果該名稱是以數(shù)字開頭的,則該名字必須用“︱︱”括起來,如︱1_datasec︱,還有些代碼段具有約定的名字,如︱text︱表示C語言編譯器產生的代碼段或者C語言庫相關的代碼段。Attr表示代碼段或數(shù)據(jù)段的屬性。在AREA偽指令中,各屬性之間用逗號隔開,各屬性如下:ALIGN=expr。默認的情況下,ELF的代碼段和數(shù)據(jù)段是4字節(jié)對齊的,expr可以取0-31的數(shù)值。CODE定義代碼段,默認屬性為READONLY;DATA定義為數(shù)據(jù)段,默認屬性為READWRITE;NOINIT指定本數(shù)據(jù)段僅僅保留了內存單元,而沒有將各初始值寫入內存單元,或者將內存單元值初始化為0;READONLY,指定本段為只讀,代碼段的默認屬性為READONLYREADWRITE,指定本段為可讀可寫,數(shù)據(jù)段的默認屬性為READWRITE為指令應用舉例如下:AREAExample,CODE,READONLYCODE16和CODE32CODE16偽指令指示匯編編譯器后面的指令為16位的Thumb指令CODE32偽指令指示匯編編譯器后面的指令為32位的ARM指令偽指令格式:CODE16CODE32CODE16和CODE32偽指令只是指示匯編編譯器后面的指令的類型,偽指令本身并不進行程序狀態(tài)的切換,要進行狀態(tài)切換,可以使用BX指令操作.為指令應用舉例:AREAExample,CODE,READONLYCODE32…使用CODE16和CODE32定義Thumb指令及ARM指令并用BX指令進行切換.AREAArmThumb,CODE,READONLYCODE32ADRR0,ThumbStart+1BXR0CODE16ThumbStartMOVR0,#10…ENDENDEND指令用于指示匯編編譯器源文件已結束。每一個匯編源文件均要使用一個END偽指令,指示本源程序結束。偽指令格式:ENDENTRYENTRY偽指令用于指定程序的入口點。偽指令格式:ENTRY一個程序(可以包含多個源文件)中至少要有一個ENTRY,可以有多個ENTRY,但一個源文件中最多只有一個ENTRY偽指令應用舉例如下:AREAExample,CODE,READONLYENTRYCODE32STARTMOVR1,#0X5FEQUEQU偽指令為數(shù)字常量,基于寄存器的值和程序中的標號定義一個名稱.指令格式如下:NameEQUexpr{,type}其中,name要定義的常量的名稱expre基于寄存器的地址值,程序中的標號,32位地址常量或32位常量Type當expr為32位常量時,可用type指示expr表示的數(shù)據(jù)類型,偽指令應用舉例:T_bitEQU0X20PLLCONEQU0XE01FC080ABCEEQUlable+8EXPORT和GLOBALEXPORT聲明一個符號可以被其他文件引用,相當于聲明了一個全局變量.GLOBAL與EXPORT相同。指令格式:EXPORTsymbol{[WEAK]}GLOBAL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 凍貨供應合同范本
- 企業(yè)郵箱合同范本
- 分紅權轉讓合同范本
- 2025年度會議場地租賃合同樣本與不可抗力條款
- 中山美白加盟合同范本
- 農村改造搬遷合同范本
- 加盟鹵菜合同范本寫
- 2022-2027年中國血容量擴充劑行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略咨詢報告
- 供應飼料合同范本
- epc國際合同范本
- 人教版高中數(shù)學必修1全冊導學案
- 四年級計算題大全(列豎式計算,可打印)
- GB/T 5782-2016六角頭螺栓
- 婦產科正常分娩課件
- 產業(yè)鏈鏈長分工表
- 國際金融課件(完整版)
- 導向標識系統(tǒng)設計(一)課件
- 220t鍋爐課程設計 李學玉
- 露天礦采坑邊坡穩(wěn)定性評價報告
- 全英文劇本 《劇院魅影》
- 北京城的中軸線PPT通用課件
評論
0/150
提交評論