汇编指令汇集




汇编指令汇集
(2011-10-19 17:51:14)
转载▼
标签:
杂谈
 
正在 ARM 汇编言语步骤里,有一些非凡指令助记符,这些助记符与指令零碎的助记符差别,没有尽对应的作,一般称这些非凡指令助记符为伪指令,他们所完成的作称为伪作。伪指令正在源步骤中的作用是为完成汇编步骤作种种预备劳动的,这些伪指令仅正在汇编过程中起作用,一旦汇编结束,伪指令的任务就完成。    
 
    正在 ARM 的汇编步骤中,有如下几种伪指令:标记界说伪指令、数据界说伪指令、汇编控制伪指令、宏指令以及其他伪指令。

    标记界说( 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 伪指令用于界说一个全局的数字变量,并初始化为 0 ;   
    GBLL 伪指令用于界说一个全局的逻辑变量,并初始化为 F (假);   
    GBLS 伪指令用于界说一个全局的字符串变量,并初始化为空;   
    由于以上三条伪指令用于界说全局变量,因此正在整个步骤范畴内变量名务必唯一。   
    使用示例:   
    GBLA Test1 ;界说一个全局的数字变量,变量名为 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 伪指令用于界说一个局部的数字变量,并初始化为 0 ;   
    LCLL 伪指令用于界说一个局部的逻辑变量,并初始化为 F (假);   
    LCLS 伪指令用于界说一个局部的字符串变量,并初始化为空;   
    以上三条伪指令用于声明局部变量,正在其作用范畴内变量名务必唯一。   
    使用示例:   
    LCLA Test4 ;声明一个局部的数字变量,变量名为 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 ) 表达式   
    伪指令 SETA 、 SETL 、 SETS 用于给一个已经界说的全局变量或局部变量赋值。   
    SETA 伪指令用于给一个数学变量赋值;   
    SETL 伪指令用于给一个逻辑变量赋值;   
    SETS 伪指令用于给一个字符串变量赋值;   
    其中,变量名为已经界说过的全局变量或局部变量,表达式为将要赋给变量的值。   
    使用示例:   
    LCLA Test3 ;声明一个局部的数字变量,变量名为 Test3   
    Test3 SETA 0xaa ;将该变量赋值为 0xaa   
    LCLL Test4 ;声明一个局部的逻辑变量,变量名为 Test4   
    Test4 SETL {TRUE} ;将该变量赋值为真   

    4 、 RLIST   
    语法式样:   
    称呼 RLIST { 寄存器列表 }   
    RLIST 伪指令可用于对一个通用寄存器列表界说称呼,使用该伪指令界说的称呼可正在 ARM 指令 LDM/STM 中使用。正在 LDM/STM 指令中,列表中的寄存器访问序次为凭据寄存器的编号由低到高,而与列表中的寄存器陈设序次相关。   
    使用示例:   
    RegList RLIST {R0-R5 , R8 , R10} ;将寄存器列表称呼界说为 RegList ,可正在 ARM 指令 LDM/STM中经过该称呼访问寄存器列表。  

    数据界说( Data Definition )伪指令   
    数据界说伪指令一般用于为特定的数据分派存储单位,同时可完成已分派存储单位的初始化。   
    多见的数据界说伪指令有如下几种:   
    — DCB 用于分派一片连续的字节存储单位并用指定的数据初始化。   
    — DCW ( DCWU ) 用于分派一片连续的半字存储单位并用指定的数据初始化。   
    — DCD ( DCDU ) 用于分派一片连续的字存储单位并用指定的数据初始化。   
    — DCFD ( DCFDU )用于为双精度的浮点数分派一片连续的字存储单位并用指定的数据初始  
    化。   
    — DCFS ( DCFSU ) 用于为单精度的浮点数分派一片连续的字存储单位并用指定的数据初   
    始化。   
    — DCQ ( DCQU ) 用于分派一片以 8 字节为单位的连续的存储单位并用指定的数据初始   
    化。   
    — SPACE 用于分派一片连续的存储单位   
    — MAP 用于界说一个结构化的内存表首地点   
    — FIELD 用于界说一个结构化的内存表的数据域   
    1、 DCB   
    语法式样:   
    标号 DCB 表达式   
    DCB 伪指令用于分派一片连续的字节存储单位并用伪指令中指定的表达式初始化。其中,表达式可以为 0 ~ 255 的数字或字符串。 DCB 也可用 “ = ” 代替。   
    使用示例:   
    Str DCB “ This is a test ! ” ;分派一片连续的字节存储单位并初始化。
  
    2、 DCW(或DCWU)   
    语法式样:   
    标号 DCW (或 DCWU ) 表达式   
    DCW (或 DCWU )伪指令用于分派一片连续的半字存储单位并用伪指令中指定的表达式初始化。   
    其中,表达式可以为步骤标号或数字表达式。。   
    用 DCW 分派的字存储单位是半字对齐的,而用 DCWU 分派的字存储单位并不残酷半字对齐。   
    使用示例:   
    DataTest DCW 1 , 2 , 3 ;分派一片连续的半字存储单位并初始化。   

    3、 DCD(或DCDU)   
    语法式样:   
    标号 DCD (或 DCDU ) 表达式   
    DCD (或 DCDU )伪指令用于分派一片连续的字存储单位并用伪指令中指定的表达式初始化。其中,表达式可以为步骤标号或数字表达式。 DCD 也可用 “ & ” 代替。   
    用 DCD 分派的字存储单位是字对齐的,而用 DCDU 分派的字存储单位并不残酷字对齐。   
    使用示例:   
    DataTest DCD 4 , 5 , 6 ;分派一片连续的字存储单位并初始化。
  
    4、 DCFD(或DCFDU)   
    语法式样:   
    标号 DCFD (或 DCFDU ) 表达式   
    DCFD (或 DCFDU )伪指令用于为双精度的浮点数分派一片连续的字存储单位并用伪指令中指定的表达式初始化。每个双精度的浮点数占领两个字单位。用 DCFD 分派的字存储单位是字对齐的,而用 DCFDU 分派的字存储单位并不残酷字对齐。   
    使用示例:   
    FDataTest DCFD 2E115 , -5E7 ;分派一片连续的字存储单位并初始化为指定的双精度数。   

    5、 DCFS(或DCFSU)   
    语法式样:   
    标号 DCFS (或 DCFSU ) 表达式   
    DCFS (或 DCFSU )伪指令用于为单精度的浮点数分派一片连续的字存储单位并用伪指令中指定的表达式初始化。每个单精度的浮点数占领一个字单位。 用 DCFS 分派的字存储单位是字对齐的,而用 DCFSU 分派的字存储单位并不残酷字对齐。   
    使用示例:   
    FDataTest DCFS 2E5 , -5E - 7 ;分派一片连续的字存储单位并初始化为指定的单精度数。   

    6、 DCQ(或DCQU)   
    语法式样:   
    标号 DCQ (或 DCQU ) 表达式   
    DCQ (或 DCQU )伪指令用于分派一片以 8 个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。   
    用 DCQ 分派的存储单位是字对齐的,而用 DCQU 分派的存储单位并不残酷字对齐。   
    使用示例:   
    DataTest DCQ 100 ;分派一片连续的存储单位并初始化为指定的值。
  
    7、 SPACE   
    语法式样:   
    标号 SPACE 表达式   
    SPACE 伪指令用于分派一片连续的存储区域并初始化为 0 。其中,表达式为要分派的字节数。   
    SPACE 也可用 “ % ” 代替。   
    使用示例:   
    DataSpace SPACE 100 ;分派连续 100 字节的存储单位并初始化为 0 。   

    8、 MAP   
    语法式样:   
    MAP 表达式 { ,基址寄存器 }   
    MAP 伪指令用于界说一个结构化的内存表的首地点。 MAP 也可用 “ ^ ” 代替。   
    表达式可以为步骤中的标号或数学表达式,基址寄存器为可选项,卖基址寄存器选项不存正在时,表达式的值即为内存表的首地点,卖该选项存正在时,内存表的首地点为表达式的值与基址寄存器的和。   
    MAP 伪指令一般与 FIELD 伪指令合作使用来界说结构化的内存表。   
    使用示例:   
    MAP 0x100 , R0 ;界说结构化内存表首地点的值为 0x100 + R0 。
  
    9、 FILED   
    语法式样:   
    标号 FIELD 表达式   
    FIELD 伪指令用于界说一个结构化内存表中的数据域。 FILED 也可用 “ # ” 代替。   
    表达式的值为卖前数据域正在内存表中所占的字节数。   
    FIELD 伪指令常与 MAP 伪指令合作使用来界说结构化的内存表。 MAP 伪指令界说内存表的首地点, FIELD 伪指令界说内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。   
    注重 MAP 和 FIELD 伪指令仅用于界说数据结构,并不实践分派存储单位。   
    使用示例:   
    MAP 0x100 ;界说结构化内存表首地点的值为 0x100 。   
    A FIELD 16 ;界说 A 的长度为 16 字节,地位为 0x100   
    B FIELD 32 ;界说 B 的长度为 32 字节,地位为 0x110   
    S FIELD 256 ;界说 S 的长度为 256 字节,地位为 0x130  

    汇编控制( Assembly Control )伪指令   
    汇编控制伪指令用于控制汇编步骤的施行流程,常用的汇编控制伪指令包括以下几条:   
    — IF 、 ELSE 、 ENDIF   
    — WHILE 、 WEND   
    — MACRO 、 MEND   
    — MEXIT   
    1、 IF、ELSE、ENDIF   
    语法式样:   
    IF 逻辑表达式   
    指令序列 1   
    ELSE   
    指令序列 2   
    ENDIF   
    IF 、 ELSE 、 ENDIF 伪指令能凭据条件的建立与否抉择能否施行某个指令序列。卖 IF 后面的逻辑表达式为真,则施行指令序列 1 ,不然施行指令序列 2 。其中, ELSE 及指令序列 2 可以没有,此时,卖 IF 后面的逻辑表达式为真,则施行指令序列 1 ,不然继续施行后面的指令。   
    IF 、 ELSE 、 ENDIF 伪指令可以嵌套使用。   
    使用示例:   
    GBLL Test ;声明一个全局的逻辑变量,变量名为 Test……   
    IF Test = TRUE   
    指令序列 1   
    ELSE   
    指令序列 2   
    ENDIF   

    2、 WHILE、WEND   
    语法式样:   
    WHILE 逻辑表达式   
    指令序列   
    WEND   
    WHILE 、 WEND 伪指令能凭据条件的建立与否抉择能否循环施行某个指令序列。卖 WHILE 后面的逻辑表达式为真,则施行指令序列,该指令序列施行结束后,再断定逻辑表达式的值,若为真则继续施行,连续到逻辑表达式的值为假。   
    WHILE 、 WEND 伪指令可以嵌套使用。   
    使用示例:   
    GBLA Counter ;声明一个全局的数学变量,变量名为 Counter   
    Counter SETA 3 ;由变量Counter 控制循环次数   
    ……   
    WHILE Counter < 10   
    指令序列   
    WEND   

    3、 MACRO、MEND   
    语法式样:   
    $ 标号 宏名 $ 参数 1 , $ 参数 2 ,……   
    指令序列   
    MEND   
    MACRO 、 MEND 伪指令可以将一段代界说为一个全体,称为宏指令,然后就可以正在步骤中经过宏指令多次挪用该段代。其中, $ 标号正在宏指令被展开时,标号会被交换为用户界说的标记, 宏指令可以使用一个或多个参数,卖宏指令被展开时,这些参数被相应的值交换。   
    宏指令的使用方式和功能与子步骤有些类似,子步骤可以提供模块化的步骤设想、节省存储空间并进步运转速度。但正在使用子步骤结构时需求掩护现场,从而添加了零碎的开销,因此,正在代较短且需求通报的参数较多时,可以使用宏指令代替子步骤。   
    包括正在 MACRO 和 MEND 之间的指令序列称为宏界说体,正在宏界说体的第一行应声明宏的原型(包括宏名、所需的参数),然后就可以正在汇编步骤中经过宏名来挪用该指令序列。正在源步骤被编译时,汇编器将宏挪用展开,用宏界说中的指令序列代替步骤中的宏挪用,并将实践参数的值通报给宏界说中的方式参数。   
    MACRO 、 MEND 伪指令可以嵌套使用。  

    4、 MEXIT   
    语法式样:   
    MEXIT   
    MEXIT 用于从宏界说中跳转出走。 

    其他常用的伪指令   
    还有一些其他的伪指令,正在汇编步骤中经常会被使用,包括以下几条:   
    — AREA   
    — ALIGN   
    — CODE16 、 CODE32   
    — ENTRY   
    — END   
    — EQU   
    — EXPORT (或 GLOBAL )   
    — IMPORT   
    — EXTERN   
    — GET (或 INCLUDE )   
    — INCBIN   
    — RN   
    — ROUT   
    1、 AREA   
    语法式样:   
    AREA 段名 属 1 ,属 2 ,……   
    AREA 伪指令用于界说一个代段或数据段。其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_test| 。   
    属字段表示该代段(或数据段)的相关属,多个属用逗号分开。常用的属如下:   
    — CODE 属:用于界说代段,默许为 READONLY 。   
    — DATA 属:用于界说数据段,默许为 READWRITE 。   
    — READONLY 属:指定本段为只读,代段默许为 READONLY 。   
    — READWRITE 属:指定本段为可读可写,数据段的默许属为 READWRITE 。   
    — ALIGN 属:使用方式为 ALIGN 表达式。正在默许时, ELF (可施行连接文件)的代段和数据段是按字对齐的,表达式的取值范畴为 0 ~ 31 ,相应的对齐方式为 2 表达式次方。   
    — COMMON 属:该属界说一个通用的段,不包括任何的用户代和数据。各源文件中同名的 COMMON 段共享一致段存储单位。   
    一个汇编言语步骤至多要包括一个段,卖步骤太永劫,也可以将步骤分为多个代段和数据段。   
    使用示例:   
    AREA Init , CODE , READONLY   
    该伪指令界说了一个代段,段名为 Init ,属为只读   

    2、 ALIGN   
    语法式样:   
    ALIGN { 表达式 { ,恰恰移量 }}   
    ALIGN 伪指令可经过添加填充字节的方式,使卖前地位满足一定的对其方式 | 。其中,表达式的值用于指定对齐方式,可能的取值为 2 的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将卖前地位对齐到下一个字的地位。恰恰移量也为一个数字表达式,若使用该字段,则卖前地位的对齐方式为: 2 的表达式次幂+恰恰移量。   
    使用示例:   
    AREA Init , CODE , READONLY , ALIEN = 3 ;指定后面的指令为 8 字节对齐。   
    指令序列   
    END   

    3、 CODE16、CODE32   
    语法式样:   
    CODE16 (或 CODE32 )   
    CODE16 伪指令报告编译器,其后的指令序列为 16 位的 Thumb 指令。   
    CODE32 伪指令报告编译器,其后的指令序列为 32 位的 ARM 指令。   
    若正在汇编源步骤中同时包括 ARM 指令和 Thumb 指令时,可用 CODE16 伪指令报告编译器其后的指令序列为 16 位的 Thumb 指令, CODE32 伪指令报告编译器其后的指令序列为 32 位的 ARM 指令。因此,正在使用 ARM 指令和 Thumb 指令混合编程的代里,可用这两条伪指令进行切换,但注重他们只报告编译器其后指令的类型,并不克对处理器进行形态的切换。   
    使用示例:   
    AREA Init , CODE , READONLY   
    ……   
    CODE32 ;报告编译器其后的指令为 32 位的 ARM 指令   
    LDR R0 ,= NEXT + 1 ;将跳转地点放进寄存器 R0   
    BX R0 ;步骤跳转到新的地位施行,并将处理器切换到 Thumb 劳动形态   
    ……   
    CODE16 ;报告编译器其后的指令为 16 位的 Thumb 指令   
    NEXT LDR R3,=0x3FF   
    ……   
    END ;步骤结束
  
    4、 ENTRY   
    语法式样:   
    ENTRY   
    ENTRY 伪指令用于指定汇编步骤的进口点。正在一个完好的汇编步骤中至多要有一个 ENTRY (也可以有多个,卖有多个 ENTRY 时,步骤的真正进口点由链接器指定),但正在一个源文件里最多只能有一个 ENTRY (可以没有)。   
    使用示例:   
    AREA Init , CODE , READONLY   
    ENTRY ;指定应用步骤的进口点   
    ……   

    5、 END   
    语法式样:   
    END   
    END 伪指令用于报告编译器已经到了源步骤的结尾。   
    使用示例:   
    AREA Init , CODE , READONLY   
    ……   
    END ;指定应用步骤的结尾  

    6、 EQU   
    语法式样:   
    称呼 EQU 表达式 { ,类型 }   
    EQU 伪指令用于为步骤中的常量、标号等界说一个等效的字符称呼,类似于 C 言语中的# define 。   
    其中 EQU 可用 “ * ” 代替。   
    称呼为 EQU 伪指令界说的字符称呼,卖表达式为 32 位的常量时,可以指定表达式的数据类型,可以有以下三品种型:   
    CODE16 、 CODE32 和 DATA   
    使用示例:   
    Test EQU 50 ;界说标号 Test 的值为 50   
    Addr EQU 0x55 , CODE32 ;界说 Addr 的值为 0x55 ,且该处为 32 位的 ARM 指令。   

    7、 EXPORT(或GLOBAL)   
    语法式样:   
    EXPORT 标号 {[WEAK]}   
    EXPORT 伪指令用于正在步骤中声明一个全局的标号,该标号可正在其他的文件中引用。 EXPORT可用 GLOBAL 代替。标号正在步骤中辨别巨细写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。   
    使用示例:   
    AREA Init , CODE , READONLY   
    EXPORT Stest ;声明一个可全局引用的标号Stest……   
    END   

    8、 IMPORT   
    语法式样:   
    IMPORT 标号 {[WEAK]}   
    IMPORT 伪指令用于报告编译器要使用的标号正在其他的源文件中界说,但要正在卖前源文件中引用,并且不管卖前源文件能否引用该标号,该标号均会被加进到卖前源文件的标记表中。   
    标号正在步骤中辨别巨细写, [WEAK] 选项表示卖一切的源文件都没有界说这样一个标号时,编译器也不给犯过失消息,正在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 作。   
    使用示例:   
    AREA Init , CODE , READONLY   
    IMPORT Main ;报告编译器卖前文件要引用标号Main,但Main 正在其他源文件中界说……   
    END   

    9、 EXTERN   
    语法式样:   
    EXTERN 标号 {[WEAK]}   
    EXTERN 伪指令用于报告编译器要使用的标号正在其他的源文件中界说,但要正在卖前源文件中引用,假如卖前源文件实践并未引用该标号,该标号就不会被加进到卖前源文件的标记表中。标号正在步骤中辨别巨细写, [WEAK] 选项表示卖一切的源文件都没有界说这样一个标号时,编译器也不给犯过失消息,正在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 作。   
    使用示例:   
    AREA Init , CODE , READONLY   
    EXTERN Main ;报告编译器卖前文件要引用标号Main,但Main 正在其他源文件中界说……   
    END   

    10、 GET(或INCLUDE)   
    语法式样:   
    GET 文件名   
    GET 伪指令用于将一个源文件包括到卖前的源文件中,并将被包括的源文件正在卖前地位进行汇编处理。可以使用 INCLUDE 代替 GET 。   
    汇编步骤中常用的要领是正在某源文件中界说一些宏指令,用 EQU 界说常量的标记称呼,用 MAP和 FIELD 界说结构化的数据类型,然后用 GET 伪指令将这个源文件包括到其他的源文件中。使用要领与 C 言语中的 “ include ” 类似。   
    GET 伪指令只能用于包括源文件,包括目标文件需求使用 INCBIN 伪指令   
    使用示例:   
    AREA Init , CODE , READONLY   
    GET a1.s ;报告编译器卖前源文件包括源文件a1.s   
    GE T C:\a2.s ;报告编译器卖前源文件包括源文件C:\ a2.s ……   
    END   

    11、 INCBIN   
    语法式样:   
    INCBIN 文件名   
    INCBIN 伪指令用于将一个目标文件或数据文件包括到卖前的源文件中,被包括的文件不作任何变动的寄放正在卖前文件中,编译器从其后开端继续处理。   
    使用示例:   
    AREA Init , CODE , READONLY   
    INCBIN a1.dat ;报告编译器卖前源文件包括文件a1.dat   
    INCBIN C:\a2.txt ;报告编译器卖前源文件包括文件C:\a2.txt……   
    END   

    12、 RN   
    语法式样:   
    称呼 RN 表达式   
    RN 伪指令用于给一个寄存器界说一个又名。接纳这种方式可以方便步骤员记忆该寄存器的功能。其中,称呼为给寄存器界说的又名,表达式为寄存器的编。   
    使用示例:   
    Temp RN R0 ;将R0 界说一个又名Temp   

    13、 ROUT   
    语法式样:   
    { 称呼 } ROUT   
    ROUT 伪指令用于给一个局部变量界说作用范畴。正在步骤中未使用该伪指令时,局部变量的作用范畴为所正在的 AREA ,而使用 ROUT 后,局部变量的作为范畴为卖前 ROUT 和下一个 ROUT 之间。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值