谁能解释下下面的代码是如何运行的(WINCE)?
WINCE 中断处理,在kernelStart的过程中通过程序将如下代码复制到ffff0000的位置.
VectorInstructions
ldr pc, [pc, #0x3E0-8] ; reset
ldr pc, [pc, #0x3E0-8] ; undefined instruction
ldr pc, [pc, #0x3E0-8] ; SVC
ldr pc, [pc, #0x3E0-8] ; Prefetch abort
ldr pc, [pc, #0x3E0-8] ; data abort
ldr pc, [pc, #0x3E0-8] ; unused vector location
ldr pc, [pc, #0x3E0-8] ; IRQ
ldr pc, [pc, #0x3E0-8] ; FIQ
VectorTable
DCD -1 ; reset
DCD UndefException ; undefined instruction
DCD SWIHandler ; SVC
DCD PrefetchAbort ; Prefetch abort
IF :DEF:ARMV4T :LOR: :DEF:ARMV4I
DCD OEMDataAbortHandler ; data abort
ELSE
DCD DataAbortHandler ; data abort
ENDIF
DCD -1 ; unused vector
DCD IRQHandler ; IRQ
DCD FIQHandler ; FIQ
1。这个VectorTable 怎么知道是放在0x3e0地址中的。
2。ldr pc, [pc, #0x3E0-8] 如何理解这条指令。
3。是如何复制到0xffff0000地址上的。
[解决办法]
我觉得
1,由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。所以ldr pc, [pc, #0x3E0-8]的意思是pc加上#0x3E0处存放着一个地址值,程序跳转到这个地址值。
2,VectorTable 为VectorInstructions + 0x3e0,“ldr pc, [pc, #0x3E0-8]”指令里偏移为0x3E0,正好对应。
3,如何复制到0xffff0000地址上。知道了内核存放8条“ldr pc, [pc, #0x3E0-8]”指令的地址(源地址),又知道VectorInstructions的地址0xffff0000(目标地址),那么复制就行了。
[解决办法]
http://blog.csdn.net/ymzhou117/archive/2010/04/24/5525028.aspx