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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

15、2DCFSU1.23,6.8E9數(shù)據(jù)定義偽指令77)SPACE格式:標號SPACES達式說明:SPAC劇于分配一片連續(xù)的存儲區(qū)域并初始化為0,表達式為要分配的字節(jié)數(shù)。SPAC的可用代替。例如:freespaceSPACE1000;分配1000字節(jié)的存儲空間數(shù)據(jù)定義偽指令8(8)MAP格式:MAPS達式,基址寄存器說明:MAPt義一個結(jié)構(gòu)化的內(nèi)存表的首地址。此時,內(nèi)存表的位置計數(shù)器VAR(匯編器的內(nèi)置變量)設(shè)置成該地址值。A可以用來代替MAP表達式可以為程序中的標號或數(shù)學(xué)表達式, 基址寄存器為可選項, 當基址寄存器選項不存在時,表達式的值即為內(nèi)存表的首地址,當該選項存在時,內(nèi)存表的首地址為表達式

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

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

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

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

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

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

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

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

24、用CODE16偽指令通知編譯器后的指令序列為16位的Thumb令。CODE16/CODE3E能對處理器進行狀態(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說明:ENTRYI于指定匯編程序的入口。在一個完整的匯編程序中至少要有一個ENTRY程序中也可以有多個,此時,程序的真正入口點可在鏈接時指定,但在一個源文件里最多只能有一個ENTRYE者沒有ENTRY其他偽指令5-2其他偽指令6(6)END格式:EN

25、D說明:END&訴編譯器已經(jīng)到了源程序的結(jié)尾。例如:AREAconstdata,DATAREADONLYEND結(jié)尾其他偽指令7(7)EQU格式:名稱EQUft達式,類型說明:EQU1于將程序中的數(shù)字常量、標號、基于寄存器的值賦予一個等效的名稱,這一點類似于C語言中的#6巾ne.可用*代替EQU如果表達式為32位的常量,我們可以指定表達式的數(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說明:EXPOR在程序中聲明一個全局標號,其他文件中的代碼可以被該標號引用。用戶也可以用GLOBA戰(zhàn)替EXPORT,WEAK可選項聲明其他文件有同名的標號,則該同名標號優(yōu)先于該標號被引用。例如:AREA|.text|,CODE,READONLYmainPROCENDPEXPORTma;in聲明一個可全局引用的函數(shù)mainEND其他偽指令9(9)IMPORT格式:IMPORTS號,WEAK說明:告訴編譯器,這個標號要在當前源文件中使用,但標號是在其他的源文件中定義的。,WEAK:如果所有的源文件都沒有找到這個標號的

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

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

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

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

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

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

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

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

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

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

37、個R0值。當R0=0時,RG=R1+R2當R0=1時,RG=R1-R2;簡單的ARM匚編程序設(shè)計(一)查表和散轉(zhuǎn)程序設(shè)計AREAJump,CODE,READONLamethisblockofcodeCODE32;FollowingcodeisARMcodenumEQU2;跳轉(zhuǎn)表的入口數(shù)目ENTRY程序入口startMOVr0,#0;設(shè)置3個參數(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è)計-續(xù)arithfuncCMPr0,#num;比較參數(shù)MOVHSpc,lr;若超出范圍則程序返回ADRr3,JumpTable;裝載跳轉(zhuǎn)表格標號地址LDRpc,r3,r0,LSL#2;跳轉(zhuǎn)到相應(yīng)子程序入口地址處JumpTableDCDDoAddDCDDoSubDoAddADDr0,r1,r2;=0時的操作MOVpc,lr;返回DoSubSUBr0,r1,r2;=1時的操作MOVpc,lr;返回END程序結(jié)尾軟中斷指令SWISemihosting在ADS的C語言函數(shù)庫中,某些ANSIC的功能是由主機的調(diào)試環(huán)境來提供的,這套機制有一個專門術(shù)語叫Semihosting。Semiho

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

溫馨提示

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

評論

0/150

提交評論