管理提醒: 本帖被 kasim 从 Linux技术交流专区 移动到本区(2010-05-28)
各位高手大家好,
小弟刚学习ARM+linux, 想问几个有关编译器原理的问题。主要是对编译器产生出来的CODE, RO, RW, ZI不了解 还有烧写进ROM,再加载到RAM里面后的运行原理。
我以前认识 CODE是 指令代码 RO 是只读常量 RW 初始化的可读写 ZI 未初始化的可读写 但是经过实际编译,产生了一些不理解的问题
const int l[5] = {11,1,1,1,1};
const char *ppp = "test";
const char ppp1[] = "test";
const char *ppp2 = "test";
const char ppp3[] = "test";
char* func();
void Main(void)
{
int i;
char name[50] = {0};
static int j = 200;
static float test;
char p[10] = {0};
int k = 0;
printf("***********************************");
while(1){
i++;
i += 100;
strcpy(name, "my hello world!");
strcpy(p, func());
strcpy(p, ppp);
i = l[0]+1;
//j++;
//test = 1.1f;
printf("************************************");
};
}
char* func()
{
char *p = "hello";
return p;
}
上面这段代码经过我反复修改 并编译 发现几个现象:
1 函数内部的字符串常量 并不会增加RO 而是增加CODE 请问CODE里面又分为什么区域? 函数内部的字符串常量 是存在哪个区? 如何在运行时将局部变量指针指向字符串常量。
2 全局常量 全局常量如char ,int, 之类的常见类型 均不会增加CODE RO RW ZI 我想是编译器在编译阶段 自动做了优化 但是全局字符串常量 却会增加RO
const char *ppp = "test"; //RO增加5个字节 , RW增加4个字节()
const char ppp1[] = "test"; //只有RO增加5个字节,
这里不是很理解,请高手指点
3 全局的数据 在简单用于其它地方赋值 或者 没有使用的情况 均不增加CODE, RW和ZI 只有在对数据变量本身操作后才会增加相应的段。