启动文件和链接文件

文章介绍了如何用汇编语言编写开发板的启动文件,包括设置SVC模式、初始化C语言环境、设置堆栈指针和跳转到C代码。同时,还详细解析了链接脚本的编写,描述了内存布局,如.text、.rodata、.data和.bss段的处理方式及内存对齐策略。
摘要由CSDN通过智能技术生成

启动文件.S编写

         需要用汇编编写开发板启动文件,初始化一下 C 语言环境,比如初始化 DDR、设置堆栈指针 SP 等等,完成 C 环境初始化,C 环境初始化完成以后跳转到 C 代码

.global _start    /* 全局标号 */
/*程序从此函数开始执行*/
_start:
	/*设置SVC超级权限模式,cpsr寄存器的M0~M4是处理器模式控制位,10011是SVC模式*/

	/*MRS 指令用于将特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器,要读取特殊寄存器的数据只能使用 MRS 指令*/
	mrs r0, cpsr		@将特殊寄存器 CPSR 程序状态寄存器里面的数据复制到 R0 中
	
	/*位操作:BIC Rd, Rn, #immed 等价 Rd = Rn & (~#immed)*/
	bic r0, r0 , #0x1f	@把0x1f取反,再&上r0寄存器数据最后赋值给r0,也就是将r0寄存器中的低5位清零

	/*位操作:ORR Rd, Rn, #immed 等价 Rd = Rn | #immed*/
	orr r0, r0 , #0x13	@0x13和r0进行 | 运算再赋值给r0

	/*MSR 指令和 MRS 刚好相反,将通用寄存器里面的数据复制到特殊寄存里中,写特殊寄存器只能使用 MSR*/
	msr cpsr, r0		@将r0 的数据写入到cpsr_c中 
	
	/*设置栈指针 */
	ldr sp, =0x80200000 
	/*跳转到main函数 */
	b main

链接脚本.lds编写

        主要是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布,就是一般编译出来的代码都包含在 text、 data、 bss 和 rodata 这四个段内,对这个四个段进行处理

/*“SECTIONS”命令:在大括号里面来描述输出文件的内存布局*/
SECTIONS{

/*“.”:在链接脚本里面叫做定位计数器,默认的定位计数器为 0*/
/*给“.”赋值0X87800000,后面的文件或者段都会以 0X87800000为起始地址开始链接*/
	. = 0X87800000;
/*“.text”是段名,后面的冒号是语法要求,冒号后面的大括号里面填上要链接到“.text”这个段里面的所有文件*/
	.text :
	{
/*链接到开始位置的文件为start.o,因为 start.o 里面包含着第一个要执行的指令,所以一定要链接到最开始的地方*/
		obj/start.o 
/*“*”是通配符,表示所有输入文件的.text段将被放置在.text中*/
		*(.text)
	}
/*定义了一个名为“.rodata”的段,然后所有文件的“.rodata”段都放到里面*/
/*ALIGN(4)表示 4 字节对齐,也就是说段“.data”的起始地址要能被 4 整除*/
	.rodata ALIGN(4) : {*(.rodata*)}     
/*同上*/
	.data ALIGN(4)   : { *(.data) }    
/*”__bss_start“符号:用来保存.bss 段的起始地址*/
	__bss_start = .;    
/*“*(.bss)”:将所有未初始化的全局变量和静态变量存放在BSS段中,这些变量在程序启动时会被初始化为0*/
/*“*(COMMON):将未初始化的全局变量和静态变量中没有被分配任何存储空间的部分,放到BSS段中,并且这些变量在程序启动时同样被初始化为0*/
	.bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
/*”__bss_end“符号:用来保存.bss 段的结束地址*/
	__bss_end = .;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值