这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 各位大哥,请帮我看看下面这段汇编程序所表达的意思,谢谢!

共2条 1/1 1 跳转至

各位大哥,请帮我看看下面这段汇编程序所表达的意思,谢谢!

院士
2006-09-17 18:14:16     打赏
各位大哥,请帮我看看下面这段汇编程序所表达的意思,谢谢!



关键词: 各位     大哥     帮我     看看     下面     这段     汇编程序     表达    

院士
2006-12-22 22:43:00     打赏
2楼
问 ;启动文件。初始化 C 程序的运行环境,然后进入 C 程序代码

        IMPORT       |Image $$ RO $$ Limit|
        IMPORT       |Image $$ RW $$ Base |
        IMPORT       |Image $$ ZI $$ Base |
        IMPORT       |Image $$ ZI $$ Limit|
        
        IMPORT       Main   ;声明 C 程序中的 Main() 函数
        
        
        AREA         Start,CODE,READONLY ;声明代码段 Start
        ENTRY                            ;标识程序入口
        CODE32                           ;声明 32 位 ARM 指令
        
Reset   LDR          SP,=0x40003F00

               
        ;初始化 C 程序的运行环境
        
        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
        
        B           Main   ;跳转到 C 程序代码 Main() 函数
        
        END                        
         
1: re:**********************************************************************************************
各位大哥,上面这段代码是 一个汇编程序,其功能是初始化堆栈指针和初始化 C 程序的运行环境
然后调试跳转到 C 程序运行,这是一个简单的启动程序。


我有几个问题向各位大哥请教:

问题1:

        IMPORT       |Image $$ RO $$ Limit|
        IMPORT       |Image $$ RW $$ Base |
        IMPORT       |Image $$ ZI $$ Base |
        IMPORT       |Image $$ ZI $$ Limit|

这些代码是什么意思?他们有什么作用?

问题2:
             
Reset   LDR          SP,=0x40003F00 ;初始化堆栈

               
        ;初始化 C 程序的运行环境
        
        LDR         R0,=|Image $$ RO $$ Limit|     
        LDR         R1,=|Image $$ RW $$ Base |
        LDR         R3,=|Image $$ ZI $$ Base |

中的
       LDR         R0,=|Image $$ RO $$ Limit|     
       LDR         R1,=|Image $$ RW $$ Base |
       LDR         R3,=|Image $$ ZI $$ Base |

他们是什么意思?他们有什么作用?


问题3:
              
LOOP0   CMP         R1,R3
        LDRCC       R2,[R0],#4
        STRCC       R2,[R1],#4
        BCC         LOOP0

中的:
     LDRCC       R2,[R0],#4
     STRCC       R2,[R1],#4

是什么意思?


谢谢!

                                           礼致!
2: 在论坛能收到更多...http://www.21icbbs.com/club/bbs/bbsView.asp?boardid=40 3: 我认为:|Image $$ RO $$ Limit|:表示RO段结束地址+1。
|Image $$ RW $$ Base |:表示RW段起始地址。
|Image $$ ZI $$ Base |:表示ZI段起始地址。
|Image $$ ZI $$ Limit|:表示表示ZI段结束地址+1。
这些标号的值时根据链接器中对ro-base和rw-base的设置来计算来得到的。

LDR   R0,=|Image $$ RO $$ Limit|  就是将RO段结束地址+1放到R0中。
LDRCC  R2,[R0],#4 就是指如果R1>R3,那么,读取r0地址的数据放R2中,
                  同时R0=R0+4

去看ARM的汇编就什么都知道了。


4: heheLDR         R0,=|Image $$ RO $$ Limit|     
       LDR         R1,=|Image $$ RW $$ Base |
       LDR         R3,=|Image $$ ZI $$ Base |

这三行是获得elf文件中程序段,数据段,zi段的地址。



“这些标号的值时根据链接器中对ro-base和rw-base的设置来计算来得到的“
这句是说在ads1.2中,设置ro-base和rw-base编译以后,就有|Image$$RW ?????? 5: 谢谢 liuruihua 大哥 和 zhangdage 大哥liuruihua 大哥 和 zhangdage 大哥:

还有几个问题向您们请教

问题1:

假设 ro-base 设置为:
0x40000000
rw-base
设置为:
0x40003000
那么 编译以后,就为:

|Image $$ RO $$ 0x40003000 |
|Image $$ RW $$ 0x40000000 |
|Image $$ ZI $$ 0x40000000 |
|Image $$ ZI $$ 0x40003000 |

是吗?

问题2:

       CMP         R0,R1
       BEQ         LOOP1

LOOP1   LDR         R1,= |Image $$ ZI $$ Limit|
        MOV         R2,#0


为什么 当 R0=R1 ,就调到 LOOP1 呢?

问题3:
       LOOP1   LDR         R1,= |Image $$ ZI $$ Limit|
               MOV         R2,#0
这句话在整个程序中有什么作用?

问题4:
      上面这段代码是 一个汇编程序,其功能是初始化堆栈指针和初始化 C 程序的运行环境然后调试跳转到 C 程序运行,这是一个简单的启动程序。

       一般要初始化哪些东西呢?还有,在什么条件下,就跳转到 C
       运行程序!

谢谢!



6: re:太深高了! 7: re
问题1:

假设 ro-base 设置为:
0x40000000
rw-base
设置为:
0x40003000
那么 编译以后,就为:

|Image $$ RO $$ 0x40003000 |
|Image $$ RW $$ 0x40000000 |
|Image $$ ZI $$ 0x40000000 |
|Image $$ ZI $$ 0x40003000 |

answer 1:no
如果你不用ADS下scatterloading file来配置image地址,则这些个符号的名字永远都是这样子的:

|Image $$ RO $$ Limit|
|Image $$ RW $$ Base |
|Image $$ ZI $$ Base |
|Image $$ ZI $$ Limit|

但是这些符号具体指向的地址是你设置的值。

问题2:

       CMP         R0,R1
       BEQ         LOOP1

LOOP1   LDR         R1,= |Image $$ ZI $$ Limit|
        MOV         R2,#0


为什么 当 R0=R1 ,就调到 LOOP1 呢?

answer 2:说明你程序的执行地址与你的存储地址一致,变量区不需要做初始化就能用。

问题3:
       LOOP1   LDR         R1,= |Image $$ ZI $$ Limit|
               MOV         R2,#0
这句话在整个程序中有什么作用?

answer 3: 接下去要处理ZI区了,初始化ZI的目的是把这块内存区清零,当然就需要给一个寄存器赋零,然后把它存储器到目标ZI区的存储单元上去。

问题4:
      上面这段代码是 一个汇编程序,其功能是初始化堆栈指针和初始化 C 程序的运行环境然后调试跳转到 C 程序运行,这是一个简单的启动程序。

一般要初始化哪些东西呢?还有,在什么条件下,就跳转到 C 运行程序!

answer 4: 一般要把有初始赋值的变量从存储区copy到执行区(是吧?通常你的程序会放在flash里,但执行的时候变量是要在RAM里的,这样就有了最最基本的存储区和执行区的概念,所以你要为这两个区设置地址:如RO_base,RW_base),然后是一些没有初始值的变量,你要为这些变量在执行区上清零(应该知道为什么吧?你写C的时候很可能大量用了一种假设,变量定义时未定义初始值的,缺省为0,但在真实系统硬件存储单元中谁来保证这一点?是你自己)

建议去看ADS手册library and linker这一册,有一章将linker生成的符号,就是这些内容,估计现在可能相关的中文资料也有人翻过或写过了吧。





共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]