微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM学习手札之汇编伪指令

ARM学习手札之汇编伪指令

时间:11-22 来源:互联网 点击:

CODE16 和CODE32
CODE16 伪指令指示汇编编译器后面的指令为16 位的Thumb 指令。
CODE32 伪指令指示汇编编译器后面的指令为32 位的ARM 指令。
伪指令格式:
CODE16
CODE32
CODE16 和CODE32 伪指令只是指示汇编编译器后面的指令的类型,伪指令本身并不进行程序状态的切换。要进行状态切换,可以使用BX 指令操作。
伪指令应用举例如下:
AREA Example CODE,READONLY
CODE32

使用CODE16 和CODE32 定义Thumb 指令及ARM 指令并用BX 指令进行切换。
CODE16 和CODE32 的使用:
AREA ArmThumC,CODE,READONLY
CODE32
ADR R0,ThumbStart+1
BX R0
CODE16
ThumbStart
MOV R0,#10

END

END
END 伪指令用于指示汇编编译器源文件已结束。每一个汇编源文件均要使用一个END 伪指令,指示本源程序结束。
伪指令格式:
END

ENTRY
ENTRY 伪指令用于指定程序的入口点。
伪指令格式:
ENTRY
一个程序(可以包含多个源文件)中至少要有一个ENTRY,可以有多个ENTRY。但一个源文件中最多只有一个ENTRY。
伪指令应用举例如下。
AREA, Example, CODE,READNOLY
ENTRY
CODE32
START MOV R1,#0x5F

EQU
EQU 伪指令为数字常量,基于寄存器的值和程序中的标号定义一个名称。*与EQU同义。
指令格式:
name EQU expr{,type}
其中:name 要定义的常量的名称。
expr 基于寄存器的地址值,程序中的标号,32 位地址常量或32 位常量。
type 当expr 为32 位常量时,可用type 指示expr 表示的数据类型。如下示例:
CODE16
CODE32
DATA
EQU 伪指令的作用类似于C 语言中的#define。用于为一个常量定义名称。
伪指令应用举例如下:
T_bit EQU 0x20 ;定义常量T_bit,其值为0x20
PLLCON EQU 0xE01FC080 ;定义寄存器PLLCON,地址为0Xe01F080
ABCD EQU label+8 ;定义ABCD 为label+8

EXPORT 和GLOBAL
EXPORT 声明一个符号可以被其它文件引用。相当于声明了一个全局变量。
GLOBAL 与EXPORT 相同
指令格式:
EXPORT symbol{[WEAK]}
GLOBAL symbol{[WEAK]}
其中:symbol 要声明的符号名称
[WEAK] 声明其它的同名符优先于本符号被引用。
伪指令应用举例如下:
EXPORT InitStack
GLOBAL Vectors

IMPORT 和EXTERN
IMJPORT 伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。
EXTERN 与IMPORT 相同
指令格式:
IMPORT symbol{[WEAK]}
EXTERN symbol{[WEAK]}
其中:symbol 要声明的符号名称。
[WEAK] 指定该选项后,如果symbol 在所有的源程序中都没有被定义,编译器也不会生任何错误信息,同时编译器也不会到当前没有被INCLUDE 进来库中去查找该标号。
使用IMPORT 或EXTERN 声明外部标号时,若连接器在连接处理时不能解释该符号,而伪指令中没有[WEAK]选项,则连接器会报告错误,若伪指令中有[WEAK]选项,则连接器不会报告错误,而是进行下面的操作:
(A)如果该符号被B 或者BL 指令引用,则该符号被设置成下一条指令的地址,该B 或者BL 指令相当于一条NOP 指令。
(B)其它情况下该符号被设置0。
伪指令应用举例如下:
IMPORT InitStack
EXTERN Vectors

GET 和INCLUDE
GET 伪指令将一个源文件包含到当前源文件中,并将被包含的文件在当前位置进行汇编处理。INCLUDE 与GFT 同义。
指令格式:
GET filename
INCLUDE filename
其中:filename 要包含的源文件名,可以使用路径信息。
GET 伪指令通常用于包含一些宏定义或常量定义的源文件。如用EQU 定义的常量,用MAP 和FIELD 定义的结构化的数据类型,这样的源文件类似于C 语言中的头文件,GET、INCLUDE 伪指令不能用来包含目标文件,而INCBIN 伪指令可以包含目标文件。
伪指令应用举例如下:
INCLUDE LPC2106.inc

INCBIN
INCBIN 伪指令将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理。
指令格式:
INCBIN filename
其中:filename 要包含的源文件名,可以使用路径信息。
通常可以使用INCBIN 将一个执行文件或者任意数据包含到当前文件中,被包含的执行文件或数据将被原封不动地放下当前文件中,编译器从INCBIN 伪指令后面开始继续处理。
伪指令应用举例如下:
NCBIN charlib。bin

KEEP
KEEP 伪指令指示编译器保留符号表中的局部符号。
伪指令格式:
KEEP {symbol}
其中:symbol 要保留的局部标号。若没有此项,则除了基于寄存器处的所有符号将包含在目标文件的符号表中。

NOFP
NOFP 伪指令用于禁止源程序中包含浮点运算指令。
伪指令格式:
NOFP

REQUIRE
REQUIRE 伪指令指定段之间的依赖关系。
伪指令格式:
REQUIRE label
其中:label 所需要的标号的名称。
当进行链接处理时,包含了REQUIRE label 伪指令的源文件,则定义label 的源文件也被包含。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top