在 ARM 匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒有相對應(yīng)的操作碼,通常稱這些特殊指令助記符為偽指令,他們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,這些偽指令僅在匯編過程中起作用,一旦匯編結(jié)束,偽指令的使命就完成。
在 ARM 的匯編程序中,有如下幾種偽指令:符號定義偽指令、數(shù)據(jù)定義偽指令、匯編控制偽指令、宏指令以及其他偽指令。
符號定義( Symbol Definition )偽指令
符號定義偽指令用于定義 ARM 匯編程序中的變量、對變量賦值以及定義寄存器的別名等操作。
常見的符號定義偽指令有如下幾種:
— 用于定義全局變量的 GBLA 、 GBLL 和 GBLS 。
— 用于定義局部變量的 LCLA 、 LCLL 和 LCLS 。
— 用于對變量賦值的 SETA 、 SETL 、 SETS 。
— 為通用寄存器列表定義名稱的 RLIST 。
1、 GBLA、GBLL 和GBLS
語法格式:
GBLA ( GBLL 或 GBLS ) 全局變量名
GBLA 、 GBLL 和 GBLS 偽指令用于定義一個 ARM 程序中的全局變量,并將其初始化。其中:
GBLA 偽指令用于定義一個全局的數(shù)字變量,并初始化為 0 ;
GBLL 偽指令用于定義一個全局的邏輯變量,并初始化為 F (假);
GBLS 偽指令用于定義一個全局的字符串變量,并初始化為空;
由于以上三條偽指令用于定義全局變量,因此在整個程序范圍內(nèi)變量名必須唯一。
使用示例:
GBLA Test1 ;定義一個全局的數(shù)字變量,變量名為 Test1
Test1 SETA 0xaa ;將該變量賦值為 0xaa
GBLL Test2 ;定義一個全局的邏輯變量,變量名為 Test2
Test2 SETL {TRUE} ;將該變量賦值為真
GBLS Test3 ;定義一個全局的字符串變量,變量名為 Test3
Test3 SETS “ Testing ” ;將該變量賦值為 “ Testing ”
2、 LCLA、LCLL 和LCLS
語法格式:
LCLA ( LCLL 或 LCLS ) 局部變量名
LCLA 、 LCLL 和 LCLS 偽指令用于定義一個 ARM 程序中的局部變量,并將其初始化。其中:
LCLA 偽指令用于定義一個局部的數(shù)字變量,并初始化為 0 ;
LCLL 偽指令用于定義一個局部的邏輯變量,并初始化為 F (假);
LCLS 偽指令用于定義一個局部的字符串變量,并初始化為空;
以上三條偽指令用于聲明局部變量,在其作用范圍內(nèi)變量名必須唯一。
使用示例:
LCLA Test4 ;聲明一個局部的數(shù)字變量,變量名為 Test4
Test3 SETA 0xaa ;將該變量賦值為 0xaa
LCLL Test5 ;聲明一個局部的邏輯變量,變量名為 Test5
Test4 SETL {TRUE} ;將該變量賦值為真
LCLS Test6 ;定義一個局部的字符串變量,變量名為 Test6
Test6 SETS “ Testing ” ;將該變量賦值為 “ Testing ”
3、 SETA、SETL 和SETS
語法格式:
變量名 SETA ( SETL 或 SETS ) 表達(dá)式
偽指令 SETA 、 SETL 、 SETS 用于給一個已經(jīng)定義的全局變量或局部變量賦值。
SETA 偽指令用于給一個數(shù)學(xué)變量賦值;
SETL 偽指令用于給一個邏輯變量賦值;
SETS 偽指令用于給一個字符串變量賦值;
其中,變量名為已經(jīng)定義過的全局變量或局部變量,表達(dá)式為將要賦給變量的值。
使用示例:
LCLA Test3 ;聲明一個局部的數(shù)字變量,變量名為 Test3
Test3 SETA 0xaa ;將該變量賦值為 0xaa
LCLL Test4 ;聲明一個局部的邏輯變量,變量名為 Test4
Test4 SETL {TRUE} ;將該變量賦值為真
4 、 RLIST
語法格式:
名稱 RLIST { 寄存器列表 }
RLIST 偽指令可用于對一個通用寄存器列表定義名稱,使用該偽指令定義的名稱可在 ARM 指令 LDM/STM 中使用。在 LDM/STM 指令中,列表中的寄存器訪問次序為根據(jù)寄存器的編號由低到高,而與列表中的寄存器排列次序無關(guān)。
使用示例:
RegList RLIST {R0-R5 , R8 , R10} ;將寄存器列表名稱定義為 RegList ,可在 ARM 指令 LDM/STM中通過該名稱訪問寄存器列表。