主题 : 求教 ARM编译器问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 22073
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
贡献值: 0 点
综合积分: 4 分
注册时间: 2010-05-26
最后登录: 2010-08-18
楼主  发表于: 2010-05-28 15:18

 求教 ARM编译器问题

管理提醒: 本帖被 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   只有在对数据变量本身操作后才会增加相应的段。