韦东山ARM第一期作业(四)代码重定位


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

猜你喜欢

转载自blog.csdn.net/Hxj_CSDN/article/details/85779582