反汇编反出的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
。。。。。。。。。。。
文章评论(0条评论)
登录后参与讨论