为什么在中断向量表中不直接LDR PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号

3 篇文章 0 订阅
问:为什么在中断向量表中不直接LDR   PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号?                                                               

    答:因为LDR指令只能是跳到当前PC   4kB范围内,而B指令能跳转到32MB范围,而现在这样在     LDR  PC    ,"xxxx"这条指令不远处用"xxxx"  DCD        定义一个字,而这个字里面存放最终异常服务程序  的地址,这样可以实现4GB全范围跳转。


http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Babbfcga.html

DCD 指令可分配一个或多个字的内存,在四个字节的边界上对齐,并定义内存的运行时初值。

&DCD 的同义词

DCDU 与之相同,不过内存对齐是任意的。

语法
{label} DCD{U} expr{,expr}

其中:

expr

可以是:

  • 一个数值表达式(请参阅数字表达式)。

  • 一个程序相对的表达式。

用法

必要时,DCD 可在定义的第一个字前最多插入三个填充字节,以实现四字节对齐。

如果不需要对齐,则可使用 DCDU

另请参阅:

示例
data1   DCD     1,5,20      ; Defines 3 words containing
                            ; decimal values 1, 5, and 20
data2   DCD     mem06 + 4   ; Defines 1 word containing 4 +
                            ; the address of the label mem06
        AREA    MyData, DATA, READWRITE
        DCB     255         ; Now misaligned ...
data3   DCDU    1,5,20      ; Defines 3 words containing
                            ; 1, 5 and 20, not word aligned

最近在学习ARM的汇编,对于DCD伪指令有些问题。所有的文档上都说DCD是在内存中开一个32位的空间。

问题1:
   该空间的地址能够指定吗?如果不能指定,汇编器如何确定该空间的地址?

问题2:

代码
    RESET_ADDR    DCD     _reset_handler
    NMI_ADDR        DCD     _nmi_handler
    ....
    IRQ31_ADDR     DCD    _irq31_handler
代码二
    _Vector        
          DCD    _reset_handler
          DCD    _nmi_handler
          ...
          DCD    _irq31_handler

这2个代码有什么区别,分别适合哪种情况??

5楼:

指不指定俺也不知道,它的地址就是紧挨着上一条指令的地址之后的4个字节啊
问题二代码一与代码二没什么区别,代码一前面加了标号.


6楼:
自问自答一下,

1. 指定该地址空间的起始地址可以用分散加载,在link时指定分散加载文件 --scatter=file_name

2. 没啥区别,同5楼



arm 汇编,怎么找到dcd分配的内存地址? 

可以定义给dcd分配的时候定义一个标号,然后用ldr r0,=label,查看r0中的值。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值