当前位置: 代码迷 >> WinCE >> 哪位高手能解释下下面的代码是怎么运行的(WINCE)
  详细解决方案

哪位高手能解释下下面的代码是怎么运行的(WINCE)

热度:156   发布时间:2016-04-28 13:43:14.0
谁能解释下下面的代码是如何运行的(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
  相关解决方案