
ARM匯編語言源程序中語句一般由指令、偽操作、宏指令和偽指令組成偽操作是ARM匯編語言程序里的一些特殊指令助記符,它的作用主要是為完成匯編程序做各種準備工作,在源程序進行匯編時由匯編程序處理,而不是在計算機運行期間由機器執行。
(資料圖片僅供參考)
宏指令是一段獨立的程序代碼,可以插在源程序中,它通過偽操作來定義。宏在被使用之前必須提前定義好,宏之間可以互相調用,也可以自己遞歸調用。通過直接書寫宏名來使用宏,并根據宏指令的格式設置相應的輸入參數。宏定義本身不會產生代碼,只是在調用它時把宏體插入到源程序中。
偽指令也是ARM匯編語言程序里的特殊指令助記符,也不在處理器運行期間由機器執行,它們在匯編時將被合適的機器指令代替成ARM或Thumb指令,從而實現真正指令操作。
它由ARM公司開發,使用了CodeWarrior公司的編譯器;
它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。
ADS編譯環境下的偽操作有如下幾種:
符號定義(Symbol Definition)偽操作數據定義(Data Definition)偽操作匯編控制(Assembly Control)偽操作框架描述(Frame Description)偽操作信息報告(Reporting)偽操作其他(Miscellaneous)偽操作GBLA,GBLL及GBLS偽操作用于聲明一個ARM程序中的全局變量并在默認情況下將其初始化。
GBLA偽操作聲明一個全局的算術變量,并將其初始化成0
GBLL偽操作聲明一個全局的邏輯變量,并將其初始化成{FALSE}
GBLS偽操作聲明一個全局的字符串變量,并將其初始化成空串“”
Variable
? 其中:??
?是GBLA,GBLL或GBLS 3種偽操作之一;Variable是全局變量的名稱。在其作用范圍內必須惟一,即同一個變量名只能在作用范圍內出現一次。
GBLA A1 ;定義一個全局的數值變量,變量名為A1 A1 SETA 0x0F ;將該變量賦值為0x0F GBLL A2 ;定義一個全局的邏輯變量,變量名為A2 A2 SETL {TRUE} ;將該變量賦值為真 GBLS A3 ;定義一個全局的字符串變量,變量名為A3 A3 SETS “Testing” ;將該變量賦值為“Testing”
LCLA,LCLL及LCLS偽操作用于聲明一個ARM程序中的局部變量,并在默認情況下將其初始化。
LCLA偽操作聲明一個局部的算術變量,并將其初始化成0。
LCLL偽操作聲明一個局部的邏輯變量,并將其初始化成{FALSE}
LCLS偽操作聲明一個局部的串變量,并將其初始化成空串“”
Variable
其中:
??
?是LCLA,LCLL或LCLS 3種偽操作之一;Variable是局部變量的名稱。在其作用范圍內必須唯一,即同一個變量名只能在作用范圍內出現一次。
LCLA Test4 ;聲明一個局部的數值變量,變量名為Test4 Test4 SETA 0xaa ;將該變量賦值為0xaa LCLL Test5 ;聲明一個局部的邏輯變量,變量名為Test5 Test5 SETL {TRUE} ;將該變量賦值為真 LCLS Test6 ;定義一個局部的字符串變量,變量名為Test6 Test6 SETS “Testing” ;將該變量賦值為“Testing”
SETA,SETL及SETS偽操作用于給一個ARM程序中的全局或局部變量賦值。
SETA偽操作給一個全局或局部算術變量賦值
SETL偽操作給一個全局或局部邏輯變量賦值
SETS偽操作給一個全局或局部字符串變量賦值
Variable expr
其中:
??
?是SETA,SETL或SETS 3種偽操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定義的變量的名稱,在其作用范圍內必須唯一;expr為表達式,即賦予變量的值。
格式:名稱RLIST {通用寄存器列表}
功能:用于對一個通用寄存器列表定義名稱,
reglist RLIST {R0-R3, R8, R12} … STMFD SP!, reglist ; 將列表reglist存儲到堆棧中 … LDMIA R4, reglist ; 將列表reglist加載到R4中
參考文獻:
孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.