每日聚焦:嵌入式:雜項匯編器偽指令

2022-12-30 11:28:31 來源:51CTO博客

AREA

格 式: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

ALIGN

CODE16和CODE32

格 式: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

功 能:ENTRY偽操作用于指定匯編程序的入口點。一個程序可由一個或多個源文件組成,一個源文件由一個或多個程序段組成。一個程序至少有一個入口,在只有一個入口時,編譯程 序會把這個入口的地址定義為系統復位后的程序的起始點。

使用示例:

AREA Init,CODE,READONLY   ENTRY ;指定應用程序的入口點   …

END

格 式:END

功 能:END偽操作用于通知編譯器已經到了源程序的結尾。

使用示例:

AREA Init,CODE,READONLY     ……     END ;指定應用程序的結尾

EQU

格 式:名稱 EQU表達式{,類型}

功 能:EQU偽操作用于為程序中的常量、標號等定義一個等效的字符名稱,類似于C語言中的#define。

使用示例:

Test EQU 50     ;定義標號Test的值為50Addr EQU 0x55   ; 定義Addr的值為0x55

EXPORT和GLOBAL

格 式:EXPORT 標號 [,WEAK]

功 能:EXPORT偽操作用于在程序中聲明一個全局的標號,該標號可在其它的文件中引用。

使用示例:

AREA Init,CODE,READONLY                 EXPORT Stest ;聲明一個可全局引用的標號Stest                  ……                 END

IMPORT

格 式:IMPORT 標號 [,WEAK]

功 能:IMPORT偽操作用于通知編譯器要使用的標號在其它的源文件中定義,但要在當前源文件中引用,而且無論當前源文件是否引用該標號,該標號均會被加入到當前源文件的符號表中。標號在程序中區分大小寫。

使用示例:

AREA Init,CODE,READONLY     IMPORT Main       …       END

EXTERN

GET和INCLUDE

格 式:GET 文件名

功 能:GET偽操作用于將一個源文件包含到當前的源文件中,并將被包含的源文件在當前位置進行匯編處理。可以使用INCLUDE代替GET。

使用示例:

AREA Init,CODE,READONLY        GET a1.s ;通知編譯器當前源文件包含源文件a1.s        GET C:\a2.s ;通知編譯器當前源文件包含源文件C:\a2.s         …          END

INCBIN

格 式:INCBIN 文件名

功 能:INCBIN偽操作用于將一個目標文件或數據文件包含到當前的源文 件中,被包含的文件不作任何變動地存放在當前文件中,編譯器從其后開始繼續處理。

使用示例:

AREA Init,CODE,READONLY    GET  a1.s     INCBIN  C:\a2.txt      …     END

分析:使用GET包含文件時,由于必須對包含文件進行編譯,所以被包含的文件只能是源文件。而使用INCBIN包含文件時,可以是其它類型的文件。

RN

格 式:名稱 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     ; 文件結束

ROUT

參考文獻:

孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.

標簽: 指令序列 匯編程序 程序入口

上一篇:世界快報:Qt實現俄羅斯方塊
下一篇:世界熱門:Redis數據清理