本帖最后由 LDTEST 于 2013-4-11 09:50 编辑
__main:
0x080000C0 F000F802 BL.W __scatterload (0x080000C8)
0x080000C4 F000F840 BL.W __rt_entry (0x08000148)
__scatterload:
0x080000C8 A00C ADR r0,{pc}+4 ; @0x080000FC
0x080000CA C830 LDM r0!,{r4-r5}
0x080000CC 3808 SUBS r0,r0,#0x08
0x080000CE 1824 ADDS r4,r4,r0
——————————————————————————————————————
0x080000C8 A00C ADR r0,{pc}+4 ; @0x080000FC
这一句中 A00C 结果确实是 0x080000FC
但是 ADR r0,{pc}+4 是怎么得到 这个结果的,求高手高手高高手 解释
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4.7 补充
0x080000C8 A00C ADR r0,{pc}+4 ; @0x080000FC
此时 pc=0x080000CC
A00C 的执行结果是 0x080000CC+ ExtendTo32(C:00) = 0x080000FC
这个没有问题
此时PC和 运算结果 差0x30 即 48
{pc}+4 这里 4 无论怎么想也不能和 48 挂上关系
另 官方手册中没有查到说明,MDK 中对于 +4 +8 +12 等 汇编后的指令也是不清不楚的,完全看不出来有任何关系
__scatterload 中 ADR r0,{pc}+4 是 A00C ,自己写的程序中 则是 A000, MDK问题?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4.11 结贴说明
ADR 貌似是 ARM-v6m 里加入的指令,之前貌似都是伪指令(也就是 小范围取值,没有查找 ARM7 ARM9 之类的资料,不能确定是不是只是伪指令)
此处问题应该是 MDK BUG,MDK直接在scatterload中使用的机器语言,因而编译正确,但是翻译成汇编出错
对比说明: IAR中同样指令 ,debug时汇编正常
修改hex文件中此命令,IAR debug正常,MDK debug 显示依然不正常
由于是 ARM-v6m 的指令,一般不会有 直接用PC作参数的,而且 机器指令正常,估计MDk没有注意到 汇编存在问题
|