完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
.section start .text .section name name 名称 type 类型 表示后面的代码属于代码段。 .section作用是将代码划分为若干段,程序***作系统加载执行时,每个段被加载到不同的地址,操作系统对不同的页面设置不同的读、写、执行权限。.data段保存程序的数据,是可读可写的,相当于C程序的全局变量。.text段保存代码,是只读和可执行的,后面那些指令都属于.text段。 .globl reset .globl作用是告诉汇编器,reset将会被链接器用到,就像前面我们介绍的在链接脚本里面发现reset是程序的入口。所以呢,要把reset设置为全局变量,并且通过.globl声明外部可以访问。 .align 4 对于.align的作用是对指令和数据的存放地址进行对齐。ARM是32位处理器,在ARM指令状态下,所有指令的执行都是按照4的倍数进行执行的,否则程序无法正常运行,所以加入语句.align 4来使指令对齐。 reset: 汇编语言中的标号,也就是地址。这个地址就是程序执行的地址。 _exception_vectors: b reset_vector /* reset */ b undef_vector /* Undefined Instruction */ b swi_vector /*Software Interrupt */ b pabt_vector /*Prefetch Abort */ b dabt_vector /* DataAbort */ .word _codesize /* Size of the image for SAM-BA */ b irq_vector /* IRQ : read the AIC */ b fiq_vector /* FIQ */ undef_vector: b undef_vector swi_vector: b swi_vector pabt_vector: b pabt_vector dabt_vector: b dabt_vector rsvd_vector: b rsvd_vector irq_vector: b irq_vector fiq_vector: b fiq_vector 上面可以称之为中断向量表,定义了7种中断模式,分别是复位模式、未定义模式、软中断模式、指令预取终止、数据访问终止、预留、外部中断、快速中断,地址如下: reset_vector: _init_stack: ldr sp,=TOP_OF_MEM 设置栈,对于栈的作用有三种: (1)保存现场/上下文 (2)传递参数:汇编代码调用c函数时,需传递参数 (3)保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 _setup_clocks: ldr r0,=AT91C_PMC_SR ldr r1,[r0] ldr r2,=AT91C_PMC_MOSCS ands r1,r1, r2 bne _switch_to_mosc 时钟的配置,AT91C_PMC_SR= 0xFFFFFC68电源管理控制状态寄存器,将寄存器的内容保存到r1,AT91C_PMC_MOSCS=0x01<<0,ands按位“与”以后更新cpsr内容,r1=r1&r2也就是判断bit[0]的数值,来判断主晶振是否稳定。如果等于1已经稳定,执行跳转到标号_switch_to_mosc执行。不等于1继续执行_enable_mosc: /* Enable the main oscillator */ _enable_mosc: ldr r0,=AT91C_PMC_MOR mov r1, #(0x40 << 8) ldr r2,=AT91C_CKGR_MOSCEN orr r1, r1, r2 str r1, [r0] ldr r0,=AT91C_PMC_SR 1: ldr r1, [r0] ldr r2,=AT91C_PMC_MOSCS ands r1, r1, r2 beq 1b AT91C_PMC_MOR=0xFFFFFC20主振荡器寄存器,r1=0x01000000 << 8=0x4000,r2=0x1<<0,orr指令是或运算,所以r1 = r1 | r2=0x4000 | 0x01=0x4001,AT91C_PMC_MOR = 0x4001,而寄存器AT91C_PMC_MOR内容在技术手册page356,可以知道寄存器的bit[14],bit[0]都等于1,bit[0]=1表示开启主晶振,bit[15:8]表示主晶振的启动时间,是低速时钟的8倍周期数。结合前面的分析就是晶振还没有稳定,那么就跳转到这里设置主晶振和晶振的启动时间,AT91C_PMC_SR=0xFFFFFC68主振荡器的状态寄存器,ldr表示将以r0为地址的寄存器内容读入到r1里面,就是说r1的内容表示主晶振的状态寄存器,r2内容表示0x01<<0,ands是与运算,r1=r1&r2表示读取状态寄存器的bit[0]同时改变cpsr位,bit[0]仍然表示是否稳定,beq表示当cpsr中的Z位等于0时不稳定,跳转到后面的标签1b处,1b表示局部标签1,再次检查,否则继续执行。 /* Test if MCK == SLOW CLOCK */ _switch_to_mosc: ldr r0,=AT91C_PMC_MCKR ldr r1,=AT91C_PMC_CSS ldr r2, [r0] and r2, r2, r1 mov r1, #0 cmp r1,r2 AT91C_PMC_MCKR=0xFFFFFC30,主控时钟寄存器,AT91C_PMC_CSS=0x03<<0,r2等于r1与上r2,也就是将主控时钟寄存器的bit[1:0]取出来判断,AT91C_PMC_MCKR寄存器的bit[1:0]功能如图: cmp指令是将r1-r2,但是不保存结果,却影响符号标志位,实际就是对于时钟选择的判断。 /* No => Do nothing */ bne _init_bss ben是条件跳转,不为零跳转到后面标号,初始化bss,否则继续执行,继续读取状态寄存器。 /* Yes => Switch to the main oscillator*/ ldr r1,=AT91C_PMC_CSS_MAIN_CLK ldr r2,=AT91C_PMC_PRES_CLK orr r1, r1, r2 str r1, [r0] ldr r0,=AT91C_PMC_SR 1: ldr r1, [r0] ldr r2,=AT91C_PMC_MCKRDY ands r1, r1, r2 beq 1b /* Copy the data section in RAM at .datalink address */ _init_data: ldr r2, =_lp_data ldmia r2, {r1, r3, r4} 1: cmp r3, r4 ldrcc r2, [r1], #4 strcc r2, [r3], #4 bcc 1b 从注释可以看出是复制数据段到ram里面, _lp_data: .word _etext .word _sdata .word _edata 上面的地址在链接脚本elf32-littlearm.lds里面可以查看到地址,在反汇编文件里面也可以找到其地址。ldmia r2, {r1, r3,r4}就是将r2,r2+4,r2+8地址的内容全部传输给r1,r3,r4,也就是从数据段的起始地址开始拷贝,比较r3和r4的内容,cc是“小于”,ldrcc是小于就装载内存数据到寄存器。 _init_bss: adr r2, _lp_bss ldmia r2, {r3, r4} mov r2, #0 1: cmp r3, r4 strcc r2, [r3], #4 bcc 1b 初始化bss段用来存放程序中未初始化的全局变量和静态变量的一块内存区域。 _branch_main: ldr r4, = main mov lr, pc bx r4 跳转到C语言的主函数里面,pc是程序执行的下一个地址,lr保存了程序的返回地址,bx r4就是跳转到main函数,BX指令跳转到指令中所指定的目标地址,若目标地址的bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址的代码解释为ARM代码;若目标地址的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码。 _go: ldr r1, =MACH_TYPE mov lr, pc bx r0 此段还没有搞明白什么意思????? 综上所述: crt0_gnu.S的作用: 1.设置中断向量表 2.设置栈 3.设置时钟 4.初始化数据段 5.初始化bss 6.调用main函数 !!!!!!!!!!!!!!!!!!!!!!欢迎指正!!!!!!!!!!!!!!!!!!!!!! |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【盈鹏飞RK3399安卓主板 XPC-3399Pro免费试用】+烧写出厂固件
10324 浏览 0 评论
【盈鹏飞EVB-T335开发板试用体验】debian系统烧写
3355 浏览 1 评论
【盈鹏飞I.MX6UL工控开发板试用体验】linux can 测试
3228 浏览 0 评论
308浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 01:58 , Processed in 0.594278 second(s), Total 69, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号