当前位置: 技术问答>linux和unix
arm启动代码疑问(boot.S)
来源: 互联网 发布时间:2016-02-27
本文导语: .equ SOURCE, 0xDF003200 .equ TARGET, 0xC0003200 .global _start _start: .word 0xE59FF000 .word 0 .word ( _start2 - 4 ) .word 0 ...
.equ SOURCE, 0xDF003200
.equ TARGET, 0xC0003200
.global _start
_start:
.word 0xE59FF000
.word 0
.word ( _start2 - 4 )
.word 0
.word ( _start2 - 4 )
_loop1: b _loop1
nop
nop
nop
nop
nop
nop
nop
_start2:
ldr r1,=0x10000000
ldr r3,=0x00040304
str r3,[r1]
在_start: .word 0xE59FF000中的地址0xE59FF00是什么地址呀 为什么不是直接跳转到_start2:去执行呢?我在mx21 spec中没有找到0xE59FF00的含义
有谁知道 请指点!
.equ TARGET, 0xC0003200
.global _start
_start:
.word 0xE59FF000
.word 0
.word ( _start2 - 4 )
.word 0
.word ( _start2 - 4 )
_loop1: b _loop1
nop
nop
nop
nop
nop
nop
nop
_start2:
ldr r1,=0x10000000
ldr r3,=0x00040304
str r3,[r1]
在_start: .word 0xE59FF000中的地址0xE59FF00是什么地址呀 为什么不是直接跳转到_start2:去执行呢?我在mx21 spec中没有找到0xE59FF00的含义
有谁知道 请指点!
|
一点理解,不确定是否正确:
0xE59FF000 -- 根据ARM ARM中A5.2.2 Load and Store Word or Unsigned Byte - Immediate offset以及LDR指令的说明,应该就是
ldr pc, [pc, #0]
因为offset_12=0,在执行此指令时,用于赋值的PC实际上是 .word (_start2-4)处的地址(注意ARM上PC的值),因此上面的指令相当于将(_start2-4)赋值给PC,也即跳转到地址(_start2-4)处,_start2-4地址也即_start2前面的一个nop地址处,执行空指令后会继续执行_start2标号处开始的代码。
对i.MX21不了解,如果楼主方便用仿真器跟踪的话,看一看应该就很清楚了.
0xE59FF000 -- 根据ARM ARM中A5.2.2 Load and Store Word or Unsigned Byte - Immediate offset以及LDR指令的说明,应该就是
ldr pc, [pc, #0]
因为offset_12=0,在执行此指令时,用于赋值的PC实际上是 .word (_start2-4)处的地址(注意ARM上PC的值),因此上面的指令相当于将(_start2-4)赋值给PC,也即跳转到地址(_start2-4)处,_start2-4地址也即_start2前面的一个nop地址处,执行空指令后会继续执行_start2标号处开始的代码。
对i.MX21不了解,如果楼主方便用仿真器跟踪的话,看一看应该就很清楚了.
|
这问题我不懂.
顶一哈。哈哈。
你该知道我是谁!
顶一哈。哈哈。
你该知道我是谁!
|
.word 0xE59FF000
不一定是地址阿,也可能是机器指令什么的阿
不一定是地址阿,也可能是机器指令什么的阿
|
看上去像是调试器(ADS AXD?)用的格式,setmem的格式应该是:setmem addrexpr valexpr [memory]
简单的说是往某个地址(addrexpr)写入某个宽度([memory],应该只能为指定的size)的值(valexpr)。
comment的格式不太明白,不知是否: comment string,应该只是写到log中的信息。
最好查查所用的调试器的手册,应该在命令部分会有对应的介绍。
简单的说是往某个地址(addrexpr)写入某个宽度([memory],应该只能为指定的size)的值(valexpr)。
comment的格式不太明白,不知是否: comment string,应该只是写到log中的信息。
最好查查所用的调试器的手册,应该在命令部分会有对应的介绍。