ARM裸机第一期,第13课 代码重定位 ; 源码在目录 005_ARM裸机1期加强版源码文档图片源码 12_relocate 09
老师的汇编代码:
/* 重定位text, rodata, data段整个程序 */
mov r0, #0
ldr r1, =_start /* 第1条指令运行时的地址 */
ldr r2, =__bss_start /* bss段的起始地址 */
sub r2, r2, r1
bl copy2sdram /* src, dest, len */
老师的C语言代码:
void copy2sdram(vola
tile unsigned int *src, volatile unsigned int *dest, unsigned int len) /* src, dest, len */
{
unsigned int i = 0;
while (i < len)
{
*dest++ = *src++;
i += 4;
}
}
此时串口输出字符正常!
===================================================================
我把汇编代码中r0换成了r1,r1换成r2,r2换成了r3,如下:
/* 重定位text, rodata, data段整个程序 */
mov r1, #0
ldr r2, =_start /* 第1条指令运行时的地址 */
ldr r3, =__bss_start /* bss段的起始地址 */
sub r3, r3, r2
bl copy2sdram /* src, dest, len */
C语言编码不动;
此时串口无字符输出?
================================================
这是为什么啊?
看了下dis文件:所有的dis目录下,唯一的区别就是以下四条:
正确的源代码dis(30000000 <_start>:中):
30000060: e3a00000 mov r0, #0 ; 0x0
30000064: e59f102c ldr r1, [pc, #44] ; 30000098 <.text+0x98>
30000068: e59f202c ldr r2, [pc, #44] ; 3000009c <.text+0x9c>
3000006c: e0422001 sub r2, r2, r1
有问题的源代码dis 在(30000000 <_start>:中):
30000060: e3a01000 mov r1, #0 ; 0x0
30000064: e59f202c ldr r2, [pc, #44] ; 30000098 <.text+0x98>
30000068: e59f302c ldr r3, [pc, #44] ; 3000009c <.text+0x9c>
3000006c: e0433002 sub r3, r3, r2
为什么会有这样的问题,希望大神解答下,谢谢!!!!