
格 式:AREA 段名 屬性1,屬性2,……
(資料圖)
功 能:AREA偽操作用于定義一個代碼段、數據段或特定屬性的段。其中,段名若以數值開頭,則該段名需用“|”括起來,如|1_test|,用C的編譯器產生的代碼一般也用“|”括起來。屬性字段表示該代碼段(或數據段)的相關屬性,多個屬性用逗號分隔。
使用示例:
AREA Init,CODE,READONLY ;定義段Init,代碼段,只讀 ENTRY ;程序入口 … ;指令序列 B START1 AREA STOCK,DATA,READWRITE ;定義段STOCK,數據段,讀/寫 SAVE SPACE 20 ;分配數據空間 AREA Init,CODE,READONLY ;定義段Init,代碼段,只讀 START1 ADD R1,R2,R3 … ;指令序列 B START1
格 式:CODE16(或CODE32)
功 能:
CODE16偽操作通知編譯器,其后的指令序列為16位的Thumb指令。CODE32偽操作通知編譯器,其后的指令序列為32位的ARM指令。使用示例:
AREA Init,CODE,READONLY … CODE32 ;通知編譯器其后的指令為32位的ARM指令 LDR R0,=NEXT+1 ;將跳轉地址放入寄存器R0 BX R0 ;程序跳轉到新的位置執行, ;并將處理器切換到Thumb工作狀態 … CODE16 ;通知編譯器其后的指令為16位的Thumb指令NEXT LDR R3,=0x3FF … END ;程序結束
格 式:ENTRY
功 能:ENTRY偽操作用于指定匯編程序的入口點。一個程序可由一個或多個源文件組成,一個源文件由一個或多個程序段組成。一個程序至少有一個入口,在只有一個入口時,編譯程 序會把這個入口的地址定義為系統復位后的程序的起始點。
使用示例:
AREA Init,CODE,READONLY ENTRY ;指定應用程序的入口點 …
格 式:END
功 能:END偽操作用于通知編譯器已經到了源程序的結尾。
使用示例:
AREA Init,CODE,READONLY …… END ;指定應用程序的結尾
格 式:名稱 EQU表達式{,類型}
功 能:EQU偽操作用于為程序中的常量、標號等定義一個等效的字符名稱,類似于C語言中的#define。
使用示例:
Test EQU 50 ;定義標號Test的值為50Addr EQU 0x55 ; 定義Addr的值為0x55
格 式:EXPORT 標號 [,WEAK]
功 能:EXPORT偽操作用于在程序中聲明一個全局的標號,該標號可在其它的文件中引用。
使用示例:
AREA Init,CODE,READONLY EXPORT Stest ;聲明一個可全局引用的標號Stest …… END
格 式:IMPORT 標號 [,WEAK]
功 能:IMPORT偽操作用于通知編譯器要使用的標號在其它的源文件中定義,但要在當前源文件中引用,而且無論當前源文件是否引用該標號,該標號均會被加入到當前源文件的符號表中。標號在程序中區分大小寫。
使用示例:
AREA Init,CODE,READONLY IMPORT Main … END
格 式:GET 文件名
功 能:GET偽操作用于將一個源文件包含到當前的源文件中,并將被包含的源文件在當前位置進行匯編處理。可以使用INCLUDE代替GET。
使用示例:
AREA Init,CODE,READONLY GET a1.s ;通知編譯器當前源文件包含源文件a1.s GET C:\a2.s ;通知編譯器當前源文件包含源文件C:\a2.s … END
格 式:INCBIN 文件名
功 能:INCBIN偽操作用于將一個目標文件或數據文件包含到當前的源文 件中,被包含的文件不作任何變動地存放在當前文件中,編譯器從其后開始繼續處理。
使用示例:
AREA Init,CODE,READONLY GET a1.s INCBIN C:\a2.txt … END
分析:使用GET包含文件時,由于必須對包含文件進行編譯,所以被包含的文件只能是源文件。而使用INCBIN包含文件時,可以是其它類型的文件。
格 式:名稱 RN 表達式
功 能:RN偽操作用于給一個寄存器定義一個別名。采用這種方式可以方便程序員記憶該寄存器的功能。其中,名稱為給寄存器定義的別名,表達式為寄存器的編碼。
使用示例:
Temp RN R0 ;將R0定義一個別名Temp
ARM匯編語言程序框架
段:
ARM匯編程序由段組成(程序段、數據段);段是由匯編器偽指令AREA定義的相對獨立程序塊;段的屬性:READONLY(只讀)或READWRITE(讀寫)分別用于定義一個代碼段或數據段;;文件名:TEST1.S ;功能:實現字符串拷貝功能 ;說明:使用ARMulate軟件仿真調試 AREA Example1,CODE,READONLY ;聲明代碼段Example1 num EQU 20 ;設置拷貝字的個數 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令START LDR R0, =src ; R0指向源數據塊 LDR R1, =dst ; R1指向目的數據塊 MOV R2, #num ; R2需要拷貝的數據個數 wordcopy LDR R3, [R0], #4 ; 從源數據塊中取一個字,放入R3中, ; R0=R0+4 STR R3, [R1], #4 ; 將R3中的數據存入R1指向的存儲 ; 單元中,R1=R1+4 SUBS R2, R2, #1 ; R2計數器減1 BNE wordcopy ; 如果R2不為0,則轉向wordcopy處stop MOV R0, #0x18 ; 程序運行結束返回編譯器調試環境 LDR R1, =0x20026 SWI 0x123456 AREA BlockData, DATA, READWRITE ; 數據段的名字BlockDataSrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4Dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0AREA |.extra|, NOINIT, READWRITE ; 未初始數據段的名字.extradata SPACE 1024END ; 文件結束
參考文獻:
孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.