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

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

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

的是代码,而不是数据;

DCQ及DCQU 分配一段双字的内存单元,并用64位的整数数据初始化;

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

DATA 在代码段中使用数据(现在已不再使用,仅用于保持向前兼容)。

以下主要介绍几种常用的:
1、 DCB (“ = ”)
语法格式:
标号 DCB 表达式
用于分配一段字节内存单元并用伪操作中指定的表达式初始化。其中,表达式可以为 -128~ 255 的数值或字符串。
使用示例:
Str DCB “ This is a test ! ” ;分配一片连续的字节存储单元并初始化。

2、DCD “ &”(或DCDU)
语法格式:
标号 DCD (或 DCDU ) 表达式
用于分配一段字内存单元并用伪操作中指定的表达式初始化。其中,表达式可以为程序中的标号或数字表达式。

用DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。
使用示例:
DataTest DCD 4,5,6 ;其值分别为4,5和6。
data2 DCD memaddr+4 ;分配一个字单元,其值为程序中标号memaddr加4个字节
3、DCQ(或DCQU)
语法格式:
标号 DCQ (或 DCQU ) 表达式
用于分配一段以8个字节为单位的内存并用伪操作中指定的表达式初始化。
用 DCQ 分配的存储单元是字对齐的,而用 DCQU 分配的存储单元并不严格字对齐。
使用示例:
DataTest DCQ -255,2_101 ;2_101指的是二进制的101

4、 SPACE (“ % ”)
语法格式:
标号 SPACE 表达式
用于分配一块内存单元,并初始化为 0 。其中,表达式为要分配的字节数。
使用示例:
DataSpace SPACE 100 ;分配连续 100 字节的存储单元并初始化为 0 。

5、 MAP (“ ^ ”)
语法格式:
MAP 表达式 { ,基址寄存器 }
用于定义一个结构化的内存表的首地址。
表达式可以为程序中的标号或数字表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。
MAP 伪操作通常与 FIELD 伪操作配合使用来定义结构化的内存表。
使用示例:
MAP 0x100 , R9;定义结构化内存表首地址的值为 0x100 + R9 。

6、 FILED (“ # ” )
语法格式:
标号 FIELD 表达式
用于定义一个结构化内存表中的数据域。
表达式的值为当前数据域在内存表中所占的字节数。
FIELD 伪操作常与 MAP 伪操作配合使用来定义结构化的内存表结构。 MAP 伪操作定义内存表的首地址, FIELD 伪操作定义内存表中的各数据域的字节长度,并可以为每个数据域指定一个标号供其他的指令引用。
注意 MAP 和 FIELD 伪操作仅用于定义数据结构,并不实际分配存储单元。
示例1:
下面的伪操作序列定义一个内存表,其首地址为固定地址4096,该内存表中包括5个数据域:consta长度为4个字节;constb长度为4个字节;x长度为8个字节;y长度为8个字节;string长度为256个字节。这种内存表称为基于绝对地址的内存表。

MAP 4096 ;内存表的首地址为4096(0x1000)

consta FIELD 4 ;consta长度为4个字节,相对位置为0

constb FIELD 4 ;constb长度为4个字节,相对位置为5000

x FIELD 8 ;x长度为4个字节,相对位置为5004

y FIELD 8 ;y长度为4个字节,相对位置为5012

string FIELD 256 ;string长度为256字节,相对位置为5020

;在指令中可以这样引用内存表中的数据域:

LDR R6,consta

上面的指令仅仅可以访问LDR指令前面(或后面)4KB地址范围的数据域

示例2:

下面的伪操作序列定义一个内存表,其首地址为0,该内存表中包括5个数据域:consta长度为4个字节;constb长度为4个字节;x长度为8个字节;y长度为8个字节;string长度为256个字节。这种内存表称为基于相对地址的内存表。

MAP 4096 ;内存表的首地址为0

consta FIELD 4 ;consta长度为4个字节,相对位置为0

constb FIELD 4 ;constb长度为4个字节,相对位置为4

x FIELD 8 ;x长度为4个字节,相对位置为8

y FIELD 8 ;y长度为4个字节,相对位置为16

string FIELD 256 ;string长度为256字节,相对位置为24

;可以通过下面的指令方便地访问地址范围超过4KB的数据

MOV R9,#4096

LDR R5,[R9,constb] ;将内存表中数据域constb读取到R5中

在这里,内存表中各数据域的实际内存地址不是基于一个固定地址,而是基于LDR指令执行时R9寄存器中的内容。这样通过上面方法定义的内存表结构可以在程序中有多个实例(通过在LDR指令中指定不同的基址寄存器值来实现)。通常用R9作为静态基址寄存器。

7、LTORG

用于声明一个数据缓冲池(literal pool)的开始

通常ARM汇编编译

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

网站地图

Top