【问题标题】:modify opcode in PIC18修改PIC18中的操作码
【发布时间】:2014-01-30 15:19:16
【问题描述】:

我用c语言写了一个程序,在这个程序中,我可以通过指向特定地址的指针来访问,并且操作码可以打印它。我用这种方法编写了自修改代码。我做到了这在 8086 架构中。 我希望它在微控制器 PIC18F2550 上运行。我正在使用带有 Mplab C18 3.46 的 Mplab IDE 8.92。我以前从未在微控制器上这样做过。 不像 8086 这里我没有访问操作码!指针是操作码的地址。但是,返回值为0X00!这是一个代码示例

#include <stdio.h>
#include <stdlib.h>
void fsub(void){
int a,b;
a=3;b=5;
a-=b;
printf("a-b=%d\n",a);   
}
void fadd(void)
{
int a,b;
 a=3;b=5;
 a+=b;
 printf("a+b=%d\n",a);
 }
 void retadd(void);
 void main()
 {
  int i;
   unsigned char *instSub,*instAdd;
  unsigned char instructionSub[2];
  void *retadd_addr=(void*)retadd;
  retadd();
  instSub=(unsigned char*)retadd_addr;
  instAdd=(unsigned char*)retadd_addr+2;
  printf("%x\n", *instSub);
  printf("%x\n", *instAdd);
  while(1);
  }
  void retadd(void)
  {
   fsub();
    fadd();
   }

![图片来自mplab]这张图显示Values1

【问题讨论】:

    标签: c opcode pic18


    【解决方案1】:

    我认为你不能这样做,原因有两个,我将在下面详述:

    PIC 控制器通常将其程序存储在flash memory 中。你可以在运行时重新编程闪存,但这并不容易,通常你不能写一个单词,而是必须写一个完整的“页面”(或“扇区”或其他东西,即一次大约 64 到 512 个字节的集合)。这使得在您尝试的级别修改代码非常不切实际。

    此外,由于控制器使用Harvard architecture,程序存储器通常不可直接寻址。这意味着您甚至不能让常规指针指向一条指令,因为数据和代码位于不同的地址空间中。

    【讨论】:

    • @user3161225 您可以通过特殊函数调用访问操作码。您无法通过 `void retadd_addr=(void)retadd 获取函数的地址。查看“哈佛架构”链接或更好:访问 www.microchip.com 并搜索有关 PIC18F2550 的文档。
    • 我通过 void retadd_addr=(void)retadd 获得了地址(参见这张图片显示的值);但是返回地址的值是0x00!
    • @user3161225 你读过哈佛页面吗?看起来你真的应该这样做,这有点令人困惑。
    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多