您的位置 首页 基础

ARM汇编伪指令详解(2)

字(Word):在ARM体系结构中,字的长度为32位,而在8位16位处理器体系结构中,字的长度一般为16位。半字(Half-Word):在ARM体系结构中

字(Word):在ARM体系结构中,字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位。

半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度共同。
字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位。

***********************************************************************************************

在 ARM 汇编言语程序里,有一些特别指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,一般称这些特别指令助记符为伪指令,他们所完结的操作称为伪操作。伪指令在源程序中的效果是为完结汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起效果,一旦汇编完毕,伪指令的任务就完结。
在 ARM 的汇编程序中,有如下几种伪指令:符号界说伪指令、数据界说伪指令、汇编操控伪指令、宏指令以及其他伪指令。

符号界说( Symbol Definition )伪指令
符号界说伪指令用于界说 ARM 汇编程序中的变量、对变量赋值以及界说寄存器的别号等操作。
常见的符号界说伪指令有如下几种:
— 用于界说大局变量的 GBLA 、 GBLL 和 GBLS 。
— 用于界说部分变量的 LCLA 、 LCLL 和 LCLS 。
— 用于对变量赋值的 SETA 、 SETL 、 SETS 。
— 为通用寄存器列表界说称号的 RLIST 。
1、 GBLA、GBLL 和GBLS
语法格局:
GBLA ( GBLL 或 GBLS )大局变量名
GBLA 、 GBLL 和 GBLS 伪指令用于界说一个 ARM 程序中的大局变量,并将其初始化。其间:
GBLA 伪指令用于界说一个大局的数字变量,并初始化为 0 ;
GBLL 伪指令用于界说一个大局的逻辑变量,并初始化为 F (假);
GBLS 伪指令用于界说一个大局的字符串变量,并初始化为空;
因为以上三条伪指令用于界说大局变量,因此在整个程序范围内变量名有必要仅有。
运用示例:
GBLA Test1 ;界说一个大局的数字变量,变量名为 Test1
Test1 SETA 0xaa ;将该变量赋值为 0xaa
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 伪指令用于界说一个部分的逻辑变量,并初始化为 F (假);
LCLS 伪指令用于界说一个部分的字符串变量,并初始化为空;
以上三条伪指令用于声明部分变量,在其效果范围内变量名有必要仅有。
运用示例:
LCLA Test4 ;声明一个部分的数字变量,变量名为 Test4
Test4 SETA 0xaa ;将该变量赋值为 0xaa
LCLL Test5 ;声明一个部分的逻辑变量,变量名为 Test5
Test5 SETL {TRUE} ;将该变量赋值为真
LCLS Test6 ;界说一个部分的字符串变量,变量名为 Test6
Test6 SETS “ Testing ” ;将该变量赋值为 “ Testing ”

3、 SETA、SETL 和SETS
语法格局:
变量名 SETA ( SETL 或 SETS )表达式
伪指令 SETA 、 SETL 、 SETS 用于给一个现已界说的大局变量或部分变量赋值。
SETA 伪指令用于给一个数学变量赋值;
SETL 伪指令用于给一个逻辑变量赋值;
SETS 伪指令用于给一个字符串变量赋值;
其间,变量名为现已界说过的大局变量或部分变量,表达式为即将赋给变量的值。
运用示例:
LCLA Test3 ;声明一个部分的数字变量,变量名为 Test3
Test3 SETA 0xaa ;将该变量赋值为 0xaa
LCLL Test4 ;声明一个部分的逻辑变量,变量名为 Test4
Test4 SETL {TRUE} ;将该变量赋值为真

4 、 RLIST
语法格局:
称号 RLIST { 寄存器列表 }
RLIST 伪指令可用于对一个通用寄存器列表界说称号,运用该伪指令界说的称号可在 ARM 指令LDM/STM 中运用。在 LDM/STM 指令中,列表中的寄存器拜访次第为依据寄存器的编号由低到高,而与列表中的寄存器摆放次第无关。
运用示例:
RegList RLIST {R0-R5 , R8 , R10} ;将寄存器列表称号界说为 RegList ,可在 ARM 指令

LDM/STM中经过该称号拜访寄存器列表。

数据界说( Data Definition )伪指令
数据界说伪指令一般用于为特定的数据分配存储单元,一起可完结已分配存储单元的初始化。
常见的数据界说伪指令有如下几种:
DCB 用于分配一片接连的字节存储单元并用指定的数据初始化。
DCW ( DCWU )用于分配一片接连的半字存储单元并用指定的数据初始化。
DCD ( DCDU )用于分配一片接连的字存储单元并用指定的数据初始化。
— DCFD ( DCFDU )用于为双精度的浮点数分配一片接连的字存储单元并用指定的数据初始
化。
— DCFS ( DCFSU )用于为单精度的浮点数分配一片接连的字存储单元并用指定的数据初
始化。
— DCQ ( DCQU ) 用于分配一片以 8 字节为单位的接连的存储单元并用指定的数据初始
化。
— SPACE 用于分配一片接连的存储单元
— MAP 用于界说一个结构化的内存表首地址
— FIELD 用于界说一个结构化的内存表的数据域

1、 DCB
语法格局:
标号 DCB 表达式
DCB 伪指令用于分配一片接连的字节存储单元并用伪指令中指定的表达式初始化。其间,表达式可认为

0 ~ 255 的数字或字符串。 DCB 也可用 “ = ” 替代。
运用示例:
Str DCB “ This is a test ! ” ;分配一片接连的字节存储单元并初始化。

2、 DCW(或DCWU)
语法格局:
标号 DCW (或 DCWU )表达式
DCW (或 DCWU )伪指令用于分配一片接连的半字存储单元并用伪指令中指定的表达式初始化。
其间,表达式可认为程序标号或数字表达式。。
用 DCW 分配的字存储单元是半字对齐的,而用DCWU 分配的字存储单元并不严厉半字对齐。
运用示例:
DataTest DCW 1 , 2 , 3 ;分配一片接连的半字存储单元并初始化。

3、 DCD(或DCDU)
语法格局:
标号 DCD (或 DCDU )表达式
DCD (或 DCDU )伪指令用于分配一片接连的字存储单元并用伪指令中指定的表达式初始化。其间,表

达式可认为程序标号或数字表达式。 DCD 也可用 “ & ” 替代。
用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严厉字对齐。
运用示例:
DataTest DCD 4 , 5 , 6 ;分配一片接连的字存储单元并初始化。

4、 DCFD(或DCFDU)
语法格局:
标号 DCFD (或 DCFDU )表达式
DCFD (或 DCFDU )伪指令用于为双精度的浮点数分配一片接连的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占有两个字单元。用 DCFD 分配的字存储单元是字对齐的,而用 DCFDU 分配的字存储单元并不严厉字对齐。
运用示例:
FDataTest DCFD 2E115 , -5E7 ;分配一片接连的字存储单元并初始化为指定的双精度数。

5、 DCFS(或DCFSU)
语法格局:
标号 DCFS (或 DCFSU )表达式
DCFS (或 DCFSU )伪指令用于为单精度的浮点数分配一片接连的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占有一个字单元。用 DCFS 分配的字存储单元是字对齐的,而用 DCFSU 分配的字存储单元并不严厉字对齐。
运用示例:
FDataTest DCFS 2E5 , -5E - 7 ;分配一片接连的字存储单元并初始化为指定的单精度数。

6、 DCQ(或DCQU)
语法格局:
标号 DCQ (或 DCQU )表达式
DCQ (或 DCQU )伪指令用于分配一片以 8 个字节为单位的接连存储区域并用伪指令中指定的表达式

初始化。
用 DCQ 分配的存储单元是字对齐的,而用 DCQU 分配的存储单元并不严厉字对齐。
运用示例:
DataTest DCQ 100 ;分配一片接连的存储单元并初始化为指定的值。

7、 SPACE
语法格局:
标号 SPACE 表达式
SPACE 伪指令用于分配一片接连的存储区域并初始化为 0 。其间,表达式为要分配的字节数。
SPACE 也可用 “ % ” 替代。
运用示例:
DataSpace SPACE 100 ;分配接连 100 字节的存储单元并初始化为 0 。

8、 MAP
语法格局:
MAP 表达式 { ,基址寄存器 }
MAP 伪指令用于界说一个结构化的内存表的首地址。 MAP 也可用 “ ^ ” 替代。
表达式可认为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。
MAP 伪指令一般与 FIELD 伪指令合作运用来界说结构化的内存表。
运用示例:
MAP 0x100 , R0 ;界说结构化内存表首地址的值为 0x100 + R0 。

9、 FILED
语法格局:
标号 FIELD 表达式
FIELD 伪指令用于界说一个结构化内存表中的数据域。 FILED 也可用 “ # ” 替代。
表达式的值为当时数据域在内存表中所占的字节数。
FIELD 伪指令常与 MAP 伪指令合作运用来界说结构化的内存表。 MAP 伪指令界说内存表的首地址,FIELD 伪指令界说内存表中的各个数据域,并可认为每个数据域指定一个标号供其他的指令引证。
留意 MAP 和 FIELD 伪指令仅用于界说数据结构,并不实践分配存储单元。
运用示例:
MAP 0x100 ;界说结构化内存表首地址的值为 0x100 。
A FIELD 16 ;界说 A 的长度为 16 字节,方位为 0x100
B FIELD 32 ;界说 B 的长度为 32 字节,方位为 0x110
S FIELD 256 ;界说 S 的长度为 256 字节,方位为 0x130

**********************************************************************************

DCB 可用 “ = ” 替代

DCD 可用 “ & ” 替代

SPACE 也可用 “ % ” 替代

MAP 也可用 “ ^ ” 替代

FILED 也可用 “ # ” 替代

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/263168.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部