代码重定位问题!!!

[复制链接]
5802|32
zhangmangui 发表于 2013-9-28 17:47 | 显示全部楼层
乌月明星稀 发表于 2013-9-28 15:28
不会吧???你是怎么做到的???求代码贴出来

你改大点不行吗
aresc 发表于 2013-9-28 20:33 | 显示全部楼层
本帖最后由 aresc 于 2013-9-28 20:40 编辑

其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代码长度。从汇编语言的角度看一个函数就是一个入口地址,函数体占据该地址后连续的一段空间,要执行这个函数就是把这个入口地址付给PC指针。
zhangmangui 发表于 2013-9-28 23:08 | 显示全部楼层
aresc 发表于 2013-9-28 20:33
其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代 ...

谢谢你的分享与解释
 楼主| 乌月明星稀 发表于 2013-9-29 00:12 | 显示全部楼层
aresc 发表于 2013-9-28 20:33
其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代 ...

你说的很有道理,我也玩汇编玩过一年,也明白。重定位问题实际上就是程序当中一些相对寻址和绝对寻址的问题。
对库的调用就是需要绝对寻址,对全局变量的访问也应该是绝对寻址,否则会出错。
 楼主| 乌月明星稀 发表于 2013-9-29 01:13 | 显示全部楼层
#include "stdio.h"
/*
这个代码是行的。
*/
void a();

void b();
char CodeArr[400];
void (*f)();
void main()
{
    int temp;
    char *Pcopy=(char*)b;
        f =a;
    for(temp=0;temp<500;temp++)
    {
            CodeArr[temp]=Pcopy[temp];//代码拷贝
    }
    (*(void(*)(void))&CodeArr[0])();    //强制转换为void (*)(void)函数类型
}

void a()
{
        char temp[10];
    printf("This is test!\n");
        scanf("%s",temp);
        printf("Get msg is:\t%s\n",temp);
}

void b()
{
   f();
}
ddxx 发表于 2013-9-30 09:02 | 显示全部楼层
a()要可重入的,否则还是会错的。
linqing171 发表于 2013-10-3 20:02 | 显示全部楼层
ROPI一定要保证。
toneic 发表于 2013-10-4 10:59 | 显示全部楼层
成功了只是巧合,并不具有通用性。需要考虑两个问题:
1. 字节对齐
2. 地址重定位
arm的bootloader在编译的时候指定了真实的运行地址。
飞鹰嵌入式 发表于 2013-10-6 20:18 | 显示全部楼层
我也试过,试的结果和楼主差不多,地址不对啊
zhangmangui 发表于 2013-10-6 21:08 | 显示全部楼层
aresc 发表于 2013-9-28 20:33
其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代 ...

学习啦  谢谢
李冬发 发表于 2013-10-7 20:04 | 显示全部楼层
都是生成exe文件后再load到内存的。
puppet21 发表于 2013-10-10 16:53 | 显示全部楼层
把大小改为1000后虽不报内存错误,但无法跑出效果,一样的卡死。测试过发现在127~128之间是个临界点,剩下的求大神解答咯~!
lzp3520265 发表于 2013-10-19 15:18 | 显示全部楼层
有几个问题
1.取指令问题。如果是类似51的,CPU无法从RAM取指令的话,这个是无法实现的。
2.函数大小问题,汇编下可以用一些伪指令来获取。C下就不好弄了。或许可以在最后加一些特定的指令来判断,比如几个NOP之类的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部