版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第4章 匯編語言程序設計 匯編語言源程序格式匯編語言上機過程匯編語言與C語言混合編程技術常用ARM源程序文件類型 文件類型擴展名匯編語言源文件.sC語言源文件.cC+源文件.cpp引入文件.INC頭文件.h匯編語言程序的結構1 匯編語言程序的結構2匯編語言程序的結構3匯編語言程序的結構4ARM的匯編語言程序一般由幾個段組成,每個段均由AREA偽操作定義。段可以分為多種,如代碼段、數(shù)據(jù)段、通用段,每個段又有不同的屬性,如代碼段的默認屬性為READONLY,數(shù)據(jù)段的默認屬性為READWRITE。本程序定義了兩個段,第一個段為代碼段codesec,它在存儲器中存放用于程序執(zhí)行的代碼以及main函數(shù)的
2、本地字符串;第二個段為數(shù)據(jù)段constdatasec,存放了全局的字符串,由于本程序沒有對數(shù)據(jù)進行寫操作,該數(shù)據(jù)段定義屬性為READONLY。匯編語言的行構成1格式:標簽 指令/偽操作/偽指令 操作數(shù) ;語句的注釋所有的標簽必須在一行的開頭頂格寫,前面不能留空格,后面也不能跟C語言中的標簽一樣加上“:”; ARM匯編器對標識符的大小寫敏感,書寫標號及指令時字母的大小寫要一致;注釋使用“;”符號,注釋的內容從“;”開始到該行的結尾結束。匯編語言的行構成2標簽標簽是一個符號,可以代表指令的地址、變量、數(shù)據(jù)的地址和常量。一般以字母開頭,由字母、數(shù)字、下劃線組成。當符號代表地址時又稱標號,可以以數(shù)字開
3、頭,其作用范圍為當前段或者在下一個ROUT偽操作之前。指令/偽操作指令/偽操作是指令的助記符或者定義符,它告訴ARM的處理器應該執(zhí)行什么樣的操作或者告訴匯編程序偽指令語句的偽操作功能。匯編語言的標號1標號代表地址。標號分為段內標號和段外標號。段內標號的地址值在匯編時確定,段外編號的地址值在鏈接時確定 。在程序段中,標號代表其所在位置與段首地址的偏移量。根據(jù)程序計數(shù)器(PC)和偏移量計算地址即程序相對尋址。在映像中定義的標號代表標號到映像首地址的偏移量。映像的首地址通常被賦予一個寄存器,根據(jù)該寄存器值與偏移量計算地址即寄存器相對尋址。例如:loop SUBS r0,r0,#1;每次循環(huán)使r0=r
4、0-1 BNE loop;跳轉到loop 標號去執(zhí)行 匯編語言的標號2在宏中也可以使用局部符號。局部標號是099的十進位數(shù)開始,可以重復定義。局部標號引用格式: F|BA|T Nroutname %:局部標號引用操作。 F:編譯器只向前搜索。B:編譯器只向后搜索。A:編譯器搜索宏的所有嵌套層次。T:編譯器搜索宏的當前層。 例如:01SUBS r0,r0,#1;每次循環(huán)使r0=r0-1BNE %B01;跳轉到01標號去執(zhí)行 匯編語言的常量常量:其值在程序運行過程中不能被改變的量。(1)數(shù)字常量:數(shù)字常量有3種表示方式:十進制數(shù),如1、2、123十六進制數(shù),如 0 x123,0 xabc n進制數(shù)
5、,形式為n_XXX,n的范圍是2到9,XXX是具體數(shù)字(2)字符常量:由單引號及中間的字符組成,包括C語言中的轉義字符,如a,n(3)字符串常量:由一對雙引號及中間的字符串表示,中間也可以使用C語言中的轉義字符,比如:“abcdef0 xarn”(4)邏輯常量:TRUE,FALSE,注意帶大括號匯編程序的變量代換1這里所說的變量,是相對于匯編程序的“變量”,是用于匯編程序進行處理的,但一旦編譯到程序中,則不會改變,成為常量。在字符串變量的前面有一個$字符,在匯編時編譯器將用該字符串變量的內容代替該串變量。在數(shù)字變量前面有一個代換操作符“$”,編譯器會將該數(shù)字變量的值轉換為十六進制的字符串,并用
6、該十六進制的字符串代換“$”后的數(shù)字變量。需要將“$”字符加入到字符串中,可以用“$”代替,此時編譯器將不再進行變量代換,而是把“$”看作一個“$”。在兩個“|”之間的“$”并不進行變量的代換,但如果“|”在雙引號內,則將進行變量代換。使用“.”來表示字符串中變量名的結束。匯編程序的變量代換2字符串“aaa str1:$str1. l1:$l1,a1:$num1.ccc”中的3個變量將在編譯時被替換。程序運行后看到下面結果:aaa str1:bbb l1:T,a1:0000004Fccc 偽指令在ARM匯編語言源程序中有些特殊助記符,它們沒有相對應的操作碼或者機器碼,通常稱為偽指令,它們所完成
7、的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準備工作的,由匯編程序在源程序的匯編期間進行處理,僅在匯編過程中起作用。在ARM的匯編程序中,有如下幾種偽指令: 符號定義偽指令數(shù)據(jù)定義偽指令匯編控制偽指令信息報告?zhèn)沃噶詈曛噶钜约捌渌麄沃噶罘柖x偽指令 作用:用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名等。符號定義有如下幾種偽指令:用于定義局部變量的LCLA、LCLL和LCLS。用于定義全局變量的GBLA、GBLL和GBLS。用于對變量賦值的SETA、SETL和SETS。為通用寄存器列表定義名稱的RLIST。 符號定義偽指令1-1(1)LCLA、LCLL和LCL
8、S格式: LCLA/LCLL/LCLS局部變量名說明:LCLA、LCLL和LCLS偽指令用于定義一個匯編程序中的局部變量并初始化。其中:LCLA定義一個局部的數(shù)字變量,初始化為0。LCLL定義一個局部的邏輯變量,初始化為F。LCLS定義一個局部的字符串變量,初始化為空串。這3條偽指令用于聲明局部變量,在其局部作用范圍內變量名必須惟一,例如在宏內。 符號定義偽指令1-2例如:MACRO TESTLCLAnum1;定義一個局部的數(shù)字變量,變量名為 ; num1LCLLl2;定義一個局部的邏輯變量,變量名為l2LCLSstr3;定義一個局部的字符串變量,變量名 ;為str3num1SETA0 xab
9、cd;將該變量賦值為0 xabcdl2SETLFALSE;將該變量賦值為真str3SETSHello!;將該變量賦值為“Hello!”MEND 符號定義偽指令2-1(2)GBLA、GBLL和GBLS格式: GBLA/GBLL/GBLS 變量名說明:GBLA、GBLL和GBLS偽操作定義一個匯編程序中的全局變量并初始化。其中:GBLA定義一個全局數(shù)字變量,并初始化為0。GBLL定義一個全局邏輯變量,并初始化為F。GBLS定義一個全局字符串變量,并初始化為空串。這3條偽指令用于定義全局變量,因此在整個程序范圍內變量名必須惟一。 符號定義偽指令2-2例如:GBLAnum1;定義一個全局的數(shù)字變 ;量
10、,變量名為num1num1SETA0 xabcd;將該變量賦值為0 xabcdGBLLl2;定義一個全局的邏輯變 ;量,變量名為l2l2SETLFALSE;將該變量賦值為假GBLSstr3;定義一個全局的字符串變 ;量,變量名為str3str3SETSHello!;將該變量賦值為“Hello!” 符號定義偽指令3-1(3)SETA、SETL和SETS格式: 變量名SETA/SETL/SETS 表達式說明:SETA:給一個數(shù)字變量賦值。SETL:給一個邏輯變量賦值。SETS:給一個字符串變量賦值。格式中的變量名必須為已經(jīng)定義過的全局或局部變量,表達式為將要賦給變量的值。 符號定義偽指令3-2例如
11、:LCLAnum1;定義一個局部的數(shù)字 ;變量,變量名為num1num1SETA0 x1234;將該變量賦值 ;為0 x1234LCLSstr3;定義一個局部的字符串變 ;量,變量名為str3str3SETS“Hello!”;將該變量賦值為 ;“Hello!” 符號定義偽指令4(4)RLIST格式: 名稱RLIST寄存器列表說明:RLIST可用于對一個通用寄存器列表定義名稱,該名稱可在ARM指令LDM/ STM中使用。在LDM/STM指令中,列表中的寄存器為根據(jù)寄存器的編號由低到高訪問次序,與列表中的寄存器排列次序無關。例如:pblockRLISTR0-R3,R7,R5,R9 ;將寄存器列表名
12、稱定義為pblock,可在ARM指令 ;LDM/STM中通過該名稱訪問寄存器列表數(shù)據(jù)定義偽指令 作用:為數(shù)據(jù)分配存儲單元,同時初始化。有如下幾種:DCB 字節(jié)分配DCW/DCWU 半字(2字節(jié))分配DCD/DCDU 字(4字節(jié))分配DCQ/DCQU 8個字節(jié)分配DCFS/DCFSU 單精度浮點數(shù)分配DCFD/DCFDU 雙精度浮點數(shù)分配SPACE 分配一塊連續(xù)的存儲單元FIELD 定義一個結構化的內存表的數(shù)據(jù)域MAP 定義一個結構化的內存表首地址 數(shù)據(jù)定義偽指令1(1)DCB格式: 標號 DCB表達式說明:分配一塊字節(jié)單元并用偽指令中指定的表達式進行初始化。表達式可以為使用雙引號的字符串或02
13、55的數(shù)字。DCB可用“=”代替。例如:Array1DCB 1,2,3,4,5;數(shù)組str1DCBYour are welcome!;構造字符串并分配空間數(shù)據(jù)定義偽指令2(2)DCW/DCWU格式: 標號DCW/DCWU 表達式說明: DCW分配一段半字存儲單元并用表達式值初始化,它定義的存儲空間是半字對齊的。DCWU功能與DCW類似,只是分配的字存儲單元不嚴格半字對齊。例如:Arrayw1DCW0 xa,-0 xb,0 xc,-0 xd;構造固定數(shù)組并分配半字存儲單元 數(shù)據(jù)定義偽指令3(3)DCD/DCDU格式: 標號DCD/DCDU表達式說明:DCD偽指令用于分配一塊字存儲單元并用偽指令中
14、指定的表達式初始化,它定義的存儲空間是字對齊的。DCD也可用“&”代替。DCDU功能與DCD類似,只是分配的存儲單元不嚴格字對齊。例如:Arrayd1 DCD1334,234,345435 ;構造固定數(shù)組并分配字為單元的存儲單元LabelDCDstr1;該字單元存放str1的地址 數(shù)據(jù)定義偽指令4(4)DCQ/DCQU格式: 標號DCQ/DCQU表達式說明:DCQ用于分配一塊以8個字節(jié)為單位的存儲區(qū)域并用偽指令中指定的表達式初始化,它定義的存儲空間是字對齊的。DCQU功能與DCQ類似,只是分配的存儲單元不嚴格字對齊。例如:Arrayd1DCQ234234,98765541 ;構造固定數(shù)組并分配
15、字為單元的存儲空間。;注意:DCQ不能給字符串分配空間 數(shù)據(jù)定義偽指令5(5)DCFD/DCFDU格式: 標號 DCFD/DCFDU表達式說明:DCFD用于為雙精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽指令中指定的表達式初始化,它定義的存儲空間是字對齊的。每個雙精度的浮點數(shù)占據(jù)兩個字單元。DCFDU功能與DCFD類似,只是分配的存儲單元不嚴格字對齊。例如:Arrayf1DCFD 6E2 Arrayf2DCFD 1.23,1.45數(shù)據(jù)定義偽指令6(6)DCFS/DCFSU格式: 標號 DCFS/DCFSU表達式說明:DCFS用于為單精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用表達式初始化,它定義的存
16、儲空間是字對齊的。每個單精度浮點數(shù)使用一個字單元。DCFSU功能與DCFS類似,只是分配的存儲單元不嚴格字對齊。例如:Arrayf1DCFS 6E2,-9E-2,-.3 Arrayf2DCFSU1.23,6.8E9 數(shù)據(jù)定義偽指令7(7)SPACE格式: 標號 SPACE表達式說明:SPACE用于分配一片連續(xù)的存儲區(qū)域并初始化為0,表達式為要分配的字節(jié)數(shù)。SPACE也可用“%”代替。例如:freespaceSPACE1000;分配1000字節(jié)的存儲空間 數(shù)據(jù)定義偽指令8(8)MAP格式: MAP 表達式 ,基址寄存器說明:MAP定義一個結構化的內存表的首地址?!啊笨梢杂脕泶鍹AP。表達式可以
17、為程序中的標號或數(shù)學表達式,基址寄存器為可選項,當基址寄存器選項不存在時,表達式的值即為內存表的首地址,當該選項存在時,內存表的首地址為表達式的值與基址寄存器的和。MAP可以與FIELD偽操作配合使用來定義結構化的內存表。例如:MAP 0 x130,R2 ;內存表首地址為0 x130R2 數(shù)據(jù)定義偽指令9(9)FIELD格式: 標號FIELD字節(jié)數(shù)說明:FIELD用于定義一個結構化內存表中的數(shù)據(jù)域?!?”可用來代替FIELD。FIELD常與MAP配合使用來定義結構化的內存表:FIELD偽指令定義內存表中的各個數(shù)據(jù)域,MAP則定義內存表的首地址,并為每個數(shù)據(jù)域指定一個標號以供其他的指令引用。需要
18、注意的是MAP和FIELD偽指令僅用于定義數(shù)據(jù)結構,并不分配存儲單元。例如:MAP0 xF10000;定義結構化內存表首地址為0 xF10000countFIELD4;定義count的長度為4字節(jié),位置為0 xF1000+0 xFIELD4;定義x的長度為4字節(jié),位置為0 xF1004yFIELD4;定義y的長度為4字節(jié),位置為0 xF1008 匯編控制偽指令作用:指引匯編程序的執(zhí)行流程。常用的偽操作包括:(1)MACRO和MEND:宏定義的開始與結束。 (2)IF、ELSE和ENDIF:根據(jù)邏輯表達式的成立與否決定是否在編譯時加入某個指令序列。 (3)WHILE和WEND:根據(jù)邏輯表達式的成
19、立與否決定是否循環(huán)執(zhí)行這個代碼段。 (4)MEXIT:從宏中退出。 其他偽指令 在匯編程序中經(jīng)常會使用一些其他的偽指令,包括以下18條:ASSERTAREAALIGNCODE16/CODE32ENTRYENDEQUIMPORTEXPORT/GLOBALEXTERNINCBINGET/INCLUDERNROUT ADRADRLLDRNOP其他偽指令1 (1)ASSERT格式: ASSERT 邏輯表達式說明:ASSERT用來表示程序的編譯必須滿足一定的條件,如果邏輯表達式不滿足,則編譯器會報錯。例如:ASSERT ver7;保證ver7 其他偽指令2(2)AREA格式: AREA 段名屬性,說明:
20、AREA用于定義一個代碼段、數(shù)據(jù)段或者特定屬性的段。如果段名以數(shù)字開頭,那么該段名需用“|”字符括起來,如|7wolf|,用C的編譯器產(chǎn)生的代碼一般也用“|”括 起來。屬性部分表示該代碼段/數(shù)據(jù)段的相關屬性,多個屬性可以用“,”分隔。常見屬性如下: DATA:定義數(shù)據(jù)段。 CODE:定義代碼段。 READONLY:表示本段為只讀。 READWRITE:表示本段可讀寫。 ALIGN=表達式,對齊方式為2的表達式次方,例如:表達式=3,則對齊方式為8字節(jié)對齊。表達式的取值范圍為031。 COMMON屬性:定義一個通用段,這個段不包含用戶代碼和數(shù)據(jù)。其他偽指令3(3)ALIGN格式: ALIGN表達
21、式,偏移量說明:ALIGN偽操作可以通過填充字節(jié)使當前的位置滿足一定的對齊方式。表達式的值為2的冪,如1、2、4、8、16等,用于指定對齊方式。如果偽操作中沒有指定表達式,則編譯器會將當前位置對齊到下一個字的位置。偏移量也是個數(shù)字表達式,如果存在偏移量,則當前位置自動對齊到2的表達式值次方偏移量。例如:AREA|.data|,DATA,READWRITE,ALIGN=2 其他偽指令4(4)CODE16/CODE32格式: CODE16/CODE32說明:CODE16偽操作指示編譯器后面的代碼為16位的Thumb指令。CODE32偽操作指示編譯器后面的代碼為32位的ARM指令。如果在匯編源代碼中
22、同時包含Thumb和ARM指令時,可以用“CODE32”通知編譯器后的指令序列為32位的ARM指令,用“CODE16”偽指令通知編譯器后的指令序列為16位的Thumb指令。CODE16/CODE32不能對處理器進行狀態(tài)的切換。例如:CODE32; 32位的ARM指令AREA|.text|,CODE,READONLYLDRR0,0 x8500;BXR0;程序跳轉,并將處理器切換到Thumb狀態(tài)CODE16;16位的Thumb指令ADD R3,R3,1END;源文件結束 其他偽指令5-1(5)ENTRY格式: ENTRY說明:ENTRY用于指定匯編程序的入口。在一個完整的匯編程序中至少要有一個EN
23、TRY,程序中也可以有多個,此時,程序的真正入口點可在鏈接時指定,但在一個源文件里最多只能有一個ENTRY或者沒有ENTRY。 其他偽指令5-2下面的代碼使用了ENTRY: AREA subrout, CODE, READONLY ; name this block of code mar k ENTRY ; first instruction to executestart MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutinestop MOV r0, #0 x18 ; angel_SWIreason_Rep
24、ortException LDR r1, =0 x20026 ; ADP_Stopped_ApplicationExit SWI 0 x123456 ; ARM semihosting SWIdoadd ADD r0, r0, r1 ; Subroutine code MOV pc, lr ; Return from subroutine END ; Mark end of file 其他偽指令6(6)END格式: END說明:END告訴編譯器已經(jīng)到了源程序的結尾。例如:AREAconstdata,DATA,READONLYEND;結尾 其他偽指令7 (7)EQU格式: 名稱 EQU表達式 ,
25、類型說明:EQU用于將程序中的數(shù)字常量、標號、基于寄存器的值賦予一個等效的名稱,這一點類似于C語言中的define.可用“*”代替EQU。如果表達式為32位的常量,我們可以指定表達式的數(shù)據(jù)類型,類型域可以有以下3種:CODE16/CODE32/DATA例如:num1EQU1234;定義num1為1234addr5EQUstr1+0 x50d1EQU0 x2400,CODE32;定義d1的為0 x2400,且該處為32位的ARM指令 其他偽指令8(8)EXPORT/GLOBAL格式: EXPORT/GLOBAL標號 ,WEAK說明:EXPORT在程序中聲明一個全局標號,其他文件中的代碼可以被該標
26、號引用。用戶也可以用GLOBAL代替EXPORT。,WEAK可選項聲明其他文件有同名的標號,則該同名標號優(yōu)先于該標號被引用。例如:AREA|.text|,CODE,READONLYmain PROC ENDPEXPORTmain;聲明一個可全局引用的函數(shù)mainEND 其他偽指令9 (9)IMPORT格式: IMPORT標號 ,WEAK說明:告訴編譯器,這個標號要在當前源文件中使用,但標號是在其他的源文件中定義的。 ,WEAK:如果所有的源文件都沒有找到這個標號的定義,編譯器也不會提示錯誤信息。例如:AREAmycode,CODE,READONLYIMPORT_ printf ;通知編譯器當前
27、文件要引用函數(shù)_ printfEND 其他偽指令10(10)EXTERN格式: EXTERN標號 ,WEAK說明:告訴編譯器,標號要在當前源文件中引用,但是該標號是在其他的源文件中定義的。與IMPORT不同的是,如果當前源文件實際上沒有引用該標號,該標號就不會被加入到當前文件的符號表中。,WEAK:即使所有的源文件都沒有找到這個標號的定義,編譯器也不給出錯誤信息。例如:AREA|.text|,CODE,READONLYEXTERN_ printf,WEAK;告訴編譯器當前文件要引用標號,如果找不到,則不提示錯誤END 其他偽指令11 (11)GET/INCLUDE格式: GET文件名說明:GE
28、T將一個源文件包含到當前的源文件中,并將被包含的源文件在當前位置展開進行匯編處理。INCLUDE和GET的作用是等效的。使用方法:在某源文件中定義一些宏指令,用MAP和FIELD定義結構化的數(shù)據(jù)類型,用EQU定義常量的符號名稱,然后用GET/INCLUDE將這個源文件包含到其他的源文件中。使用方法與C語言中的“#include”相似。GET/INCLUDE只能用于包含源文件,包含其他文件則需要使用INCBIN偽指令。例如:AREAmycode,DATA,READONLYGET E:codeprog1.s;通知編譯器在當前源文件包含源文件E:code prog1.sGET prog2.s ;通知
29、編譯器當前源文件包含可搜索目錄下的prog2.sEND 其他偽指令12(12)INCBIN格式: INCBIN文件名說明:INCBIN將一個數(shù)據(jù)文件或者目標文件包含到當前的源文件中,編譯時被包含的文件不作任何變動地存放在當前文件中,編譯器從后面開始繼續(xù)處理。例如:AREAconstdata,DATA,READONLYINCBINdata1.dat;源文件包含文件data1.datINCBIN E:DATAdata2.bin ;源文件包含文件E:DATAdata2.binEND 其他偽指令13 (13)RN格式: 名稱RN表達式說明:RN用于給一個寄存器定義一個別名,以便程序員記憶該寄存器的功能
30、。名稱為給寄存器定義的別名,表達式為寄存器的編碼。例如:countRNR1;給R1定義一個別名count 其他偽指令14(14)ROUT格式: 名稱ROUT說明:ROUT可以給一個局部變量定義作用范圍。在程序中未使用該偽指令時,局部變量的作用范圍為所在的AREA,而使用ROUT后,局部變量的作用范圍為當前ROUT和下一個ROUT之間。 其他偽指令15 (15)ADR 小范圍地址讀取格式: ADR ,;說明:將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值(expr 地址表達式)讀取到目標寄存器Rd中。當?shù)刂分凳欠亲謱R時,取值范圍在-255255字節(jié)之間;當?shù)刂分凳亲謱R時,取值范圍在-
31、1 0201 020字節(jié)之間。在匯編編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能。若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。 對于基于PC相對偏移的地址值時,給定范圍是相對當前指令地址后兩個字處(因為ARM7TDMI為三級流水線)??梢杂肁DR加載地址實現(xiàn)查表。例如:LOOP MOV R1,#0 xF0 ADR R2,LOOP ;將LOOP的地址放入R2 ADR R3,LOOP + 4其他偽指令16(16)ADRL 中等范圍地址讀取格式: ADRL ,;說明:類似于ADR, 但比ADR讀取更大范圍的地址。當?shù)刂分凳?/p>
32、非字對齊時,取值范圍在-64KB64 KB之間;地址值是字對齊時,取值范圍在-256KB256 KB之間。在匯編編譯源程序時,ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn)ADRL偽指令功能,則產(chǎn)生錯誤,編譯失敗。可以用ADRL加載地址,實現(xiàn)程序跳轉。例如:ADRL R0,DATA_BUFADRL R1,DATA_BUF+80DATA_BUFSPACE 100 ;定義100字節(jié)緩沖區(qū)其他偽指令17 (17)LDR 大范圍地址讀取格式: LDR ,;說明:加載32位的立即數(shù)或一個地址值到目標寄存器Rd。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未
33、超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令;否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。 LDR用于加載芯片外圍功能部件的寄存器地址(32位立即數(shù)),以實現(xiàn)各種控制操作。從PC到文字池的偏移量必須小于4 KB。與ARM指令的LDR相比,偽指令的LDR的參數(shù)有“”符號。例如:LDR R0,=0 x12345678 ;加載32位立即數(shù)0 x12345678LDR R0,=DATA_BUF+60 ;加載DATA_BUF地址+60LTORG ;聲明文字池其他偽指令18(18)NOP 空操作格式: NOP ;說明:不產(chǎn)生任何有意義的操作,只是
34、占用一個機器時間。 NOP偽指令在匯編時將會被替代成ARM中的空操作,比如可能為“MOV R0,R0”指令等。匯編語言上機過程用ARM匯編語言編寫的源程序,要使之運行必須經(jīng)過以下幾個步驟:1.編輯匯編源程序,保存為文件名后綴是“.s”的文件;2.調用匯編程序對源程序進行匯編,生成目標文件;3.連接目標文件,生成可以放進ARM軟件仿真器進行調試的映象文件或者可下載到ARM的目標板執(zhí)行的二進制文件;4.對生成的最終文件進行調試。ARM的開發(fā)工具ADS1.2ADS1.2是ARM公司推出的一套ARM匯編、C、C+的集成開發(fā)環(huán)境。包含了幾個有用的開發(fā)工具,包括:(1)CodeWarrior IDE fo
35、r the ARM Developer Suite :為ARM的程序員管理、開發(fā)軟件工程項目提供了一個簡單直觀、靈活的用戶界面。(2)AXD Debuger:AXD是一個功能強大、使用方便的調試器。編輯匯編語言源程序可以使用簡單的Windows自帶的記事本程序來編輯ARM的匯編程序: 單擊開始菜單程序附件記事本 敲入?yún)R編代碼保存為.s文件 也可以使用CodeWarrior IDE來編輯匯編程序: 單擊File菜單的New菜單項 單擊Project標簽頁 單擊工具欄的New Text按鈕 敲入?yún)R編代碼保存為hello.s文件 單擊Project菜單,選擇“Add *.s to project”
36、編譯匯編語言源程序ARM的編譯器有如下幾種:(1)armcc:ARM C編譯器,具有優(yōu)化功能,兼容ANSI C(2)tcc:Thumb的C編譯器,同樣具有優(yōu)化功能兼容ANSI C(3)armcpp:ARM C+編譯器,遵循ANSI C+或者EC+標準(4)tcpp:Thubm的C+編譯器,遵循ANSI C+或者EC+標準(5)armasm:支持ARM和Thumb的匯編器這些編譯器輸出的是ELF格式的目標文件,可以包括RAWF2格式的調試信息。同時通過特殊的控制選項可以輸出匯編語言文件或者列表文件。連接裝配匯編程序使用armlink程序對ARM的匯編源程序進行連接,它也可以將多個.o目標文件連接
37、生成最終的可執(zhí)行文件。術語 :映像文件(image):是指一個可執(zhí)行文件,在執(zhí)行的時候被加載到處理器中。一個映像文件可以有多個線程。它是ELF(Executable and linking format)格式的。 段(section):描述映像文件的代碼或數(shù)據(jù)塊。域(Regions):在一個映像文件中,一個域包含了13個輸出段。多個域組織在一起,就構成了最終的映像文件。 加載時地址:映像文件載入存儲器時的地址。運行時地址:映像文件運行時的地址。 匯編程序的運行兩種運行方法:(1)生成的*.axf文件是ARM 的ELF 格式的可執(zhí)行映像文件;這個文件可以載入AXD 進行仿真調試。使用armsd在
38、終端模擬它在ARM目標機上的運行。(2)也可以直接在CodeWarrior IDE中運行映像文件:在Project窗口中單擊Run按鈕,可以執(zhí)行AXD并在Console窗口中看到運行結果。在AXD上調試成功之后,我們可以通過fromelf 工具將ELF 文件轉換為二進制格式文件下載到目標板執(zhí)行。 匯編程序的調試使用AXD進行調試 :編譯、連接成功之后,可以點擊project窗口的debug按鈕啟動AXD進行調試:主框架窗口上方的調試工具欄有幾個常用按鈕:go:使程序運行直到下一個斷點停止step in:進入函數(shù)內部運行step:單步調試,每次移動一行step out :跳出循環(huán)或函數(shù)run t
39、o cursor:運行到光標所在的位置然后停止。匯編語言與C語言混合編程技術 ARM體系結構支持ARM的匯編語言與C與C+的混合編程。在一個完整的程序設計的中,除了初始化部分用匯編語言完成外,其大部分的編程任務一般都用C或C+完成。匯編程序中訪問C程序變量1 在匯編的源程序中調用C語言風格的字符串需要使用IMPORT偽操作。IMPORT相當于C語言中的extern關鍵字,告訴編譯器引用的符號不是在本文件中定義的,而是在其他的源文件中定義的。偽操作的格式 : IMPORT symbol ,WEAKsymbol是聲明的符號的名稱;,WEAK指示編譯器如果發(fā)現(xiàn)symbol在所有的源文件中都沒有找到,
40、那么它也不會產(chǎn)生任何的錯誤信息。示例見下頁。匯編程序中訪問C程序變量2C語言代碼文件str.c里面只有一個簡單的字符串的定義:char *strhello=Hello world!n0;匯編代碼文件hello.s1 AREA |.text|, CODE, READONLY 2 main PROC3 STMFD sp!,lr4 LDR r0,=strtemp5 LDRr0,r06 BL _printf7 LDMFD sp!,pc8 strtemp9 DCDstrhello10 ENDP11 EXPORT main12 IMPORT strhello13 IMPORT _main14 IMPORT
41、 _main15 IMPORT _printf16 IMPORT |Lib$Request$armlib|, WEAK17 END將str.c和hello.s導入CodeWarrior IDE編譯運行,即可看到下面的運行結果:Hello world!C程序中內嵌匯編指令1 在ARM的C語言程序中可以使用關鍵字_asm來加入一段匯編語言的程序。格式: _asm instruction/*comment*/ C程序中內嵌匯編指令2 在C語言中嵌入的ARM匯編需要注意一些問題:在匯編指令中,可以使用表達式,使用逗號“,”作為分隔符 ;如果一條指令占用了多行,那么應該使用符號“”續(xù)行,如果一行中有多個匯編指令,那么應該使用“;”將多個指令隔開。匯編中不能再使用“;”作為注釋行的開頭,而應該使用C語言中的“/*/”或者“/”進行注釋;不要企圖使用一個物理寄存器去改變一個C變量;對于內嵌的匯編代碼用到的寄存器,編譯器在編譯時會自動加入保存和恢復這些寄存器的代碼而不用用戶去管理,除了寄存器CPSR和SPSR,其他寄存器都必須先賦值然后再讀取,否則編譯時將出現(xiàn)錯誤。C程序中內嵌匯編指令3內嵌的ARM匯編與純粹的AR
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中小學教師晉級職稱考試試題(附含答案)
- 高溫高壓清洗的環(huán)保效益-洞察及研究
- 金融科技對跨境支付市場的影響研究-洞察及研究
- 量子態(tài)解碼技術-洞察及研究
- 2026年市場營銷專員面試準備指南及答案
- 2026年IT行業(yè)注冊技術專家考試技巧
- 2026年客戶經(jīng)理績效考核及獎勵機制
- 2026年IT技術支持工程師助理的面試題
- 2026年石油化工環(huán)保治理項目專責面試題庫
- 未來五年海水養(yǎng)殖鮑企業(yè)數(shù)字化轉型與智慧升級戰(zhàn)略分析研究報告
- 江蘇省高級人民法院勞動爭議案件審理指南
- 夾套管施工方案
- 地面人工開挖施工方案
- 物業(yè)房屋中介合作協(xié)議
- 眼科常見疾病診療規(guī)范診療指南2022版
- 新郎父親在婚禮上的精彩講話稿范文(10篇)
- (山東)通風與空調工程施工資料表格大全(魯TK001-057)
- 大鵬新區(qū)保護與發(fā)展綜合規(guī)劃(2013-2020)
- 戰(zhàn)略成本1-6章toc經(jīng)典案例
- DB37-T 5026-2022《居住建筑節(jié)能設計標準》
- 虛擬電廠(共30張PPT)
評論
0/150
提交評論