原创 反汇编反出的51串口通讯“波特率自动校准技术”(无名氏作)

2007-1-6 00:48 6931 9 9 分类: MCU/ 嵌入式
返回的hotpower的个人主页




反汇编反出的51串口通讯“波特率自动校准技术”(无名氏作) (44818字)hotpower2004-2-12 1:35:22[82次]

HotPower 发表于 11/21/2003 1:20:50 PM 新手园地 ←返回版面    

;-----------------------------------------------------------------------
;反汇编反出的51串口通讯“波特率自动校准技术”(无名氏作)
;-----------------------------------------------------------------------
;Disasm51 Version 3.02 Copyright (c) 2000,2003 Xi'an XXX Co. HotPower
;Binfile_name  :[Att51.bin]
;Binfile_length:[4153...1039H]
;-----------------------------------------------------------------------
;“超级反汇编”标号说明
;以L打头的标号为(子)程序运行地址(LABEL)   例L00BB:
;以S打头的标号为子程序运行地址(SUB)       例S0121:
;以D打头的标号为数据区装载地址(DATA)      例D0542:
;以W打头的标号为散转程序隐藏地址(WORD)    例W09C0:
;-----------------------------------------------------------------------
    ORG   0000H
RESET:    LJMP  MAIN;跳入主程序
;-------注意,硬件有鬼!地址多了8000H----------------------------
;此君在编程时,处处设防,表现了“对社会的强烈不满”
;可惜HotPower不在场,否则,一定将他“扒的精光”!
;-------让我看硬件后,再给你个“正版”--------------------------
;请注意P2:P0硬件
;    MOV   DPTR,#0FF00H;
;    MOV   DPTR,#0FF03H;?MOVC
;    MOV   DPTR,#0FF05H;?MOVX
;    MOV   DPTR,#0FF07H;?MOVC,MOVX
;    MOV   DPTR,#0FF08H;?MOVC,MOVX
;    MOV   DPTR,#0FF09H;?MOVC
;    MOV   DPTR,#0FF0AH;?MOVC,MOVX
;    MOV   DPTR,#0FF0BH;?MOVC
;    MOV   DPTR,#0FF0CH;?MOVC
;    MOV   DPTR,#0FF0DH;?MOVC,MOVX
;    MOV   DPTR,#0FF0EH;?MOVC
;       MOV   DPTR,#0FF0FH;?MOVC
;    MOV   DPTR,#0FF10H;?MOVC
;    MOV   DPTR,#0FF11H;?MOVX
;    MOV   DPTR,#0FF7BH;?
;    MOV   DPTR,#0FF80H;?MOVC
;    MOV   DPTR,#0FF81H;?MOVC
;    MOV   DPTR,#0FFC3H;?
;----------------------------------------------------------------
        ORG   0003H
EXTI0:    LJMP  EXTI0;原为LJMP  EXTI0+8000H
        ORG   000BH
TIMER0:    LJMP  TIMER0;原为LJMP  TIMER0+8000H
        ORG   0013H
EXTI1:    LJMP  EXTI1;原为LJMP  EXTI1+8000H
        ORG   001BH
TIMER1:    LJMP  TIMER1;原为LJMP  TIMER1+8000H
        ORG   0023H
SINT:    LJMP  L0B7C;实际有2套串口中断入口地址
        ORG   002BH
;-------以下全为“瞎折腾”---------------------------------------
TIMER2:
        LJMP  002BH;原为LJMP  002BH+8000H
        ORG   0033H
        LJMP  0033H;原为LJMP  0033H+8000H
        ORG   003BH
        LJMP  003BH;原为LJMP  003BH+8000H
        ORG   0043H
        LJMP  0043H;原为LJMP  0043H+8000H
        ORG   004BH
        LJMP  004BH;原为LJMP  004BH+8000H
        ORG   0053H
        LJMP  0053H;原为LJMP  0053H+8000H
        ORG   005BH
        LJMP  005BH;原为LJMP  005BH+8000H
        ORG   0063H
        LJMP  0063H;原为LJMP  0063H+8000H
        ORG   006BH
        LJMP  006BH;原为LJMP  006BH+8000H
        ORG   0073H
        LJMP  0073H;原为LJMP  0073H+8000H
        ORG   007BH
        LJMP  007BH;原为LJMP  007BH+8000H
        ORG   0083H
        LJMP  0083H;原为LJMP  0083H+8000H
        ORG   008BH
        LJMP  008BH;原为LJMP  008BH+8000H
        ORG   0093H
        LJMP  0093H;原为LJMP  0093H+8000H
        ORG   009BH
        LJMP  009BH;原为LJMP  009BH+8000H
        ORG   00A3H
        LJMP  00A3H;原为LJMP  00A3H+8000H
        ORG   00ABH
        LJMP  00ABH;原为LJMP  00ABH+8000H
MAIN:
;-------波特率自动校准参数初始化-----------------------------
        CLR   A
    MOV   RCAP2H,A
    MOV   RCAP2L,A
    MOV   TL2,A;
    MOV   TH2,A;
    MOV   T2MOD,A
    MOV   T2CON,A
;-------串口在一定时间内有2个脉冲信号才能运行本程序---------
;开机必须撞大运!!!此君我服也!!!
;HotPower认为开机“密码”为F5H,不知此君能否给我“大奖”
;2个脉冲信号是否可认为:
;51开机串口(高电平1)
;结束起始位(低电平0)
;数据流10101111B(数据为F5H)停止位(高电平1)
;这样脉冲信号流为10101111111B
;我猜你在应用“波特率自动校准技术”!!!
;此君高人也,HotPower自叹不如!!!
;HotPower一直自称为“魔”,看来要“让位”了。。。
;但在“让位”前,我敢说此君的“散转技术”必我差点(别拍砖)
;看来此君的P89C51RX2的BootROM中的ISP精神领会的很深!!!
;HotPower这几天在此玩反汇编绝非“捣蛋”!!!
;我想给大家展示此君的“风采”
;-----------------------------------------------------------
;无首脉冲信号在此死机!!!
L00BB:    JB    RXD,$;等待串口低电平(首脉冲信号)
L00BE:    JNB   RXD,$;等待串口高电平(结束起始位D0=1)
;-------有首脉冲信号(起始位)才有资格撞大运--------------------
    SETB  TR2;打开定时器2,开始计时,现在测D0(1)
L00C3:    JNB   RXD,L00C9;测试次脉冲信号(D1=0)
    JNB   TF2,L00C3;等待定时时间到(无次脉冲信号)
L00C9:    JNB   RXD,$;等待串口高电平D2=1,测D1(0)
;-------D0D1已测完---------------------------------
L00CC:    JNB   RXD,L00D2;有次脉冲信号(D3=0)
    JNB   TF2,L00CC;等待定时时间到
;-------定时时间到,手气不好----------------------
;数据不能为0FFH,数据估计为F5H(11110101B)
L00D2:    JNB   RXD,$;等待串口高电平D4=1(8位数据和停止位)
;-------D4=D5=D6=D7=STOPBIT=1-------------------
    CLR   TR2;立即关闭定时器,用于校准波特率
    JB    TF2,MAIN;定时时间到,重新撞大运!!!
;-------多次撞上大运才能运行----------------------
;请看此君的“波特率自动校准技术”!!!
;-------------------------------------------------
    MOV   R7,TL2;保存实际测试的波特率低8位
    MOV   R6,TH2;保存实际测试的波特率高8位
;-------波特率自动校准技术------------------------
;从以下程序分析,此君的开机数据可能不是55H,是F5H吗?
;此君真是“做鬼也风流”呀!!!佩服!!!
;-------------------------------------------------
;2个脉冲信号必须除2,此君对吗???
;-------------------------------------------------
    MOV   A,R6
    CLR   C
    RRC   A;R6/2
    MOV   R4,A;暂存R4=R6/2
    MOV   A,R7
    RRC   A;R7/2+CY*80H
    ADD   A,R7
    MOV   R7,A;R7=R7+R7/2+(CY*80H)
    MOV   A,R4
    ADDC  A,R6
    MOV   R6,A;R6=R6+R6/2+CY
    MOV   A,R7
;-------调整误差------------------------------
    ADD   A,#010H;调整误差(关TR2有些晚)
    MOV   R7,A
    CLR   A
    ADDC  A,R6;加进位
    MOV   R6,A
;-------再次调整----------------------------
    MOV   A,R7
    MOV   R0,#005H;
L00F3:    XCH   A,R6;保存ACC,取R6
    CLR   C
    RRC   A;R6=R6/2
    XCH   A,R6;恢复ACC,取R6=R6/2
    RRC   A;RRC (R7)
    DJNZ  R0,L00F3
    MOV   R7,A
;-------完成波特率自动校准运算-------------
;由于51的T2是+1定时器,故结果必须取反
;R6:R7=-R6:R7
;------------------------------------------
    CLR   C
    CLR   A
    SUBB  A,R7;A=-R7(递增定时器)
    MOV   RCAP2L,A;得到自动校准后的波特率
    MOV   TL2,A;得到自动校准后的波特率
    CLR   A
    SUBB  A,R6;A=-R6(递增定时器)
    MOV   RCAP2H,A;得到自动校准后的波特率
    MOV   TH2,A;得到自动校准后的波特率
;--------------------------------------------
    MOV   T2CON,#034H;RCLK=TCLK=1,TR2=1
    MOV   SCON,#05AH;8位数据
;---------------------------------------------------
L010E:    CLR   RI
L0110:    JNB   RI,$;等待接收数据
    MOV   A,SBUF;取8位串行数据
    CJNE  A,#011H,L010E;接收不到11H进入死循环
;-------胜利大逃亡!哈哈哈哈------------------------
    LJMP  L0546
;---------------------------------------------------
;此君是何方高人???连波特率自动校准也忘不了搞鬼!
;这鬼确实搞大了!连串口数据通讯的波特率也加了密!!!
;这个密真是“杀人不见血”呀!!!!!!!!!!!!!
;----------------------------------------------------
S011B:    MOV   C,RI
    RET
S011E:    MOV   C,TI
    RET
S0121:    MOV   A,SBUF;取串行数据
    RET
S0124:    MOV   SBUF,A;发送串行数据
    RET
S0127:    CLR   TI
    RET
S012A:    SETB  TI
    RET
S012D:    CLR   RI
    RET
S0130:    CLR   ES;禁止串行中断
    RET
S0133:    SETB  ES;开放串行中断
    RET
S0136:    RET
S0137:    RET
S0138:    MOVX  @DPTR,A
    RET
;-------------------------------------------
        ORG   300H
;-------保护现场数据------------------------
L0300:    PUSH  DPL
    PUSH  DPH
    MOV   DPTR,#0FF08H;?(ACC)
    MOVX  @DPTR,A
    MOV   A,PSW
    INC   DPTR;DPTR=0FF09H(PSW)
    MOVX  @DPTR,A
    CLR   A
    MOV   PSW,A
    XCH   A,IE
    INC   DPTR;DPTR=0FF0AH(IE)
    MOVX  @DPTR,A
    POP   ACC;(DPH)
    INC   DPTR;DPTR=0FF0BH(DPH)
    MOVX  @DPTR,A
    POP   ACC;(DPL)
    INC   DPTR;DPTR=0FF0CH(DPL)
    MOVX  @DPTR,A
    POP   ACC;(PCH)
    INC   DPTR;DPTR=0FF0DH(PCH)
    MOVX  @DPTR,A
    POP   ACC;(PCL)
    INC   DPTR;DPTR=0FF0EH(PCL)
    MOVX  @DPTR,A
    INC   DPTR;DPTR=0FF0FH(SP)
    CLR   A
    MOVC  A,@A+DPTR
    XCH   A,SP;改写SP(SP已被4个POP指令破坏)
    MOVX  @DPTR,A
    MOV   A,B
    INC   DPTR;DPTR=0FF10H(B)
    MOVX  @DPTR,A
    MOV   A,R0
    INC   DPTR;DPTR=0FF12H(R0)
    MOVX  @DPTR,A
    MOV   R0,#000H
L0332:    INC   R0
    INC   DPTR
    CLR   A
    MOVC  A,@A+DPTR
    XCH   A,@R0
    MOVX  @DPTR,A
    MOV   A,R0
    CJNE  A,#06FH,L0332
    LCALL S0137;RET;神经病!
    LCALL S03A0
    LCALL L0CD0
;-------R0:R1-3--------------------------
    LCALL S0BD4;交换DPH:DPL和R0:R1
    LCALL S0AEC;DPTR-1(DEC DPTR)
    LCALL S0AEC;DPTR-1(DEC DPTR)
    LCALL S0AEC;DPTR-1(DEC DPTR)
S0351:    LCALL S0BD4;交换DPH:DPL和R0:R1
    MOV   DPTR,#0FF0DH;?
    MOV   A,R0
    MOVX  @DPTR,A
    INC   DPTR
    MOV   A,R1
    MOVX  @DPTR,A
    LCALL S012A;SETB TI
    RET;返回调用地址+3
S0360:    MOV   R2,#001H
S0362:    LCALL L0CD0
    MOV   R6,001H
    MOV   R5,000H
L0369:    LCALL S0C0C;MOVC A,@R2*6+DPTR
    CJNE  A,#001H,L039B
    PUSH  DPH
    PUSH  DPL
    LCALL S0BCA
    CLR   C
    MOV   A,R6
    SUBB  A,R1
    MOV   R4,A
    MOV   A,R5
    SUBB  A,R0
    JNZ   L038A
    CJNE  R4,#002H,L0381
L0381:    JNC   L038A
    MOV   028H,#008H
    MOV   A,#001H
    SJMP  L0396
L038A:    MOV   A,#012H
    LCALL S0BDF
    MOV   A,#002H
    LCALL S0BDF
    MOV   A,#003H
L0396:    POP   DPL
    POP   DPH
    MOVX  @DPTR,A
L039B:    INC   R2
    CJNE  R2,#00CH,L0369
    RET
S03A0:    MOV   R2,#00BH
L03A2:    LCALL S0C0C;MOVC A,@R2*6+DPTR
    CJNE  A,#003H,L03B4
    MOV   A,#001H
    MOVX  @DPTR,A
    LCALL S0BCA
    LCALL S0BDD
    LCALL S0BDD
L03B4:    DJNZ  R2,L03A2
S03B6:    MOV   A,#081H
;-------读数据--------------------
S03B8:    SETB  010H;置READ命令
    MOV   R0,A
    SJMP  L03C1
L03BD:    MOV   R0,#081H
;-------写数据--------------------
S03BF:    CLR   010H;置WRITE命令
L03C1:    MOV   DPTR,#0FF08H;?
    CJNE  R0,#0E0H,L03C9
    SJMP  L03ED
L03C9:    INC   DPTR;0FF09H
    CJNE  R0,#0D0H,L03CF
    SJMP  L03ED
L03CF:    INC   DPTR;0FF0AH
    CJNE  R0,#0A8H,L03D5
    SJMP  L03ED
L03D5:    INC   DPTR;0FF0BH
    CJNE  R0,#083H,L03DB
    SJMP  L03ED
L03DB:    INC   DPTR;0FF0CH
    CJNE  R0,#082H,L03E1
    SJMP  L03ED
L03E1:    MOV   DPTR,#0FF0FH;?
    CJNE  R0,#081H,L03E9
    SJMP  L03ED
L03E9:    INC   DPTR;0FF10H
    CJNE  R0,#0F0H,L03F5
L03ED:    JB    010H,L03F2
;-------10H='0'WRITE---------------
    MOVX  @DPTR,A
    RET
L03F2:
;-------10H='1'READ----------------
        CLR   A
    MOVC  A,@A+DPTR
    RET
;-------以下是最简单的散转程序方法之一------------
;本程序最难攻之处!
;虽然“超级反汇编”软件已将数据和代码剥离
;但该处散转入口地址很难找到。(必需知道硬件)
L03F5:    MOV   R1,#0E5H;读数据
    JB    010H,L03FC
    MOV   R1,#088H;写数据
L03FC:    PUSH  ACC;保护ACC
    MOV   DPTR,#0FFC3H;?
    MOV   A,R1
    LCALL S09F4;在此搞鬼...
    MOV   R1,DPL
    MOV   A,DPH
    XCH   A,R0
    INC   DPTR
    LCALL S0BF0;在此继续搞鬼...
    MOV   A,#022H
    LCALL S0BF0;在此继续搞鬼...
;--------------------------------------------------
    MOV   DPL,R1;散转程序地址低8位
    MOV   DPH,R0;散转程序地址高8位
    CLR   A
    POP   000H;恢复到R0
;--------------------------------------------------
    JMP   @A+DPTR;?散转程序很隐蔽
;--------------------------------------------------
;此处逃过了“超级反汇编”的“眼睛”
;HotPower心里真难受。。。真想“哭”
;但是,这里让计算机分析“太难为情了”
;--------------------------------------------------
L041B:    MOV   A,#0E0H
    LCALL S03B8;读数据
    MOV   DPL,02CH
    MOV   DPH,02BH
    MOVC  A,@A+DPTR
    MOV   R0,#0E0H
    LJMP  S03BF;写数据
S042C:    LCALL S03B6
    PUSH  006H
    MOV   R1,A
    MOV   A,02CH
    LCALL S0A18
    MOV   A,02BH
    LCALL S0A18
    MOV   A,R1
    POP   006H
    LJMP  L03BD
。。。。。。。
;-------版本号V3.0------------------------------------
D0542:    DB    056H,033H,02EH,030H;'V3.0'
;-------主程序开始------------------------------------
;此君真行,胜利大逃亡后还要将一大堆数据放在前面!!!
;可惜,此君“生不逢时”,遇上了HotPower!!!
;-----------------------------------------------------
L0546:    MOV   SP,#007H
    MOV   DPTR,#0FF08H;?
        CLR   A
    MOV   R0,#005H
L054F:    MOVX  @DPTR,A;0FF08H~0FF0CH=00H
。。。。。。。。。。。



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条