01 - 作业所在路径
ARM裸机1期加强版\源码文档图片\文档图片\第013课_代码重定位
02 - 作业描述
2.1 - 作业1
使用printf函数打印以下信息:
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
a. 打印dest, end, src的值
b. 打印dest, end, src所指向的地址的值
2.2 - 作业2
修改链接脚本,把程序重定位到0x32000000,再观察上述打印结果
03 - 作业解答
3.1 - 作业1解答
使用printf函数打印以下信息:
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
a. 打印dest, end, src的值
b. 打印dest, end, src所指向的地址的值
在main()
中添加代码
volatile unsigned int *dest = (volatile unsigned int *)&code_start;
volatile unsigned int *end = (volatile unsigned int *)&bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
printf("dest=0x%x, end=0x%x, src=0x%x",dest,end,src);
puts("\n\r");
printf("*dest=0x%d, *end=0x%d, *src=0x%d",*dest,*end,*src);
puts("\n\r");
输出:
dest=0x30000000, end=0x30001310, src=0x0
*dest=0x-476052397, *end=0x0, *src=0x-476052397
3.2 - 作业2解答
修改链接脚本,把程序重定位到0x32000000,再观察上述打印结果
修改链接脚本到0x32000000后的输出
dest=0x32000000, end=0x32001310, src=0x0
*dest=0x-476052397, *end=0x0, *src=0x-476052397
由结果可知,ls链接脚步中的变量,在C语言中使用&取出变量的值,而把这个值当成地址操作后,就会直接操作sdram