DX帮忙看一下这段汇编代码,看了半天看不懂,怀疑是加密算法
如题:Q10D6: CLR A ;10D6 E4
MOVCA,@A+DPTR ;10D7 93
INC DPTR ;10D8 A3
MOV R0,A ;10D9 F8
Q10DA: CLR A ;10DA E4
MOVCA,@A+DPTR ;10DB 93
INC DPTR ;10DC A3
JC Q10E2 ;10DD 40 03
MOV @R0,A ;10DF F6
SJMPQ10E3 ;10E0 80 01
Q10E2: MOVX@R0,A ;10E2 F2
Q10E3: INC R0 ;10E3 08
DJNZR7,Q10DA ;10E4 DF F4
SJMPQ1109 ;10E6 80 21
Q10E8: CLR A ;10E8 E4
MOVCA,@A+DPTR ;10E9 93
INC DPTR ;10EA A3
MOV R0,A ;10EB F8
ANL A,#07H ;10EC 54 07
ADD A,#0CH ;10EE 24 0C
XCH A,R0 ;10F0 C8
CLR C ;10F1 C3
RLC A ;10F2 33
SWAPA ;10F3 C4
ANL A,#0FH ;10F4 54 0F
ORL A,#20H ;10F6 44 20
XCH A,R0 ;10F8 C8
MOVCA,@A+PC ;10F9 83
JC Q1100 ;10FA 40 04
CPL A ;10FC F4
ANL A,@R0 ;10FD 56
SJMPQ1101 ;10FE 80 01
Q1100: ORL A,@R0 ;1100 46
Q1101: MOV @R0,A ;1101 F6
DJNZR7,Q10E8 ;1102 DF E4
SJMPQ1109 ;1104 80 03
Q1106: MOV DPTR,#000EH ;1106 90 00 0E//数据指针寄存器DPTR=000EH
Q1109: CLR A ;1109 E4
MOV R6,#01H ;110A 7E 01
MOVCA,@A+DPTR ;110C 93
JZ Q10D3 ;110D 60 C4
INC DPTR ;110F A3
MOV R7,A ;1110 FF
ANL A,#3FH ;1111 54 3F
JNB ACC.5,Q111F ;1113 30 E5 09
ANL A,#1FH ;1116 54 1F
MOV R6,A ;1118 FE
CLR A ;1119 E4
MOVCA,@A+DPTR ;111A 93
INC DPTR ;111B A3
JZ Q111F ;111C 60 01
INC R6 ;111E 0E
Q111F: XCH A,R7 ;111F CF
ANL A,#0C0H ;1120 54 C0
ADD A,ACC ;1122 25 E0
JZ Q10D6 ;1124 60 B0
JC Q10E8 ;1126 40 C0
CLR A ;1128 E4
MOVCA,@A+DPTR ;1129 93
INC DPTR ;112A A3
MOV R2,A ;112B FA
CLR A ;112C E4
MOVCA,@A+DPTR ;112D 93
INC DPTR ;112E A3
MOV R0,A ;112F F8
Q1130: CLR A ;1130 E4
MOVCA,@A+DPTR ;1131 93
INC DPTR ;1132 A3
XCH A,R0 ;1133 C8
XCH A,DPL ;1134 C5 82
XCH A,R0 ;1136 C8
XCH A,R2 ;1137 CA
XCH A,DPH ;1138 C5 83
XCH A,R2 ;113A CA
MOVX@DPTR,A ;113B F0
INC DPTR ;113C A3
XCH A,R0 ;113D C8
XCH A,DPL ;113E C5 82
XCH A,R0 ;1140 C8
XCH A,R2 ;1141 CA
XCH A,DPH ;1142 C5 83
XCH A,R2 ;1144 CA
DJNZR7,Q1130 ;1145 DF E9
DJNZR6,Q1130 ;1147 DE E7
SJMPQ1109 ;1149 80 BE
Q114B: MOV A,R7 ;114B EF
ADD A,0BH ;114C 25 0B
MOV R7,A ;114E FF
MOV A,R6 ;114F EE
ADDCA,0AH ;1150 35 0A
MOV R6,A ;1152 FE
MOV A,R5 ;1153 ED
ADDCA,09H ;1154 35 09
MOV R5,A ;1156 FD
MOV A,R4 ;1157 EC
ADDCA,08H ;1158 35 08
MOV R4,A ;115A FC
LJMPQ11D8 ;115B 02 11 D8 你这个明显是反编译hex码来的.意图? 意图是看明白里面的算法,然后自己用c写,不知道可行否? 51的,建議軟件模擬,跟蹤一下 .我頭暈,幫不了你,抱歉. 哈哈,没关系,总算看懂一点, 延时(((231*8)+8+4)*14)+8=26048个机器周期?
但是不明白为什么要压栈?
Q1383: PUSH07H ;1383 C0 07
MOV R7,#0E7H ;1385 7F E7// E7H=231
Q1387: NOP ;1387 00
NOP ;1388 00
NOP ;1389 00
NOP ;138A 00
NOP ;138B 00
NOP ;138C 00
DJNZR7,Q1387 ;138D DF F8
NOP ;138F 00
POP 07H ;1390 D0 07
RET ;1392 22
;==========================================================================
Q1393: PUSH06H ;1393 C0 06
MOV R6,#14H ;1395 7E 14
Q1397: LCALL Q1383 ;1397 12 13 83
DJNZR6,Q1397 ;139A DE FB
POP 06H ;139C D0 06
RET ;139E 22 07H = R7? 应该不是吧,07H应该是系统复位时堆栈指针SP的值。
下面还对06H进行了压栈和出栈。 建議軟件模擬,跟蹤一下。怎么进行软件模拟?请指点,谢谢。 把HEX 直接变成 C就好了 我也想啊,前面有个贴子在讨论阿,很多高手都否了。 51很久沒用了,都不大記得了.我以為07H=R7,先保存其值再裝入立即數#0E7H ,(很多人習慣,在子程序用到記存器時,先保存其值,這樣其它地方用到這記存器時就不會攪亂它的內容了)故要压栈 ,以下的06H,R6同理
怎么进行软件模拟? 用keil呀,開個project,把它單步執行看看它做了些啥,當然你先要把程序修改成可運行的. Q114B: MOV A,R7 ;114B EF
ADD A,0BH ;114C 25 0B
MOV R7,A ;114E FF
MOV A,R6 ;114F EE
ADDCA,0AH ;1150 35 0A
MOV R6,A ;1152 FE
MOV A,R5 ;1153 ED
ADDCA,09H ;1154 35 09
MOV R5,A ;1156 FD
MOV A,R4 ;1157 EC
ADDCA,08H ;1158 35 08
MOV R4,A ;115A FC
LJMPQ11D8 ;115B 02 11 D8
======================================================================================
功能:
R4R5R6R7(unsigned long类型,R4为MSB) += RAM(unsigned long类型,0x08为MSB) Q1130: CLR A ;1130 E4
MOVCA,@A+DPTR ;1131 93
INC DPTR ;1132 A3
XCH A,R0 ;1133 C8
XCH A,DPL ;1134 C5 82
XCH A,R0 ;1136 C8
XCH A,R2 ;1137 CA
XCH A,DPH ;1138 C5 83
XCH A,R2 ;113A CA
MOVX@DPTR,A ;113B F0
INC DPTR ;113C A3
XCH A,R0 ;113D C8
XCH A,DPL ;113E C5 82
XCH A,R0 ;1140 C8
XCH A,R2 ;1141 CA
XCH A,DPH ;1142 C5 83
XCH A,R2 ;1144 CA
DJNZR7,Q1130 ;1145 DF E9
DJNZR6,Q1130 ;1147 DE E7
SJMPQ1109 ;1149 80 BE
======================================================================================
功能:
ROM中数据块送往XRAM中;ROM中数据块的起始地址由DPTR取得;XRAM中目标区域的首址由R2R0取得(R2为高8位);数据块长度由R6、R7取得,为(R6-1)* 256 + R7,其中R6和R7的取值范围为1~256,也就是说如果为零,则最后的效果为256。 Q10D6: CLR A ;10D6 E4
MOVCA,@A+DPTR ;10D7 93
INC DPTR ;10D8 A3
MOV R0,A ;10D9 F8
Q10DA: CLR A ;10DA E4
MOVCA,@A+DPTR ;10DB 93
INC DPTR ;10DC A3
JC Q10E2 ;10DD 40 03
MOV @R0,A ;10DF F6
SJMPQ10E3 ;10E0 80 01
Q10E2: MOVX@R0,A ;10E2 F2
Q10E3: INC R0 ;10E3 08
DJNZR7,Q10DA ;10E4 DF F4
SJMPQ1109 ;10E6 80 21
======================================================================================
功能:
ROM中数据块送往IRAM中或XRAM中的PDATA区(由传进来的C标志位决定);目标区域的首址为入口处DPTR指向的ROM中的值;数据块紧跟在其后;数据块长度由传入的R7取得,其中R7的取值范围为1~256,也就是说如果为零,则最后的效果为256。 Q10E8: CLR A ;10E8 E4
MOVCA,@A+DPTR ;10E9 93
INC DPTR ;10EA A3
MOV R0,A ;10EB F8
ANL A,#07H ;10EC 54 07
ADD A,#0CH ;10EE 24 0C
XCH A,R0 ;10F0 C8
CLR C ;10F1 C3
RLC A ;10F2 33
SWAPA ;10F3 C4
ANL A,#0FH ;10F4 54 0F
ORL A,#20H ;10F6 44 20
XCH A,R0 ;10F8 C8
MOVCA,@A+PC ;10F9 83
JC Q1100 ;10FA 40 04
CPL A ;10FC F4
ANL A,@R0 ;10FD 56
SJMPQ1101 ;10FE 80 01
Q1100: ORL A,@R0 ;1100 46
Q1101: MOV @R0,A ;1101 F6
DJNZR7,Q10E8 ;1102 DF E4
SJMPQ1109 ;1104 80 03
======================================================================================
功能:
ROM中数据块送往IRAM中的BDATA区;目标为IRAM中的BDATA区中的某个/某些位;操作为对这个/这些位进行置位或清零;数据块由传入的DPTR取得,数据块长度由传入的R7取得,其中R7的取值范围为1~256,也就是说如果为零,则最后的效果为256(实际这里最大取得128);数据块中的一个字节对应BDATA区中的一个位,该字节的最高位表示是要将目标位置位(为1时)还是清零(为0时),该字节的低七位指定目标位的地址,在程序中使用这七位中的高4位来定位目标位所在的目标字节的地址、使用这七位中的低3位来定位目标位在目标字节中位 位置(通过查询一个位图,该位图紧跟在这段代码最后一句SJMP的后面,共8个字节,依次为0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80)。 Q1109: CLR A ;1109 E4
MOV R6,#01H ;110A 7E 01
MOVCA,@A+DPTR ;110C 93
JZ Q10D3 ;110D 60 C4
INC DPTR ;110F A3
MOV R7,A ;1110 FF
ANL A,#3FH ;1111 54 3F
JNB ACC.5,Q111F ;1113 30 E5 09
ANL A,#1FH ;1116 54 1F
MOV R6,A ;1118 FE
CLR A ;1119 E4
MOVCA,@A+DPTR ;111A 93
INC DPTR ;111B A3
JZ Q111F ;111C 60 01
INC R6 ;111E 0E
Q111F: XCH A,R7 ;111F CF
ANL A,#0C0H ;1120 54 C0
ADD A,ACC ;1122 25 E0
JZ Q10D6 ;1124 60 B0
JC Q10E8 ;1126 40 C0
======================================================================================
功能:
带结束检测的数据段作用分析;如果传入的DPTR所指向的数据(ROM中)为0,则说明结束;不为0,则该字节后其后的一字节数据说明再之后一段数据的长度以及将要送入哪个RAM区域;这两个字节可以称之为数据头,数据头第一字节的高两位表明后面的数据将被送入哪个RAM区域,X0(00或10)时由Q10D6程序段处理送入PDATA区或IDATA区(00为IDATA区,10为PDATA区)、11时由Q10E8程序段处理送入BDATA区、01时执行下面紧跟着的代码(再取数据区中的两个字节送入R2R0后执行Q1130程序段,将后面的数据送入XDATA区);这些程序段完成后均返回Q1109标号处,可以处理连续存放的多个数据段,最后的0x00表示整个数据段的结束;程序的入口为Q1109标号的前一句:“Q1106: MOV DPTR,#000EH ;1106 90 00 0E//数据指针寄存器DPTR=000EH”,表示整个数据段的起始地址为ROM中的0x000E单元。 最后,这段程序的作用就是完成51单片机的各个存储空间中的全局变量、静态变量的初始化。 望啊莫加精。 楼主没来……
lusson没来……
阿莫一样没来…… 呵。楼主估计早忘了这事了,
加精的话可是给楼主加而不是给你加啊。这边是比较不热闹。 那就给我加积分?积分是做什么用的?
*^_^* 没用的哈
楼上有耐性哈 耐性?你是指分析代码的耐性吗?
其实只是觉得可以在帮助别人的同时可以提高自己还可以炫耀一下自己,呵呵~~~~ 这个要MARK,以后学习 这个汇编,明显是高级语言编译形成的.
页:
[1]