打印

怎样在KeilC 中把汇编语言转成C语言

[复制链接]
23157|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
月晕而风|  楼主 | 2009-11-12 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
月晕而风|  楼主 | 2009-11-12 09:39 | 只看该作者
我用的单片机是P89V51RD2

使用特权

评论回复
板凳
yczhang| | 2009-11-12 09:43 | 只看该作者
汇编是不可能用软件自动转成C语言的,你想转成C就自己写吧,反正是自己的程序,程序流程是不用变的

使用特权

评论回复
地板
月晕而风|  楼主 | 2009-11-12 09:50 | 只看该作者
其实这个是别人的程序,我现在的问题是汇编中的A累加器 ,C进位标志位是直接用的,如果转成C的话是不是要先写个A EQU E0H ,然后在c中写A =#00H,这样C中的A才能和单片机中的累加器相对应?

使用特权

评论回复
5
BitFu| | 2009-11-12 10:01 | 只看该作者
新手,绝对的新手!

使用特权

评论回复
6
yczhang| | 2009-11-12 10:24 | 只看该作者
C里面基本上可以不用C和ACC了,立即数要写带前缀0x的形式,建议你好好学学C51再弄吧

使用特权

评论回复
7
月晕而风|  楼主 | 2009-11-12 17:20 | 只看该作者
我只要转一段串口中断程序就行了
下面是汇编语句
;************串口中断程序*************
RECIV:        CLR ES
        setb led
        PUSH PSW
        PUSH ACC
        PUSH 00H
        PUSH 01H
        CLR RI
        
        MOV A,SBUF
        MOV 30H,A        ;进入中断后收 帧头#55H
        
        MOV R0,#31H        ;初始化数据区
        MOV R1,#05H
        MOV A,#00H
REC1:        MOV @R0,A
        INC R0
        DJNZ R1,REC1
       
       
        MOV R0,#31H
        
        MOV R1,#5
RECIV1:
        JNB RI,$
        CLR RI
        MOV A,SBUF
        MOV @R0,A
        clr c
        SUBB A,#0AAH
        JZ BJY1
        
        INC R0
   
        DJNZ R1,RECIV1
        
        
BJY1 :   MOV A,30H        ;校验头字节是否是#55H,即桢头
         CLR C
         SUBB A,#55H
        
        JNZ RECIVERR
        

        MOV A,35H        ;校验最后一个字节是否是#0AAH,即桢尾
        CLR C
        SUBB A,#0AAH
        JNZ RECIVERR
              
        MOV A,31H
        CLR C
        SUBB A,#58H        ;校验是否是读命令#58H
      
        JNZ RECIVERR
           
        MOV A,#00H        ;校验34H字节的校验码
        MOV R0,#31H
        MOV R1,#3
RECIV2: ADD A,@R0
        INC R0
        DJNZ R1,RECIV2
        CJNE A,34H,RECIVERR
        
        SETB 78H
        AJMP RECIVO
RECIVERR:
        SETB 79H      
RECIVO:        POP 01H
        POP 00H
        POP ACC
        POP PSW
        
        RETI

这是我自己转的C语言
# include <REG51F.h>
#define uint unsigned int
#define INBUF_LEN 6 //数据长度
sfr Addr =0x30;         
uint i=0 ,sum,num;
num=INBUF_LEN;
void main(void)
{  
   while(1);
}
//串口中断处理
void serial () interrupt 4
{   
    ES=0;
    LED=1;
    if (RI)  
    {  
         if(num)
            {
             RI = 0;       
                *(Addr+i)= SBUF;            //放入数据            
                i++;                                 // 地址+1
           num--;                                 //6个数
               if(num==0)         
      
              {
                 sum=(*(Addr+1))+(*(Addr+2))+(*(Addr+3));
                 if((*Addr)!=0x55 ||(*(Addr+5))!=0xAA || sum!=(*(Addr+4)))          //校验
                  RECDELAY=1;
                 else
                   ROVER=1;               
                }
             }
            if (i==INBUF_LEN-1) i=0;//地址到顶部回到底部               
      }
}
不知道对不对,现在还有个问题,c语言中断时是怎样保护现场的,是否也要像汇编那样需要写堆栈语句?

使用特权

评论回复
8
inter_zhou| | 2009-11-12 17:30 | 只看该作者
什么最基本的概念都不知道,还是花时间多看点书,而不是到这里问些莫名其妙的问题

使用特权

评论回复
9
杜专| | 2009-11-12 23:27 | 只看该作者

使用特权

评论回复
10
与时俱进| | 2009-11-13 11:07 | 只看该作者
建议lz读懂上面汇编程序对串口的操作方法,然后自己用c编一个,而不是硬生生地把汇编‘翻译’成c

使用特权

评论回复
11
airwill| | 2009-11-13 14:32 | 只看该作者
真是个好的想法, 啥时候有办法做出这样的反编译器来!

以前倒是见到过一个 基于 x86 的这样的东西, 不过效果不理想, 后来就没有了动静

使用特权

评论回复
12
xuliufeng| | 2013-12-3 21:17 | 只看该作者
楼主在吗?你的联系电话多少?我们探讨下。联系我18778991460

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

1

粉丝