完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
注意:如果点击空白处无法输入,则点击字会有输入提示符 | 则可以使用键盘进行输入!
此板块为 [uboot开发]
下边是uboot 一段代码,我的问题是汇编执行的语句顺序。 假如执行完 bl CopyCode2Ram,下一条汇编语句应该是执行clear_bss这个标号里边的语句,还是ldr pc, _start_ARMboot这句语句
#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate: /* relocate U-Boot to RAM */ adr r0, _start /* r0 <- current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ beq clear_bss ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 /* r2 <- size of armboot */#if 1 bl CopyCode2Ram /* r0: source, r1: dest, r2: size */#else add r2, r0, r2 /* r2 <- source end address */copy_loop: ldmia r0!, {r3-r10} /* copy from source address [r0] */ stmia r1!, {r3-r10} /* copy to target address [r1] */ cmp r0, r2 /* until source end addreee [r2] */ ble copy_loop#endif#endif /* CONFIG_SKIP_RELOCATE_UBOOT */clear_bss: ldr r0, _bss_start /* find start of bss segment */ ldr r1, _bss_end /* stop here */ mov r2, #0x00000000 /* clear */clbss_l:str r2, [r0] /* clear loop... */ add r0, r0, #4 cmp r0, r1 ble clbss_lSetLoadFlag: /* Set a global flag, PreLoadedONRAM */ adr r0, _start /* r0 <- current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ ldr r2, =PreLoadedONRAM mov r3, #1 streq r3, [r2]#if 0 /* try doing this stuff after the relocation */ ldr r0, =pWTCON mov r1, #0x0 str r1, [r0] /* * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMR str r1, [r0] /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #3 str r1, [r0] /* END stuff after relocation */#endif ldr pc, _start_armboot_start_armboot: .word start_armboot |
|
相关推荐
6个回答
|
|
按顺序执行 clear_bss
|
|
|
|
在上面的程序片段中,如果r0=r1的话,会跳转执行第6行clear_bss,执行完了clear_bss标号的代码以后,是继续执行clbss_1标号的代码,还是返回去去执行第8行语句?
|
|
|
|
ble 是小于等于的话跳转到标号处执行,等于的话还是要拷贝一次
|
|
|
|
那按照老师说的,我的理解是先cmp r0,r1,如果相等,执行clear_bss标号处代码,然后顺序执行clbss_l和SetLoadFlag标号处的代码。但是按照这么执行的话,CopyCode2Ram这个函数是执行不到的啊。我的问题就是执行了clear_bss标号代码也好,clbss_l标号代码也好,他是以什么来判定清bss段执行完了那
|
|
|
|
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ beq clear_bss 正常情况r0,r1是不相等的,相等就不用重定位了 正常r0是0,r1是需要定位的地址 |
|
|
|
好的,明白了,谢谢老师
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2150 浏览 6 评论
1959 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4516 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 15:12 , Processed in 0.748636 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号