Q
|Image$$RO$$Limit|相关问题
在2200实验教程中3.8实验中有这样一段初始化C程序的运行环境的代码,如下:
; 起动文件。初始化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、|Image$$RO$$Limit| 是在哪儿定义的,有何作用?
2、 LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
这三条语句的作用是什么?
3、如何将C程序中的变量i、sum与ARM寄存器中的R0、R1关联起来?
请周工帮忙解释一下,或提示在哪儿可以找到对这些的解释,谢谢!
A:
1、|Image$$RO$$Limit|是编译器内部产生的变量,也就是只读属性的程序段的最后一个字句的地址,请参考ADS的PDF文档
2、 LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
这三条语句的作用是什么?
这一段是实现段拷贝功能,一般的段拷贝过程是把RO段中的有初值的变量还原到RW段中,然后清零RW段中剩下的无初值的变量
3、如何将C程序中的变量i、sum与ARM寄存器中的R0、R1关联起来?
请周工帮忙解释一下,或提示在哪儿可以找到对这些的解释,谢谢!
i,sum等等函数内部定义的局部变量,在编译的时候一般是定义成寄存器变量(callee save的寄存器:r4到r11),如果不够用就用拼命用stack来补充。