当前位置: 代码迷 >> WinCE >> 请问关于EBOOT
  详细解决方案

请问关于EBOOT

热度:144   发布时间:2016-04-28 13:43:16.0
请教关于EBOOT
请问:
ALIGN
INITMMU

; *****************************************************************
; Load RVA of OEMAddressTable[]
;

add r0, pc, #OEMAddressTable-(.+8) ; (r0) = OEMAddressTable phys addr *DO NOT DESTROY THIS VALUE
mov r11, r0 ; (r11) = &MemoryMap (save pointer for later)
请问这句话的详细意思是什么呢??
特别是-(.+8)
谢谢各位

------解决方案--------------------
这是ARM流水线。
如果add r0, pc, #OEMAddressTable
那么PC会得到OEMAddressTable+8的指令的地址。
为了符合实际,就要减回来
add r0, pc, #OEMAddressTable-(.+8)
------解决方案--------------------
探讨

thank u!
现在你很牛很强大!

------解决方案--------------------
前面的问题在此论坛上讨论过,有明确的结果,说明你看贴还不够认真
后面的问题,OEMAddressTable里面既有物理地址也有虚拟地址,你没有看过吗?
里面是物理地址映射虚拟地址的一个表,不知道你这问题是怎么问出来的?
------解决方案--------------------
我的理解是:
1、OEMAddressTable是虚拟地址还是物理地址取决与PC的地址
2、OEMAddressTable是相对地址还是绝对地址取决于他的使用方式
3、MMU没被打开
4、这样些是PIC规范,并不是PC的数值+ OEMAddressTable的绝对地址,而是PC加上到OEMAddressTable的偏移量,就是相当于取OEMAddressTable标号的地址 
5、OEMAddressTable是一个标号,取标号的地址到寄存器有两种方法
LDR r0, [pc, #OEMAddressTable-(.+8)]
LDR r0, =OEMAddressTable
------解决方案--------------------
标号地址的问题我也迷糊,不知道我的理解对不对,

这个帖子和http://topic.csdn.net/u/20081023/12/32e215de-ddf3-4fbe-8992-a4384ce0c3ec.html 这个帖子一脉相承
从 StartUp 到 KernelStart
------解决方案--------------------
C:\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s
楼主看看这个代码就知道是怎么回事了。
------解决方案--------------------
从OEMAddressTable出现地方,它是物理地址的。不知道是否因为在它编译的时候这个MMU都没有打开,这个东西的确有点奇怪的。
我发现是否是虚拟地址一般就会扯上MMU,只要一开MMU,立刻就是虚拟地址了。不知道这个微软的编译器是怎么做的?但是看了代码,事实就是这样——是否是虚拟地址和MMU是否开启有关,这个我有点纳闷。编译器真的可以这样弄的吗?
欢迎来讨论,不知道我的理解是否正确。

------解决方案--------------------
这是一条伪指令,作用是把OEMAddressTable的地址加载到r0。比较难理解的是(.+8)这个表达式。.其实代表当前指令的地址。比如说这条指令:
LABEL1
LDR R0, .
作用是把LABEL1的地址加载到R0中。
这里还要知道一点ARM架构的特点,一条指令从加载到执行主要分为预取、译码、执行三个阶段。执行add r0, pc, #OEMAddressTable-(.+8)时,pc寄存器的值实际上指向下下条指令。另一方面,.是在MS的ARM编译器在预处理时决定的,它的值为当前指令的地址,因此有恒等式.+8=pc。
明白了这两点,这条指令就很容易理解了:
r0 = pc+OEMAddressTable-(.+8) = OEMAddressTable + (pc-(.+8)) = OEMAddressTable

搞得这么复杂,其实有一条更简单更好理解的指令和它等价:
adr r0, OEMAddressTable
微软有时候尽干傻事,简单的事情非要复杂化。
------解决方案--------------------
ADR是一条伪指令,汇编器汇编时也会尝试用ADD或SUB指令来构造这个地址,如果构造地址失败就产生一个Error
MS这样写只是少转了一次弯
------解决方案--------------------
这条指令不管是虚拟地址还是物理地址都可以工作,因为OEMAddressTable的地址是根据PC寄存器算出来的。这里面包含两个假设,即运行时如果PC寄存器是物理地址则OEMAddressTable也是物理地址;如果PC是虚拟地址则OEMAddressTable也是虚拟地址。而编译时OEMAddressTable使用物理地址还是虚拟地址其实是无关紧要的,因为OEMAddressTable和.一减就只剩下偏移量了。
------解决方案--------------------
探讨
ADR是一条伪指令,汇编器汇编时也会尝试用ADD或SUB指令来构造这个地址,如果构造地址失败就产生一个Error
MS这样写只是少转了一次弯

------解决方案--------------------
探讨

这个ADR伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。
所以微软使用add r0, pc, #OEMAddressTable-(.+8)的办法有时候未必没有道理的。

------解决方案--------------------
探讨
引用:

这个ADR伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。