链接地址和运行地址Word文档下载推荐.docx
《链接地址和运行地址Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《链接地址和运行地址Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
.global_start
_start:
bl
disable_watch_dog
@关闭WATCHDOG,否则CPU会不断重启
bl
memsetup
@设置存储控制器
copy_steppingstone_to_sdram
@复制代码到SDRAM中
ldrpc,=on_sdram
@跳到SDRAM中继续执行
on_sdram:
ldrsp,=0x34000000
@设置堆栈
main
halt_loop:
b
halt_loop
disable_watch_dog:
@往WATCHDOG寄存器写0即可
movr1,
#0x53000000
movr2,
#0x0
strr2,
[r1]
movpc,
lr
@返回
copy_steppingstone_to_sdram:
@将Steppingstone的4K数据全部复制到SDRAM中去
@Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
movr1,#0
ldrr2,=SDRAM_BASE
movr3,#4*1024
1:
ldrr4,[r1],#4
@从Steppingstone读取4字节的数据,并让源地址加4
strr4,[r2],#4
@将此4字节的数据复制到SDRAM中,并让目地地址加4
cmpr1,r3
@判断是否完成:
源地址等于Steppingstone的未地址?
bne1b
@若没有复制完,继续
memsetup:
@设置存储控制器以便使用SDRAM等外设
#MEM_CTL_BASE
@存储控制器的13个寄存器的开始地址
adrl
r2,mem_cfg_val
@这13个值的起始存储地址
addr3,
r1,#52
@13*4=54
ldrr4,
[r2],#4
@读取设置值,并让r2加4
strr4,
[r1],#4
@将此值写入寄存器,并让r1加4
cmpr1,
r3
@判断是否设置完所有13个寄存器
@若没有写成,继续
.align4
mem_cfg_val:
@存储控制器13个寄存器的设置值
.long
0x22011110
@BWSCON
0x00000700
@BANKCON0
@BANKCON1
@BANKCON2
@BANKCON3
@BANKCON4
@BANKCON5
0x00018005
@BANKCON6
@BANKCON7
0x008C07A3
@REFRESH
0x000000B1
@BANKSIZE
0x00000030
@MRSRB6
@MRSRB7
下面来看看反汇编代码
sdram_elf:
fileformatelf32-littlearm
Disassemblyofsection.text:
30000000<
_start>
:
30000000:
eb000005
3000001c<
disable_watch_dog>
30000004:
eb000010
3000004c<
memsetup>
30000008:
eb000007
3000002c<
copy_steppingstone_to_sdram>
3000000c:
e59ff090
ldr
pc,[pc,#144]
;
300000a4<
mem_cfg_val+0x34>
30000010<
on_sdram>
30000010:
e3a0d30d
mov
sp,#872415232
0x34000000
30000014:
eb000033
300000e8<
main>
30000018<
halt_loop>
30000018:
eafffffe
b
3000001c:
e3a01453
r1,#1392508928
0x53000000
30000020:
e3a02000
r2,#0
30000024:
e5812000
str
r2,[r1]
30000028:
e1a0f00e
pc,lr
3000002c:
e3a01000
r1,#0
30000030:
e3a02203
r2,#805306368
30000034:
e3a03a01
r3,#4096
0x1000
30000038:
e4914004
r4,[r1],#4
3000003c:
e4824004
r4,[r2],#4
30000040:
e1510003
cmp
r1,r3
30000044:
1afffffb
bne
30000038<
copy_steppingstone_to_sdram+0xc>
30000048:
3000004c:
e3a01312
r1,#1207959552
30000050:
e28f2018
add
r2,pc,#24
30000054:
e1a00000
nop
(movr0,r0)
30000058:
e2813034
r3,r1,#52
0x34
3000005c:
e4924004
30000060:
e4814004
30000064:
30000068:
3000005c<
memsetup+0x10>
3000006c:
30000070<
mem_cfg_val>
30000070:
22011110
andcs
r1,r1,#4
30000074:
00000700
andeq
r0,r0,r0,lsl#14
30000078:
3000007c:
30000080:
30000084:
30000088:
3000008c:
00018005
r8,r1,r5
30000090:
30000094:
008c07a3
addeq
r0,ip,r3,lsr#15
30000098:
000000b1
strheq
r0,[r0],-r1
3000009c:
00000030
r0,r0,r0,lsrr0
300000a0:
300000a4:
30000010
andcc
r0,r0,r0,lslr0
300000a8:
300000ac:
300000b0<
wait>
300000b0:
e52db004
push
{fp}
(strfp,[sp,#-4]!
)
300000b4:
e28db000
fp,sp,#0
300000b8:
e24dd00c
sub
sp,sp,#12
300000bc:
e50b0008
r0,[fp,#-8]
300000c0:
ea000002
300000d0<
wait+0x20>
300000c4:
e51b3008
r3,[fp,#-8]
300000c8:
e2433001
r3,r3,#1
300000cc:
e50b3008
300000d0:
300000d4:
e3530000
r3,#0
300000d8:
1afffff9
300000c4<
wait+0x14>
300000dc:
e28bd000
sp,fp,#0
300000e0:
e8bd0800
pop
{fp}
300000e4:
e12fff1e
bx
lr
300000e8:
e92d4800
{fp,lr}
300000ec:
e28db004
fp,sp,#4
300000f0:
e24dd008
sp,sp,#8
300000f4:
e3a03000
300000f8:
300000fc:
e59f3030
r3,[pc,#48]
30000134<
main+0x4c>
30000100:
e3a02b55
r2,#87040
0x15400
30000104:
e5832000
r2,[r3]
30000108:
e59f0028
r0,[pc,#40]
30000138<
main+0x50>
3000010c:
ebffffe7
30000110:
e59f3024
r3,[pc,#36]
3000013c<
main+0x54>
30000114:
30000118:
3000011c:
e59f0014
r0,[pc,#20]
30000120:
ebffffe2
30000124:
e59f3010
r3,[pc,#16]
30000128:
e3a02e1e
r2,#480
0x1e0
3000012c:
30000130:
eafffff4
30000108<
main+0x20>
30000134:
56000010
undefinedinstruction0x56000010
30000138:
00007530
r7,r0,r0,lsrr5
3000013c:
56000014
undefinedinstruction0x56000014
Disassemblyofsection.ARM.attributes:
00000000<
.ARM.attributes>
0:
00002541
r2,r0,r1,asr#10
4:
61656100
cmnvs
r5,r0,lsl#2
8:
01006962
tsteq
r0,r2,ror#18
c:
0000001b
r0,r0,fp,lslr0
10:
00543405
subseq
r3,r4,r5,lsl#8
14:
01080206
r8,r6,lsl#4
18:
04120109
ldreq
r0,[r2],#-265
0x109
1c:
01150114
r5,r4,lslr1
20:
01180317
r8,r7,lslr3
24:
Address0x00000024isoutofbounds.
Disassemblyofsection.comment:
.comment>
3a434347
bcc
10d0d24<
SDRAM_BASE-0x2ef2f2dc>
74632820
strbtvc
r2,[r3],#-2080
0x820
312d676e
teqcc
sp,lr,ror#14
312e362e
lr,lr,lsr#12
2e342029
cdpcs
0,3,cr2,cr4,cr9,{1}
00332e34
eorseq
r2,r3,r4,lsrlr
当我们从Nandflash启动时,硬件会自动将Nandflash前4kB代码拷贝到片内SRAM中,然后CPU从SRAM的0x00000000地址处开始执行程序。
在这里我想纠正一个错误的观点,网上很多人都说是CPU自动把Nandflash前4kB代码拷贝到片内SRAM中,其实不然,是Nandflash控制器完成的,这个过程中CPU根本就没有参与。
通过上面的Makefile文件,我们可以知道bl
这条指令的运行地址是0x30000000,但是它现在保存在SRAM的0x00000000的地址处,那么这条指令能够正确执行吗?
ofcourse,why?
因为这条指令
是位置无关码,虽然它的运行地址是在SDRAM中的0x30000000,但是它可以在Steppingstone中执行。
这条指令的功能是跳转到标号disable_watch_dog处执行,它是一个相对跳转,PC=当前PC的值+偏移量OFFSET。
其中当前PC的值等于下两条指令的地址,通过反汇编可以看到下两条指令的地址为0x00000008,而不是0x30000008.因为现在指令是保存在SRAM中。
这条指令的机器码为eb000005,将机器码低24位按符号位扩展成32位得到0x000000005.然后将0x00000005左移2位得到0x00000014。
这个值就是偏移量OFFSET=0X00000014。
所以PC=0X00000008+0X00000014=0X0000001c.那么CPU就会到SRAM中的0x0000001c地址处执行程序。
可以发现bl指令依赖当前PC的值,这个特性使得bl指令不依赖指令的运行地址。
所以接下来的blmensetup,blcope_steppingstone_to_sdram都能够执行。
接下来的ldrpc,=on_sdram是一条位置有关码,经过反汇编可以看到,它是当前pc的值+偏移量,得到一个地址Addr,然后从内存中的这个地址去取数据Data赋给pc。
现在我们计算一下Addr这个地址。
Addr=当前PC的值+144。
当前PC的值等于下两条指令的地址0x00000014,而不是0x30000014,因为现在程序是保存在SRAM中。
所以Addr=0x00000014+144=0x00000014+0x00000090=0x000000a4.那么这个地址0x000000a4中保存了什么数据。
通过反汇编可以看到SRAM中的0x000000a4这个地址保存的机器码为30000010,所以cpu会跳转到0x30000010这个地址处执行程序。
这个地址0x30000010
是在SDRAM中,这样程序就跳到SDRAM中去了。
因为我们前面的指令blcope_stepping_to_sdram已经把SRAM中4kB的程序拷贝到了SDRAM中,所以现在SDRAM中有程序了。
但是如果在程序的开头放置一条这样的指令:
ldrpc,=disable_watch_dog,那么整个程序就不能够正确执行了。
why?
我们先来看看启动代码
@*************************************************************************
@**