2014-01-30 80 views
0

我用c語言編寫了一個程序。在這個程序中,我可以通過指向特定地址的指針訪問,操作碼可以打印它。我用這種方法編寫了自我修改代碼。我在8086架構中做了這個。 我希望它在微控制器PIC18F2550上運行。我正在使用Mplab IDE 8.92和Mplab C18 3.46.我之前從未使用微控制器完成過此操作。 與8086不同,這裏我沒有訪問操作碼!指針是操作碼的地址。然而,返回值是0X00!這是一個代碼示例在PIC18中修改操作碼

#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

回答

1

我不認爲你可以做到這一點,有兩個原因,我詳細如下:

PIC控制器通常將其程序存儲在flash memory。你可以可以在運行時對閃存進行重新編程,但這並不容易,通常你不能寫一個單詞,而是必須編寫一個完整的「頁面」(或「扇區」或其他東西,也許是64個集合一次到512字節左右)。這使得在您嘗試的級別修改代碼非常不切實際。

此外,由於控制器使用Harvard architecture,程序存儲器通常不能直接尋址。這意味着你甚至不會有指向指令的常規指針,因爲數據和代碼位於不同的地址空間中。

+0

可能更多解釋 – user3161225

+0

有沒有辦法訪問操作碼? – user3161225

+0

@ user3161225您可以通過特殊的函數調用訪問操作碼。您無法通過void * retadd_addr =(void *)retadd獲取函數的地址。查看「哈佛架構」鏈接或更好:訪問www.microchip.com並在PIC18F2550上搜索文檔。 – chux