首页 理论教育嵌入式系统原理及应用:汇编结构伪指令

嵌入式系统原理及应用:汇编结构伪指令

【摘要】:汇编结构伪指令用于建立汇编程序的结构框架,常用的伪指令包括以下几条。上述常用属性中,ALIGN实际也是一个伪指令。例如:2.状态切换伪指令CODE16、CODE32格式:CODE16功能:CODE16伪指令通知编译器,其后的指令序列为16位Thumb指令。CODE32伪指令通知编译器,其后的指令序列为32位ARM指令。例如:4.程序结束伪指令END格式:END功能:END伪指令用于通知编译器已经到了源程序的结尾。

汇编结构(Assembly Structure)伪指令用于建立汇编程序的结构框架,常用的伪指令包括以下几条。

1.段定义伪指令AREA

格式:AREA 段名 属性1,属性2,……

功能:AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。

注意:一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用属性如下:

(1)CODE属性:用于定义代码段,默认为READONLY。

(2)DATA属性:用于定义数据段,默认为READWRITE。

(3)READONLY属性:指定本段为只读,代码段默认为READONLY。

(4)READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。

(5)ALIGN属性:使用方式为“ALIGN 表达式”。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2的表达式次幂。

(6)COMMON属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元

上述常用属性中,ALIGN实际也是一个伪指令。

格式:ALIGN{表达式{,偏移量}}

功能:ALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对齐方式。其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如1、2、4、8、16等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为2的表达式次幂+偏移量。

例如:

2.状态切换伪指令CODE16、CODE32

格式:CODE16(或CODE32)

功能:CODE16伪指令通知编译器,其后的指令序列为16位Thumb指令。CODE32伪指令通知编译器,其后的指令序列为32位ARM指令。

注意:若在汇编源程序中同时包含ARM指令和Thumb指令,则可用CODE16伪指令通知编译器其后的指令序列为16位Thumb指令,用CODE32伪指令通知编译器其后的指令序列为32位ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码中,可用这两条伪指令进行切换,但注意它们只通知编译器其后指令的类型,并不能对处理器进行状态切换。

例如:

3.程序入口伪指令ENTRY

格式:ENTRY

功能:ENTRY伪指令用于指定汇编程序的入口点。

注意:在一个完整的汇编程序中至少要有一个ENTRY,当有多个ENTRY时,程序的真正入口点由链接器指定,但在一个源文件里最多只能有一个ENTRY,也可以没有。

例如:

4.程序结束伪指令END

格式:END(www.chuimin.cn)

功能:END伪指令用于通知编译器已经到了源程序的结尾。

例如:

5.标号输出伪指令EXPORT(或GLOBAL)

格式:EXPORT 标号{[WEAK]}

功能:EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他文件中引用。

注意:EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他同名标号优先于该标号被引用。

例如:

6.标号输入伪指令IMPORT

格式:IMPORT 标号{[WEAK]}

功能:IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号都会被加入当前源文件的符号表中。

注意:标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。

例如:

7.标号引入伪指令EXTERN

格式:EXTERN 标号{[WEAK]}

功能:EXTERN伪指令用于通知编译器要使用的标号在其他源文件中定义,但要在当前源文件中引用。与伪指令IMPORT不同的是,如果当前源文件实际并未引用该标号,则该标号就不会被加入当前源文件的符号表中。

注意:标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。

例如:

8.源文件包含伪指令GET(或INCLUDE)

格式:GET 文件名

功能:GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。

注意:汇编程序中常用的方法是在某源文件中定义一些宏指令,先用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,然后用GET伪指令将这个源文件包含到其他源文件中,使用方法与C语言中的“include”相似。

例如:

9.目标文件包含伪指令INCBIN

格式:INCBIN 文件名

功能:INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动地存放在当前文件中,编译器从其后开始继续处理。

例如: