微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编程序设计之:ARM汇编器所支持的伪操作

ARM汇编程序设计之:ARM汇编器所支持的伪操作

时间:09-30 来源:互联网 点击:

ARM源程序文件(即源文件)有特定的文件格式和语法规则,可以使用任意文本编辑器编写程序代码。一般地,ARM源程序文件名的后缀如表10.1所示。

表10.1 ARM源程序文件名后缀

程序

文件名

汇编

*.S

引入文件

*.INC

C程序

*.C

头文件

*.H

在一个项目中,至少要有一个汇编源文件,可以有多个汇编源文件或多个C程序,或者C程序文件和汇编文件两者的组合。

ARM汇编语言语句格式如下所示。

{label}{instruction/directive/pseudo-instruction}{;comment}

注意

所有指令均不能顶格写,要用空格(space)或TAB开头。

其中instruction即ARM指令集中的汇编指令。Directive为ARM汇编器所支持的伪操作。pseudo-instruction为ARM汇编器所支持的伪操作。下面章节分别介绍伪操作和伪指令。

10.1ARM汇编器所支持的伪操作

在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive),它们所完成的操作称为伪操作。伪操作在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。

在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作、宏指令等。

10.1.1符号定义(SymbolDefinition)伪操作

符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。

·用于定义全局变量的GBLA、GBLL和GBLS。

·用于定义局部变量的LCLA、LCLL和LCLS。

·用于对变量赋值的SETA、SETL、SETS。

·为通用寄存器列表定义名称的RLIST。

·为协处理器寄存器定义别名的CN。

·为协处理器定义别名的CP。

·为VFP寄存器定义名称的DN和SN。

·为FPA浮点指针寄存器定义名称的FPA。

1.全局变量定义伪操作GBLA、GBLL和GBLS

(1)语法格式

GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量并将其初始化。其中:

GBLA伪操作用于定义一个全局的数字变量并初始化为0。

GBLL伪操作用于定义一个全局的逻辑变量并初始化为F(假)。

GBLS伪操作用于定义一个全局的字符串变量并初始化为空。

由于以上3条伪指令用于定义全局变量,因此在整个程序范围内变量名必须惟一。

语法格式如下。

gblx>variable>

①gblx>

取值为GBLA、GBLL、GBLS之一。

②variable>

定义的全局变量名,在其作用范围内必须惟一。全局变量的作用范围为包含该变量的源程序。

(2)使用说明

如果用这些伪操作重新声明已经声明过的变量,变量的值将被初始化成后一次声明语句中的值。

(3)示例

①使用伪操作声明全局变量。

GBLATest1 ;定义一个全局的数字变量,变量名为Test1

Test1SETA0xaa ;将该变量赋值为0xaa

GBLLTest2 ;定义一个全局的逻辑变量,变量名为Test2

Test2SETL{TRUE} ;将该变量赋值为真

GBLSTest3 ;定义一个全局的字符串变量,变量名为Test3

Test3SETSTesting ;将该变量赋值为“Testing”

②声明变量objectsize并设置其值为0xff,为“SPACE”操作做准备。

GBLAobjectsize

ObjectsizeSETAoxff

SPACEobjectsize

③下面的例子显示如何使用汇编命令设置变量的值。具体做法是使用“-pd”选项。

Armasm-pdobjectsizeSETAoxff-oobjectfilesourcefile

2.局部变量定义伪操作LCLA、LCLL和LCLS

(1)语法格式

LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。其中:

LCLA伪操作用于定义一个局部的数字变量并初始化为0。

LCLL伪操作用于定义一个局部的逻辑变量并初始化为F(假)。

LCLS伪操作用于定义一个局部的字符串变量并初始化为空。

以上三条伪操作用于声明局部变量,在其作用范围内变量名必须惟一。

语法格式如下。

lclx>variable>

①gblx>

取值为LCLA、LCLL、LCLS之一。

②variable>

所定义的局部变量名,在其作用范围内必须惟一。局部变量作用范围为包含该局部变量的宏。

(2)使用说明

如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始化成后一次声明语句中的值。

(3)示例

①使用伪操作声明局部变量。

LCLATest4 ;声明一个局部的数字变量,变量名为Test4

Test3SETA0xaa ;将该变量赋值为0xaa

LCLLTest5 ;声明一个局部的逻辑变量,变量名为Test5

Test4SETL{TRUE} ;将该变量赋值为真

LCLSTest6 ;定义一个局部的字符串变量,变量名为Test6

Test6SETSTesting ;将该变量赋值为“Testing”

②下面的例子定义一个宏

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

网站地图

Top