[ZLG-ARM] arm启动代码ro/rw搬运代码的疑问

[复制链接]
3255|3
 楼主| huntsmen 发表于 2008-9-21 02:04 | 显示全部楼层 |阅读模式
在arm的启动代码startup.s中,有这样一段代码<br />;&nbsp;&nbsp;Build&nbsp;enviroment&nbsp;for&nbsp;C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Limit|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RW$$Base|<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Base|<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Limit|<br /><br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,=|Image$$RO$$Limit|&nbsp;&nbsp;<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,=|Image$$RW$$Base|&nbsp;&nbsp;<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,=|Image$$ZI$$Base|<br />CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R1<br />BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />LOOP0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />LDRCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R0],#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />STRCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R1],#4&nbsp;&nbsp;&nbsp;&nbsp;<br />BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />LOOP1<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,=|Image$$ZI$$Limit|<br />MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,#0<br />LOOP2&nbsp;&nbsp;&nbsp;<br />CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,R1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />STRCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R3],#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;&nbsp;进入&nbsp;the&nbsp;C&nbsp;code<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;__main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;=__main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0<br /><br />我也上网搜了一些资料,知道ro,rw,zi,加载域,运行域的一些概念<br />但是还是有些地方不太明白,<br />为何我的启动代码中没有这个ro/rw搬运代码,也可以运行?<br />2,跳转到main函数,为何有的用<br />&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;main<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,=main<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r14,pc<br />&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0<br />而有的用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;__main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;=__main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0<br />网上的资料:汇编代码的指令为&nbsp;b&nbsp;&nbsp;__main,&nbsp;编译器在跳转到main之前还要作一系列的工作,这其中就包括对运行环境的初始化<br />按照这个意思,如果是用b&nbsp;__main的话就可以不要rw搬运代码,如果用b&nbsp;main的话,就必须有搬运代码吗?<br /><br />谢谢指教
nkguodalu 发表于 2008-9-21 16:24 | 显示全部楼层

看看资料就明白了

“为何我的启动代码中没有这个ro/rw搬运代码”<br />这个启动代码是你写的还是别人写的?<br /><br />-----------------------------------<br />关键问题是编译器在你的main之前自动添加了一些代码做了些事情。<br />至于加了什么做了什么,<br />要么你去看arm的一些文档。<br />要么去买本书看看吧。《博客藏经阁丛书--ARM程序分析与设计》<br />北航出的,二十来块。<br /><br />你的问题这两个地方都讲了,仔细看看大体意思就明白了。
 楼主| huntsmen 发表于 2008-9-21 17:41 | 显示全部楼层

rorw搬运

我现在都是通过jtag口放在片内sram中调试的&nbsp;<br />是不是在sram中调试时,有没有ro/rw搬运代码,用b&nbsp;main&nbsp;还是b&nbsp;__mian都一样<br /><br />只有放在flash中时,要么用<br />第一种:<br />ro/rw搬运代码<br />b&nbsp;main<br />第二种:<br />直接用b&nbsp;__main<br /><br />第二种是不是因为b&nbsp;__main在跳到自己的main之前,调用了ads的库函数,做了一些初始话的工作,就可以不需要自己加ro/rw代码了,因为b&nbsp;__main自己完成了ro/rw代码<br />对于第一种,因为是直接跳到自己的mian,所以需要自己手动加上ro/rw搬运代码,否则会出问题
luhuaren 发表于 2008-9-23 15:12 | 显示全部楼层

re

用分散加载,就不需要搬运RW,和ZI段<br />如果不用分散加载,那么则需要进行搬运,是否搬运RO段,那要看你的加载域与运行域是否相同。而RW段是必须要搬运到RAM里去的,ZI段要清零<br />你的启动代码里有搬运的部分,在这里<br /><br /><br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,=|Image$$RO$$Limit|&nbsp;&nbsp;<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,=|Image$$RW$$Base|&nbsp;&nbsp;<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,=|Image$$ZI$$Base|<br />CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R1<br />BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />LOOP0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />LDRCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R0],#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />STRCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R1],#4&nbsp;&nbsp;&nbsp;&nbsp;<br />BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />LOOP1<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,=|Image$$ZI$$Limit|<br />MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,#0<br />LOOP2&nbsp;&nbsp;&nbsp;<br />CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,R1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />STRCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R3],#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP2&nbsp;&nbsp;&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部