数据定义(
数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。
—
3、
语法格式:
标号
DCD
用
使用示例:
DataTest
举例1:
SwiFunction
TASK_SW
举例2:
语句如下:
FiqStackSpace SPACE FIQ_Stack_Legth
FiqStack DCD FiqStackSpace + FIQ_Stack_Legth
最后一条语句,DCD的后面跟FiqStackSpace + FIQ_Stack_Legth,
DCD后面的FiqStackSpace,表示一串空字符,这好理解
但是再上FIQ_Stack_Legth,就不明白了,WHY?
FiqStackSpace是标号,相当与地址,实际上就是在FiqStackSpace SPACE FIQ_Stack_Legth 这个语句给分配的空间的首地址,FiqStackSpace+ FIQ_Stack_Legth 是这个地址空间的结束地址,将FiqStack指向这个地址,当做栈的顶部,该栈向下生长,长度FIQ_Stack_Legth
根据DCD伪指令的定义,{label} DCD expr
DCD用于分配一段字内存单元,并用伪指令中的expr初始化之,但我见到有的程序中expr是一个函数名,这是什么意思啊?
---------------------------------------------------------------------------------------------------------------------------------
DCD 用于分配一片连续的字存储单元并用指定的数据初始化
[语法格式]:标号 DCD 表达式
DCD伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。
用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。
[使用示例]:
DataTest DCD 4,5,6 ;分配一片连续的字存储单元并初始化
[expr可以是一个函数名]:
其实函数名,就是一函数的首地址,这样用函数的首地址来指定它,有点类似于C语言的#define
[类似的指令]:
DCB 预备一个字节(8 位值)
DCW 预备一个半字(16 位值)
DCD 预备一个字(32 位值)
DCS 按给出的字符串的要求预备直到 255 个的字符
===============================================
==================================================
下面摘自:http://moonsnow1002.blog.sohu.com/109905740.html
初学ARM,DCD指令给我留下了深刻印象,它的使用较为广泛,而且不易理解,现就对它做些小结:
在中断向量表中不直接LDR PC,"异常地址".而是使用一个标号,然后再在后面使用DCD定义这个标号,其原因是:
LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,而现在这样在LDR PC, "xxxx"这条指令不远处用"xxxx"DCD 定义一个字,而这
个字里面存放最终异常服务程序的地址,这样可以实现4GB 全范围跳转。
另:有如下语句
USR_STACK_LEGTH EQU 64 ;定义用户模式堆栈长度为64字
StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH-1)*4 ;定义一个字的空间,这个字的内容是一个递减堆栈的首地址
UsrStackSpace SPACE USR_STACK_LEGTH*4 ;为用户模式分配一个64字的堆栈空间,若这个堆栈做递减使用,则其首地址为
UsrStackSpace + (USR_STACK_LEGTH-1)*4