答:因为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
与之相同,不过内存对齐是任意的。
必要时,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个代码有什么区别,分别适合哪种情况??
指不指定俺也不知道,它的地址就是紧挨着上一条指令的地址之后的4个字节啊 问题二代码一与代码二没什么区别,代码一前面加了标号. |
自问自答一下, 1. 指定该地址空间的起始地址可以用分散加载,在link时指定分散加载文件 --scatter=file_name 2. 没啥区别,同5楼 |
可以定义给dcd分配的时候定义一个标号,然后用ldr r0,=label,查看r0中的值。