关于KEIL C里如何执行系统不能识别的新指令

这源于论坛里回复一个朋友的回复:

他的问题:

目前使用的Mentor Graphics的一个单片机,使用Keil软件编译,完成对ROM的写操作,即在线编程。
  这个单片机有个比较特殊的指令【MOVC @DPTR,A】,用于把数据写入ROM中,该指令对应的操作码是A5。当对DPTR和A赋值后,CPU执行A5操作码,就会完成MOVC @DPTR,A,即对ROM写操作。
  但问题是Keil编译器不能识别这条指令,而且没有支持的IDE/COMPILER。单片机文档中介绍说把A5操作码定义为宏来执行,但我不清楚怎么做?能让CPU去执行这个操作码? 求教高手帮忙看看 !非常感谢!


#include <reg51.h>

typedef void(*p)(void);

code unsigned char SETC[2] ={0xA5,0x22};
void A(void)
{
  volatile t = 0;
t++;
}

int main()
{
  p Pfun = (p)&SETC;

A();
Pfun();
while (1);
}

C:0x0000 02001F LJMP STARTUP1(C:001F)
  7: void A(void) 
  8: { 
  9: volatile t = 0; 
C:0x0003 E4 CLR A
C:0x0004 F508 MOV 0x08,A
C:0x0006 F509 MOV 0x09,A
  10: t++; 
C:0x0008 0509 INC 0x09
C:0x000A E509 MOV A,0x09
C:0x000C 7002 JNZ C:0010
C:0x000E 0508 INC 0x08
  11: } 
  12:  
C:0x0010 22 RET  
  13: int main() 
  14: { 
  15: p Pfun = (p)&SETC; 
  16:  
C:0x0011 7BFF MOV R3,#0xFF
C:0x0013 7A00 MOV R2,#0x00
C:0x0015 7931 MOV R1,#0x31
  17: A(); 
C:0x0017 120003 LCALL A(C:0003)
  18: Pfun(); 
C:0x001A 12002B LCALL C?ICALL(C:002B)
  19: while (1); 
C:0x001D 80FE SJMP C:001D
  99: MOV R0,#IDATALEN - 1 
C:0x001F 787F MOV R0,#0x7F
  100: CLR A 
C:0x0021 E4 CLR A
  101: IDATALOOP: MOV @R0,A 
C:0x0022 F6 MOV @R0,A
  102: DJNZ R0,IDATALOOP 
C:0x0023 D8FD DJNZ R0,IDATALOOP(C:0022)
  151: MOV SP,#?STACK-1 
  152: ; This code is required if you use L51_BANK.A51 with Banking Mode 4 
  153: ; EXTRN CODE (?B_SWITCH0) 
  154: ; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 
C:0x0025 758109 MOV SP(0x81),#0x09
  155: LJMP ?C_START 
C:0x0028 020011 LJMP main(C:0011)
  C?ICALL:
C:0x002B 8A83 MOV DPH(0x83),R2
C:0x002D 8982 MOV DPL(0x82),R1
  C?ICALL2:
C:0x002F E4 CLR A
C:0x0030 73 JMP @A+DPTR
C:0x0031 A5 DB 0xA5
C:0x0032 22 RET  


对比一下C和汇编

感觉比较像了,这个是把你的A5当成一个无参数,无返回值的函数在用


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页