我用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]此图片显示值1
答案 0 :(得分:1)
我认为你不能这样做,原因有二,我在下面详述:
PIC控制器通常将程序存储在flash memory中。您可以在运行时重新编程闪存,但这并不容易,通常您不能写一个单词,而是必须写一个完整的“页面”(或“扇区”或其他东西,即一次可能是64到512字节左右的集合。这使得在您尝试的级别修改代码非常不切实际。
此外,由于控制器使用Harvard architecture,程序存储器通常无法直接寻址。这意味着你甚至不能有一个指向指令的常规指针,因为数据和代码位于不同的地址空间。