标号 DCW(或DCWU)表达式
DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪操作中指定的表达式初始化。其中,表达式可以为程序标号或数值表达式。用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格按照半字对齐。
标号 DCD(或DCDU)表达式
DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪操作中指定的表达式初始化。
其表达式可以为程序标号或数值表达式。DCD也可用“&”代替。用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格按照字对齐。
Str DCB “This is a test!”
;分配一片连续的字节存储单元并初始化。
DataTest DCW 1,2,3
;分配一片连续的半字存储单元并初始化。
DataTest DCD 4,5,6
;分配一片连续的字存储单元并初始化。
标号 DCFD (或 DCFDU ) 表达式
DCFD (或 DCFDU )伪操作用于为双精度的浮点数分配一片连续的字存储单元并用伪操作中指定的表达式初始化。每个双精度的浮点数占据两个字单元
FDataTest DCFD 2E115 , -5E7 ;分配一片连续的字存储单元并初始化为指定的双精度数。
标号 DCFS (或 DCFSU ) 表达式
DCFS (或 DCFSU )伪操作用于为单精度的浮点数分配一片连续的字存储单元并用伪操作中指定的表达式初始化。每个单精度的浮点数占据一个字单元。
标号 DCQ (或 DCQU ) 表达式
DCQ (或 DCQU )伪操作用于分配一片以 8 个字节为单位的连续存储区域并用伪操作中指定的表达式初始化。
DataTest DCQ 100 ;分配一片连续的存储单元并初始化为指定的值。
标号 SPACE 表达式
SPACE 伪指令用于分配一片连续的存储区域并初始化为 0 。其中,表达式为要分配的字节数。
SPACE 也可用 “ % ” 代替。
DataSpace SPACE 100 ;分配连续 100 字节的存储单元并初始化为 0
MAP 表达式 { ,基址寄存器 }
MAP 伪指令用于定义一个结构化的内存表的首地址。 MAP 也可用 “ ^ ” 代替。
表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。
MAP 伪操作通常与 FIELD 伪指令配合使用来定义结构化的内存表。
MAP 0x100 , R0 ;定义结构化内存表首地址的值为 0x100 + R0 。
标号 FIELD 表达式
FIELD 伪指令用于定义一个结构化内存表中的数据域。 FILED 也可用 “ # ” 代替。
表达式的值为当前数据域在内存表中所占的字节数。
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
LTORG用于声明一个数据缓冲池(也称为文字池)的开始。在使用伪操作LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池。
LTORG
当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生可以使用LTORG伪操作定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一个代码段开始之前,或者END伪操作之前。
【例】显示定义文字池示例
AREA Example ,CODE,READONLY; //声明一个代码段,名称为Example,属性为只读
Start BL funcl
;code
funcl //子程序
;code
LDR R1,=0x800 //将0X800加载到R1
MOV PC,lr //子程序结束
LTORG //定义数据缓冲池
data SPACE 40 //从当前开始分配40字节的内存单元并初始化为0
END //程序结束
0x800的值被编译器暂时放在了data[0-3]字段中。
参考文献:
孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.