005_ARM裸机1期加强版(新1期)\第013课_代码重定位\第005节

    在学习韦东山嵌入式学习视频的005_ARM裸机1期加强版(新1期)\第013课_代码重定位\第005节,视频中老师把NOR flash中的代码拷贝到SDRAM中执行,但是跳转指令使用的是bl main,查资料得知bl是相对位移跳转指令,跳转到main后运行的还是NOR flash中的代码,但是老师之前讲过,NOR flash是只读的,为什么在串口调试时打印的全局变量是可以改变的呢?

    为了弄清楚这个问题,我查看了main程序的反汇编代码,例如在0x30000404的指令为加载0x30000490处的数据到r3,查看0x30000490处的数据为0x300004d0;下条指令的内容为ldr r0, [r3],也就是把0x300004d0处的数据加载到r0,查看0x300004d0的数据恰好是全局变量g_A,其他全局变量的访问与这个类似,即都是通过绝对地址来访问的。这就解释了为什么串口调试时这些全局变量为什么可以改变了,因为这些变量的地址已经处在SDRAM中了,而在程序开始运行的时候已经把整个程序从NOR中拷贝到了SDRAM中。

300003ec <main>:
300003ec:	e1a0c00d 	mov	ip, sp
300003f0:	e92dd800 	stmdb	sp!, {fp, ip, lr, pc}
300003f4:	e24cb004 	sub	fp, ip, #4	; 0x4
300003f8:	ebffff31 	bl	300000c4 <uart0_init>
300003fc:	e59f0088 	ldr	r0, [pc, #136]	; 3000048c <.text+0x48c>
30000400:	ebffff74 	bl	300001d8 <puts>
30000404:	e59f3084 	ldr	r3, [pc, #132]	; 30000490 <.text+0x490>
30000408:	e5930000 	ldr	r0, [r3]
3000040c:	ebffff84 	bl	30000224 <printHex>
30000410:	e59f007c 	ldr	r0, [pc, #124]	; 30000494 <.text+0x494>
30000414:	ebffff6f 	bl	300001d8 <puts>
30000418:	e59f0078 	ldr	r0, [pc, #120]	; 30000498 <.text+0x498>
3000041c:	ebffff6d 	bl	300001d8 <puts>
30000420:	e59f3074 	ldr	r3, [pc, #116]	; 3000049c <.text+0x49c>
30000424:	e5930000 	ldr	r0, [r3]
30000428:	ebffff7d 	bl	30000224 <printHex>
3000042c:	e59f0060 	ldr	r0, [pc, #96]	; 30000494 <.text+0x494>
30000430:	ebffff68 	bl	300001d8 <puts>
30000434:	e59f3064 	ldr	r3, [pc, #100]	; 300004a0 <.text+0x4a0>
30000438:	e5d33000 	ldrb	r3, [r3]
3000043c:	e1a00003 	mov	r0, r3
30000440:	ebffff42 	bl	30000150 <putchar>
30000444:	e59f2054 	ldr	r2, [pc, #84]	; 300004a0 <.text+0x4a0>
30000448:	e59f3050 	ldr	r3, [pc, #80]	; 300004a0 <.text+0x4a0>
3000044c:	e5d33000 	ldrb	r3, [r3]
30000450:	e2833001 	add	r3, r3, #1	; 0x1
30000454:	e5c23000 	strb	r3, [r2]
30000458:	e59f3044 	ldr	r3, [pc, #68]	; 300004a4 <.text+0x4a4>
3000045c:	e5d33000 	ldrb	r3, [r3]
30000460:	e1a00003 	mov	r0, r3
30000464:	ebffff39 	bl	30000150 <putchar>
30000468:	e59f2034 	ldr	r2, [pc, #52]	; 300004a4 <.text+0x4a4>
3000046c:	e59f3030 	ldr	r3, [pc, #48]	; 300004a4 <.text+0x4a4>
30000470:	e5d33000 	ldrb	r3, [r3]
30000474:	e2833001 	add	r3, r3, #1	; 0x1
30000478:	e5c23000 	strb	r3, [r2]
3000047c:	e3a0093d 	mov	r0, #999424	; 0xf4000
30000480:	e2800d09 	add	r0, r0, #576	; 0x240
30000484:	ebffffa8 	bl	3000032c <delay>
30000488:	eaffffe9 	b	30000434 <main+0x48>
3000048c:	300004b0 	strcch	r0, [r0], -r0
30000490:	300004d0 	ldrccd	r0, [r0], -r0
30000494:	300004bc 	strcch	r0, [r0], -ip
30000498:	300004c0 	andcc	r0, r0, r0, asr #9
3000049c:	300004d4 	ldrccd	r0, [r0], -r4
300004a0:	300004cc 	andcc	r0, r0, ip, asr #9
300004a4:	300004cd 	andcc	r0, r0, sp, asr #9
Disassembly of section .rodata:

300004a8 <g_Char2-0x4>:
300004a8:	00007830 	andeq	r7, r0, r0, lsr r8

300004ac <g_Char2>:
300004ac:	00000042 	andeq	r0, r0, r2, asr #32
300004b0:	5f670d0a 	swipl	0x00670d0a
300004b4:	203d2041 	eorcss	r2, sp, r1, asr #32
300004b8:	00000000 	andeq	r0, r0, r0
300004bc:	00000d0a 	andeq	r0, r0, sl, lsl #26
300004c0:	5f670d0a 	swipl	0x00670d0a
300004c4:	72617642 	rsbvc	r7, r1, #69206016	; 0x4200000
300004c8:	00203d20 	eoreq	r3, r0, r0, lsr #26
Disassembly of section .data:

300004cc <g_Char>:
300004cc:	Address 0x300004cc is out of bounds.


300004cd <g_Char3>:
300004cd:	Address 0x300004cd is out of bounds.

Disassembly of section .bss:

300004d0 <g_A>:
300004d0:	00000000 	andeq	r0, r0, r0

300004d4 <g_Bvar>:
300004d4:	00000000 	andeq	r0, r0, r0
Disassembly of section .comment:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值