0

私は 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を示しています

4

1 に答える 1

1

以下に詳述する2つの理由から、これを行うことはできないと思います。

通常、PIC コントローラはプログラムをフラッシュ メモリに保存します。実行時にフラッシュを再プログラムすることはできますが、それほど簡単ではなく、通常は 1 つの単語を書き込むことはできず、「ページ」全体 (または「セクター」など、つまりおそらく 64 から 512 のコレクション) を書き込む必要があります。バイト程度) 一度に。これにより、試しているレベルでコードを変更することは非常に非現実的になります。

さらに、ハーバード アーキテクチャを使用するコントローラのため、通常、プログラム メモリを直接アドレス指定することはできません。これは、データとコードが異なるアドレス空間にあるため、命令を指す通常のポインターを持つことさえできないことを意味します。

于 2014-01-30T15:27:12.573 に答える