首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

请问关于EBOOT

2012-03-14 
请教关于EBOOT请问:ALIGNINITMMU *****************************************************************L

请教关于EBOOT
请问:
ALIGN
INITMMU

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

addr0, pc, #OEMAddressTable-(.+8); (r0) = OEMAddressTable phys addr *DO NOT DESTROY THIS VALUE
movr11, 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伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。


所以微软使用add r0, pc, #OEMAddressTable-(.+8)的办法有时候未必没有道理的。


所以有人这样写LDR r0, =g_oalAddressTable

还有个问题 LDR r0, =g_oalAddressTable 和LDR r0, g_oalAddressTable差别在哪里,查了资料但是还是很迷糊


[解决办法]
探讨
引用:

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


所以有人这样写LDR r0, =g_oalAddressTable

还有个问题 LDR r0, =g_oalAddressTable 和LDR r0, g_oalAddressTable差别在哪里,查了资料但是还是很迷糊

[解决办法]
探讨
引用:

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


所以有人这样写LDR r0, =g_oalAddressTable

还有个问题 LDR r0, =g_oalAddressTable 和LDR r0, g_oalAddressTable差别在哪里,查了资料但是还是很迷糊

[解决办法]
这个贴子加精了。
[解决办法]
学习一下
[解决办法]
arm7是基于三级流水线指令,因此pc相对偏移地址是2个word,即8的缘故。
[解决办法]
装载OEMAddressTable的地址到r0,由于流水线的原因(arm9为5级流水线:取指,译码,执行,存储器访问,写回),pc所指位置是当前执行指令的下两条(即取指),所以.+8. 其中这个“.”是当前执行语句的地址。
至于为什么要写成这个样子,上次也讨论过,也没讨论出个啥,有人说因为不能直接赋值,所以要借助PC的相对位置来赋值。

OEMAddressTable可以理解为一个数组的首地址,这个数组就是虚实地址的映射表,数组的每个元素有3个字段。
它的地址当然是实地址了,这个时候代码中startup中执行,并没有打开MMU,其中的操作都是对应的物理地址,所以当然是物理地址。
这样的操作一般是得到OEMAddressTable这个数组的首地址,然后再把这个数组拷贝到某个地方。

上次也讨论了,为啥没加精呢?感觉最近推荐的帖子好多,难道2009版主也勤奋了?
[解决办法]
探讨
感谢各位!

引用:
前面的问题在此论坛上讨论过,有明确的结果,说明你看贴还不够认真
后面的问题,OEMAddressTable里面既有物理地址也有虚拟地址,你没有看过吗?
里面是物理地址映射虚拟地址的一个表,不知道你这问题是怎么问出来的?

没看懂你说的什么

热点排行