在 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 偽指令用于定義一個(gè) ARM 程序中的全局變量,并將其初始化。其中: GBLA 偽指令用于定義一個(gè)全局的數(shù)字變量,并初始化為 0 ; GBLL 偽指令用于定義一個(gè)全局的邏輯變量,并初始化為 F (假); GBLS 偽指令用于定義一個(gè)全局的字符串變量,并初始化為空; 由于以上三條偽指令用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須唯一。 使用示例: GBLA Test1 ;定義一個(gè)全局的數(shù)字變量,變量名為 Test1 Test1 SETA 0xaa ;將該變量賦值為 0xaa GBLL Test2 ;定義一個(gè)全局的邏輯變量,變量名為 Test2 Test2 SETL ;將該變量賦值為真 GBLS Test3 ;定義一個(gè)全局的字符串變量,變量名為 Test3 Test3 SETS “ Testing ” ;將該變量賦值為 “ Testing ” 2、 LCLA、LCLL 和LCLS 語法格式: LCLA ( LCLL 或 LCLS ) 局部變量名 LCLA 、 LCLL 和 LCLS 偽指令用于定義一個(gè) ARM 程序中的局部變量,并將其初始化。其中: LCLA 偽指令用于定義一個(gè)局部的數(shù)字變量,并初始化為 0 ; LCLL 偽指令用于定義一個(gè)局部的邏輯變量,并初始化為 F (假); LCLS 偽指令用于定義一個(gè)局部的字符串變量,并初始化為空; 以上三條偽指令用于聲明局部變量,在其作用范圍內(nèi)變量名必須唯一。 使用示例: LCLA Test4 ;聲明一個(gè)局部的數(shù)字變量,變量名為 Test4 Test3 SETA 0xaa ;將該變量賦值為 0xaa LCLL Test5 ;聲明一個(gè)局部的邏輯變量,變量名為 Test5 Test4 SETL ;將該變量賦值為真 LCLS Test6 ;定義一個(gè)局部的字符串變量,變量名為 Test6 Test6 SETS “ Testing ” ;將該變量賦值為 “ Testing ”
3、 SETA、SETL 和SETS 語法格式: 變量名 SETA ( SETL 或 SETS ) 表達(dá)式 偽指令 SETA 、 SETL 、 SETS 用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。 SETA 偽指令用于給一個(gè)數(shù)學(xué)變量賦值; SETL 偽指令用于給一個(gè)邏輯變量賦值; SETS 偽指令用于給一個(gè)字符串變量賦值; 其中,變量名為已經(jīng)定義過的全局變量或局部變量,表達(dá)式為將要賦給變量的值。 使用示例: LCLA Test3 ;聲明一個(gè)局部的數(shù)字變量,變量名為 Test3 Test3 SETA 0xaa ;將該變量賦值為 0xaa LCLL Test4 ;聲明一個(gè)局部的邏輯變量,變量名為 Test4 Test4 SETL ;將該變量賦值為真
4 、 RLIST 語法格式: 名稱 RLIST { 寄存器列表 } RLIST 偽指令可用于對一個(gè)通用寄存器列表定義名稱,使用該偽指令定義的名稱可在 ARM 指令 LDM/STM 中使用。在 LDM/STM 指令中,列表中的寄存器訪問次序?yàn)楦鶕?jù)寄存器的編號由低到高,而與列表中的寄存器排列次序無關(guān)。 使用示例: RegList RLIST {R0-R5 , R8 , R10} ;將寄存器列表名稱定義為 RegList ,可在 ARM 指令 LDM/STM中通過該名稱訪問寄存器列表。 數(shù)據(jù)定義( Data Definition )偽指令 數(shù)據(jù)定義偽指令一般用于為特定的數(shù)據(jù)分配存儲單元,同時(shí)可完成已分配存儲單元的初始化。 常見的數(shù)據(jù)定義偽指令有如下幾種: — DCB 用于分配一片連續(xù)的字節(jié)存儲單元并用指定的數(shù)據(jù)初始化。 — DCW ( DCWU ) 用于分配一片連續(xù)的半字存儲單元并用指定的數(shù)據(jù)初始化。 — DCD ( DCDU ) 用于分配一片連續(xù)的字存儲單元并用指定的數(shù)據(jù)初始化。 — DCFD ( DCFDU )用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲單元并用指定的數(shù)據(jù)初始 化。 — DCFS ( DCFSU ) 用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲單元并用指定的數(shù)據(jù)初 始化。 — DCQ ( DCQU ) 用于分配一片以 8 字節(jié)為單位的連續(xù)的存儲單元并用指定的數(shù)據(jù)初始 化。 — SPACE 用于分配一片連續(xù)的存儲單元 — MAP 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址 — FIELD 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域 1、 DCB |