打印
[STM8]

STM8在RAM中执行Code

[复制链接]
10159|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2010-5-13 14:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
老早就听说STM8可以在RAM上运行Code,那么有没有可能,我把某个函数编译好打包成数组,在需要的时候再把它放到RAM上去,然后我跑去RAM上运行这段代码?
看了好久这个_fctcpy,好像它的作用只是让程序在链接的时候把某个段链接到RAM上而已,而我是想程序执行之后重链接。请教一下这想法靠谱吗?
沙发
香水城| | 2010-5-13 17:04 | 只看该作者
想程序执行之后重链接,这个想法很好,但是哪个程序去执行这个重链接的动作呢?

我没有看到过哪个开发环境提供这个功能,恐怕要你自己写这样的重链接程序。

使用特权

评论回复
板凳
hsbjb| | 2010-5-13 19:11 | 只看该作者
想法不错

使用特权

评论回复
地板
voidx| | 2010-5-14 08:49 | 只看该作者
所有的跳转指令全部用相对跳转,函数指令执行与绝对地址无关,只与相对地址有关。

那么函数有就可以搬到RAM来执行了。

使用特权

评论回复
5
iwzj| | 2010-5-16 10:27 | 只看该作者
可使用COSMIC中的函数_fctcpyFLASH中的代码代码拷贝RAM中,并运行。_fctcpyFALSH中拷贝一段可移动代码段到RAM中。_fctcpy寻找linker定义的描述符(此描述符是在RAM中定义段的第一个字符)。本例子在RAM 中定义了一个段.CODE_IN_RAM。所以地一个字符是’C’
需要在程序中应用int _fctcpycharname;
Ram 中创建一个.CODE_IN_RAM段。并在Option 中输入-ic
.CODE_IN_RAM表示在RAM中定义一个CODE_IN_RAM的段。程序可从此起始地址运行。_fctcpy函数使用此段的名字的第一个描述符’C’
-ic’
表示标记这个段为可移动的段。可将FLASH中的代码移动到此。

在程序代码中完成函数:
#pragma section (CODE_IN_RAM)
functions()
{

var1= 0x99;


var2= 0x88;


var3= 0x77;

}
routine()
{

var1++;


var2++;


var3++;

}
#pragma section ()
打开project->settings…->Linker如下图所示配置:



例子如下:
  unsigned char var1,var2,var3;
  int  _fctcpy(char name);
  
  #pragma  section (CODE_IN_RAM)
  functions()
  {
  
var1 = 0x99;

  
var2 = 0x88;

  
var3 = 0x77;

  }
  routine()
  {
  
var1++;

  
var2++;

  
var3++;

  }
  #pragma  section ()
  
  main()
  {
  _fctcpy('C');
//
拷贝pragma section(CODE_IN_RAM)中的函数到RAM
  
functions();
//
调用RAM中的functions 函数
  
routine();
//
调用RAM 中的 routine 函数
  

  while (1)
  
{

  
_asm("nop");

  
_asm("nop");

  
_asm("nop");

  
_asm("nop");

  
}

  }
  





使用特权

评论回复
6
乙天| | 2010-5-17 09:20 | 只看该作者
这个不错,可以将一段防盗版的程序加密,在一定时间解密到RAM运行,判断是否是盗版的。

这样对于静态的代码分析,就找不到**点了。
就必须整个程序去通读去判断,另外也加一个正常代码解压到RAM执行,这样就不能随便屏蔽掉解压执行。

使用特权

评论回复
7
tomhe666| | 2010-8-2 08:07 | 只看该作者
记号下

使用特权

评论回复
8
hotpower| | 2010-8-2 08:42 | 只看该作者
有点像菜农的汇编数组,动态链接调用

使用特权

评论回复
9
wxx116zh| | 2010-11-30 21:23 | 只看该作者
mark

使用特权

评论回复
10
xuannin| | 2010-11-30 22:24 | 只看该作者
mark

使用特权

评论回复
11
mcuisp| | 2010-11-30 23:57 | 只看该作者
其实以STM8S 300k次的flash擦写寿命,把flash中的代码倒腾倒腾,也不失为一个加密的妙法。

使用特权

评论回复
12
tlb| | 2010-12-1 07:55 | 只看该作者
高人

使用特权

评论回复
13
STM32W| | 2010-12-1 07:56 | 只看该作者
IAR 直接:
__ram_func

使用特权

评论回复
14
RyanHsuing| | 2010-12-1 08:04 | 只看该作者
13# STM32W 这个是IAR 1.20版才有的功能

使用特权

评论回复
15
wuxing1106| | 2014-8-27 19:42 | 只看该作者
好帖子要mark一下

使用特权

评论回复
16
aichixiaobaicai| | 2014-8-28 15:49 | 只看该作者

使用特权

评论回复
17
ballack_linux| | 2014-9-17 15:47 | 只看该作者
赞一个

使用特权

评论回复
18
lexiaoyao2012| | 2015-8-31 11:37 | 只看该作者
赞一个

使用特权

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

本版积分规则

78

主题

368

帖子

0

粉丝