首页
社区
课程
招聘
[求助]arm 代码动态复制请教
发表于: 2010-2-25 12:05 8463

[求助]arm 代码动态复制请教

2010-2-25 12:05
8463
我想在程序运行时,将一段代码复制到固定的位置上执行,

例如:有函数:

    void dym_CODE()
     {
      ...
     }

我想在程序运行的时候,动态的将函数dym_CODE的代码复制到0X40000000处,并在复制完后跳到0X40000000处开始执行,如果是用汇编,比较容易实现,用C语言的话不知道怎么弄?
我用的是ADS1.2,哪位大哥知道的,指点下小弟,谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 240
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
一个参考:
去看一下arm的scatter 文件,理解什么叫执行view,什么叫load view.
写相应的scatter file.把相应的代码加入定义的执行view中。
然后写一个拷贝的程序,将代码拷贝到相应的区域。会用到ADS生成的一些特殊的变量来标记你的代码的起始位置以及长度。
2010-2-26 12:57
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢 songhowl 的回复,我去找下相关的资料看看
2010-2-26 13:40
0
雪    币: 220
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ADS没用过
在VS中可以这样
typedef void T_dym_CODE ( void );
T_dym_CODE  *My_dym_CODE ;
My_dym_CODE  =  (T_dym_CODE  *)0X40000000;
My_dym_CODE();
2010-2-26 17:38
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这只是跳到0X40000000但没有复制代码?
2010-3-1 15:50
0
雪    币: 220
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
复制代码不是很简单么
一个for或while不就解决了
2010-3-2 09:45
0
雪    币: 240
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
对于比较简单的代码,如果没有涉及到地址的重新映射的情况下,可以直接拷贝。比如汇编的指令,可以直接这么做。但是对于复杂的C代码,用scatter文件比较合适,在连接阶段就帮你把地址重新映射好了。动态的执行很多时候并不是简单的拷贝就能做到的。
2010-3-3 09:37
0
雪    币: 220
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
直接拷贝是没考虑到重定位的情况
...
类似DLL了
请问songhowl
在有重定位的情况下
用scatter文件能否做到让指定代码在任意地址上加载运行
还是只能在编译时指定某个地址
2010-3-3 11:08
0
雪    币: 240
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
不能做到在任意地址上加载运行,只能在指定位置。当然如果你在编写C代码的时候比较注意,是可以做到的,这个时候只要拷贝一下就行了,也就不需要用scatter文件了。前提是你对这个比较了解。
使用scatter文件在指定位置执行是比较保险的方法。
如果了解的比较深入的话,去网上搜一下ARM的位置无关的代码应该怎么编程,以及多试验。
2010-3-3 11:32
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
请问songhowl在scatter文件指定运行位置,那代码的加载(拷贝)要自己完成,还是编译器会自动生成相应的代码?
2010-3-3 21:15
0
雪    币: 240
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
需要自己完成加载的代码。也是做一个拷贝的动作。
2010-3-5 09:26
0
游客
登录 | 注册 方可回帖
返回
//