新一期ARM作业(四)----代码重定位

目录

描述

解答


描述

  • 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

修改链接脚本,把程序重定位到0x32000000,再观察上述打印结果

 

解答

  • 1

main.c 中的代码:

int main(void)
{
	uart0_init();
	
	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 = 1;
	*end  = 2;
	*src  = 3;
	printf("*dest=0x%d, *end=0x%d, *src=0x%d",*dest,*end,*src);
	puts("\n\r");
	
	while(1)
	{
	}
	return 0;
}

串口输出结果如下:

 

  • 2

在 sdram.lds 链接脚本中修改

SECTIONS {
	. = 0x30000000;
	
	code_start = .;
	
	. = ALIGN(4);
	.text 	 :
	{ 
		*(.text) 
	}
	
	. = ALIGN(4);
	.rodata  :
	{ 
		*(.rodata) 
	}
	
	. = ALIGN(4);
	.data  	  : 
	{
		*(.data) 
	}
	
	. = ALIGN(4);
	bss_start = . ;
	.bss  		:
	{ 
		*(.bss) *(.COMMON) 
	}
	bss_end = . ;
}

串口输出结果如下:

对比上一个结果,可知链接脚步中的变量使用&取出变量的值,而把这个值当成地址操作后,就会直接操作sdram

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值