




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第4章 ARM程序設計基礎ARM編譯器一般都支持匯編語言的程序設計和C/C+語言的程序設計,以及兩者的混合編程。本章介紹ARM程序設計的一些基本概念,如ARM匯編語言的偽指令、匯編語言的語句格式和匯編語言的程序結構等,同時介紹C/C和匯編語言的混合編程等問題。本章的主要內容:ARM編譯器所支持的偽指令匯編語言的語句格式匯編語言的程序結構相關的程序示例4.1 ARM匯編器所支持的偽指令在ARM匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統的助記符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為偽指令,他們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準備工作
2、的,這些偽指令僅在匯編過程中起作用,一旦匯編結束,偽指令的使命就完成。在ARM的匯編程序中,有如下幾種偽指令:符號定義偽指令、數據定義偽指令、匯編控制偽指令、宏指令以及其他偽指令。4.1.1 符號定義(Symbol Definition)偽指令符號定義偽指令用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名等操作。常見的符號定義偽指令有如下幾種: 用于定義全局變量的GBLA、GBLL和GBLS。 用于定義局部變量的LCLA、LCLL和LCLS。 用于對變量賦值的SETA、SETL、SETS。 為通用寄存器列表定義名稱的RLIST。1、 GBLA、GBLL和GBLS語法格式:GBLA
3、(GBLL或GBLS)全局變量名GBLA、GBLL和GBLS偽指令用于定義一個ARM程序中的全局變量,并將其初始化。其中:GBLA偽指令用于定義一個全局的數字變量,并初始化為0;GBLL偽指令用于定義一個全局的邏輯變量,并初始化為F(假);GBLS偽指令用于定義一個全局的字符串變量,并初始化為空;由于以上三條偽指令用于定義全局變量,因此在整個程序范圍內變量名必須唯一。使用示例:GBLATest1;定義一個全局的數字變量,變量名為Test1Test1SETA0xaa;將該變量賦值為0xaaGBLLTest2;定義一個全局的邏輯變量,變量名為Test2Test2SETLTRUE;將該變量賦值為真G
4、BLSTest3;定義一個全局的字符串變量,變量名為Test3Test3SETS“Testing”;將該變量賦值為“Testing”2、 LCLA、LCLL和LCLS語法格式:LCLA(LCLL或LCLS)局部變量名LCLA、LCLL和LCLS偽指令用于定義一個ARM程序中的局部變量,并將其初始化。其中:LCLA偽指令用于定義一個局部的數字變量,并初始化為0;LCLL偽指令用于定義一個局部的邏輯變量,并初始化為F(假);LCLS偽指令用于定義一個局部的字符串變量,并初始化為空;以上三條偽指令用于聲明局部變量,在其作用范圍內變量名必須唯一。使用示例:LCLATest4;聲明一個局部的數字變量,變
5、量名為Test4Test3SETA0xaa;將該變量賦值為0xaaLCLLTest5;聲明一個局部的邏輯變量,變量名為Test5Test4SETLTRUE;將該變量賦值為真LCLSTest6;定義一個局部的字符串變量,變量名為Test6Test6SETS“Testing”;將該變量賦值為“Testing”3、 SETA、SETL和SETS語法格式:變量名SETA(SETL或SETS)表達式偽指令SETA、SETL、SETS用于給一個已經定義的全局變量或局部變量賦值。SETA偽指令用于給一個數學變量賦值;SETL偽指令用于給一個邏輯變量賦值;SETS偽指令用于給一個字符串變量賦值;其中,變量名為
6、已經定義過的全局變量或局部變量,表達式為將要賦給變量的值。使用示例:LCLATest3;聲明一個局部的數字變量,變量名為Test3Test3SETA0xaa;將該變量賦值為0xaaLCLLTest4;聲明一個局部的邏輯變量,變量名為Test4Test4SETLTRUE;將該變量賦值為真4、 RLIST語法格式:名稱 RLIST寄存器列表RLIST偽指令可用于對一個通用寄存器列表定義名稱,使用該偽指令定義的名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問次序為根據寄存器的編號由低到高,而與列表中的寄存器排列次序無關。使用示例:RegListRLISTR0-R5,
7、R8,R10;將寄存器列表名稱定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。4.1.2 數據定義(Data Definition)偽指令數據定義偽指令一般用于為特定的數據分配存儲單元,同時可完成已分配存儲單元的初始化。常見的數據定義偽指令有如下幾種: DCB用于分配一片連續的字節存儲單元并用指定的數據初始化。 DCW(DCWU)用于分配一片連續的半字存儲單元并用指定的數據初始化。 DCD(DCDU)用于分配一片連續的字存儲單元并用指定的數據初始化。 DCFD(DCFDU)用于為雙精度的浮點數分配一片連續的字存儲單元并用指定的數據初始化。 DCFS(DCFSU)用
8、于為單精度的浮點數分配一片連續的字存儲單元并用指定的數據初始化。 DCQ(DCQU)用于分配一片以8字節為單位的連續的存儲單元并用指定的數據初始化。 SPACE用于分配一片連續的存儲單元 MAP用于定義一個結構化的內存表首地址 FIELD用于定義一個結構化的內存表的數據域1、 DCB語法格式:標號DCB表達式DCB偽指令用于分配一片連續的字節存儲單元并用偽指令中指定的表達式初始化。其中,表達式可以為0255的數字或字符串。DCB也可用“=”代替。使用示例:StrDCB“This is a test!”;分配一片連續的字節存儲單元并初始化。2、 DCW(或DCWU)語法格式:標號DCW(或DCW
9、U)表達式DCW(或DCWU)偽指令用于分配一片連續的半字存儲單元并用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。用DCW分配的字存儲單元是半字對齊的,而用DCWU分配的字存儲單元并不嚴格半字對齊。使用示例:DataTestDCW1,2,3;分配一片連續的半字存儲單元并初始化。3、 DCD(或DCDU)語法格式:標號DCD(或DCDU)表達式DCD(或DCDU)偽指令用于分配一片連續的字存儲單元并用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。DCD也可用“&”代替。用DCD分配的字存儲單元是字對齊的,而用DCDU分配的字存儲單元并不嚴格字
10、對齊。使用示例:DataTestDCD4,5,6;分配一片連續的字存儲單元并初始化。4、 DCFD(或DCFDU)語法格式:標號DCFD(或DCFDU)表達式DCFD(或DCFDU)偽指令用于為雙精度的浮點數分配一片連續的字存儲單元并用偽指令中指定的表達式初始化。每個雙精度的浮點數占據兩個字單元。用DCFD分配的字存儲單元是字對齊的,而用DCFDU分配的字存儲單元并不嚴格字對齊。使用示例:FDataTestDCFD2E115,-5E7;分配一片連續的字存儲單元并初始化為指定的雙精度數。5、 DCFS(或DCFSU)語法格式:標號DCFS(或DCFSU)表達式DCFS(或DCFSU)偽指令用于為
11、單精度的浮點數分配一片連續的字存儲單元并用偽指令中指定的表達式初始化。每個單精度的浮點數占據一個字單元。用DCFS分配的字存儲單元是字對齊的,而用DCFSU分配的字存儲單元并不嚴格字對齊。使用示例:FDataTestDCFS2E5,-5E7;分配一片連續的字存儲單元并初始化為指定的單精度數。6、 DCQ(或DCQU)語法格式:標號DCQ(或DCQU)表達式DCQ(或DCQU)偽指令用于分配一片以8個字節為單位的連續存儲區域并用偽指令中指定的表達式初始化。用DCQ分配的存儲單元是字對齊的,而用DCQU分配的存儲單元并不嚴格字對齊。使用示例:DataTestDCQ100;分配一片連續的存儲單元并初
12、始化為指定的值。7、 SPACE語法格式:標號SPACE表達式SPACE偽指令用于分配一片連續的存儲區域并初始化為0。其中,表達式為要分配的字節數。SPACE也可用“”代替。使用示例:DataSpaceSPACE100;分配連續100字節的存儲單元并初始化為0。8、 MAP語法格式:MAP表達式,基址寄存器MAP偽指令用于定義一個結構化的內存表的首地址。MAP也可用“”代替。表達式可以為程序中的標號或數學表達式,基址寄存器為可選項,當基址寄存器選項不存在時,表達式的值即為內存表的首地址,當該選項存在時,內存表的首地址為表達式的值與基址寄存器的和。MAP偽指令通常與FIELD偽指令配合使用來定義
13、結構化的內存表。使用示例:MAP0x100,R0;定義結構化內存表首地址的值為0x100R0。9、 FILED語法格式:標號FIELD表達式FIELD偽指令用于定義一個結構化內存表中的數據域。FILED也可用“#”代替。表達式的值為當前數據域在內存表中所占的字節數。FIELD偽指令常與MAP偽指令配合使用來定義結構化的內存表。MAP偽指令定義內存表的首地址,FIELD偽指令定義內存表中的各個數據域,并可以為每個數據域指定一個標號供其他的指令引用。注意MAP和FIELD偽指令僅用于定義數據結構,并不實際分配存儲單元。使用示例:MAP0x100;定義結構化內存表首地址的值為0x100。AFIELD
14、16;定義A的長度為16字節,位置為0x100BFIELD32;定義B的長度為32字節,位置為0x110SFIELD256;定義S的長度為256字節,位置為0x1304.1.3 匯編控制(Assembly Control)偽指令匯編控制偽指令用于控制匯編程序的執行流程,常用的匯編控制偽指令包括以下幾條: IF、ELSE、ENDIF WHILE、WEND MACRO、MEND MEXIT1、 IF、ELSE、ENDIF語法格式:IF邏輯表達式指令序列1ELSE指令序列2ENDIFIF、ELSE、ENDIF偽指令能根據條件的成立與否決定是否執行某個指令序列。當IF后面的邏輯表達式為真,則執行指令序
15、列1,否則執行指令序列2。其中,ELSE及指令序列2可以沒有,此時,當IF后面的邏輯表達式為真,則執行指令序列1,否則繼續執行后面的指令。IF、ELSE、ENDIF偽指令可以嵌套使用。使用示例:GBLLTest;聲明一個全局的邏輯變量,變量名為TestIFTest = TRUE指令序列1ELSE指令序列2ENDIF2、 WHILE、WEND語法格式:WHILE邏輯表達式指令序列WENDWHILE、WEND偽指令能根據條件的成立與否決定是否循環執行某個指令序列。當WHILE后面的邏輯表達式為真,則執行指令序列,該指令序列執行完畢后,再判斷邏輯表達式的值,若為真則繼續執行,一直到邏輯表達式的值為假
16、。WHILE、WEND偽指令可以嵌套使用。使用示例:GBLACounter;聲明一個全局的數學變量,變量名為CounterCounterSETA3;由變量Counter控制循環次數WHILECounter < 10指令序列WEND3、 MACRO、MEND語法格式:$標號宏名$參數1,$參數2,指令序列MENDMACRO、MEND偽指令可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中通過宏指令多次調用該段代碼。其中,$標號在宏指令被展開時,標號會被替換為用戶定義的符號,宏指令可以使用一個或多個參數,當宏指令被展開時,這些參數被相應的值替換。宏指令的使用方式和功能與子程序有些相
17、似,子程序可以提供模塊化的程序設計、節省存儲空間并提高運行速度。但在使用子程序結構時需要保護現場,從而增加了系統的開銷,因此,在代碼較短且需要傳遞的參數較多時,可以使用宏指令代替子程序。包含在MACRO和MEND之間的指令序列稱為宏定義體,在宏定義體的第一行應聲明宏的原型(包含宏名、所需的參數),然后就可以在匯編程序中通過宏名來調用該指令序列。在源程序被編譯時,匯編器將宏調用展開,用宏定義中的指令序列代替程序中的宏調用,并將實際參數的值傳遞給宏定義中的形式參數。MACRO、MEND偽指令可以嵌套使用。4、 MEXIT語法格式:MEXITMEXIT用于從宏定義中跳轉出去。4.1.4 其他常用的偽
18、指令還有一些其他的偽指令,在匯編程序中經常會被使用,包括以下幾條: AREA ALIGN CODE16、CODE32 ENTRY END EQU EXPORT(或GLOBAL) IMPORT EXTERN GET(或INCLUDE) INCBIN RN ROUT1、 AREA語法格式:AREA段名屬性1,屬性2,AREA偽指令用于定義一個代碼段或數據段。其中,段名若以數字開頭,則該段名需用“|”括起來,如|1_test|。屬性字段表示該代碼段(或數據段)的相關屬性,多個屬性用逗號分隔。常用的屬性如下: CODE屬性:用于定義代碼段,默認為READONLY。 DATA屬性:用于定義數據段,默認為
19、READWRITE。 READONLY屬性:指定本段為只讀,代碼段默認為READONLY。 READWRITE屬性:指定本段為可讀可寫,數據段的默認屬性為READWRITE。 ALIGN屬性:使用方式為ALIGN 表達式。在默認時,ELF(可執行連接文件)的代碼段和數據段是按字對齊的,表達式的取值范圍為031,相應的對齊方式為2表達式次方。 COMMON屬性:該屬性定義一個通用的段,不包含任何的用戶代碼和數據。各源文件中同名的COMMON段共享同一段存儲單元。一個匯編語言程序至少要包含一個段,當程序太長時,也可以將程序分為多個代碼段和數據段。使用示例:AREAInit,CODE,READONL
20、Y指令序列;該偽指令定義了一個代碼段,段名為Init,屬性為只讀2、 ALIGN語法格式:ALIGN表達式,偏移量ALIGN偽指令可通過添加填充字節的方式,使當前位置滿足一定的對其方式|。其中,表達式的值用于指定對齊方式,可能的取值為2的冪,如1、2、4、8、16等。若未指定表達式,則將當前位置對齊到下一個字的位置。偏移量也為一個數字表達式,若使用該字段,則當前位置的對齊方式為:2的表達式次冪偏移量。使用示例:AREAInit,CODE,READONLY,ALIEN3;指定后面的指令為8字節對齊。指令序列END3、 CODE16、CODE32語法格式:CODE16(或CODE32)CODE16
21、偽指令通知編譯器,其后的指令序列為16位的Thumb指令。CODE32偽指令通知編譯器,其后的指令序列為32位的ARM指令。若在匯編源程序中同時包含ARM指令和Thumb指令時,可用CODE16偽指令通知編譯器其后的指令序列為16位的Thumb指令,CODE32偽指令通知編譯器其后的指令序列為32位的ARM指令。因此,在使用ARM指令和Thumb指令混合編程的代碼里,可用這兩條偽指令進行切換,但注意他們只通知編譯器其后指令的類型,并不能對處理器進行狀態的切換。使用示例:AREAInit,CODE,READONLYCODE32;通知編譯器其后的指令為32位的ARM指令LDRR0,NEXT1;將跳
22、轉地址放入寄存器R0BXR0;程序跳轉到新的位置執行,并將處理器切換到Thumb工作狀態CODE16;通知編譯器其后的指令為16位的Thumb指令NEXTLDRR3,0x3FFEND;程序結束4、 ENTRY語法格式:ENTRYENTRY偽指令用于指定匯編程序的入口點。在一個完整的匯編程序中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程序的真正入口點由鏈接器指定),但在一個源文件里最多只能有一個ENTRY(可以沒有)。使用示例:AREAInit,CODE,READONLYENTRY;指定應用程序的入口點5、 END語法格式:ENDEND偽指令用于通知編譯器已經到了源程序的結尾。
23、使用示例:AREAInit,CODE,READONLYEND;指定應用程序的結尾6、 EQU語法格式:名稱EQU表達式,類型EQU偽指令用于為程序中的常量、標號等定義一個等效的字符名稱,類似于C語言中的define。其中EQU可用“*”代替。名稱為EQU偽指令定義的字符名稱,當表達式為32位的常量時,可以指定表達式的數據類型,可以有以下三種類型:CODE16、CODE32和DATA使用示例:TestEQU50;定義標號Test的值為50AddrEQU0x55,CODE32;定義Addr的值為0x55,且該處為32位的ARM指令。7、 EXPORT(或GLOBAL)語法格式:EXPORT標號WE
24、AKEXPORT偽指令用于在程序中聲明一個全局的標號,該標號可在其他的文件中引用。EXPORT可用GLOBAL代替。標號在程序中區分大小寫,WEAK選項聲明其他的同名標號優先于該標號被引用。使用示例:AREAInit,CODE,READONLYEXPORTStest;聲明一個可全局引用的標號StestEND8、 IMPORT語法格式:IMPORT標號WEAKIMPORT偽指令用于通知編譯器要使用的標號在其他的源文件中定義,但要在當前源文件中引用,而且無論當前源文件是否引用該標號,該標號均會被加入到當前源文件的符號表中。標號在程序中區分大小寫,WEAK選項表示當所有的源文件都沒有定義這樣一個標號
25、時,編譯器也不給出錯誤信息,在多數情況下將該標號置為0,若該標號為B或BL指令引用,則將B或BL指令置為NOP操作。使用示例:AREAInit,CODE,READONLYIMPORTMain;通知編譯器當前文件要引用標號Main,但Main在其他源文件中定義END9、 EXTERN語法格式:EXTERN標號WEAKEXTERN偽指令用于通知編譯器要使用的標號在其他的源文件中定義,但要在當前源文件中引用,如果當前源文件實際并未引用該標號,該標號就不會被加入到當前源文件的符號表中。標號在程序中區分大小寫,WEAK選項表示當所有的源文件都沒有定義這樣一個標號時,編譯器也不給出錯誤信息,在多數情況下將
26、該標號置為0,若該標號為B或BL指令引用,則將B或BL指令置為NOP操作。使用示例:AREAInit,CODE,READONLYEXTERNMain;通知編譯器當前文件要引用標號Main,但Main在其他源文件中定義END10、 GET(或INCLUDE)語法格式:GET文件名GET偽指令用于將一個源文件包含到當前的源文件中,并將被包含的源文件在當前位置進行匯編處理??梢允褂肐NCLUDE代替GET。匯編程序中常用的方法是在某源文件中定義一些宏指令,用EQU定義常量的符號名稱,用MAP和FIELD定義結構化的數據類型,然后用GET偽指令將這個源文件包含到其他的源文件中。使用方法與C語言中的“i
27、nclude”相似。GET偽指令只能用于包含源文件,包含目標文件需要使用INCBIN偽指令使用示例:AREAInit,CODE,READONLYGETa1.s;通知編譯器當前源文件包含源文件a1.sGETC:a2.s;通知編譯器當前源文件包含源文件C: a2.sEND11、 INCBIN語法格式:INCBIN文件名INCBIN偽指令用于將一個目標文件或數據文件包含到當前的源文件中,被包含的文件不作任何變動的存放在當前文件中,編譯器從其后開始繼續處理。使用示例:AREAInit,CODE,READONLYINCBINa1.dat;通知編譯器當前源文件包含文件a1.datINCBIN C:a2.t
28、xt;通知編譯器當前源文件包含文件C:a2.txtEND12、 RN語法格式:名稱RN表達式RN偽指令用于給一個寄存器定義一個別名。采用這種方式可以方便程序員記憶該寄存器的功能。其中,名稱為給寄存器定義的別名,表達式為寄存器的編碼。使用示例:TempRNR0;將R0定義一個別名Temp13、 ROUT語法格式:名稱ROUTROUT偽指令用于給一個局部變量定義作用范圍。在程序中未使用該偽指令時,局部變量的作用范圍為所在的AREA,而使用ROUT后,局部變量的作為范圍為當前ROUT和下一個ROUT之間。4.2 匯編語言的語句格式ARM(Thumb)匯編語言的語句格式為:標號指令或偽指令;注釋在匯編
29、語言程序設計中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不用許在一條指令中大、小寫混用。同時,如果一條語句太長,可將該長語句分為若干行來書寫,在行的末尾用“”表示下一行與本行為同一條語句。4.2.1 在匯編語言程序中常用的符號在匯編語言程序設計中,經常使用各種符號代替地址、變量和常量等,以增加程序的可讀性。盡管符號的命名由編程者決定,但并不是任意的,必須遵循以下的約定: 符號區分大小寫,同名的大、小寫符號會被編譯器認為是兩個不同的符號。 符號在其作用范圍內必須唯一。 自定義的符號名不能與系統的保留字相同。 符號名不應與指令或偽指令同名。1、 程序中的變量程序中的變量是指其值在程序的運
30、行過程中可以改變的量。ARM(Thumb)匯編程序所支持的變量有數字變量、邏輯變量和字符串變量。數字變量用于在程序的運行中保存數字值,但注意數字值的大小不應超出數字變量所能表示的范圍。邏輯變量用于在程序的運行中保存邏輯值,邏輯值只有兩種取值情況:真或假。字符串變量用于在程序的運行中保存一個字符串,但注意字符串的長度不應超出字符串變量所能表示的范圍。在ARM(Thumb)匯編語言程序設計中,可使用GBLA、GBLL、GBLS偽指令聲明全局變量,使用LCLA、LCLL、LCLS偽指令聲明局部變量,并可使用SETA、SETL和SETS對其進行初始化。2、 程序中的常量程序中的常量是指其值在程序的運行
31、過程中不能被改變的量。ARM(Thumb)匯編程序所支持的常量有數字常量、邏輯常量和字符串常量。數字常量一般為32位的整數,當作為無符號數時,其取值范圍為0232-1,當作為有符號數時,其取值范圍為-231231-1。邏輯常量只有兩種取值情況:真或假。字符串常量為一個固定的字符串,一般用于程序運行時的信息提示。3、 程序中的變量代換程序中的變量可通過代換操作取得一個常量。代換操作符為“$”。如果在數字變量前面有一個代換操作符“$”,編譯器會將該數字變量的值轉換為十六進制的字符串,并將該十六進制的字符串代換“$”后的數字變量。如果在邏輯變量前面有一個代換操作符“$”,編譯器會將該邏輯變量代換為它
32、的取值(真或假)。如果在字符串變量前面有一個代換操作符“$”,編譯器會將該字符串變量的值代換“$”后的字符串變量。使用示例:LCLSS1;定義局部字符串變量S1和S2LCLSS2S1SETS“Test!”S2SETS“This is a $S1”;字符串變量S2的值為“This is a Test!”4.2.2 匯編語言程序中的表達式和運算符在匯編語言程序設計中,也經常使用各種表達式,表達式一般由變量、常量、運算符和括號構成。常用的表達式有數字表達式、邏輯表達式和字符串表達式,其運算次序遵循如下的優先級: 優先級相同的雙目運算符的運算順序為從左到右。 相鄰的單目運算符的運算順序為從右到左,且單
33、目運算符的優先級高于其他運算符。 括號運算符的優先級最高。1、 數字表達式及運算符數字表達式一般由數字常量、數字變量、數字運算符和括號構成。與數字表達式相關的運算符如下: “”、“”、“×”、“/” 及“MOD”算術運算符以上的算術運算符分別代表加、減、乘、除和取余數運算。例如,以X和Y表示兩個數字表達式,則:XY表示X與Y的和。XY表示X與Y的差。X×Y表示X與Y的乘積。X/Y表示X除以Y的商。X:MOD:Y表示X除以Y的余數。 “ROL”、“ROR”、“SHL”及“SHR”移位運算符以X和Y表示兩個數字表達式,以上的移位運算符代表的運算如下:X:ROL:Y表示將X循環左
34、移Y位。X:ROR:Y表示將X循環右移Y位。X:SHL:Y表示將X左移Y位。X:SHR:Y表示將X右移Y位。 “AND”、“OR”、“NOT”及“EOR”按位邏輯運算符以X和Y表示兩個數字表達式,以上的按位邏輯運算符代表的運算如下:X:AND:Y表示將X和Y按位作邏輯與的操作。X:OR:Y表示將X和Y按位作邏輯或的操作。:NOT:Y表示將Y按位作邏輯非的操作。X:EOR:Y表示將X和Y按位作邏輯異或的操作。2、 邏輯表達式及運算符邏輯表達式一般由邏輯量、邏輯運算符和括號構成,其表達式的運算結果為真或假。與邏輯表達式相關的運算符如下: “=”、“>”、“<”、“>=”、“<
35、;= ”、“/=”、“ <>” 運算符以X和Y表示兩個邏輯表達式,以上的運算符代表的運算如下:X = Y表示X等于Y。X > Y表示X大于Y。X < Y表示X小于Y。X >= Y表示X大于等于Y。X <= Y表示X小于等于Y。X /= Y表示X不等于Y。X <> Y表示X不等于Y。 “LAND”、“LOR”、“LNOT”及“LEOR”運算符以X和Y表示兩個邏輯表達式,以上的邏輯運算符代表的運算如下:X:LAND:Y表示將X和Y 作邏輯與的操作。X:LOR:Y表示將X和Y作邏輯或的操作。:LNOT:Y表示將Y作邏輯非的操作。X:LEOR:Y表示將X
36、和Y作邏輯異或的操作。3、 字符串表達式及運算符字符串表達式一般由字符串常量、字符串變量、運算符和括號構成。編譯器所支持的字符串最大長度為512字節。常用的與字符串表達式相關的運算符如下: LEN運算符LEN運算符返回字符串的長度(字符數),以X表示字符串表達式,其語法格式如下:LEN:X CHR運算符CHR運算符將0255之間的整數轉換為一個字符,以M表示某一個整數,其語法格式如下:CHR:M STR運算符STR運算符將將一個數字表達式或邏輯表達式轉換為一個字符串。對于數字表達式,STR運算符將其轉換為一個以十六進制組成的字符串;對于邏輯表達式,STR運算符將其轉換為字符串T或F,其語法格式
37、如下:STR:X其中,X為一個數字表達式或邏輯表達式。 LEFT運算符LEFT運算符返回某個字符串左端的一個子串,其語法格式如下:X:LEFT:Y其中:X為源字符串,Y為一個整數,表示要返回的字符個數。 RIGHT運算符與LEFT運算符相對應,RIGHT運算符返回某個字符串右端的一個子串,其語法格式如下:X:RIGHT:Y其中:X為源字符串,Y為一個整數,表示要返回的字符個數。 CC運算符CC運算符用于將兩個字符串連接成一個字符串,其語法格式如下:X:CC:Y其中:X為源字符串1,Y為源字符串2,CC運算符將Y連接到X的后面。4、 與寄存器和程序計數器(PC)相關的表達式及運算符常用的與寄存器
38、和程序計數器(PC)相關的表達式及運算符如下: BASE運算符BASE運算符返回基于寄存器的表達式中寄存器的編號,其語法格式如下:BASE:X其中,X為與寄存器相關的表達式。 INDEX運算符INDEX運算符返回基于寄存器的表達式中相對于其基址寄存器的偏移量,其語法格式如下:INDEX:X其中,X為與寄存器相關的表達式。5、 其他常用運算符 ?運算符?運算符返回某代碼行所生成的可執行代碼的長度,例如:?X返回定義符號X的代碼行所生成的可執行代碼的字節數。 DEF運算符DEF運算符判斷是否定義某個符號,例如:DEF:X如果符號X已經定義,則結果為真,否則為假。4.3 匯編語言的程序結構4.3.1
39、 匯編語言的程序結構在ARM(Thumb)匯編語言程序中,以程序段為單位組織代碼。段是相對獨立的指令或數據序列,具有特定的名稱。段可以分為代碼段和數據段,代碼段的內容為執行代碼,數據段存放代碼運行時需要用到的數據。一個匯編程序至少應該有一個代碼段,當程序較長時,可以分割為多個代碼段和數據段,多個段在程序編譯鏈接時最終形成一個可執行的映象文件。可執行映象文件通常由以下幾部分構成: 一個或多個代碼段,代碼段的屬性為只讀。 零個或多個包含初始化數據的數據段,數據段的屬性為可讀寫。 零個或多個不包含初始化數據的數據段,數據段的屬性為可讀寫。鏈接器根據系統默認或用戶設定的規則,將各個段安排在存儲器中的相
40、應位置。因此源程序中段之間的相對位置與可執行的映象文件中段的相對位置一般不會相同。以下是一個匯編語言源程序的基本結構:AREAInit,CODE,READONLYENTRYStartLDRR0,=0x3FF5000LDRR1,0xFFSTRR1,R0LDRR0,=0x3FF5008LDRR1,0x01STRR1,R0END在匯編語言程序中,用AREA偽指令定義一個段,并說明所定義段的相關屬性,本例定義一個名為Init的代碼段,屬性為只讀。ENTRY偽指令標識程序的入口點,接下來為指令序列,程序的末尾為END偽指令,該偽指令告訴編譯器源文件的結束,每一個匯編程序段都必須有一條END偽指令,指示代
41、碼段的結束。4.3.2 匯編語言的子程序調用在ARM匯編語言程序中,子程序的調用一般是通過BL指令來實現的。在程序中,使用指令:BL子程序名即可完成子程序的調用。該指令在執行時完成如下操作:將子程序的返回地址存放在連接寄存器LR中,同時將程序計數器PC指向子程序的入口點,當子程序執行完畢需要返回調用處時,只需要將存放在LR中的返回地址重新拷貝給程序計數器PC即可。在調用子程序的同時,也可以完成參數的傳遞和從子程序返回運算的結果,通??梢允褂眉拇嫫鱎0R3完成。以下是使用BL指令調用子程序的匯編語言源程序的基本結構:AREAInit,CODE,READONLYENTRYStartLDRR0,=0
42、x3FF5000LDRR1,0xFFSTRR1,R0LDRR0,=0x3FF5008LDRR1,0x01STRR1,R0BLPRINT_TEXTPRINT_TEXT MOVPC,BLEND4.3.3 匯編語言程序示例以下是一個基于S3C4510B的串行通訊程序,關于S3C4510B的串行通訊的工作原理,可以參考第六章的相關內容,在此僅向讀者說明一個完整匯編語言程序的基本結構:;*; Institute of Automation,Chinese Academy of Sciences;Description:This example shows the UART communication!;
43、Author: JuGuang,Lee;Date:;*UARTLCON0EQU0x3FFD000UARTCONT0EQU0x3FFD004UARTSTAT0EQU 0x3FFD008UTXBUF0EQU0x3FFD00CUARTBRD0EQU0x3FFD014AREA Init,CODE,READONLYENTRY;*;LED Display;*LDRR1,=0x3FF5000LDRR0,=&ffSTRR0,R1LDRR1,=0x3FF5008LDRR0,=&ffSTRR0,R1;*;UART0 line control register;*LDRR1,=UARTLCON0LD
44、RR0,=0x03STRR0,R1;*;UART0 control regiser;*LDRR1,=UARTCONT0LDRR0,=0x9STRR0,R1;*;UART0 baud rate divisor regiser;Baudrate=19200,對應于50MHz的系統工作頻率;*LDRR1,=UARTBRD0LDRR0,=0x500 STRR0,R1;*;Print the messages!;*LOOPLDRR0,=Line1BLPrintLineLDRR0,=Line2BLPrintLineLDRR0,=Line3BLPrintLineLDRR0,=Line4BLPrintLine
45、LDRR1,=0x7FFFFFLOOP1SUBSR1,R1,#1BNELOOP1BLOOP;*;Print line ;*PrintLineMOVR4,LRMOVR5,R0LineLDRBR1,R5,#1ANDR0,R1,#&FFTSTR0,#&FFMOVEQPC,R4BLPutByteBLinePutByteLDRR3,=UARTSTAT0LDRR2,R3TSTR2,#&40BEQPutByteLDRR3,=UTXBUF0STRR0,R3MOVPC,LRLine1DCB&A,&D,"*",0Line2DCB&A,&D
46、,"Chinese Academy of Sciences,Institute of Automation,Complex System Lab.",0Line3DCB&A,&D," ARM Development Board Based on Samsung ARM S3C4510B.",0Line4 DCB&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店營銷經理勞動合同范本
- 肇慶市實驗中學高三生物三四五高效課堂教學設計:自由組合定律專題
- 西南財經大學天府學院《基本體操(1)》2023-2024學年第一學期期末試卷
- 四川省廣安市代市中學2025屆初三下學期教學質量檢測試題模擬考試數學試題含解析
- 山東建筑大學《文學與大眾文化》2023-2024學年第二學期期末試卷
- 山西工程技術學院《藥物分析Ⅱ》2023-2024學年第一學期期末試卷
- 上海外國語大學《語言與社會》2023-2024學年第二學期期末試卷
- 江西工商職業技術學院《數據挖掘與人工智能》2023-2024學年第二學期期末試卷
- 上海市上海民辦張江集團校2024-2025學年中考物理試題原創模擬卷(十)含解析
- 天津仁愛學院《報紙采編實戰訓練》2023-2024學年第二學期期末試卷
- 2025年上半年池州市園林局招考專業技術人員易考易錯模擬試題(共500題)試卷后附參考答案
- 質量信譽考核自評報告3篇
- 2025年度毛絨玩具產業發展報告
- 2025年初級社會工作者綜合能力理論考試試題(300題)附答案
- 危險作業安全管理培訓課件
- 2025-2030中國嬰兒車行業市場現狀供需分析及投資評估規劃分析研究報告
- 特種設備事故壓力容器應急預案演練記錄
- 人教版(2024)七年級下冊地理期中綜合調研測試卷(含答案解析)
- 畢業設計(論文)-可調節辦公椅分析與設計
- 工業廢氣治理工(技師)職業技能鑒定理論試題及答案
- 騰訊游戲引擎技術向工業數字孿生的遷移
評論
0/150
提交評論