在学习韦东山嵌入式学习视频的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: