ARM匯編程序設計基礎-第四章_第1頁
ARM匯編程序設計基礎-第四章_第2頁
ARM匯編程序設計基礎-第四章_第3頁
ARM匯編程序設計基礎-第四章_第4頁
ARM匯編程序設計基礎-第四章_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章ARM匯編語言程序設計根底本章介紹ARM程序設計的一些根本概念:ARM匯編語言的偽操作、匯編語言的語句格式和匯編語言的程序結(jié)構(gòu),相關例如。第4章目錄偽操作(directive)ARM匯編語言語句格式ARM匯編語言的程序格式相關的程序例如第4章目錄偽操作(directive)ARM匯編語言語句格式ARM匯編語言的程序格式相關的程序例如4.1偽操作(directive)偽操作 偽操作在源程序中的作用是為完成匯編程序,進行各種準備工作〔如數(shù)據(jù)定義、分配存儲區(qū)、指示程序結(jié)束)。這些偽操作僅在匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命就完成。如DCDFunction;就是分配一個字單元,存放Function這個標號,匯編后這個字單元的內(nèi)容就為Function標號的地址。4.1偽操作(directive)宏 通過偽操作〔MACRO/MEND)將一段代碼定義為一個整體稱為宏。 宏操作的使用方式和功能與子程序類似,區(qū)別在于調(diào)用宏時編譯程序會在調(diào)用處插入宏的程序段,有多少次調(diào)用就會插入多少次宏的程序段,而調(diào)用子程序不增加新的程序段。使用宏的好處是不占用傳送參數(shù)的存放器,不用保護現(xiàn)場。4.1偽操作(directive)在ARM的匯編程序中,有如下幾種偽操作:符號定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽操作。4.1偽操作(directive)符號定義偽操作符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義存放器的別名等操作。常見的符號定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)符號定義偽操作符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義存放器的別名等操作。常見的符號定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)定義全局變量——GBLAGBLLGBLS語法格式: GBLA〔GBLL或GBLS〕全局變量名GBLA、GBLL和GBLS偽操作用于定義一個ARM程序中的全局變量,并將其初始化。GBLA偽操作用于定義一個全局的數(shù)字變量,并初始化為0;GBLL偽操作用于定義一個全局的邏輯變量,并初始化為False〔假〕;GBLS偽操作用于定義一個全局的字符串變量,并初始化為空;注意:由于以上三條偽操作用于定義全局變量,因此在整個程序范圍內(nèi)變量名必須唯一。作用范圍為包含該變量的源程序GlobalArithmeticLogicString4.1偽操作(directive)定義全局變量——GBLAGBLLGBLS使用例如: GBLAobjectsize ;定義全局的數(shù)字變量objectsize,為0 ObjectsizeSETA0xff ;將該變量賦值為0xff

GBLLstatusB ;定義全局的邏輯變量statusB,為{False} statusBSETL{TRUE};將該變量賦值為真4.1偽操作(directive)符號定義偽操作符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義存放器的別名等操作。常見的符號定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)定義局部變量——LCLALCLLLCLS語法格式: LCLA〔LCLL或LCLS〕局部變量名LCLA、LCLL和LCLS偽操作用于定義一個ARM程序中的局部變量,并將其初始化。LCLA偽操作用于定義一個局部的數(shù)字變量,并初始化為0;LCLL偽操作用于定義一個局部的邏輯變量,并初始化為False〔假〕;LCLS偽操作用于定義一個局部的字符串變量,并初始化為空;注意:以上三條偽操作用于聲明局部變量,在其作用范圍內(nèi)變量名必須唯一。4.1偽操作(directive)符號定義偽操作符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義存放器的別名等操作。常見的符號定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)變量賦值——SETA、SETL、SETS語法格式: 變量名 SETA〔SETL或SETS〕 表達式〔expression)偽操作SETA、SETL、SETS用于給一個已經(jīng)定義的全局變量或局部變量賦值。SETA偽操作用于給一個數(shù)學變量賦值;SETL偽操作用于給一個邏輯變量賦值;SETS偽操作用于給一個字符串變量賦值;注意:在向變量賦值前,必須先聲明該變量。4.1偽操作(directive)變量賦值——SETA、SETL、SETS使用例如: LCLA Test3 ;聲明一個局部的數(shù)字變量,變量名為Test3 Test3 SETA 0xaa ;將該變量賦值為0xaa LCLL Test4 ;聲明一個局部的邏輯變量,變量名為Test4 Test4 SETL {TRUE} ;將該變量賦值為真4.1偽操作(directive)符號定義偽操作符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義存放器的別名等操作。常見的符號定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)通用存放器列表定義名稱——RLIST語法格式: 名稱 RLIST {存放器列表}RLIST偽操作可用于對一個存放器列表定義名稱,使用該偽操作定義的名稱可在ARM指令LDM/STM中使用。使用例如: RegListRLIST{r0-r6,r8,r10-r12,r15} ;將存放器列表名稱定義為RegList, ;可在ARM指令LDM/STM中通過該名稱訪問存放器列表。 ;如,LDMIASP!,RegList4.1偽操作(directive)CN為一個協(xié)處理器的存放器命名PowerCN6;將協(xié)處理器的存放器6名稱定義為powerCP為一個協(xié)處理器命名DmuCP7;將協(xié)處理器7命名為DmuDN為一個雙精度〔8字節(jié)〕的VFP〔vectorfloatingprocessor浮點向量協(xié)處理器〕存放器定義名稱SN為一個單精度〔4字節(jié)〕VFP存放器命名HeightDN6;將VFP雙精度存放器6名稱定義為HeightwidthSN16;將VFP單精度存放器16名稱定義為widthFN為一個FPA〔floatingprocessoraccelerate浮點加速協(xié)處理器〕的浮點存放器定義名稱HeightFN6;將浮點存放器6命名為Height4.2偽指令ARM偽指令包括:

ADR、ADRL、LDR和NOP 這些偽指令在匯編編譯器對源程序進行匯編處理時將被替換成ARM或Thumb指令。ADR〔小范圍的地址讀取指令〕 該指令將基于PC的地址值或基于存放器的地址值放入存放器中,語法格式:ADR{cond}register,expression 在匯編編譯器處理源程序時,ADR偽指令被編譯器替換成一條適宜的指令,通常是一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能。startmovr0,#10 adrr4,start xxxxxx,xxx xxxxx,xxx ;因為PC值為當前指令地址值加8字節(jié),本ADR偽指 ;令將被編譯器替換成SUBr4,pc,#0xc4.2偽指令ARM偽指令——小范圍的地址讀取ADR偽指令將基于PC相對偏移的地址值或基于存放器相對偏移的地址值讀取到存放器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條適宜的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,假設不能用一條指令實現(xiàn),那么產(chǎn)生錯誤,編譯失敗。...ADRR0,Delay...DelayMOVR0,r14...應用例如〔源程序〕:使用偽指令將程序標號Delay的地址存入R0...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...ARM偽指令——小范圍的地址讀取...ADRR0,Delay...DelayMOVR0,r14...應用例如〔源程序〕:編譯后的反匯編代碼:使用偽指令將程序標號Delay的地址存入R0地址程序代碼上面的PC為0x28ARM偽指令——小范圍的地址讀取...ADRR0,Delay...DelayMOVR0,r14...應用例如〔源程序〕:...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標號Delay的地址存入R0ADR偽指令被匯編成一條指令實際偏移為PC值為0x28,=〉0x28+0x3c=0x64ARM偽指令——小范圍的地址讀取應用例如2〔查表〕: ADRR0,DISP_TAB ;加載轉(zhuǎn)換表地址LDRBR1,[R0,R2] ;使用R2作為參數(shù),進行查表…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99ADRL〔中等范圍的地址讀取指令〕 該指令將基于PC的地址值或基于存放器的地址值放入存放器中,ADRL偽指令比ADR偽指令可以讀取更大的范圍的地址。ADRL偽指令在匯編時被編譯器替換成兩條指令。語法格式:ADRL{cond}register,expression 在匯編編譯器處理源程序時,ADRL偽指令被編譯器替換成兩條適宜的指令,即使一條指令可以完成該偽指令的功能,編譯器也將用兩條指令來替換該ADRL偽指令。4.2偽指令startmovr0,#10 ADRLr4,start+60000; 60000=0xea60 ;因為PC值為當前指令地址值加8,本ADRL偽指令將被編譯器替換成下面兩條指令: ADDr4,pc,#0xE800 ADDr4,r4,#0x254 r4=pc-0xc+0xea60=pc+0xe800+0x254 =pc+0xea544.2偽指令ARM偽指令——中等范圍的地址讀取ADRL偽指令將基于PC相對偏移的地址值或基于存放器相對偏移的地址值讀取到存放器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條適宜的指令。假設不能用兩條指令實現(xiàn),那么產(chǎn)生錯誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應用例如〔源程序〕:使用偽指令將程序標號Delay的地址存入R0ARM偽指令——中等范圍的地址讀取ADRL偽指令將基于PC相對偏移的地址值或基于存放器相對偏移的地址值讀取到存放器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條適宜的指令。假設不能用兩條指令實現(xiàn),那么產(chǎn)生錯誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應用例如〔源程序〕:...0x20ADDr0,pc,#0x400x24ADDr0,r0,#0...0x68MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標號Delay的地址存入R0地址程序代碼ARM偽指令——中等范圍的地址讀取...ADRLR0,Delay...DelayMOVR0,r14...應用例如〔源程序〕:...0x20ADDr0,pc,#0x400x24ADDr0,r0,#0...0x68MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標號Delay的地址存入R0ADRL偽指令被匯編成兩條指令,盡管第2條指令并沒有意義上面的pc為0x284.2偽指令LDR(大范圍的地址讀取偽指令) LDR偽指令將一個32位的常數(shù)或者一個地址值讀取到存放器中。LDR{cond}register,=[expr|label-expr] expr為32位常量。當expr表示的地址指沒有超過MOV/MVN指令中的地址取值范圍時,編譯器用適宜的MOV/MVN指令代替該LDR偽指令。例1:將0xff0讀取到R1中。 LDRR1,=0xff0 匯編后: MOVR1,#0xff0 LDR{cond}register,=[expr|label-expr] 當expr表示的地址指超過MOV/MVN指令中的地址取值范圍時,編譯器通常將該常數(shù)放在數(shù)據(jù)緩沖區(qū),同時用一條基于pc的LDR讀取該常數(shù)。例2:將0xfff讀取到R1 LDRR1,=0xfff 匯編后為: LDRR1,[PC,offset_to_lpool] ……lpoolDCD0xfffLDR{cond}register,=[expr|label-expr]label-expr為基于pc的地址標號。例3:將外部地址ADDR1讀取到R1中。 LDRR1,=ADDR1 匯編后將得到: LDRR1,[PC,offset_to_lpool] …….lpoolDCDADDR1 …….ADDR1 ….....4.1偽操作(directive)ARM匯編器所支持的偽操作在ARM的匯編程序中,有如下幾種偽指令:符號定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽指操作4.1偽操作(directive)數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作,一般用于為特定的數(shù)據(jù),分配存儲單元,同時可完成已分配存儲單元的初始化。常見的數(shù)據(jù)定義偽指令有如下幾種:LTORGMAPFIELDSPACEDCB、DCW〔DCWU〕、DCD〔DCDU〕、DCQ〔DCQU〕DCFD〔DCFDU〕 DCFS〔DCFSU〕LTORG用于聲明一個數(shù)據(jù)緩沖池〔literalpool〕的開始 當程序中使用了LDR偽指令時,數(shù)據(jù)緩沖池的使用可能越界。這時可以使用LTORG偽操作。防止越界發(fā)生,通常大的代碼段可以使用多個數(shù)據(jù)緩沖池。 LTORG偽操作通常放在無條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器就不會錯誤地將數(shù)據(jù)緩沖池中的數(shù)據(jù)當作指令來執(zhí)行。LTORG聲明一個數(shù)據(jù)緩沖池LTORG ….. LDRR1,=0X55555555

;被編譯成LDRR1,[PC,#OFFSETTOLITERALPOOL1]

….. MOVPC,LR ;子程序返回 ;定義數(shù)據(jù)緩沖池存放0X55555555Dataspace4200 ;分配4200字節(jié)的內(nèi)存單元;假設LTORG在此處那么OFFSET超出4k,無法存放0X55555555 END偏移必須小于4k在LDR指令中的12位(212=4k)來表示偏移量存放0X55555555的地址dcd0X555555554.1偽操作(directive)數(shù)據(jù)定義偽操作——MAP語法格式: MAP表達式{,基址存放器} MAP偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址〔即表中第一個元素的地址〕。表達式可以為程序中的標號或數(shù)學表達式。 {,基址存放器},為可選項,當基址存放器選項不存在時,表達式的值即為內(nèi)存表的首地址,當{,基址存放器}該選項存在時,內(nèi)存表的首地址為表達式的值與基址存放器的和。 MAP偽操作通常與FIELD偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存表。MAP也可用“^”代替。4.1偽操作(directive)數(shù)據(jù)定義偽操作——FIELD語法格式:

{標號} FIELD表達式 FIELD偽操作用于定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。表達式的值為當前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。 FIELD偽操作常與MAP偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存表。MAP偽操作定義內(nèi)存表的首地址,F(xiàn)IELD偽操作定義內(nèi)存表中的各個數(shù)據(jù)域,并可以為每個數(shù)據(jù)域指定一個標號供其他的指令引用。注意:MAP和FIELD偽操作僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實際分配存儲單元。4.1偽操作(directive)數(shù)據(jù)定義偽操作——FIELD參見教材121頁到123頁使用例如。datastrucspace280 ;為datastruc結(jié)構(gòu)保存280字節(jié)的存儲空間 MAP datastruc;定義結(jié)構(gòu)化內(nèi)存表首地址consta FIELD 4 ;consta的長度為4字節(jié),相對位置為0constb FIELD 4 ;constb的長度為4字節(jié),相對位置為4x # 8 ;x的長度為8字節(jié),相對位置為0x8y # 8 ;y的長度為8字節(jié),相對位置為0x10string # 256 ;y的長度為256字節(jié),相對位置為0x18 LDR R5,constb ;將內(nèi)存表中數(shù)據(jù)域constb讀取到R5中4.1偽操作(directive)數(shù)據(jù)定義偽操作——SPACE語法格式: {標號} SPACE表達式SPACE偽操作用于分配一片連續(xù)的存儲區(qū)域并初始化為0。其中,表達式為要分配的字節(jié)數(shù)。SPACE也可用“%”代替。 使用例如: DataSpaceSPACE280 ;分配連續(xù)280字節(jié)的存儲單元并初始化為04.1偽操作(directive)數(shù)據(jù)定義偽操作——DCB語法格式: {標號} DCB 表達式DCB偽操作用于分配一片連續(xù)的字節(jié)存儲單元,并用偽操作中指定的表達式初始化。其中,表達式可以為-128~255的數(shù)字或字符串。DCB也可用“=”代替。使用例如: Nullstring DCB “Nullstring”,0 ;構(gòu)造一個以NULL結(jié)尾的字符串4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCW〔或DCWU〕語法格式: {標號} DCW〔或DCWU〕 表達式DCW〔或DCWU〕偽操作用于分配一片連續(xù)的半字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數(shù)字表達式。 DCW:半字對齊 DCWU:不嚴格半字對齊。 表達式取值范圍:-32768~65535使用例如: data1 DCW 1,2,3,-128,num1+8 ;num1必須是已經(jīng)定義過的4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCD〔或DCDU〕語法格式: {標號} DCD〔或DCDU〕 表達式DCD〔或DCDU〕偽操作用于分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數(shù)字表達式。DCD也可用“&”代替。 DCD:字對齊 DCDU:不嚴格字對齊。使用例如: data1 DCD 1,5,20 ;其值為1,5,20 data2 DCD memaddr+4;分配一個字單元,其值為程序中標號memaddr的地址加4個字節(jié)4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCQ〔或DCQU〕語法格式: {標號} DCQ〔或DCQU〕 表達式DCQ〔或DCQU〕偽操作用于分配一片連續(xù)的雙字存儲單元并用偽操作中指定的表達式初始化。 DCQ:字對齊 DCQU:不嚴格字對齊。使用例如: data1 DCQ 1,5,20 ;其值為1,5,20

4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCFD〔或DCFDU〕語法格式: {標號} DCFD〔或DCFDU〕 表達式DCFD〔或DCFDU〕偽操作用于為雙精度的浮點數(shù)分配一片連續(xù)的字存儲單元,并用偽操作中指定的表達式初始化。每個雙精度的浮點數(shù)占據(jù)兩個字單元。 DCFD:字對齊 DCFDU:不嚴格字對齊。使用例如: FDataTest1 DCFD 1E30,-4E-100 FDataTest2 DCFDU 100000,3.1E264.1偽操作(directive)數(shù)據(jù)定義偽操作——DCFS〔或DCFSU〕語法格式: {標號} DCFS〔或DCFSU〕 表達式DCFS〔或DCFSU〕偽操作用于為單精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個單精度的浮點數(shù)占據(jù)一個字單元。 DCFS:字對齊 DCFSU:不嚴格字對齊。使用例如: FDataTest1 DCFS 1E3,-4E-9 FDataTest2 DCFSU 1.00000,3.1E64.1偽操作(directive)ARM匯編器所支持的偽操作在ARM的匯編程序中,有如下幾種偽操作:符號定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽操作。4.1偽操作(directive)匯編控制偽操作匯編控制〔AssemblyControl〕偽操作用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽操作包括以下幾條:IF、ELSE、ENDIFWHILE、WENDMACRO、MENDMEXIT4.1偽操作(directive)匯編控制偽操作——IF、ELSE、ENDIF

語法格式: IF 邏輯表達式 指令序列1 ELSE 指令序列2 ENDIFIF、ELSE、ENDIF偽操作能根據(jù)條件的成立與否決定是否執(zhí)行某個指令序列。當IF后面的邏輯表達式為真,那么執(zhí)行指令序列1,否那么執(zhí)行指令序列2。其中,ELSE及指令序列2可以沒有,此時,當IF后面的邏輯表達式為真,那么執(zhí)行指令序列1,否那么繼續(xù)執(zhí)行后面的指令。IF、ELSE、ENDIF偽操作可以嵌套使用。IF 邏輯表達式

指令序列1ENDIF4.1偽操作(directive)匯編控制偽操作——IF、ELSE、ENDIF

使用例如: GBLL Test ;聲明一個全局的邏輯變量為Test, ;并初始化為F〔假〕 …… IF Test=TRUE 指令序列1 ELSE 指令序列2 ENDIF4.1偽操作(directive)匯編控制偽操作——WHILE、WEND

語法格式: WHILE邏輯表達式 指令序列 WENDWHILE、WEND偽操作能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個指令序列。當WHILE后面的邏輯表達式為真,那么執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達式的值,假設為真那么繼續(xù)執(zhí)行,一直到邏輯表達式的值為假。WHILE、WEND偽操作可以嵌套使用。4.1偽操作(directive)匯編控制偽操作——WHILE、WEND

使用例如: count SETA 1 WHILE count<=4 count SETA count+1 ;code WEND4.1偽操作(directive)匯編控制偽操作——MACRO、MEND

語法格式:

MACRO $標號宏名$參數(shù)1,$參數(shù)2,…… 指令序列 MEND4.1偽操作(directive)匯編控制偽操作——MACRO、MEND

使用例如:在ARM中完成測試-跳轉(zhuǎn)操作需要兩條指令,定義一條宏指令完成測試-跳轉(zhuǎn)操作MACRO$label TestAndBranch $dest,$reg,$cc$label CMP $reg, #0 B$cc $destMEND;在程序中調(diào)用該宏testTestAndBranchNonZero,r0,NE……NonZero;程序被匯編后,宏展開的結(jié)果 testCMPr0,#0 BNENonZero … … NonZero4.1偽操作(directive)匯編控制偽操作——MEXIT語法格式: MEXITMEXIT用于從宏定義中跳轉(zhuǎn)出去,提前退出宏定義。4.1偽操作(directive)ARM匯編器所支持的偽操作在ARM的匯編程序中,有如下幾種偽操作:符號定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽操作。4.1偽操作(directive)其他偽操作還有一些其他的偽操作,在匯編程序中經(jīng)常會被使用,包括以下幾條:AREACODE16、CODE32ENTRYENDEQUIMPORTGET〔或INCLUDE〕 INCBINRN4.1偽操作(directive)其他偽操作——CODE16、CODE32語法格式: CODE16〔或CODE32〕 CODE16:通知編譯器,其后的指令序列為16位的Thumb指令。 CODE32:通知編譯器,其后的指令序列為32位的ARM指令。注意:他們只通知編譯器其后指令的類型,并不能對處理器進行狀態(tài)的切換。4.1偽操作(directive)其他偽操作——EQU語法格式: 名稱 EQU 表達式{,類型}EQU偽操作用于為程序中的常量、標號等定義一個等效的字符名稱,類似于C語言中的#define。其中EQU可用“*”代替。名稱為EQU偽操作定義的字符名稱,當表達式為32位的常量時,可以指定表達式的數(shù)據(jù)類型,可以有以下三種類型:CODE16、CODE32和DATA使用例如: abcd EQU2;定義abcd符號的值為2 abcd EQUlabel1+16;定義abcd符號的值〔label1+16) Addr EQU 0x55,CODE32 ;定義Addr的絕對地址值為0x55,且該處為32位的ARM指令。4.1偽操作(directive)其他偽操作——AREA語法格式: AREA 段名屬性1,屬性2,……AREA偽操作用于定義一個代碼段或數(shù)據(jù)段。其中,段名假設以數(shù)字開頭,那么該段名需用“|”括起來,如|1_test|。常用的屬性如下: CODE:用于定義代碼段,默認為READONLY。 DATA:用于定義數(shù)據(jù)段,默認為READWRITE。 READONLY:指定本段為只讀,代碼段默認為READONLY。 READWRITE:指定本段為可讀可寫,數(shù)據(jù)段的默認屬性為READWRITE。4.1偽操作(directive)其他偽操作——AREA使用例如: AREA Example,CODE,READONLY …… ;code;該偽操作定義了一個代碼段,段名為Example,屬性為只讀4.1偽操作(directive)其他偽操作——CODE16、CODE32使用例如: AREA ChangeState,CODE,READONLY CODE32 ;指示下面的指令為ARM指令 LDR r0,=start+1 BX r0 ;切換到Thumb狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行 CODE16 ;指示下面的指令為Thumb指令start MOVr1,#10 4.1偽操作(directive)其他偽操作——ENTRY語法格式: ENTRYENTRY偽操作用于指定匯編程序的入口點。在一個源文件里最多只能有一個ENTRY〔可以沒有〕。在一個完整的匯編程序中至少要有一個ENTRY〔當有多個ENTRY時,程序的真正入口點由鏈接器指定〕。使用例如: AREAexample,CODE,READONLY ENTRY ;應用程序的入口點4.1偽操作(directive)其他偽操作——END語法格式: ENDEND偽操作用于通知編譯器已經(jīng)到了源程序的結(jié)尾使用例如: AREAexample,CODE,READONLY …… END

ALIGNEXPORTIMPORTEXTERN源文件〔源代碼〕目標文件〔ELF格式〕映像文件〔ELF格式〕1.查找源文件的錯誤并給出錯誤信息和報警信息2.匯編語言編譯成16位或32位指令代碼3.給出編譯信息,對源程序進行優(yōu)化編譯連接芯片1.找出個文件之間的跳轉(zhuǎn)和相互調(diào)用關系,對個文件分配地址并連接,進行優(yōu)化2.提取所引用的c/c++組件下載文件中程序的位置關系和實際的存儲地址是對應的4.1偽操作(directive)其他偽操作——GET〔或INCLUDE〕語法格式:

GET 文件名用于將一個源文件包含到當前的源文件中,并將被包含的源文件在當前位置進行匯編處理。可以使用INCLUDE代替GET。使用方法與C語言中的“include”相似。匯編程序中常用的方法是在某源文件中定義一些宏指令,用EQU定義常量的符號名稱,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,然后用GET偽操作將這個源文件包含到其他的源文件中。使用方法與C語言中的“include”相似。注意:GET偽操作只能用于包含源文件,不能包含目標文件。4.1偽操作(directive)其他偽操作——GET〔或INCLUDE〕使用例如: AREAexample,CODE,READONLY GETfile1.s ;包含源文件file1.s GETC:\project\file2.s ;包含源文件file2.s GETC:\Programfiles\file3.s ;包含源文件file3.s4.1偽操作(directive)其他偽操作——INCBIN

語法格式: INBIN 文件名INCBIN偽操作用于將一個目標文件或數(shù)據(jù)文件包含到當前的源文件中,被包含的文件不作任何變動的存放在當前文件中,編譯器從其后開始繼續(xù)處理。使用例如:AREA Init,CODE,READONLYINCBIN a1.dat ;通知編譯器當前源文件包含文件a1.datINCBINC:\a2.txt ;當前源文件包含文件C:\a2.txt……END 4.3ARM匯編語言語句格式4.3ARM匯編語言語句格式 {標號} {指令或偽操作} {;注釋} 標號:從一行的行頭開始,不能包含空格 指令或偽操作:指令的前面必須有空格或符號〔不能頂格寫〕 注釋:以“;”開頭每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用〔如,Ldr〕。語句之間可以插入空行。如果一條語句太長,可將該長語句分為假設干行來書寫,在行的末尾用“\”表示下一行與本行為同一條語句。4.3ARM匯編語言語句格式ARM匯編語言中的符號——命名規(guī)那么在匯編語言程序設計中,經(jīng)常使用各種符號代替地址、變量和常量等,以增加程序的可讀性。盡管符號的命名由編程者決定,但并不是任意的,必須遵循以下的約定:符號區(qū)分大小寫,同名的大、小寫符號會被編譯器認為是兩個不同的符號。符號在其作用范圍內(nèi)必須唯一。局部標號〔字在當前段起作用〕以數(shù)字開頭,其他符號不能以數(shù)字開頭。自定義的符號名不能與系統(tǒng)的保存字相同。符號名不應與指令或偽操作同名。4.3ARM匯編語言語句格式ARM匯編語言中的符號——程序中的變量程序中的變量是指其值在程序的運行過程中可以改變的量。ARM〔Thumb〕匯編程序所支持的變量有數(shù)字變量、邏輯變量和字符串變量:數(shù)字值的大小不應超出數(shù)字變量所能表示的范圍。邏輯變量只有兩種取值情況:真{true}或假{false}字符串變量的長度不應超出字符串變量所能表示的范圍GBLA、GBLL、GBLS:聲明全局變量LCLA、LCLL、LCLS:聲明局部變量SETA、SETL和SETS:賦值4.3ARM匯編語言語句格式ARM匯編語言中的符號——程序中的常量程序中的常量是指其值在程序的運行過程中不能被改變的量。ARM〔Thumb〕匯編程序所支持的常量有數(shù)字常量、邏輯常量和字符串常量。數(shù)字常量一般為32位的整數(shù),當作為無符號數(shù)時,其取值范圍為0~232-1,當作為有符號數(shù)時,其取值范圍為-231~231-1。邏輯常量只有兩種取值情況:真或假。字符串常量為一個固定的字符串,一般用于程序運行時的信息提示。一般用EQU來聲明常量4.3ARM匯編語言語句格式ARM匯編語言中的符號——程序中的變量代換程序中的變量可通過代換操作取得一個常量。代換操作符為“$”。如果在數(shù)字變量前面有一個代換操作符“$”,編譯器會將該數(shù)字變量的值轉(zhuǎn)換為十六進制的字符串,并將該十六進制的字符串代換“$”后的數(shù)字變量。使用例如:LCLA A1 ;定義局部數(shù)字變量A1LCLS S2 ;定義局部字符串變量S2A1 SETA 56 ;56=0x00000038S2 SETS “Thisisanumber$A1”;字符串變量S2的值為“Thisisanumber00000038”4.3ARM匯編語言語句格式ARM匯編語言中的符號——程序中的標號標號代表一個地址,可以表示程序中的指令或者數(shù)據(jù)地址。段內(nèi)標號的地址值在匯編時確定,段外標號的地址值在鏈接時確定。在此要區(qū)別基于PC的標號和基于存放器的標號:基于PC的標號:位于目標指令前或者程序中數(shù)據(jù)定義偽操作前的標號。匯編時將被處理成PC值加上或減去一個數(shù)字常量。常用于表示跳轉(zhuǎn)指令的目標地址,或者代碼段中的少量數(shù)據(jù)。基于存放器的標號:用MAP,F(xiàn)IELD偽操作定義。匯編時將被處理成存放器的值加上或減去一個數(shù)字常量。常用于訪問位于數(shù)據(jù)段中的數(shù)據(jù)。絕對地址:32位數(shù)字量4.3ARM匯編語言語句格式ARM匯編語言中的表達式

在匯編語言程序設計中,也經(jīng)常使用各種表達式,表達式一般由變量、常量、運算符和括號構(gòu)成。常用的表達式有數(shù)字表達式、邏輯表達式和字符串表達式,其運算次序遵循如下的優(yōu)先級:括號運算符的優(yōu)先級最高。優(yōu)先級相同的雙目運算符的運算順序為從左到右。相鄰的單目運算符的運算順序為從右到左,且單目運算符的優(yōu)先級高于其他運算符。4.3ARM匯編語言語句格式ARM匯編語言中的表達式————數(shù)字表達式整數(shù)數(shù)字量例如: a SETA 34906 Addr DCD 0xA10E LDR R4,&1000000F DCD 2_11001010 ;2進制數(shù) 0x000000ca c3 SETA 8_74007 ;8進制數(shù) 0x00007807 DCQ 0x123456789abcdef ;16進制數(shù) ;0x89abcdef,0x012345674.3ARM匯編語言語句格式ARM匯編語言中的表達式————數(shù)字表達式浮點數(shù)字量 單精度浮點數(shù)表示范圍:3.4e+38~1.18e-38 雙精度浮點數(shù)表示范圍:1.8e+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論