打印
[ZLG-ARM]

arm启动代码ro/rw搬运代码的疑问

[复制链接]
2084|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huntsmen|  楼主 | 2008-9-21 02:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在arm的启动代码startup.s中,有这样一段代码
;  Build enviroment for C                
IMPORT      |Image$$RO$$Limit|           
IMPORT      |Image$$RW$$Base|
IMPORT      |Image$$ZI$$Base|
IMPORT      |Image$$ZI$$Limit|

LDR         R0,=|Image$$RO$$Limit|  
LDR         R1,=|Image$$RW$$Base|  
LDR         R3,=|Image$$ZI$$Base|
CMP         R0,R1
BEQ         LOOP1 
                        
LOOP0                              
CMP         R1,R3                  
LDRCC       R2,[R0],#4              
STRCC       R2,[R1],#4    
BCC         LOOP0    
    
LOOP1
LDR         R1,=|Image$$ZI$$Limit|
MOV         R2,#0
LOOP2   
CMP         R3,R1                
STRCC       R2,[R3],#4        
BCC         LOOP2     
        
; 进入 the C code
        IMPORT  __main
        LDR     R0, =__main
        BX      R0

我也上网搜了一些资料,知道ro,rw,zi,加载域,运行域的一些概念
但是还是有些地方不太明白,
为何我的启动代码中没有这个ro/rw搬运代码,也可以运行?
2,跳转到main函数,为何有的用
    import main
    ldr        r0,=main
    mov        r14,pc
    bx        r0
而有的用
        IMPORT  __main
        LDR     R0, =__main
        BX      R0
网上的资料:汇编代码的指令为 b  __main, 编译器在跳转到main之前还要作一系列的工作,这其中就包括对运行环境的初始化
按照这个意思,如果是用b __main的话就可以不要rw搬运代码,如果用b main的话,就必须有搬运代码吗?

谢谢指教

相关帖子

沙发
nkguodalu| | 2008-9-21 16:24 | 只看该作者

看看资料就明白了

“为何我的启动代码中没有这个ro/rw搬运代码”
这个启动代码是你写的还是别人写的?

-----------------------------------
关键问题是编译器在你的main之前自动添加了一些代码做了些事情。
至于加了什么做了什么,
要么你去看arm的一些文档。
要么去买本书看看吧。《博客藏经阁丛书--ARM程序分析与设计》
北航出的,二十来块。

你的问题这两个地方都讲了,仔细看看大体意思就明白了。

使用特权

评论回复
板凳
huntsmen|  楼主 | 2008-9-21 17:41 | 只看该作者

rorw搬运

我现在都是通过jtag口放在片内sram中调试的 
是不是在sram中调试时,有没有ro/rw搬运代码,用b main 还是b __mian都一样

只有放在flash中时,要么用
第一种:
ro/rw搬运代码
b main
第二种:
直接用b __main

第二种是不是因为b __main在跳到自己的main之前,调用了ads的库函数,做了一些初始话的工作,就可以不需要自己加ro/rw代码了,因为b __main自己完成了ro/rw代码
对于第一种,因为是直接跳到自己的mian,所以需要自己手动加上ro/rw搬运代码,否则会出问题

使用特权

评论回复
地板
luhuaren| | 2008-9-23 15:12 | 只看该作者

re

用分散加载,就不需要搬运RW,和ZI段
如果不用分散加载,那么则需要进行搬运,是否搬运RO段,那要看你的加载域与运行域是否相同。而RW段是必须要搬运到RAM里去的,ZI段要清零
你的启动代码里有搬运的部分,在这里


LDR         R0,=|Image$$RO$$Limit|  
LDR         R1,=|Image$$RW$$Base|  
LDR         R3,=|Image$$ZI$$Base|
CMP         R0,R1
BEQ         LOOP1 
                        
LOOP0                              
CMP         R1,R3                  
LDRCC       R2,[R0],#4              
STRCC       R2,[R1],#4    
BCC         LOOP0    
    
LOOP1
LDR         R1,=|Image$$ZI$$Limit|
MOV         R2,#0
LOOP2   
CMP         R3,R1                
STRCC       R2,[R3],#4        
BCC         LOOP2   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

14

帖子

0

粉丝