版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章ARM匯編語(yǔ)言程序設(shè)計(jì)根底本章介紹ARM程序設(shè)計(jì)的一些根本概念:ARM匯編語(yǔ)言的偽操作、匯編語(yǔ)言的語(yǔ)句格式和匯編語(yǔ)言的程序結(jié)構(gòu),相關(guān)例如。第4章目錄偽操作(directive)ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言的程序格式相關(guān)的程序例如第4章目錄偽操作(directive)ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言的程序格式相關(guān)的程序例如4.1偽操作(directive)偽操作 偽操作在源程序中的作用是為完成匯編程序,進(jìn)行各種準(zhǔn)備工作〔如數(shù)據(jù)定義、分配存儲(chǔ)區(qū)、指示程序結(jié)束)。這些偽操作僅在匯編過(guò)程中起作用,一旦匯編結(jié)束,偽操作的使命就完成。如DCDFunction;就是分配一個(gè)字單元,存放Function這個(gè)標(biāo)號(hào),匯編后這個(gè)字單元的內(nèi)容就為Function標(biāo)號(hào)的地址。4.1偽操作(directive)宏 通過(guò)偽操作〔MACRO/MEND)將一段代碼定義為一個(gè)整體稱為宏。 宏操作的使用方式和功能與子程序類似,區(qū)別在于調(diào)用宏時(shí)編譯程序會(huì)在調(diào)用處插入宏的程序段,有多少次調(diào)用就會(huì)插入多少次宏的程序段,而調(diào)用子程序不增加新的程序段。使用宏的好處是不占用傳送參數(shù)的存放器,不用保護(hù)現(xiàn)場(chǎng)。4.1偽操作(directive)在ARM的匯編程序中,有如下幾種偽操作:符號(hào)定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽操作。4.1偽操作(directive)符號(hào)定義偽操作符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義存放器的別名等操作。常見的符號(hào)定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)符號(hào)定義偽操作符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義存放器的別名等操作。常見的符號(hào)定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)定義全局變量——GBLAGBLLGBLS語(yǔ)法格式: GBLA〔GBLL或GBLS〕全局變量名GBLA、GBLL和GBLS偽操作用于定義一個(gè)ARM程序中的全局變量,并將其初始化。GBLA偽操作用于定義一個(gè)全局的數(shù)字變量,并初始化為0;GBLL偽操作用于定義一個(gè)全局的邏輯變量,并初始化為False〔假〕;GBLS偽操作用于定義一個(gè)全局的字符串變量,并初始化為空;注意:由于以上三條偽操作用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須唯一。作用范圍為包含該變量的源程序GlobalArithmeticLogicString4.1偽操作(directive)定義全局變量——GBLAGBLLGBLS使用例如: GBLAobjectsize ;定義全局的數(shù)字變量objectsize,為0 ObjectsizeSETA0xff ;將該變量賦值為0xff
GBLLstatusB ;定義全局的邏輯變量statusB,為{False} statusBSETL{TRUE};將該變量賦值為真4.1偽操作(directive)符號(hào)定義偽操作符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義存放器的別名等操作。常見的符號(hào)定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)定義局部變量——LCLALCLLLCLS語(yǔ)法格式: LCLA〔LCLL或LCLS〕局部變量名LCLA、LCLL和LCLS偽操作用于定義一個(gè)ARM程序中的局部變量,并將其初始化。LCLA偽操作用于定義一個(gè)局部的數(shù)字變量,并初始化為0;LCLL偽操作用于定義一個(gè)局部的邏輯變量,并初始化為False〔假〕;LCLS偽操作用于定義一個(gè)局部的字符串變量,并初始化為空;注意:以上三條偽操作用于聲明局部變量,在其作用范圍內(nèi)變量名必須唯一。4.1偽操作(directive)符號(hào)定義偽操作符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義存放器的別名等操作。常見的符號(hào)定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)變量賦值——SETA、SETL、SETS語(yǔ)法格式: 變量名 SETA〔SETL或SETS〕 表達(dá)式〔expression)偽操作SETA、SETL、SETS用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。SETA偽操作用于給一個(gè)數(shù)學(xué)變量賦值;SETL偽操作用于給一個(gè)邏輯變量賦值;SETS偽操作用于給一個(gè)字符串變量賦值;注意:在向變量賦值前,必須先聲明該變量。4.1偽操作(directive)變量賦值——SETA、SETL、SETS使用例如: LCLA Test3 ;聲明一個(gè)局部的數(shù)字變量,變量名為Test3 Test3 SETA 0xaa ;將該變量賦值為0xaa LCLL Test4 ;聲明一個(gè)局部的邏輯變量,變量名為Test4 Test4 SETL {TRUE} ;將該變量賦值為真4.1偽操作(directive)符號(hào)定義偽操作符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義存放器的別名等操作。常見的符號(hào)定義偽操作有如下幾種:定義全局變量:GBLAGBLLGBLS定義局部變量:LCLALCLLLCLS變量賦值: SETA、SETL、SETS通用存放器列表定義名稱:RLIST4.1偽操作(directive)通用存放器列表定義名稱——RLIST語(yǔ)法格式: 名稱 RLIST {存放器列表}RLIST偽操作可用于對(duì)一個(gè)存放器列表定義名稱,使用該偽操作定義的名稱可在ARM指令LDM/STM中使用。使用例如: RegListRLIST{r0-r6,r8,r10-r12,r15} ;將存放器列表名稱定義為RegList, ;可在ARM指令LDM/STM中通過(guò)該名稱訪問存放器列表。 ;如,LDMIASP!,RegList4.1偽操作(directive)CN為一個(gè)協(xié)處理器的存放器命名PowerCN6;將協(xié)處理器的存放器6名稱定義為powerCP為一個(gè)協(xié)處理器命名DmuCP7;將協(xié)處理器7命名為DmuDN為一個(gè)雙精度〔8字節(jié)〕的VFP〔vectorfloatingprocessor浮點(diǎn)向量協(xié)處理器〕存放器定義名稱SN為一個(gè)單精度〔4字節(jié)〕VFP存放器命名HeightDN6;將VFP雙精度存放器6名稱定義為HeightwidthSN16;將VFP單精度存放器16名稱定義為widthFN為一個(gè)FPA〔floatingprocessoraccelerate浮點(diǎn)加速協(xié)處理器〕的浮點(diǎn)存放器定義名稱HeightFN6;將浮點(diǎn)存放器6命名為Height4.2偽指令A(yù)RM偽指令包括:
ADR、ADRL、LDR和NOP 這些偽指令在匯編編譯器對(duì)源程序進(jìn)行匯編處理時(shí)將被替換成ARM或Thumb指令。ADR〔小范圍的地址讀取指令〕 該指令將基于PC的地址值或基于存放器的地址值放入存放器中,語(yǔ)法格式:ADR{cond}register,expression 在匯編編譯器處理源程序時(shí),ADR偽指令被編譯器替換成一條適宜的指令,通常是一條ADD指令或SUB指令來(lái)實(shí)現(xiàn)該ADR偽指令的功能。startmovr0,#10 adrr4,start xxxxxx,xxx xxxxx,xxx ;因?yàn)镻C值為當(dāng)前指令地址值加8字節(jié),本ADR偽指 ;令將被編譯器替換成SUBr4,pc,#0xc4.2偽指令A(yù)RM偽指令——小范圍的地址讀取ADR偽指令將基于PC相對(duì)偏移的地址值或基于存放器相對(duì)偏移的地址值讀取到存放器中。在匯編編譯器編譯源程序時(shí),ADR偽指令被編譯器替換成一條適宜的指令。通常,編譯器用一條ADD指令或SUB指令來(lái)實(shí)現(xiàn)該ADR偽指令的功能,假設(shè)不能用一條指令實(shí)現(xiàn),那么產(chǎn)生錯(cuò)誤,編譯失敗。...ADRR0,Delay...DelayMOVR0,r14...應(yīng)用例如〔源程序〕:使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...ARM偽指令——小范圍的地址讀取...ADRR0,Delay...DelayMOVR0,r14...應(yīng)用例如〔源程序〕:編譯后的反匯編代碼:使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0地址程序代碼上面的PC為0x28ARM偽指令——小范圍的地址讀取...ADRR0,Delay...DelayMOVR0,r14...應(yīng)用例如〔源程序〕:...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0ADR偽指令被匯編成一條指令實(shí)際偏移為PC值為0x28,=〉0x28+0x3c=0x64ARM偽指令——小范圍的地址讀取應(yīng)用例如2〔查表〕: ADRR0,DISP_TAB ;加載轉(zhuǎn)換表地址LDRBR1,[R0,R2] ;使用R2作為參數(shù),進(jìn)行查表…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99ADRL〔中等范圍的地址讀取指令〕 該指令將基于PC的地址值或基于存放器的地址值放入存放器中,ADRL偽指令比ADR偽指令可以讀取更大的范圍的地址。ADRL偽指令在匯編時(shí)被編譯器替換成兩條指令。語(yǔ)法格式:ADRL{cond}register,expression 在匯編編譯器處理源程序時(shí),ADRL偽指令被編譯器替換成兩條適宜的指令,即使一條指令可以完成該偽指令的功能,編譯器也將用兩條指令來(lái)替換該ADRL偽指令。4.2偽指令startmovr0,#10 ADRLr4,start+60000; 60000=0xea60 ;因?yàn)镻C值為當(dāng)前指令地址值加8,本ADRL偽指令將被編譯器替換成下面兩條指令: ADDr4,pc,#0xE800 ADDr4,r4,#0x254 r4=pc-0xc+0xea60=pc+0xe800+0x254 =pc+0xea544.2偽指令A(yù)RM偽指令——中等范圍的地址讀取ADRL偽指令將基于PC相對(duì)偏移的地址值或基于存放器相對(duì)偏移的地址值讀取到存放器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時(shí),ADRL偽指令被編譯器替換成兩條適宜的指令。假設(shè)不能用兩條指令實(shí)現(xiàn),那么產(chǎn)生錯(cuò)誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用例如〔源程序〕:使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0ARM偽指令——中等范圍的地址讀取ADRL偽指令將基于PC相對(duì)偏移的地址值或基于存放器相對(duì)偏移的地址值讀取到存放器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時(shí),ADRL偽指令被編譯器替換成兩條適宜的指令。假設(shè)不能用兩條指令實(shí)現(xiàn),那么產(chǎn)生錯(cuò)誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用例如〔源程序〕:...0x20ADDr0,pc,#0x400x24ADDr0,r0,#0...0x68MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0地址程序代碼ARM偽指令——中等范圍的地址讀取...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用例如〔源程序〕:...0x20ADDr0,pc,#0x400x24ADDr0,r0,#0...0x68MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0ADRL偽指令被匯編成兩條指令,盡管第2條指令并沒有意義上面的pc為0x284.2偽指令LDR(大范圍的地址讀取偽指令) LDR偽指令將一個(gè)32位的常數(shù)或者一個(gè)地址值讀取到存放器中。LDR{cond}register,=[expr|label-expr] expr為32位常量。當(dāng)expr表示的地址指沒有超過(guò)MOV/MVN指令中的地址取值范圍時(shí),編譯器用適宜的MOV/MVN指令代替該LDR偽指令。例1:將0xff0讀取到R1中。 LDRR1,=0xff0 匯編后: MOVR1,#0xff0 LDR{cond}register,=[expr|label-expr] 當(dāng)expr表示的地址指超過(guò)MOV/MVN指令中的地址取值范圍時(shí),編譯器通常將該常數(shù)放在數(shù)據(jù)緩沖區(qū),同時(shí)用一條基于pc的LDR讀取該常數(shù)。例2:將0xfff讀取到R1 LDRR1,=0xfff 匯編后為: LDRR1,[PC,offset_to_lpool] ……lpoolDCD0xfffLDR{cond}register,=[expr|label-expr]label-expr為基于pc的地址標(biāo)號(hào)。例3:將外部地址ADDR1讀取到R1中。 LDRR1,=ADDR1 匯編后將得到: LDRR1,[PC,offset_to_lpool] …….lpoolDCDADDR1 …….ADDR1 ….....4.1偽操作(directive)ARM匯編器所支持的偽操作在ARM的匯編程序中,有如下幾種偽指令:符號(hào)定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽指操作4.1偽操作(directive)數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作,一般用于為特定的數(shù)據(jù),分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。常見的數(shù)據(jù)定義偽指令有如下幾種:LTORGMAPFIELDSPACEDCB、DCW〔DCWU〕、DCD〔DCDU〕、DCQ〔DCQU〕DCFD〔DCFDU〕 DCFS〔DCFSU〕LTORG用于聲明一個(gè)數(shù)據(jù)緩沖池〔literalpool〕的開始 當(dāng)程序中使用了LDR偽指令時(shí),數(shù)據(jù)緩沖池的使用可能越界。這時(shí)可以使用LTORG偽操作。防止越界發(fā)生,通常大的代碼段可以使用多個(gè)數(shù)據(jù)緩沖池。 LTORG偽操作通常放在無(wú)條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器就不會(huì)錯(cuò)誤地將數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來(lái)執(zhí)行。LTORG聲明一個(gè)數(shù)據(jù)緩沖池LTORG ….. LDRR1,=0X55555555
;被編譯成LDRR1,[PC,#OFFSETTOLITERALPOOL1]
….. MOVPC,LR ;子程序返回 ;定義數(shù)據(jù)緩沖池存放0X55555555Dataspace4200 ;分配4200字節(jié)的內(nèi)存單元;假設(shè)LTORG在此處那么OFFSET超出4k,無(wú)法存放0X55555555 END偏移必須小于4k在LDR指令中的12位(212=4k)來(lái)表示偏移量存放0X55555555的地址dcd0X555555554.1偽操作(directive)數(shù)據(jù)定義偽操作——MAP語(yǔ)法格式: MAP表達(dá)式{,基址存放器} MAP偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址〔即表中第一個(gè)元素的地址〕。表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)表達(dá)式。 {,基址存放器},為可選項(xiàng),當(dāng)基址存放器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址,當(dāng){,基址存放器}該選項(xiàng)存在時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址存放器的和。 MAP偽操作通常與FIELD偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。MAP也可用“^”代替。4.1偽操作(directive)數(shù)據(jù)定義偽操作——FIELD語(yǔ)法格式:
{標(biāo)號(hào)} FIELD表達(dá)式 FIELD偽操作用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。 FIELD偽操作常與MAP偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。MAP偽操作定義內(nèi)存表的首地址,F(xiàn)IELD偽操作定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其他的指令引用。注意:MAP和FIELD偽操作僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。4.1偽操作(directive)數(shù)據(jù)定義偽操作——FIELD參見教材121頁(yè)到123頁(yè)使用例如。datastrucspace280 ;為datastruc結(jié)構(gòu)保存280字節(jié)的存儲(chǔ)空間 MAP datastruc;定義結(jié)構(gòu)化內(nèi)存表首地址consta FIELD 4 ;consta的長(zhǎng)度為4字節(jié),相對(duì)位置為0constb FIELD 4 ;constb的長(zhǎng)度為4字節(jié),相對(duì)位置為4x # 8 ;x的長(zhǎng)度為8字節(jié),相對(duì)位置為0x8y # 8 ;y的長(zhǎng)度為8字節(jié),相對(duì)位置為0x10string # 256 ;y的長(zhǎng)度為256字節(jié),相對(duì)位置為0x18 LDR R5,constb ;將內(nèi)存表中數(shù)據(jù)域constb讀取到R5中4.1偽操作(directive)數(shù)據(jù)定義偽操作——SPACE語(yǔ)法格式: {標(biāo)號(hào)} SPACE表達(dá)式SPACE偽操作用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為0。其中,表達(dá)式為要分配的字節(jié)數(shù)。SPACE也可用“%”代替。 使用例如: DataSpaceSPACE280 ;分配連續(xù)280字節(jié)的存儲(chǔ)單元并初始化為04.1偽操作(directive)數(shù)據(jù)定義偽操作——DCB語(yǔ)法格式: {標(biāo)號(hào)} DCB 表達(dá)式DCB偽操作用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元,并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為-128~255的數(shù)字或字符串。DCB也可用“=”代替。使用例如: Nullstring DCB “Nullstring”,0 ;構(gòu)造一個(gè)以NULL結(jié)尾的字符串4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCW〔或DCWU〕語(yǔ)法格式: {標(biāo)號(hào)} DCW〔或DCWU〕 表達(dá)式DCW〔或DCWU〕偽操作用于分配一片連續(xù)的半字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。 DCW:半字對(duì)齊 DCWU:不嚴(yán)格半字對(duì)齊。 表達(dá)式取值范圍:-32768~65535使用例如: data1 DCW 1,2,3,-128,num1+8 ;num1必須是已經(jīng)定義過(guò)的4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCD〔或DCDU〕語(yǔ)法格式: {標(biāo)號(hào)} DCD〔或DCDU〕 表達(dá)式DCD〔或DCDU〕偽操作用于分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。DCD也可用“&”代替。 DCD:字對(duì)齊 DCDU:不嚴(yán)格字對(duì)齊。使用例如: data1 DCD 1,5,20 ;其值為1,5,20 data2 DCD memaddr+4;分配一個(gè)字單元,其值為程序中標(biāo)號(hào)memaddr的地址加4個(gè)字節(jié)4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCQ〔或DCQU〕語(yǔ)法格式: {標(biāo)號(hào)} DCQ〔或DCQU〕 表達(dá)式DCQ〔或DCQU〕偽操作用于分配一片連續(xù)的雙字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。 DCQ:字對(duì)齊 DCQU:不嚴(yán)格字對(duì)齊。使用例如: data1 DCQ 1,5,20 ;其值為1,5,20
4.1偽操作(directive)數(shù)據(jù)定義偽操作——DCFD〔或DCFDU〕語(yǔ)法格式: {標(biāo)號(hào)} DCFD〔或DCFDU〕 表達(dá)式DCFD〔或DCFDU〕偽操作用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元,并用偽操作中指定的表達(dá)式初始化。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元。 DCFD:字對(duì)齊 DCFDU:不嚴(yán)格字對(duì)齊。使用例如: FDataTest1 DCFD 1E30,-4E-100 FDataTest2 DCFDU 100000,3.1E264.1偽操作(directive)數(shù)據(jù)定義偽操作——DCFS〔或DCFSU〕語(yǔ)法格式: {標(biāo)號(hào)} DCFS〔或DCFSU〕 表達(dá)式DCFS〔或DCFSU〕偽操作用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。每個(gè)單精度的浮點(diǎn)數(shù)占據(jù)一個(gè)字單元。 DCFS:字對(duì)齊 DCFSU:不嚴(yán)格字對(duì)齊。使用例如: FDataTest1 DCFS 1E3,-4E-9 FDataTest2 DCFSU 1.00000,3.1E64.1偽操作(directive)ARM匯編器所支持的偽操作在ARM的匯編程序中,有如下幾種偽操作:符號(hào)定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽操作。4.1偽操作(directive)匯編控制偽操作匯編控制〔AssemblyControl〕偽操作用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽操作包括以下幾條:IF、ELSE、ENDIFWHILE、WENDMACRO、MENDMEXIT4.1偽操作(directive)匯編控制偽操作——IF、ELSE、ENDIF
語(yǔ)法格式: IF 邏輯表達(dá)式 指令序列1 ELSE 指令序列2 ENDIFIF、ELSE、ENDIF偽操作能根據(jù)條件的成立與否決定是否執(zhí)行某個(gè)指令序列。當(dāng)IF后面的邏輯表達(dá)式為真,那么執(zhí)行指令序列1,否那么執(zhí)行指令序列2。其中,ELSE及指令序列2可以沒有,此時(shí),當(dāng)IF后面的邏輯表達(dá)式為真,那么執(zhí)行指令序列1,否那么繼續(xù)執(zhí)行后面的指令。IF、ELSE、ENDIF偽操作可以嵌套使用。IF 邏輯表達(dá)式
指令序列1ENDIF4.1偽操作(directive)匯編控制偽操作——IF、ELSE、ENDIF
使用例如: GBLL Test ;聲明一個(gè)全局的邏輯變量為Test, ;并初始化為F〔假〕 …… IF Test=TRUE 指令序列1 ELSE 指令序列2 ENDIF4.1偽操作(directive)匯編控制偽操作——WHILE、WEND
語(yǔ)法格式: WHILE邏輯表達(dá)式 指令序列 WENDWHILE、WEND偽操作能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個(gè)指令序列。當(dāng)WHILE后面的邏輯表達(dá)式為真,那么執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達(dá)式的值,假設(shè)為真那么繼續(xù)執(zhí)行,一直到邏輯表達(dá)式的值為假。WHILE、WEND偽操作可以嵌套使用。4.1偽操作(directive)匯編控制偽操作——WHILE、WEND
使用例如: count SETA 1 WHILE count<=4 count SETA count+1 ;code WEND4.1偽操作(directive)匯編控制偽操作——MACRO、MEND
語(yǔ)法格式:
MACRO $標(biāo)號(hào)宏名$參數(shù)1,$參數(shù)2,…… 指令序列 MEND4.1偽操作(directive)匯編控制偽操作——MACRO、MEND
使用例如:在ARM中完成測(cè)試-跳轉(zhuǎn)操作需要兩條指令,定義一條宏指令完成測(cè)試-跳轉(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語(yǔ)法格式: MEXITMEXIT用于從宏定義中跳轉(zhuǎn)出去,提前退出宏定義。4.1偽操作(directive)ARM匯編器所支持的偽操作在ARM的匯編程序中,有如下幾種偽操作:符號(hào)定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作其他偽操作。4.1偽操作(directive)其他偽操作還有一些其他的偽操作,在匯編程序中經(jīng)常會(huì)被使用,包括以下幾條:AREACODE16、CODE32ENTRYENDEQUIMPORTGET〔或INCLUDE〕 INCBINRN4.1偽操作(directive)其他偽操作——CODE16、CODE32語(yǔ)法格式: CODE16〔或CODE32〕 CODE16:通知編譯器,其后的指令序列為16位的Thumb指令。 CODE32:通知編譯器,其后的指令序列為32位的ARM指令。注意:他們只通知編譯器其后指令的類型,并不能對(duì)處理器進(jìn)行狀態(tài)的切換。4.1偽操作(directive)其他偽操作——EQU語(yǔ)法格式: 名稱 EQU 表達(dá)式{,類型}EQU偽操作用于為程序中的常量、標(biāo)號(hào)等定義一個(gè)等效的字符名稱,類似于C語(yǔ)言中的#define。其中EQU可用“*”代替。名稱為EQU偽操作定義的字符名稱,當(dāng)表達(dá)式為32位的常量時(shí),可以指定表達(dá)式的數(shù)據(jù)類型,可以有以下三種類型:CODE16、CODE32和DATA使用例如: abcd EQU2;定義abcd符號(hào)的值為2 abcd EQUlabel1+16;定義abcd符號(hào)的值〔label1+16) Addr EQU 0x55,CODE32 ;定義Addr的絕對(duì)地址值為0x55,且該處為32位的ARM指令。4.1偽操作(directive)其他偽操作——AREA語(yǔ)法格式: AREA 段名屬性1,屬性2,……AREA偽操作用于定義一個(gè)代碼段或數(shù)據(jù)段。其中,段名假設(shè)以數(shù)字開頭,那么該段名需用“|”括起來(lái),如|1_test|。常用的屬性如下: CODE:用于定義代碼段,默認(rèn)為READONLY。 DATA:用于定義數(shù)據(jù)段,默認(rèn)為READWRITE。 READONLY:指定本段為只讀,代碼段默認(rèn)為READONLY。 READWRITE:指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為READWRITE。4.1偽操作(directive)其他偽操作——AREA使用例如: AREA Example,CODE,READONLY …… ;code;該偽操作定義了一個(gè)代碼段,段名為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語(yǔ)法格式: ENTRYENTRY偽操作用于指定匯編程序的入口點(diǎn)。在一個(gè)源文件里最多只能有一個(gè)ENTRY〔可以沒有〕。在一個(gè)完整的匯編程序中至少要有一個(gè)ENTRY〔當(dāng)有多個(gè)ENTRY時(shí),程序的真正入口點(diǎn)由鏈接器指定〕。使用例如: AREAexample,CODE,READONLY ENTRY ;應(yīng)用程序的入口點(diǎn)4.1偽操作(directive)其他偽操作——END語(yǔ)法格式: ENDEND偽操作用于通知編譯器已經(jīng)到了源程序的結(jié)尾使用例如: AREAexample,CODE,READONLY …… END
ALIGNEXPORTIMPORTEXTERN源文件〔源代碼〕目標(biāo)文件〔ELF格式〕映像文件〔ELF格式〕1.查找源文件的錯(cuò)誤并給出錯(cuò)誤信息和報(bào)警信息2.匯編語(yǔ)言編譯成16位或32位指令代碼3.給出編譯信息,對(duì)源程序進(jìn)行優(yōu)化編譯連接芯片1.找出個(gè)文件之間的跳轉(zhuǎn)和相互調(diào)用關(guān)系,對(duì)個(gè)文件分配地址并連接,進(jìn)行優(yōu)化2.提取所引用的c/c++組件下載文件中程序的位置關(guān)系和實(shí)際的存儲(chǔ)地址是對(duì)應(yīng)的4.1偽操作(directive)其他偽操作——GET〔或INCLUDE〕語(yǔ)法格式:
GET 文件名用于將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進(jìn)行匯編處理。可以使用INCLUDE代替GET。使用方法與C語(yǔ)言中的“include”相似。匯編程序中常用的方法是在某源文件中定義一些宏指令,用EQU定義常量的符號(hào)名稱,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,然后用GET偽操作將這個(gè)源文件包含到其他的源文件中。使用方法與C語(yǔ)言中的“include”相似。注意:GET偽操作只能用于包含源文件,不能包含目標(biāo)文件。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
語(yǔ)法格式: INBIN 文件名INCBIN偽操作用于將一個(gè)目標(biāo)文件或數(shù)據(jù)文件包含到當(dāng)前的源文件中,被包含的文件不作任何變動(dòng)的存放在當(dāng)前文件中,編譯器從其后開始繼續(xù)處理。使用例如:AREA Init,CODE,READONLYINCBIN a1.dat ;通知編譯器當(dāng)前源文件包含文件a1.datINCBINC:\a2.txt ;當(dāng)前源文件包含文件C:\a2.txt……END 4.3ARM匯編語(yǔ)言語(yǔ)句格式4.3ARM匯編語(yǔ)言語(yǔ)句格式 {標(biāo)號(hào)} {指令或偽操作} {;注釋} 標(biāo)號(hào):從一行的行頭開始,不能包含空格 指令或偽操作:指令的前面必須有空格或符號(hào)〔不能頂格寫〕 注釋:以“;”開頭每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用〔如,Ldr〕。語(yǔ)句之間可以插入空行。如果一條語(yǔ)句太長(zhǎng),可將該長(zhǎng)語(yǔ)句分為假設(shè)干行來(lái)書寫,在行的末尾用“\”表示下一行與本行為同一條語(yǔ)句。4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的符號(hào)——命名規(guī)那么在匯編語(yǔ)言程序設(shè)計(jì)中,經(jīng)常使用各種符號(hào)代替地址、變量和常量等,以增加程序的可讀性。盡管符號(hào)的命名由編程者決定,但并不是任意的,必須遵循以下的約定:符號(hào)區(qū)分大小寫,同名的大、小寫符號(hào)會(huì)被編譯器認(rèn)為是兩個(gè)不同的符號(hào)。符號(hào)在其作用范圍內(nèi)必須唯一。局部標(biāo)號(hào)〔字在當(dāng)前段起作用〕以數(shù)字開頭,其他符號(hào)不能以數(shù)字開頭。自定義的符號(hào)名不能與系統(tǒng)的保存字相同。符號(hào)名不應(yīng)與指令或偽操作同名。4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的符號(hào)——程序中的變量程序中的變量是指其值在程序的運(yùn)行過(guò)程中可以改變的量。ARM〔Thumb〕匯編程序所支持的變量有數(shù)字變量、邏輯變量和字符串變量:數(shù)字值的大小不應(yīng)超出數(shù)字變量所能表示的范圍。邏輯變量只有兩種取值情況:真{true}或假{false}字符串變量的長(zhǎng)度不應(yīng)超出字符串變量所能表示的范圍GBLA、GBLL、GBLS:聲明全局變量LCLA、LCLL、LCLS:聲明局部變量SETA、SETL和SETS:賦值4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的符號(hào)——程序中的常量程序中的常量是指其值在程序的運(yùn)行過(guò)程中不能被改變的量。ARM〔Thumb〕匯編程序所支持的常量有數(shù)字常量、邏輯常量和字符串常量。數(shù)字常量一般為32位的整數(shù),當(dāng)作為無(wú)符號(hào)數(shù)時(shí),其取值范圍為0~232-1,當(dāng)作為有符號(hào)數(shù)時(shí),其取值范圍為-231~231-1。邏輯常量只有兩種取值情況:真或假。字符串常量為一個(gè)固定的字符串,一般用于程序運(yùn)行時(shí)的信息提示。一般用EQU來(lái)聲明常量4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的符號(hào)——程序中的變量代換程序中的變量可通過(guò)代換操作取得一個(gè)常量。代換操作符為“$”。如果在數(shù)字變量前面有一個(gè)代換操作符“$”,編譯器會(huì)將該數(shù)字變量的值轉(zhuǎn)換為十六進(jìn)制的字符串,并將該十六進(jìn)制的字符串代換“$”后的數(shù)字變量。使用例如:LCLA A1 ;定義局部數(shù)字變量A1LCLS S2 ;定義局部字符串變量S2A1 SETA 56 ;56=0x00000038S2 SETS “Thisisanumber$A1”;字符串變量S2的值為“Thisisanumber00000038”4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的符號(hào)——程序中的標(biāo)號(hào)標(biāo)號(hào)代表一個(gè)地址,可以表示程序中的指令或者數(shù)據(jù)地址。段內(nèi)標(biāo)號(hào)的地址值在匯編時(shí)確定,段外標(biāo)號(hào)的地址值在鏈接時(shí)確定。在此要區(qū)別基于PC的標(biāo)號(hào)和基于存放器的標(biāo)號(hào):基于PC的標(biāo)號(hào):位于目標(biāo)指令前或者程序中數(shù)據(jù)定義偽操作前的標(biāo)號(hào)。匯編時(shí)將被處理成PC值加上或減去一個(gè)數(shù)字常量。常用于表示跳轉(zhuǎn)指令的目標(biāo)地址,或者代碼段中的少量數(shù)據(jù)?;诖娣牌鞯臉?biāo)號(hào):用MAP,F(xiàn)IELD偽操作定義。匯編時(shí)將被處理成存放器的值加上或減去一個(gè)數(shù)字常量。常用于訪問位于數(shù)據(jù)段中的數(shù)據(jù)。絕對(duì)地址:32位數(shù)字量4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的表達(dá)式
在匯編語(yǔ)言程序設(shè)計(jì)中,也經(jīng)常使用各種表達(dá)式,表達(dá)式一般由變量、常量、運(yùn)算符和括號(hào)構(gòu)成。常用的表達(dá)式有數(shù)字表達(dá)式、邏輯表達(dá)式和字符串表達(dá)式,其運(yùn)算次序遵循如下的優(yōu)先級(jí):括號(hào)運(yùn)算符的優(yōu)先級(jí)最高。優(yōu)先級(jí)相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接?。相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶?,且單目運(yùn)算符的優(yōu)先級(jí)高于其他運(yùn)算符。4.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的表達(dá)式————數(shù)字表達(dá)式整數(shù)數(shù)字量例如: a SETA 34906 Addr DCD 0xA10E LDR R4,&1000000F DCD 2_11001010 ;2進(jìn)制數(shù) 0x000000ca c3 SETA 8_74007 ;8進(jìn)制數(shù) 0x00007807 DCQ 0x123456789abcdef ;16進(jìn)制數(shù) ;0x89abcdef,0x012345674.3ARM匯編語(yǔ)言語(yǔ)句格式ARM匯編語(yǔ)言中的表達(dá)式————數(shù)字表達(dá)式浮點(diǎn)數(shù)字量 單精度浮點(diǎn)數(shù)表示范圍:3.4e+38~1.18e-38 雙精度浮點(diǎn)數(shù)表示范圍:1.8e+
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工地臨時(shí)護(hù)欄安裝協(xié)議
- 古鎮(zhèn)裝飾施工合同
- 電力設(shè)施廠房施工合同
- 科技館建設(shè)民建施工合同
- 西安景區(qū)附近酒店租賃協(xié)議
- 機(jī)場(chǎng)航站樓空調(diào)租賃協(xié)議
- 工地用施工升降機(jī)購(gòu)銷合同
- 校園建設(shè)建造師聘用合同范例
- 建筑改造施工合同封面
- 大學(xué)廣告位租賃合同
- 2023國(guó)家開放大學(xué)《經(jīng)濟(jì)學(xué)基礎(chǔ)》形考任務(wù)1-4參考答案
- 初中科學(xué)《九年級(jí)第四章集體備課》基于“大概念”理念的單元設(shè)計(jì)計(jì)劃課件
- 管理學(xué)原理 王光健版
- 中國(guó)標(biāo)準(zhǔn)文獻(xiàn)分類法二級(jí)目錄
- 阿司可咖膠囊鎮(zhèn)痛作用的臨床研究
- 小學(xué)生數(shù)學(xué)計(jì)算能力問卷調(diào)查表及問卷分析
- 2023-2024學(xué)年河南省南陽(yáng)市唐河縣數(shù)學(xué)四年級(jí)第一學(xué)期期末監(jiān)測(cè)模擬試題含答案
- 執(zhí)行監(jiān)督申請(qǐng)復(fù)核申請(qǐng)書
- 調(diào)查問卷的設(shè)計(jì)
- 中耳解剖、生理與疾病 助聽器驗(yàn)配課件
- 勞動(dòng)教育知到章節(jié)答案智慧樹2023年常熟理工學(xué)院
評(píng)論
0/150
提交評(píng)論