DCD 伪指令解析

arm 核心篇 同时被 2 个专栏收录
31 篇文章 2 订阅
29 篇文章 1 订阅
原文地址:关于汇编ARM指令DCD 作者:晓喻

数据定义( DataDefinition )伪指令

数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。

DCD DCDU用于分配一片连续的字存储单元并用指定的数据初始化。

3、 DCD(或DCDU)

语法格式:

标号 DCD (或 DCDU 表达式

DCD (或 DCDU )伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。 DCD 也可用& 代替。

DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。

使用示例:

DataTest DCD 4 5 6 ;分配一片连续的字存储单元并初始化。

举例1:

SwiFunction
DCD TASK_SW ;0
DCD ENTER_CRITICAL ;1
DCD EXIT_CRITICAL ;2
DCD ISRBegin ;3
DCD ChangeToSYSMode ;4
DCD ChangeToUSRMode ;5
DCD __OSStartHighRdy ;6
DCD TaskIsARM ;7
DCD TaskIsTHUMB ;8
DCD OSISRNeedSwap ;9
DCD GetOSFunctionAddr ;10
DCD GetUsrFunctionAddr ;11

TASK_SW
MRS R3, SPSR ;保存任务的
CPSR

MOV R2, LR ;保存任务的PC

举例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

 

  • 2
    点赞
  • 1
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值