ARM匯編語(yǔ)言源程序格式_第1頁(yè)
ARM匯編語(yǔ)言源程序格式_第2頁(yè)
ARM匯編語(yǔ)言源程序格式_第3頁(yè)
ARM匯編語(yǔ)言源程序格式_第4頁(yè)
ARM匯編語(yǔ)言源程序格式_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、ARM匯編語(yǔ)言源程序格式ARM匚編語(yǔ)言源程序格式2010-11-1613:52來(lái)源:MC瞅入式領(lǐng)域常用ARM程序文件類型匯編語(yǔ)言程序的結(jié)構(gòu)1匯編語(yǔ)言程序的結(jié)構(gòu)2匯編語(yǔ)言程序的結(jié)構(gòu)3匯編語(yǔ)言程序的結(jié)構(gòu)4ARM的匯編語(yǔ)言程序一般由幾個(gè)段組成, 每個(gè)段均由AREAS操作定義。段可以分為多種,如代碼段、數(shù)據(jù)段、通用段,每個(gè)段又有不同的屬性,如代碼段的默認(rèn)屬性為READONL淡據(jù)段的默認(rèn)屬性為READWRITE本程序定義了兩個(gè)段,第一個(gè)段為代碼段codesec,它在存儲(chǔ)器中存放用于程序執(zhí)行的代碼以及main函數(shù)的本地字符串; 第二個(gè)段為數(shù)據(jù)段constdatasec,存放了全局的字符串,由于本程序沒(méi)有對(duì)

2、數(shù)據(jù)進(jìn)行寫操作,該數(shù)據(jù)段定義屬性為READONLY匯編語(yǔ)言的行構(gòu)成1格式:標(biāo)簽指令/偽操作/偽指令操作數(shù);語(yǔ)句的注釋所有的標(biāo)簽必須在一行的開(kāi)頭頂格寫,前面不能留空格,后面也不能跟C語(yǔ)言中的標(biāo)簽一樣加上:;ARM匚編器對(duì)標(biāo)識(shí)符的大小寫敏感,書(shū)寫標(biāo)號(hào)及指令時(shí)字母的大小寫要一致;注釋使用;符號(hào),注釋的內(nèi)容從、”開(kāi)始到該行的結(jié)尾結(jié)束匯編語(yǔ)言的行構(gòu)成2標(biāo)簽標(biāo)簽是一個(gè)符號(hào),可以代表指令的地址、變量、數(shù)據(jù)的地址和常量。一般以字母開(kāi)頭,由字母、數(shù)字、下劃線組成。當(dāng)符號(hào)代表地址時(shí)又稱標(biāo)號(hào),可以以數(shù)字開(kāi)頭,其作用范圍為當(dāng)前段或者在下一個(gè)ROU初操作之前。指令/偽操作指令/偽操作是指令的助記符或者定義符,它告訴AR

3、M勺處理器應(yīng)該執(zhí)行什么樣的操作或者告訴匯編程序偽指令語(yǔ)句的偽操作功能。匯編語(yǔ)言的標(biāo)號(hào)1標(biāo)號(hào)代表地址。標(biāo)號(hào)分為段內(nèi)標(biāo)號(hào)和段外標(biāo)號(hào)。 段內(nèi)標(biāo)號(hào)的地址值在匯編時(shí)確定, 段外編號(hào)的地址值在鏈接時(shí)確定。在程序段中,標(biāo)號(hào)代表其所在位置與段首地址的偏移量。根據(jù)程序計(jì)數(shù)器(PC)和偏移量計(jì)算地址即程序相對(duì)尋址。在映像中定義的標(biāo)號(hào)代表標(biāo)號(hào)到映像首地址的偏移量。 映像的首地址通常被賦予一個(gè)寄存器,根據(jù)該寄存器值與偏移量計(jì)算地址即寄存器相對(duì)尋址。例如:loopSUBSr0,r0,#1;每次循環(huán)使r0=r0-1BNEloop;跳轉(zhuǎn)到loop標(biāo)號(hào)去執(zhí)行匯編語(yǔ)言的標(biāo)號(hào)2在宏中也可以使用局部符號(hào)。局部標(biāo)號(hào)是099的十進(jìn)位數(shù)

4、開(kāi)始,可以重復(fù)定義。局部標(biāo)號(hào)引用格式:%F|BA|TNroutname%局部標(biāo)號(hào)引用操作。F:編譯器只向前搜索。B:編譯器只向后搜索。A:編譯器搜索宏的所有嵌套層次。T:編譯器搜索宏的當(dāng)前層。例如:01SUBSr0,r0,#1;每次循環(huán)使r0=r0-1BNE%B01;跳車到01標(biāo)號(hào)去執(zhí)行匯編語(yǔ)言的常量常量:其值在程序運(yùn)行過(guò)程中不能被改變的量。(1)數(shù)字常量:數(shù)字常量有3種表示方式:十進(jìn)制數(shù),如1、2、123十六進(jìn)制數(shù),如0 x123,0 xabcn進(jìn)制數(shù),形式為n_XXXn的范圍是2至U9,XXX是具體數(shù)字(2)字符常量:由單引號(hào)及中間的字符組成,包括C語(yǔ)言中的轉(zhuǎn)義字符,如a,n(3)字符串常

5、量:由一對(duì)雙引號(hào)及中間的字符串表示,中間也可以使用C語(yǔ)言中的轉(zhuǎn)義字符,比如:abcdefmessagexarn(4)邏輯常量:TRUE,FALSE,注意帶大括號(hào)匯編程序的變量代換1這里所說(shuō)的變量,是相對(duì)于匯編程序的“變量”,是用于匯編程序進(jìn)行處理的,但一旦編譯到程序中,則不會(huì)改變,成為常量。在字符串變量白前面有一個(gè)$字符,在匯編時(shí)編譯器將用該字符串變量的內(nèi)容代替該用變量。在數(shù)字變量前面有一個(gè)代換操作符$”,編譯器會(huì)將該數(shù)字變量的值轉(zhuǎn)換為十六進(jìn)制的字符用,并用該十六進(jìn)制的字符串代換”爐后的數(shù)字變量。需要將$字符加入到字符串中,可以用$”代替,此時(shí)編譯器將不再進(jìn)行變量代換,而是把$看作一個(gè)$。在兩

6、個(gè)T之間的$并不進(jìn)行變量的代換,但如果T在雙引號(hào)內(nèi),則將進(jìn)行變量代換。使用”.來(lái)表示字符串中變量名的結(jié)束。匯編程序的變量代換2字符串a(chǎn)aastr1$str1.l1$l1,a1$num1.ccc”中的3個(gè)變量將在編譯時(shí)被替換。程序運(yùn)行后看到下面結(jié)果:aaastr1:bbbl1:T,a1:0000004Fccc偽指令在ARM匚編語(yǔ)言源程序中有些特殊助記符,它們沒(méi)有相對(duì)應(yīng)的操作碼或者機(jī)器碼,通常稱為偽指令,它們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,由匯編程序在源程序的匯編期間進(jìn)行處理,僅在匯編過(guò)程中起作用。在ARM勺匯編程序中,有如下幾種偽指令:符號(hào)定義偽指

7、令數(shù)據(jù)定義偽指令匯編控制偽指令信息報(bào)告?zhèn)沃噶詈曛噶钜约捌渌麄沃噶罘?hào)定義偽指令作用:用于定義ARME編程序中的變量、對(duì)變量賦值以及定義寄存器的別笈箋七寸0符號(hào)定義有如下幾種偽指令:用于定義局部變量的LCLALCLL和LCLS用于定義全局變量的GBLAGBLL和GBLS用于對(duì)變量賦值的SETASETL和SETS為通用寄存器列表定義名稱的RLISTo符號(hào)定義偽指令1-1LCLA、LCLL和LCLS格式:LCLA/LCLL/LCLSW部變量名說(shuō)明:LCLALCLL和LCLSft指令用于定義一個(gè)匯編程序中的局部變量并初始化。其中:LCLA定義一個(gè)局部的數(shù)字變量,初始化為00LCLL定義一個(gè)局部的邏輯變

8、量,初始化為F。LCLS定義一個(gè)局部的字符串變量,初始化為空用。這3條偽指令用于聲明局部變量,在其局部作用范圍內(nèi)變量名必須惟一,例如在宏內(nèi)。符號(hào)定義偽指令1-2符號(hào)定義偽指令2-12)GBLA、GBLL和GBLS格式:GBLA/GBLL/GBL變量名說(shuō)明:GBLAGBLLf口GBLSft操作定義一個(gè)匯編程序中的全局變量并初始化。其中:GBLAt義一個(gè)全局?jǐn)?shù)字變量,并初始化為00GBL3義一個(gè)全局邏輯變量,并初始化為FoGBLSt義一個(gè)全局字符串變量,并初始化為空用。這3條偽指令用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須惟一例如:GBLAnum,定義一個(gè)全局的數(shù)字變;量, 變量名為numl

9、numlSETAOxabcd將該變量賦值為OxabcdGBLL12;定義一個(gè)全局的邏輯變;量,變量名為1212SETLFALSE;將該變量賦值為假GBLSstr3;定義一個(gè)全局的字符串變;量,變量名為str3str3SETSHello!;將該變量賦值為Hello!符號(hào)定義偽指令3-1(3)SETA、SETL和SETS格式:變量名SETA/SETL/SET法達(dá)式說(shuō)明:SETA給一個(gè)數(shù)字變量賦值。SETL給一個(gè)邏輯變量賦值。SETS給一個(gè)字符串變量賦值。格式中的變量名必須為已經(jīng)定義過(guò)的全局或局部變量,表達(dá)式為將要賦給變量的值。符號(hào)定義偽指令3-2例如:LCLAnuml定義一個(gè)局部的數(shù)字;變量,變量

10、名為numlnumlSETA0 x1234將該變量賦值;為0 x1234LCLSstr3;定義一個(gè)局部的字符串變;量,變量名為str3str3SETSHello!;將該變量賦值為;Hello!”符號(hào)定義偽指令44)RLIST格式:名稱RLIST寄存器列表說(shuō)明:RLIST可用于對(duì)一個(gè)通用寄存器列表定義名稱,該名稱可在ARM旨令LDM/STW使用。在LDM/STM旨令中,列表中的寄存器為根據(jù)寄存器的編號(hào)由低到高訪問(wèn)次序,與列表中的寄存器排列次序無(wú)關(guān)。例如:pblockRLISTR0-R3,R7,R5,R9;將寄存器列表名稱定義為pblock,可在ARM旨令;LDM/STW通過(guò)該名稱訪問(wèn)寄存器列表數(shù)

11、據(jù)定義偽指令作用:為數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)初始化。有如下幾種:DCB?節(jié)分配DCW/DCWU?(2字節(jié))分配DCD/DCDU(4字節(jié))分配DCQ/DCQU8字節(jié)分配DCFS/DCFSU精度浮點(diǎn)數(shù)分配DCFD/DCFDU精度浮點(diǎn)數(shù)分配SPAC分配一塊連續(xù)的存儲(chǔ)單元FIELD定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域MAPS義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址數(shù)據(jù)定義偽指令1(1)DCB格式:標(biāo)號(hào)DCBft達(dá)式說(shuō)明:分配一塊字節(jié)單元并用偽指令中指定的表達(dá)式進(jìn)行初始化表達(dá)式可以為使用雙引號(hào)的字符串或0255的數(shù)字。DCBm用=代替。例如:ArraylDCB1,2,3,4,5;數(shù)組strlDCBYourarewelcome

12、!;構(gòu)造字符串并分配空間數(shù)據(jù)定義偽指令2(2)DCW/DCWU格式:標(biāo)號(hào)DCW/DCWU式說(shuō)明:DCW配一段半字存儲(chǔ)單元并用表達(dá)式值初始化,它定義的存儲(chǔ)空問(wèn)是半字對(duì)齊的。DCWU能與DCW!似,只是分配的字存儲(chǔ)單元不嚴(yán)格半字對(duì)齊。例如:ArraywlDCW0 xa,-0 xb,0 xc,-0 xd;構(gòu)造固定數(shù)組并分配半字存儲(chǔ)單元數(shù)據(jù)定義偽指令3(3)DCD/DCDU格式:標(biāo)號(hào)DCD/DCDU達(dá)式說(shuō)明:DCLft指令用于分配一塊字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的。DCDt可用&代替。DCD助能與DC或似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。例如:Arrayd

13、lDCD1334,234,345435;構(gòu)造固定數(shù)組并分配字為單元的存儲(chǔ)單元LabelDCDstr1;該字單元存放str1的地址數(shù)據(jù)定義偽指令4(4)DCQ/DCQU格式:標(biāo)號(hào)DCQ/DCQU達(dá)式說(shuō)明:DCCffl于分配一塊以8個(gè)字節(jié)為單位的存儲(chǔ)區(qū)域并用偽指令中指定的表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的。DCQ助能與DC燮似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。例如:ArraydlDCQ234234,98765541;構(gòu)造固定數(shù)組并分配字為單元的存儲(chǔ)空間。;注意:DCQf能給字符串分配空間數(shù)據(jù)定義偽指令5(5)DCFD/DCFDU格式:標(biāo)號(hào)DCFD/DCFDU達(dá)式說(shuō)明: DCF皿于為雙精度的浮

14、點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元。DCFD助能與DCFD!似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。例如:ArrayflDCFD6E2Arrayf2DCFD1.23,1.45數(shù)據(jù)定義偽指令6(6)DCFS/DCFSU格式:標(biāo)號(hào)DCFS/DCFSU達(dá)式說(shuō)明:DCFSffl于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用表達(dá)式初始化, 它定義的存儲(chǔ)空間是字對(duì)齊的。每個(gè)單精度浮點(diǎn)數(shù)使用一個(gè)字單元。DCFS助能與DCFSK似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。例如:Arrayf1DCFS6E2,-9E-2,-.3Arrayf

15、2DCFSU1.23,6.8E9數(shù)據(jù)定義偽指令77)SPACE格式:標(biāo)號(hào)SPACES達(dá)式說(shuō)明:SPAC劇于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為0,表達(dá)式為要分配的字節(jié)數(shù)。SPAC的可用代替。例如:freespaceSPACE1000;分配1000字節(jié)的存儲(chǔ)空間數(shù)據(jù)定義偽指令8(8)MAP格式:MAPS達(dá)式,基址寄存器說(shuō)明:MAPt義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。此時(shí),內(nèi)存表的位置計(jì)數(shù)器VAR(匯編器的內(nèi)置變量)設(shè)置成該地址值。A可以用來(lái)代替MAP表達(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á)式

16、的值與基址寄存器的和。MA對(duì)以與FIELD偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。例如:MAP0 x130,R2內(nèi)存表首地址為0 x130+R2數(shù)據(jù)定義偽指令9(9)FIELD格式:標(biāo)號(hào)FIELD字節(jié)數(shù)說(shuō)明:FIELD用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。#可用來(lái)代替FIELDoFIELD常與MAPE合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表:FIELD偽指令定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,MAFW定義內(nèi)存表的首地址,并為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)以供其他的指令引用。需要注意的是MA林口FIELD偽指令僅用于定義數(shù)據(jù)結(jié)構(gòu),并不分配存儲(chǔ)單元。例如:MAP0XF10000;定義結(jié)構(gòu)化內(nèi)存表首地址為0XF10000countFIE

17、LD4;定義count的長(zhǎng)度為4字節(jié),位置為0XF1000+0 xFIELD4;定義x的長(zhǎng)度為4字節(jié),位置為0XF1004yFIELD4;定義y的長(zhǎng)度為4字節(jié),位置為0XF1008匯編控制偽指令作用:指引匯編程序的執(zhí)行流程。常用的偽操作包括:(1)MACRG口MEND宏定義的開(kāi)始與結(jié)束。(2)IF、ELSEffiENDIF根據(jù)邏輯表達(dá)式的成立與否決定是否在編譯時(shí)加入某個(gè)指令序列。(3)WHILE和WEND根據(jù)邏輯表達(dá)式的成立與否決定是否循環(huán)執(zhí)行這個(gè)代碼段。(4)MEXIT:從宏中退出。MACROMEND格式MACRO$標(biāo)號(hào)宏名僑參數(shù)1,$參數(shù)2,指令序列MEND其中,$標(biāo)號(hào)在宏指令被展開(kāi)時(shí),標(biāo)

18、號(hào)可被替換成相應(yīng)的符號(hào)(在一個(gè)符號(hào)前使用$,表示程序在匯編時(shí)將使用相應(yīng)的值來(lái)替代$后的符號(hào)),$參數(shù)1為宏指令的參數(shù),當(dāng)宏指令被展開(kāi)時(shí)將被替換成相應(yīng)的值,類似于函數(shù)中的形式參數(shù)。宏指令可以重復(fù)使用,與子程序有些類似,子程序可以節(jié)省存儲(chǔ)空間,提供模塊化的程序設(shè)計(jì)。但是使用子程序結(jié)構(gòu)時(shí)需要保存/恢復(fù)現(xiàn)場(chǎng),從而增加了系統(tǒng)的開(kāi)銷。使用說(shuō)明:在子程序比較短而需要傳遞的參數(shù)比較多的情況下,可使用宏匯編技術(shù)。宏定義偽指令例子MACFRO宏定義開(kāi)始$labeljump$a1,$a2;宏的名稱為jump,有2個(gè)參數(shù)al和a2$label.loop1;$label.loop1為宏體的內(nèi)部標(biāo)號(hào)BGE$label.l

19、oop1$label.loop2BL$a1;參數(shù)$a1為一個(gè)子程序的名稱BGT$label.loop2ADR$a2MEND宏定義結(jié)束宏定義偽指令在程序中調(diào)用該宏examjumpsub,det;調(diào)用宏jump,宏的標(biāo)號(hào)為exam,參數(shù)1為sub,參數(shù)2為det程序被匯編后,宏的展開(kāi)結(jié)果:examlooplBGEexamlooplexamloop2BLsubBGTexamloop2ADRdetIF、ELS刖ENDIF格式:IF邏輯表達(dá)式代碼段1ELSE代碼段2ENDIF說(shuō)明:能根據(jù)邏輯表達(dá)式的成立與否決定是否在編譯時(shí)加入某個(gè)指令序列。IF、ELS刖ENDIF分別可以用,代替。如果IF后面的邏輯表達(dá)

20、式為真,則編譯代碼段1,否則編譯代碼段2。ELSE代碼段2也可以沒(méi)有,這時(shí),當(dāng)IF后面的邏輯表達(dá)式為真時(shí),則代碼段1,否則繼續(xù)編譯后面的指令。WHILE?口WEND格式:WHIL遭輯表達(dá)式代碼段WEND說(shuō)明:WHILESWEN防指令能根據(jù)邏輯表達(dá)式的成立與否決定是否循環(huán)執(zhí)行這個(gè)代碼段。當(dāng)WHILES面的邏輯表達(dá)式為真時(shí),則執(zhí)行代碼段,該代碼段執(zhí)行完畢后,再判斷邏輯表達(dá)式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達(dá)式的值為假。例如:GBLAnum聲明全局白數(shù)字變量numnumSETA9由num控制循環(huán)次數(shù)WHILEnum0subr0,r0,1addr1,r1,1WEND其他偽指令在匯編程序中經(jīng)常會(huì)使用

21、一些其他的偽指令,包括以下18條:ASSERTAREAALIGNCODE16/CODE32ENTRYENDEQUIMPORTEXPORT/GLOBALEXTERNINCBINGET/INCLUDERNROUTADRADRLLDRNOP其他偽指令1(1)ASSERT格式:ASSERTS輯表達(dá)式說(shuō)明:ASSER川來(lái)表示程序的編譯必須滿足一定的條件,如果邏輯表達(dá)式不滿足,則編譯器會(huì)報(bào)錯(cuò),并終止匯編。例如:ASSERTver7;保證ver7其他偽指令22)AREA格式:ARE徽名屬性,說(shuō)明:AREAS于定義一個(gè)代碼段、數(shù)據(jù)段或者特定屬性的段。如果段名以數(shù)字開(kāi)頭,那么該段名需用|字符括起來(lái),如|7wol

22、f|,用C的編譯器產(chǎn)生的代碼一般也用|括起來(lái)。屬性部分表示該代碼段/數(shù)據(jù)段的相關(guān)屬性,多個(gè)屬性可以用,分隔。常見(jiàn)屬性如下:DATA定義數(shù)據(jù)段,默認(rèn)屬性是READWRITECODE定義代碼段,默認(rèn)屬性是READONLYREADONLY8示本段為只讀。READWRITEg示本段可讀寫。ALIGN嚷達(dá)式,表示段白對(duì)齊方式為2的表達(dá)式次方,例如:表達(dá)式=3,則對(duì)齊方式為8字節(jié)對(duì)齊。表達(dá)式的取值范圍為031。COMMON性:定義一個(gè)通用段,這個(gè)段不包含用戶代碼和數(shù)據(jù)。其他偽指令3(3)ALIGN格式:ALIGN表達(dá)式,偏移量說(shuō)明:ALIGN偽操作可以通過(guò)填充字節(jié)使當(dāng)前的位置滿足一定的對(duì)齊方式。表達(dá)式的值

23、為2的幕,如1、2、4、8、16等,用于指定對(duì)齊方式。如果偽操作中沒(méi)有指定表達(dá)式,則編譯器會(huì)將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。偏移量也是個(gè)數(shù)字表達(dá)式,如果存在偏移量,則當(dāng)前位置自動(dòng)對(duì)齊到2的表達(dá)式值次方+移量。例如:AREA|.data|,DATA,READWRITE,ALIGN=2其他偽指令4(4)CODE16/CODE32格式:CODE16/CODE32說(shuō)明:CODE16;操作指示編譯器后面的代碼為16位的Thumb旨令。CODE3物操作指示編譯器后面的代碼為32位的ARM旨令。如果在匯編源代碼中同時(shí)包含Thum用口ARMt令時(shí),可以用CODE32通知編譯器后的指令序列為32位的ARM旨令,

24、用CODE16偽指令通知編譯器后的指令序列為16位的Thumb令。CODE16/CODE3E能對(duì)處理器進(jìn)行狀態(tài)的切換。例如:CODE3232位的ARM旨令LDRR0,=0 x8500;BXRQ程序跳轉(zhuǎn),并將處理器切換到Thumb犬態(tài)CODE1616位的Thumb旨令A(yù)DDR3,R3,1END源文件結(jié)束其他偽指令5-1(5)ENTRY格式:ENTRY說(shuō)明:ENTRYI于指定匯編程序的入口。在一個(gè)完整的匯編程序中至少要有一個(gè)ENTRY程序中也可以有多個(gè),此時(shí),程序的真正入口點(diǎn)可在鏈接時(shí)指定,但在一個(gè)源文件里最多只能有一個(gè)ENTRYE者沒(méi)有ENTRY其他偽指令5-2其他偽指令6(6)END格式:EN

25、D說(shuō)明:END&訴編譯器已經(jīng)到了源程序的結(jié)尾。例如:AREAconstdata,DATAREADONLYEND結(jié)尾其他偽指令7(7)EQU格式:名稱EQUft達(dá)式,類型說(shuō)明:EQU1于將程序中的數(shù)字常量、標(biāo)號(hào)、基于寄存器的值賦予一個(gè)等效的名稱,這一點(diǎn)類似于C語(yǔ)言中的#6巾ne.可用*代替EQU如果表達(dá)式為32位的常量,我們可以指定表達(dá)式的數(shù)據(jù)類型,類型域可以有以下3種:CODE16/CODE32/DATA例如:num1EQU1234定義num1為1234addr5EQUstr1+0 x50d1EQU0 x2400,CODE32定義d1的為0 x2400,且該處為32位的ARM旨令其他偽

26、指令8(8)EXPORT/GLOBAL格式:EXPORT/GLOBAtt,WEAK說(shuō)明:EXPOR在程序中聲明一個(gè)全局標(biāo)號(hào),其他文件中的代碼可以被該標(biāo)號(hào)引用。用戶也可以用GLOBA戰(zhàn)替EXPORT,WEAK可選項(xiàng)聲明其他文件有同名的標(biāo)號(hào),則該同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。例如:AREA|.text|,CODE,READONLYmainPROCENDPEXPORTma;in聲明一個(gè)可全局引用的函數(shù)mainEND其他偽指令9(9)IMPORT格式:IMPORTS號(hào),WEAK說(shuō)明:告訴編譯器,這個(gè)標(biāo)號(hào)要在當(dāng)前源文件中使用,但標(biāo)號(hào)是在其他的源文件中定義的。,WEAK:如果所有的源文件都沒(méi)有找到這個(gè)標(biāo)號(hào)的

27、定義, 編譯器也不會(huì)提示錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒(méi)有被INCLUDES來(lái)的庫(kù)中去查找該符號(hào)。例如:AREAmycode,CODE,READONLYIMPORT_printf;通知編譯器當(dāng)前文件要引用函數(shù)_printfENDIMPORT使用說(shuō)明使用IMPOR叨操作聲明一個(gè)符號(hào)是在其他源文件中定義的。如果鏈接器在鏈接處理時(shí)不能解析該符號(hào),而且IMPOR操作中沒(méi)有指定WEAK 選項(xiàng),則鏈接器將會(huì)報(bào)告錯(cuò)誤。如果鏈接器在鏈接處理時(shí)不能解析該符號(hào),而IMPOR初操作中指定了WEAK 選項(xiàng),則鏈接器不會(huì)報(bào)告錯(cuò)誤,而是進(jìn)行下面的操作:如果該符號(hào)被B或BL指令引用,則該符號(hào)被設(shè)置成下一條指令的地址,該B

28、或者BL指令相當(dāng)于一條NOP旨令。例如Bsign,sign不能被解析,則該指令被忽略為NOP旨令,繼續(xù)執(zhí)行下面的指令,也就是將sign理解為下一條指令的地址。其他情況下該符號(hào)被設(shè)置為00其他偽指令1010)EXTERN格式:EXTERN號(hào),WEAK說(shuō)明:告訴編譯器,標(biāo)號(hào)要在當(dāng)前源文件中引用,但是該標(biāo)號(hào)是在其他的源文件中定義的。與IMPOR壞同的是,如果當(dāng)前源文件實(shí)際上沒(méi)有引用該標(biāo)號(hào),該標(biāo)號(hào)就不會(huì)被加入到當(dāng)前文件的符號(hào)表中。,WEAK:即使所有的源文件都沒(méi)有找到這個(gè)標(biāo)號(hào)的定義,編譯器也不給出錯(cuò)誤信息。例如:AREA|.text|,CODE,READONLYEXTERN_printf,WEAK;告

29、訴編譯器當(dāng)前文件要引用標(biāo)號(hào),如果找不到,則不提示錯(cuò)誤END其他偽指令11(11)GET/INCLUDE格式:GETC件名說(shuō)明:GETB一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置展開(kāi)進(jìn)行匯編處理。INCLUDEDGET勺作用是等效的。使用方法:在某源文件中定義一些宏指令,用MAPf口FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,用EQUS義常量的符號(hào)名稱,然后用GET/INCLUDEI這個(gè)源文件包含到其他的源文件中。使用方法與C語(yǔ)言中的#include相似。GET/INCLUDE,能用于包含源文件,包含其他文件則需要使用INCBIN偽指令。例如:AREAmycode,DATA,READONL

30、YGET靶odeprog1.s;通知編譯器在當(dāng)前源文件包含源文件E:codeprog1.sGETprog2.s;通知編譯器當(dāng)前源文件包含可搜索目錄下的prog2.sEND其他偽指令12(12)INCBIN格式:INCBIN文件名說(shuō)明:INCBIN將一個(gè)數(shù)據(jù)文件或者目標(biāo)文件包含到當(dāng)前的源文件中,編譯時(shí)被包含的文件不作任何變動(dòng)地存放在當(dāng)前文件中,編譯器從后面開(kāi)始繼續(xù)處理。例如:AREAconstdata,DATA,READONLYINCBINdata1.dat;源文件包含文件data1.datINCBINE:DATAdata2.bin;源文件包含文件E:DATAdata2.binEND其他偽指令1

31、3(13)RN格式:名稱RN表達(dá)式說(shuō)明:RN用于給一個(gè)寄存器定義一個(gè)別名,以便程序員記憶該寄存器的功能。名稱為給寄存器定義的別名,表達(dá)式為寄存器的編碼。例如:countRNR1;給R1定義一個(gè)別名count其他偽指令14(14)ROUT格式:名稱ROUT說(shuō)明:ROUTT以給一個(gè)局部變量定義作用范圍。在程序中未使用該偽指令時(shí),局部變量的作用范圍為所在的AREA而使用ROUT5,局部變量的作用范圍為當(dāng)前ROU下口下一個(gè)ROU之間。例如:routineROUT;定義局部標(biāo)號(hào)的有效范圍1routine;routine內(nèi)的局部標(biāo)號(hào)1BEQ%1routine;若條件成立,則跳轉(zhuǎn)到routine范圍內(nèi)的局部

32、標(biāo)號(hào)1OtherroutineROUT;定義新的局部標(biāo)號(hào)的有效范圍其他偽指令14(15)LTORG說(shuō)明:LTORG1于聲明一個(gè)數(shù)據(jù)緩沖池(literalpool)的開(kāi)始。通常放在無(wú)條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,以免處理器錯(cuò)誤地將數(shù)據(jù)緩沖池中地?cái)?shù)據(jù)作為指令來(lái)執(zhí)行。例如:FunciMOVPC,LRLTORGDATASPACE;26data標(biāo)號(hào)開(kāi)始預(yù)留256字節(jié)地內(nèi)存單元END其他偽指令15(16)ADR小范圍地址讀取格式:ADRcondRd,expr;說(shuō)明:將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值(expr地址表達(dá)式)讀取到目標(biāo)寄存器Rd中。當(dāng)?shù)刂分凳欠亲謱?duì)齊時(shí),取值范圍

33、在-255255字節(jié)之間;當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),取值范圍在-10201020字節(jié)之間。在匯編編譯源程序時(shí),ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD旨令或SUB旨令來(lái)實(shí)現(xiàn)該ADRft指令的功能。若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。對(duì)于基于PC相對(duì)偏移的地址值時(shí),給定范圍是相對(duì)當(dāng)前指令地址后兩個(gè)字處(因?yàn)锳RM7TDMfe三級(jí)流水線)??梢杂肁DR1口載地址實(shí)現(xiàn)查表。例如:LOOPMOVR1#0 xF0ADRR2,LOOP將LOO用勺地址放入R2,因?yàn)镻C值為當(dāng)前指令地址值加8字節(jié),所以本ADRft指令將被編譯器換成SUBR2,PC,0XC其他偽指令16(17)AD

34、RL中等范圍地址讀取格式:ADRLcondRd,expr;說(shuō)明:類似于ADR但比ADR實(shí)取更大范圍的地址。當(dāng)?shù)刂分凳欠亲謱?duì)齊時(shí),取值范圍在-64KB64KB之間;地址值是字對(duì)齊時(shí),取值范圍在-256KB256KB之間。在匯編編譯源程序時(shí),ADR助指令被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn)ADR助指令功能,則產(chǎn)生錯(cuò)誤,編譯失敗??梢杂肁DRLfe載地址,實(shí)現(xiàn)程序跳轉(zhuǎn)。例如:ADRLR0DATA_BUFADRLR1DATA_BUF+80DATA_BUFSPACE;100義100字節(jié)緩沖區(qū)其他偽指令17(18)LDR大范圍地址讀取格式:LDRcondRd,=expr/label-expr

35、;說(shuō)明:加載32位的立即數(shù)或一個(gè)地址值到目標(biāo)寄存器R&在匯編編譯源程序時(shí),LDRft指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOVEMVN勺范圍,則使用MOVEMVN旨令代替該LDR偽指令;否則匯編器將常量放入文字池,并使用一條程序相對(duì)偏移的LDR指令從文字池讀出常量。LDRffl于加載芯片外圍功能部件的寄存器地址(32位立即數(shù)) , 以實(shí)現(xiàn)各種控制操作。從PC到文字池的偏移量必須小于4KB。與ARM旨令的LDR相比,偽指令的LDR的參數(shù)有=符號(hào)。例如:LDRRQ=0 x12345678;力口載32位立即數(shù)0 x12345678LDRR0,=DATA_BUF+60力口載DA

36、TA_BU地址+60LTORG聲明文字池其他偽指令18(19)NOP空操作格式:NOP說(shuō)明:不產(chǎn)生任何有意義的操作,只是占用一個(gè)機(jī)器時(shí)間。NOPM旨令在匯編時(shí)將會(huì)被替代成ARMH勺空操作,比如可能為MOVR0,R0指令等。簡(jiǎn)單的ARM?匚編程序設(shè)計(jì)(一)查表和散轉(zhuǎn)程序設(shè)計(jì)當(dāng)涉及到數(shù)據(jù)用或者跳轉(zhuǎn)表格時(shí),常常需要通過(guò)地址對(duì)他們進(jìn)行訪問(wèn),通常有兩種方法裝載地址:通過(guò)AD濟(jì)口ADR助指令直接裝載地址;通過(guò)偽指令LDRRed=label從數(shù)據(jù)池中裝載地址。下面以程序jump.s為例,介紹通過(guò)ADR指令裝載地址地散轉(zhuǎn)程序地設(shè)計(jì)。查表和散轉(zhuǎn)程序設(shè)計(jì)主程序中設(shè)置了3個(gè)參數(shù),arithfunc根據(jù)3個(gè)參數(shù)返回一

37、個(gè)R0值。當(dāng)R0=0時(shí),RG=R1+R2當(dāng)R0=1時(shí),RG=R1-R2;簡(jiǎn)單的ARM匚編程序設(shè)計(jì)(一)查表和散轉(zhuǎn)程序設(shè)計(jì)AREAJump,CODE,READONLamethisblockofcodeCODE32;FollowingcodeisARMcodenumEQU2;跳轉(zhuǎn)表的入口數(shù)目ENTRY程序入口startMOVr0,#0;設(shè)置3個(gè)參數(shù)MOVr1,#3MOVr2,#2BLarithfunc;調(diào)用子程序Stop;執(zhí)行中止MOVr0,#0 x18;軟中斷參數(shù)設(shè)置LDRr1,=0 x20026;軟中斷參數(shù)設(shè)置SWI0 x123456;將CPU的控制權(quán)交給調(diào)試器ARMsemihostingSW

38、I查表和散轉(zhuǎn)程序設(shè)計(jì)-續(xù)arithfuncCMPr0,#num;比較參數(shù)MOVHSpc,lr;若超出范圍則程序返回ADRr3,JumpTable;裝載跳轉(zhuǎn)表格標(biāo)號(hào)地址LDRpc,r3,r0,LSL#2;跳轉(zhuǎn)到相應(yīng)子程序入口地址處JumpTableDCDDoAddDCDDoSubDoAddADDr0,r1,r2;=0時(shí)的操作MOVpc,lr;返回DoSubSUBr0,r1,r2;=1時(shí)的操作MOVpc,lr;返回END程序結(jié)尾軟中斷指令SWISemihosting在ADS的C語(yǔ)言函數(shù)庫(kù)中,某些ANSIC的功能是由主機(jī)的調(diào)試環(huán)境來(lái)提供的,這套機(jī)制有一個(gè)專門術(shù)語(yǔ)叫Semihosting。Semiho

39、sting通過(guò)一組軟件中斷(SWI)指令來(lái)實(shí)現(xiàn)。當(dāng)一個(gè)Semihosting軟中斷被執(zhí)行時(shí),調(diào)t系統(tǒng)先識(shí)別這個(gè)SWI請(qǐng)求,然后掛起正在運(yùn)行的程序,調(diào)用Semihosting的服務(wù),完成后再恢復(fù)原來(lái)的程序執(zhí)行。因此,主機(jī)執(zhí)行的任務(wù)對(duì)于程序來(lái)說(shuō)是透明的。SWI傳遞的功能號(hào)(例如:semi-hosting,使用0 x123456(ARM)or0 xAB(Thumb)在此例中,表格jumptable中存放地是子程序地入口地址, 我們把這種表格稱為跳轉(zhuǎn)表格。注意指令LDRPCR3,R0,LSL#2,執(zhí)行地操作為PC=R3+R04,因?yàn)楸砀裰写娣诺氐刂窞?字節(jié)地址,所以要將R0乘以4得出偏移量,再加上表格首地址,得出子程序地入口地址賦值給PG字符串拷貝程序設(shè)計(jì)下面的例子為用ARM旨令編寫的用拷貝的例子。兩個(gè)數(shù)據(jù)用都放在數(shù)據(jù)段中,且用DCBW旨令定義,DCB為定義1字節(jié)或多字節(jié)內(nèi)存空間,雙引號(hào)中的字符串在內(nèi)存中是順序存放的,因此取數(shù)/存數(shù)時(shí)需要使用LDRBf口STRB旨令

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論