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

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

Test3SETS"Testing" ;将该变量赋值为“Testing”

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

GBLAobjectsize

ObjectsizeSETAoxff

SPACEobjectsize

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

Armasm-pd"objectsizeSETAoxff"-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

Test6SETS"Testing" ;将该变量赋值为“Testing”

②下面的例子定义一个宏,显示了局部变量的作用范围。

MACRO ;声明一个宏

$labelmessage$a ;宏原型

LCLSerr ;声明局部字符串变量

$label

INFO0,"err":CC::STR:$a

MEND ;宏结束,局部变量不再起作用

3.变量赋值伪操作SETA、SETL和SETS

(1)语法格式

伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。

SETA伪操作用于给一个数学变量赋值;

SETL伪操作用于给一个逻辑变量赋值;

SETS伪操作用于给一个字符串变量赋值;

语法格式如下。

Variable<setx>expr

①Variable

变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。

②<setx>

取值为SETA、SETL、SETS之一。

③expr

数学、逻辑或字符串表达式,也就是将要赋予变量的值。

(2)使用说明

在向变量赋值前必须先声明变量。

也可以在汇编指令中预定义变量,如:

"Armasm--pd"objectsizeSETAoxff"--oobjectfilesourcefile"

(3)示例

①为预先定义的变量赋值。

LCLATest3 ;声明一个局部的数字变量,变量名为Test3

Test3SETA0xaa ;将该变量赋值为0xaa

LCLLTest4 ;声明一个局部的逻辑变量,变量名为Test4

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

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

Test6SETS"Testing" ;将该变量赋值为“Testing”

②使用变量赋值伪操作,定义一些程序相关内容。

GBLAversionNumber

VersionNumber SETA21

GBLLDebug

Debug SETL{TRUE}

GBLS versionString

VersionString SETS"version1.0"

4.通用寄存器列表定义伪操作RLIST

(1)语法格式

RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序根据寄存器的编号由低到高,与列表中的寄存器排列次序无关。

语法格式如下。

NameRLIST{list-of-registers}

①Name

寄存器列表的名称。

注意

该名称不能和已经定义寄存器或协处理器名称相同。

②list-of-registers

通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可以用“-”指定寄存器范围。具体用法参见程序示例。

(2)使用说明

在使用ARM汇编编译器编译源文件时,可以使用“-checkreg”选项来指定汇编器进行寄存器检查。如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。

(3)示例

①将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。

RegListRLIST{R0-R5,R8,R10};

②使用“-”在寄存器列表中,指定寄存器范围。

ContextRLIST{r0-r6,r8,r10-r12,r15} ;

5.协处理器寄存器名称定义伪操作CN

(1)语法格式

CN伪操作为协处理器寄存器定义名称。

语法格式如下。

NameCNexpr

①Name

定义的协处理器寄存器的名称。

注意

该名称不能和已经定义寄存器或协处理器名称相同。

②expr

协处理器寄存器编号。

(2)使用说明

协处理器寄存器编号的数值范围为0~15。避免使用不同的名称定义同一物理寄存器。

注意

协处理器寄存器的名称不能被定义为c0~c15,这些名称已经被汇编器预定义。

(3)示例

将协处理器寄存器6命名为Power。

PowerCN6

6.协处理器名称定义伪操作CP

(1)语法格式

CP伪操作为指定的协处理器定义名称。

语法格式如下。

NameCPexpr

①Name

定义的协处理器名称。

注意

该名称不能和已经定义寄存器或其他协处理器名称相同。

②expr

协处理器编号。

(2)使用说明

协处理器编号范围为0~15。

使用CP伪操作为协处理器定义一个方便记忆的名称,可以使程序员更高效地编写代码。

注意

协处理器寄存器的称不能被定义为p0~p15,这些名称已经被汇编器预定义。

(3)示例

将协处理器6命名为Dmu。

DmuCP6

7.VFP寄存器名称定义伪操作DN/SN

(1)语法格式

DN伪操作为双精度(double-precision)VFP寄存器定义名称。D0~D15是汇编器预先定义的,用户不能使用。

SN伪操作为单精度(single-precision)VFP寄存器定义名称。S0~S31是汇编器预先定义的,用户不能使用。

语法格式如下。

NameDNexpr

NameSNexpr

①Name

指定的VFP寄存器的名称。

注意

该名称不能和已经定义寄存器或其他协处理器名称相同。

②expr

指定VFP寄存器编号。对于双精度寄存器编号范围为0~15;对于单精度寄存器编号范围为0~31。

(2)示例

①将VFP双精度寄存器6定义为energy。

energyDN6

②将VFP单精度寄存器16定义为mass。

massSN16

8.浮点寄存器名称定义伪操作FN

(1)语法格式

FN为一个FPA浮点寄存器定义名称。F0~F7是汇编器预先定义的,用户不能使用。

注意

FPA的使用在ARM公司新发布的编译器RVCT中已不再支持。

语法格式如下。

NameFNexpr

①Name

指定的浮点寄存器的名称。

注意

该名称不能和已经定义寄存器或其他协处理器名称相同。

②expr

指定浮点寄存器编号。编号范围为0~7。

(2)示例

为浮点寄存器6指定名称为Energy。

EnergyFN6

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭