STM8在RAM中执行Code

gdaddma   2010-5-13 14:45 楼主
老早就听说STM8可以在RAM上运行Code,那么有没有可能,我把某个函数编译好打包成数组,在需要的时候再把它放到RAM上去,然后我跑去RAM上运行这段代码?
看了好久这个_fctcpy,好像它的作用只是让程序在链接的时候把某个段链接到RAM上而已,而我是想程序执行之后重链接。请教一下这想法靠谱吗?

回复评论 (13)

想程序执行之后重链接,这个想法很好,但是哪个程序去执行这个重链接的动作呢?

我没有看到过哪个开发环境提供这个功能,恐怕要你自己写这样的重链接程序。
点赞  2010-5-13 17:04
                                 想法不错
点赞  2010-5-13 19:11
所有的跳转指令全部用相对跳转,函数指令执行与绝对地址无关,只与相对地址有关。

那么函数有就可以搬到RAM来执行了。
点赞  2010-5-14 08:49
可使用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");

  
}

  }
  
点赞  2010-5-16 10:27
这个不错,可以将一段防盗版的程序加密,在一定时间解密到RAM运行,判断是否是盗版的。

这样对于静态的代码分析,就找不到破解点了。
就必须整个程序去通读去判断,另外也加一个正常代码解压到RAM执行,这样就不能随便屏蔽掉解压执行。
点赞  2010-5-17 09:20
                                 记号下
点赞  2010-8-2 08:07
                                 有点像菜农的汇编数组,动态链接调用
点赞  2010-8-2 08:42
                                 mark
点赞  2010-11-30 21:23
                                 mark
点赞  2010-11-30 22:24
                                 其实以STM8S 300k次的flash擦写寿命,把flash中的代码倒腾倒腾,也不失为一个加密的妙法。
点赞  2010-11-30 23:57
                                 高人
点赞  2010-12-1 07:55
IAR 直接:
__ram_func
点赞  2010-12-1 07:56
                                  这个是IAR 1.20版才有的功能
点赞  2010-12-1 08:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复