微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编语言中的伪操作(一)

ARM汇编语言中的伪操作(一)

时间:11-11 来源:互联网 点击:
伪操作(derective)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.

符号定义( Symbol Definition )伪操作
符号定义伪操作用于定义 ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名。
包括以下伪操作:
— 用于声明全局变量 GBLA 、 GBLL 和 GBLS 。
— 用于声明局部变量 LCLA 、 LCLL 和 LCLS 。
— 用于对变量赋值 SETA 、 SETL 、 SETS 。
— 为通用寄存器列表定义名称 RLIST 。

—为协处理器的寄存器定义名称 CN
— 为协处理器定义名称 CP
— 为VFP的寄存器定义名称 DN、SN
— 为FPA的浮点寄存器定义名称 FN

1、 GBLA、GBLL 和GBLS
语法格式:
GBLA ( GBLL 或 GBLS ) 全局变量名
GBLA 、 GBLL 和 GBLS 伪操作用于声明一个 ARM 程序中的全局变量,并将其初始化。其中:
GBLA 伪操作用于声明一个全局的算术变量,并初始化为 0 ;
GBLL 伪操作用于声明一个全局的逻辑变量,并初始化为 {FALSE};
GBLS 伪操作用于声明一个全局的字符串变量,并初始化为空串;
全局变量名在其作用范围内必须唯一。 如果用这些伪操作重新声明已经声明过的变量,则变量的值将 被初始化成后一次声明语句中的值。
使用示例:
GBLA Test1 ;声明一个全局的算术变量,变量名为 Test1
Test1 SETA 0xaa ;将该变量赋值为 0xaa
SPACE Test1 ;引用该变量

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 伪操作用于声明一个局部的逻辑变量,并初始化为 {FALSE};
LCLS 伪操作用于声明一个局部的字符串变量,并初始化为空串;
使用示例:
MACRO ;声明一个宏

$label message $a ;宏的原型

LCLS err ;声明一个局部串变量err

err SETS “error no: “ ;向该变量赋值

$label ;代码

INFO 0, “err”:CC: :STR: $a ;使用该串变量

MEND ;宏定义结束

3、 SETA、SETL 和SETS
语法格式:
变量名 SETA ( SETL 或 SETS ) 表达式
伪操作 SETA 、 SETL 、 SETS 用于给一个ARM程序中的变量赋值。
SETA 伪操作用于给一个算术变量赋值;
SETL 伪操作用于给一个逻辑变量赋值;
SETS 伪操作用于给一个字符串变量赋值;
其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。 在向变量赋值前,必须先声明该变量。

4 、 RLIST
语法格式:
名称 RLIST { 寄存器列表 }
RLIST 伪操作用于对一个通用寄存器列表定义名称,定义的名称可在LDM/STM指令中使用。在 LDM/STM 指令中,寄存器列表中的寄存器的访问次序总是先访问编号较低的寄存器,再访问编号较高的寄存器,而不管寄存器列表中各寄存器的排列顺序。

使用示例:
RegList RLIST {R0-R5 , R8 , R10} ;将寄存器列表名称定义为 RegList ,可在 ARM 指令 LDM/STM中通过该名称访问寄存器列表。

5 、 CN

语法格式:

name CN expr

其中:name 是该寄存器的名称

expr为协处理器的寄存器的编号,数值范围为0~15。

CN伪操作用于给一个协处理器的寄存器定义名称。方便程序员记忆该寄存器的功能

示例

Power CN 6 ;将协处理器的寄存器6名称定义为Power

注:以下的伪操作类似(可参考CN)

数据定义( Data Definition )伪操作
数据定义伪操作包括以下伪操作:

LTORG 声明一个数据缓冲池的开始;

MAP 定义一个结构化的内存表首地址;

FIELD 定义结构化的内存表中的一个数据域;

SPACE 分配一块内存单元,并用0初始化;

DCB 分配一段字节的内存单元,并用指定的数据初始化;

DCD及DCDU 分配一段字的内存单元,并用指定的数据初始化;

DCDO 分配一段字的内存单元,并将每个单元的内容初始化成该单元相对于基态值的寄存器的偏移量;

DCFD及DCFDU 分配一段双字的内存单元,并用双精度的浮点数据初始化;

DCFS及DCFSU 分配一段字的内存单元, 并用单精度的浮点数据初始化;

DCI 分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放

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

网站地图

Top