uboot start.S 搬运代码部看不懂

yby28471231 2010-04-01 08:02:39
在start.s中,


copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop



这里搬运过程,是以8个寄存器为单位的,(也就是8*4字节一次),
我看不懂的是,如果_START代码量不是以8*4字节整数倍的.会不会发生越界搬运呢???
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
难的的嵌入式帖子...帮顶...
yby28471231 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 microsky2813 的回复:]
具体可能是 FIFO可容纳32字节?正好32位就都拿来转了? 感觉这么说服力不够

如果多转了一点怎么办呢?多的那些一般是不会执行的,到代码应该终止的那个位置会有个跳转,后面多几个字节也无所谓。

直接用8个寄存器来转能快不少应该
[/Quote]


我也刚学ARM,这段代码一直过不去.我QQ:28471231,加我吧
qsrscxwb 2010-04-02
  • 打赏
  • 举报
回复
这里搬运过程,是以8个寄存器为单位的,(也就是8*4字节一次),
我看不懂的是,如果_START代码量不是以8*4字节整数倍的.会不会发生越界搬运呢???
MicroSky2813 2010-04-01
  • 打赏
  • 举报
回复
具体可能是 FIFO可容纳32字节?正好32位就都拿来转了? 感觉这么说服力不够

如果多转了一点怎么办呢?多的那些一般是不会执行的,到代码应该终止的那个位置会有个跳转,后面多几个字节也无所谓。

直接用8个寄存器来转能快不少应该
MicroSky2813 2010-04-01
  • 打赏
  • 举报
回复
正好我也在看uboot 和 linux 源码


#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* 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 stack_setup

ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
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 /* CONFIG_SKIP_RELOCATE_UBOOT */

16,199

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧