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

问:为什么在中断向量表中不直接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

另请参阅:

  • DCB

  • DCI

  • DCW 和 DCWU

  • DCQ 和 DCQU

  • SPACE 或 FILL

示例

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中的值。



你可能感兴趣的:(为什么在中断向量表中不直接LDR PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号)