发新帖我要提问
12
返回列表
打印

代码重定位问题!!!

[复制链接]
楼主: 乌月明星稀
手机看帖
扫描二维码
随时随地手机跟帖
21
zhangmangui| | 2013-9-28 17:47 | 只看该作者 回帖奖励 |倒序浏览
乌月明星稀 发表于 2013-9-28 15:28
不会吧???你是怎么做到的???求代码贴出来

你改大点不行吗

使用特权

评论回复
22
aresc| | 2013-9-28 20:33 | 只看该作者
本帖最后由 aresc 于 2013-9-28 20:40 编辑

其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代码长度。从汇编语言的角度看一个函数就是一个入口地址,函数体占据该地址后连续的一段空间,要执行这个函数就是把这个入口地址付给PC指针。

使用特权

评论回复
23
zhangmangui| | 2013-9-28 23:08 | 只看该作者
aresc 发表于 2013-9-28 20:33
其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代 ...

谢谢你的分享与解释

使用特权

评论回复
24
乌月明星稀|  楼主 | 2013-9-29 00:12 | 只看该作者
aresc 发表于 2013-9-28 20:33
其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代 ...

你说的很有道理,我也玩汇编玩过一年,也明白。重定位问题实际上就是程序当中一些相对寻址和绝对寻址的问题。
对库的调用就是需要绝对寻址,对全局变量的访问也应该是绝对寻址,否则会出错。

使用特权

评论回复
25
乌月明星稀|  楼主 | 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();
}

使用特权

评论回复
26
ddxx| | 2013-9-30 09:02 | 只看该作者
a()要可重入的,否则还是会错的。

使用特权

评论回复
27
linqing171| | 2013-10-3 20:02 | 只看该作者
ROPI一定要保证。

使用特权

评论回复
28
toneic| | 2013-10-4 10:59 | 只看该作者
成功了只是巧合,并不具有通用性。需要考虑两个问题:
1. 字节对齐
2. 地址重定位
arm的bootloader在编译的时候指定了真实的运行地址。

使用特权

评论回复
29
飞鹰嵌入式| | 2013-10-6 20:18 | 只看该作者
我也试过,试的结果和楼主差不多,地址不对啊

使用特权

评论回复
30
zhangmangui| | 2013-10-6 21:08 | 只看该作者
aresc 发表于 2013-9-28 20:33
其实几乎所有的DSP编译都有代码overlay的功能,这个就是类似重定位的。需要注意的只有入口地址以及COPY的代 ...

学习啦  谢谢

使用特权

评论回复
31
李冬发| | 2013-10-7 20:04 | 只看该作者
都是生成exe文件后再load到内存的。

使用特权

评论回复
32
puppet21| | 2013-10-10 16:53 | 只看该作者
把大小改为1000后虽不报内存错误,但无法跑出效果,一样的卡死。测试过发现在127~128之间是个临界点,剩下的求大神解答咯~!

使用特权

评论回复
33
lzp3520265| | 2013-10-19 15:18 | 只看该作者
有几个问题
1.取指令问题。如果是类似51的,CPU无法从RAM取指令的话,这个是无法实现的。
2.函数大小问题,汇编下可以用一些伪指令来获取。C下就不好弄了。或许可以在最后加一些特定的指令来判断,比如几个NOP之类的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则