汇编语言转化为C语言,求助!!!

[复制链接]
3609|17
 楼主| yygkqzh 发表于 2012-10-19 17:38 | 显示全部楼层 |阅读模式
本帖最后由 yygkqzh 于 2012-10-19 17:41 编辑

以下是程序,这是一个交通灯的程序。
  ORG 0000H
   AJMP START
      ORG  0003H
     LJMP  INT00
     ORG  0013H
     LJMP INT10
START: MOV SP,#60H
       SETB  EX0
       SETB  EX1
       SETB  EA
       ;LCALL ST00
MAIN: LCALL ST10
       LCALL ST20
       LCALL ST30
       LCALL ST40
     LJMP  MAIN
ST00: MOV A,#00
       MOV P2,A
ST10:MOV R7,#30
ST11:MOV R0,#0DEH
      MOV P2,R0
      LCALL  DELAY1S
        RET
ST20:MOV R4,#05
ST21:MOV R0,#0DDH
      MOV  P2,R0
      MOV R5,#05
  L22:lCALL DELAY01S    ;延时0.5S
      DJNZ R5,L22
      MOV R0,#0DFH
      MOV P2,R0
      MOV R5,#05
  L23:lCALL DELAY01S     ;延时0.5S
      DJNZ R5,L23
      DJNZ R4,ST21
          RET
ST30:MOV R7,#30
      MOV R0,#0F3H
      MOV P2,R0
      LCALL DELAY1S
        RET
ST40:MOV R4,#05
ST41:MOV R0,#0EBH
      MOV P2,R0
      MOV R5,#05
  L42:lCALL DELAY01S    ;延时0.5S
      DJNZ R5,L42
      MOV R0,#0FBH
      MOV P2,R0
      MOV R5,#05
  L43:lCALL DELAY01S    ;延时0.5S
      DJNZ R5,L43
      DJNZ R4,ST41
      ; JMP  ST10
         RET
DELAY1S: MOV R3,#50        ;           R3存循环20ms的次数(50次)
          CLR A
    DIS0: MOV A,R7
        LCALL X0
        DJNZ  R3,DIS0
        DJNZ R7,DELAY1S
           RET
DELAY01S: MOV R7,#05        ;           R2存循环20ms的次数(5次)
           CLR A
     DIS1:  MOV A,R4
            LCALL X0
           DJNZ  R7,DIS1
            RET
DELAY10MS: MOV R2,#20    ;键扫描10ms子程序
   DEL1:    MOV R6,#248
            DJNZ R6,$
            DJNZ R2,DEL1
            MOV R6,#00
            MOV R2,#00
              RET
  TAB: DB 3FH,06H,5BH,4FH
      DB 66H,6DH,7DH,07H
      DB 7FH,6FH,77H,7CH
      DB 39H,5EH,79H,71H
      DB 40H,00H
X0:   MOV R6,A                           
        MOV R1,#40H                    
        MOV A,R6                           
        MOV B,#10
        DIV AB
       MOV @R1,A
        INC R1
       MOV @R1,B
       MOV DPTR,#TAB
       MOV A,@R1
       MOVC A,@A+DPTR
       MOV P0,A
       CLR P3.7
       LCALL  DELAY10MS
         SETB P3.7
         DEC R1
      MOV DPTR,#TAB
       MOV A,@R1
       MOVC A,@A+DPTR
       MOV P0,A
       CLR P3.6
      LCALL DELAY10MS
        SETB    P3.6
         RET
INT00: MOV 36H,R7
         PUSH 36H
        MOV 37H,R0
         PUSH 37H
        MOV 39H,R3
         PUSH 39H
        MOV R7,#10    ;紧急情况按钮,南北停止通行,均为红灯,持续10秒。
        MOV P2,#0DBH
       LCALL  DELAY1S
        POP 39H
        POP 37H
        POP 36H
        MOV R7,36H
        MOV R0,37H
        MOV P2,R0
        MOV R3,39H
         RETI
INT10:  MOV 36H,R7         ;R7----XIANSHIMIAOSHU
         PUSH 36H            ;R0----p2 显示灯的状态
         MOV 37H,R0            ;
         PUSH 37H
         MOV 38H,R6
         PUSH 38H
         MOV 39H,R3
         PUSH 39H               
         ;JNB P3.4,SV1
         ;JNB P3.5,SV2
         ; RET
SV1:   MOV R7,#10     ;南北车流量多,切换成南北方向上运行
        MOV R0,#0DEH
        MOV P2,R0
      LCALL  DELAY1S
          AJMP RETN
SV2:    MOV R7,#10      ;东西车流量多,切换成东西方向上运行
         MOV R0,#0F3H
         MOV P2,R0
      LCALL DELAY1S
          AJMP  RETN
RETN:      POP 39H
            MOV R3,39H
            POP 38H
            MOV R6,38H
            POP 37H
            MOV R0,37H
            POP 36H
            MOV R7,36H
              RETI

END
john_lee 发表于 2012-10-19 18:28 | 显示全部楼层
楼主等着天上掉馅饼?
阿南 发表于 2012-10-19 18:51 | 显示全部楼层
楼主把汇编的功能吃透,然后再重新用C写,应该问题不大的。
 楼主| yygkqzh 发表于 2012-10-19 19:07 | 显示全部楼层
就是急着用,要不也不会求助大家。
 楼主| yygkqzh 发表于 2012-10-19 19:07 | 显示全部楼层
3# 阿南 就是急着用,要不也不会求助大家。
 楼主| yygkqzh 发表于 2012-10-19 19:07 | 显示全部楼层
2# john_lee 就是急着用,要不也不会求助大家。
aihe 发表于 2012-10-19 21:03 | 显示全部楼层
临时抱佛脚吧
aihe 发表于 2012-10-19 21:03 | 显示全部楼层
临时抱佛脚吧
kk8346 发表于 2012-10-19 21:26 | 显示全部楼层
呵呵,具体的问题还是要自己动手的,旁人可以给思路提建议,但不能包揽。
john_lee 发表于 2012-10-19 21:35 | 显示全部楼层
看程序本身应该就是汇编写的,而不是C编译生成的,不能直接逆向,楼主还是把程序吃透了,用C来写一个吧。
john_lee 发表于 2012-10-19 21:39 | 显示全部楼层
帮你逆向了4个函数,其它的不行了。
  1. void st10()
  2. {
  3.         P2 = 0xde;
  4.         delay1s(30);
  5. }

  6. void st20()
  7. {
  8.         u8 r4 = 5;
  9.         do {
  10.                 u8 r5 = 5;
  11.                 P2 = 0xdd;
  12.                 do
  13.                         delay01s();
  14.                 while (--r5);
  15.                 P2 = 0xdf;
  16.                 r5 = 5;
  17.                 do
  18.                         delay01s();
  19.                 while (--r5);
  20.         } while (--r4);
  21. }

  22. void st30()
  23. {
  24.         P2 = 0xf3;
  25.         delay1s(30);
  26. }

  27. void st40()
  28. {
  29.         u8 r4 = 5;
  30.         do {
  31.                 u8 r5 = 5;
  32.                 P2 = 0xeb;
  33.                 do
  34.                         delay01s();
  35.                 while (--r5);
  36.                 P2 = 0xfb;
  37.                 r5 = 5;
  38.                 do
  39.                         delay01s();
  40.                 while (--r5);
  41.         } while (--r4);
  42. }
asd21338 发表于 2012-10-19 23:56 | 显示全部楼层
进来,学习下
lpf336 发表于 2012-10-20 09:41 | 显示全部楼层
自己写多省事
szseo668 发表于 2012-10-20 10:15 | 显示全部楼层
一个交通灯用C语言来编写、我也是进来学习的。
mcu5i51 发表于 2012-10-20 12:01 | 显示全部楼层
懂些C的话,能写出汇编来也一定可以写出C来
651927693 发表于 2012-10-20 19:39 | 显示全部楼层
建议多给些资料,比如你的这个交通灯的原理,或者关于这个程序的任何信息。大家现在甚至不能了解你的那些16进制数据到底是干什么的。建议多给一些直观的东西
 楼主| yygkqzh 发表于 2012-10-21 17:09 | 显示全部楼层
11# john_lee 多谢您了
 楼主| yygkqzh 发表于 2012-10-21 17:15 | 显示全部楼层
其他的差不多就是有一个功能比较棘手,“按下紧急按钮时,南北向全部变成绿灯,东西向全部变为红灯;松开紧急按钮时,红黄绿灯与数码管的显示状态分别回到原来的状态。”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部