共2条
1/1 1 跳转至页
各位大哥,请帮我看看下面这段汇编程序所表达的意思,谢谢!
问
;启动文件。初始化 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生成的符号,就是这些内容,估计现在可能相关的中文资料也有人翻过或写过了吧。
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |