📄 des_sam.s
字号:
; /************************************************************************
; * Project Name :
; * Module Name : DES encrypt and descrypt routine
; *
; * History Author
; Version Comment
; * 2000.09.16 P.Z.F 0.00
;original version
;
; C语言接口原形定义:
; void DES(uchar idata * DATA_ADDR,uchar idata *KEY_ADDR,bit JA_JE_B)
NAME DES
?PR?_DES?DES SEGMENT CODE INBLOCK
?BI?_DES?DES SEGMENT BIT OVERLAYABLE
?DT?_DES?DES SEGMENT DATA OVERLAYABLE
?ID?_DES?DES SEGMENT IDATA OVERLAYABLE
PUBLIC ?_DES?BIT
PUBLIC _DES
RSEG ?BI?_DES?DES
?_DES?BIT:
JA_JE_B: DBIT 1
ORG 1
D_TMP_B: DBIT 1
RSEG ?DT?_DES?DES
KEY_ADDR: DS 1
DATA_ADDR: DS 1
RSEG ?ID?_DES?DES
L_R_ADDR: DS 8
C_D_ADDR: DS 8
Li_ADDR EQU L_R_ADDR
Ri_ADDR EQU (L_R_ADDR+4)
Ci_ADDR EQU C_D_ADDR
Di_ADDR EQU (C_D_ADDR+4)
RSEG ?PR?_DES?DES
USING 0
_DES:
MOV DATA_ADDR,R7
MOV KEY_ADDR,R5
MOV R6,#8H
MOV R1,DATA_ADDR ;DATA ADDRESS
MOV R2,#L_R_ADDR ;L0 AND R0 ADDRESS
MOV R3,#40H ;BIT POSITION
LLOP1:
MOV R7,#8H
MOV R4,#0
CJNE R6,#4H,LLOP2
MOV R3,#80H
LLOP2: MOV A,R4
RL A
MOV R4,A
MOV A,R1
ADD A,R7
DEC A ;GET THE ADDRESS OF BYTE IN DATA
MOV R0,A
MOV A,@R0 ;GET THE VALUE OF BYTE IN DATA
ANL A,R3
JZ TT1
INC R4
TT1: DJNZ R7,LLOP2 ;IF A BYTE IS OVER
MOV A,R3 ;GET NEW BIT POSITION
RR A ;
RR A ;
MOV R3,A ;
MOV A,R6 ;SAVE THE BYTE TO RAM
DEC A ;
CPL A
ANL A,#07H ;
ADD A,R2 ;
MOV R0,A ;
MOV A,R4 ;
MOV @R0,A ;
DJNZ R6,LLOP1 ;IF DATA IS OVER
;KEY->C0 AND D0
MOV R6,#8
MOV R1,KEY_ADDR
MOV R2,#C_D_ADDR
MOV DPTR,#PC_1
MOV R3,#0H
LLOP3: MOV R7,#7H
MOV R4,#0H
LLOP30: MOV A,R4
RL A
MOV R4,A
MOV A,R3 ;GET VALUE OF PC_1 TABLE
MOVC A,@A+DPTR ;
INC R3
MOV B,#8
DIV AB
ADD A,R1
MOV R0,A ;GET THE ADDRESS OF BYTE IN KEY
MOV A,@R0 ;GET THE VALUE OF BYTE IN KEY
MOV R5,A ;SAVE
MOV A,B ;GET THE BIT POSITION
CPL A
ANL A,#07H
JZ N_LLOP1
MOV B,A
MOV A,#1
LP: RL A
DJNZ B,LP
LJMP E_LLOP1
N_LLOP1: MOV A,#1
E_LLOP1: ANL A,R5
JZ TT2
INC R4
TT2: DJNZ R7,LLOP30 ;IF A BYTE IS OVER
MOV A,R6 ;SAVE THE BYTE TO RAM
DEC A ;
CPL A ;
ANL A,#07H ;
ADD A,R2 ;
MOV R0,A ;
MOV A,R4 ;
MOV @R0,A ;
DJNZ R6,LLOP3 ;IF DATA IS OVER
;BEGIN LLOP
MOV R7,#10H
LLOP:
;Ri->E
MOV R6,#8
MOV R1,#Ri_ADDR
MOV R2,DATA_ADDR
MOV R3,#1FH
LLOP_1: MOV R4,#0
MOV R5,#6
LLOP10: MOV A,R4
RL A
MOV R4,A
MOV A,R3
MOV B,#8
DIV AB
ADD A,R1
MOV R0,A ;GET THE ADDRESS OF BYTE IN Ri-1
MOV A,@R0 ;GET THE VALUE OF BYTE IN Ri-1
MOV R0,A
MOV A,B
CPL A
ANL A,#07H
JZ N_LLOP2
MOV B,A
MOV A,#1
LP10: RL A
DJNZ B,LP10
LJMP E_LLOP2
N_LLOP2: MOV A,#1
E_LLOP2: ANL A,R0
JZ TT10
INC R4
TT10: INC R3
CJNE R3,#20H,WW0
MOV R3,#0
WW0: DJNZ R5,LLOP10 ;IF A BYTE IS OVER
MOV A,R6 ;SAVE THE BYTE TO RAM
DEC A ;
CPL A ;
ANL A,#07H ;
ADD A,R2 ;
MOV R0,A ;
MOV A,R4 ;
MOV @R0,A ;
DEC R3 ;ADJUST THE BIT POSITION
DEC R3 ;
DJNZ R6,LLOP_1 ;IF DATA IS OVER
;C0 AND D0->Ki
MOV A,R7 ;GET THE SHIF BIT NUMBER
DEC A ;
CPL A ;
ANL A,#0FH ;
MOV DPTR,#SHIF ;
MOVC A,@A+DPTR ;
MOV R3,A ;SAVE IN R3
MOV C,JA_JE_B
JC DES0
MOV A,R3
JZ N_SHIF
LLOP0A: MOV R1,#0H ;SET THE INITIATE ADDRESS SHIF VALUE
CLR C
MOV D_TMP_B,C
LP00A: MOV A,R1 ;GET THE Ci-1 BYTE
MOV R4,#Ci_ADDR ;
ADD A,R4 ;
MOV R0,A ;
MOV A,@R0 ;
MOV C,D_TMP_B ;
MOV ACC.7,C
CLR C
RRC A ;SHIF Ci
WW00A: MOV D_TMP_B,C
MOV @R0,A
INC R1
CJNE R1,#4,LP00A;
MOV C,D_TMP_B
JNC WW01A
MOV R0,#Ci_ADDR
MOV A,@R0
MOV C,D_TMP_B
MOV ACC.6,C
MOV @R0,A
WW01A: MOV R1,#0
CLR C
MOV D_TMP_B,C
LP01A: MOV A,R1 ;GET THE Di-1 BYTE
MOV R4,#Di_ADDR ;
ADD A,R4 ;
MOV R0,A ;
MOV A,@R0 ;
MOV C,D_TMP_B ;
MOV ACC.7,C ;
CLR C
RRC A ;SHIF Di
WW02A: MOV D_TMP_B,C
MOV @R0,A
INC R1
CJNE R1,#4,LP01A;
MOV C,D_TMP_B
JNC WW03A
MOV R0,#Di_ADDR
MOV A,@R0
MOV C,D_TMP_B
MOV ACC.6,C
MOV @R0,A
WW03A: DJNZ R3,LLOP0A
N_SHIF: LJMP SH_O
DES0: MOV A,R3
JNZ LLOP0B
INC R3
LLOP0B: MOV R1,#4H ;SET THE INITIATE ADDRESS SHIF VALUE
CLR C
MOV D_TMP_B,C
LP00B: MOV A,R1 ;GET THE Ci-1 BYTE
MOV R4,#Ci_ADDR ;
DEC R4 ;
ADD A,R4 ;
MOV R0,A ;
MOV A,@R0 ;
MOV C,D_TMP_B ;
RLC A ;SHIF Ci
JNB ACC.7,WW00B
CPL C
CPL ACC.7
WW00B: MOV D_TMP_B,C
MOV @R0,A
DJNZ R1,LP00B ;
MOV C,D_TMP_B
JNC WW01B
MOV R0,#Di_ADDR
DEC R0
MOV A,@R0
MOV C,D_TMP_B
MOV ACC.0,C
MOV @R0,A
WW01B: MOV R1,#4H
CLR C
MOV D_TMP_B,C
LP01B: MOV A,R1 ;GET THE Di-1 BYTE
MOV R4,#Di_ADDR ;
DEC R4
ADD A,R4 ;
MOV R0,A ;
MOV A,@R0 ;
MOV C,D_TMP_B ;
RLC A ;SHIF Di
JNB ACC.7,WW02B
CPL C
CPL ACC.7
WW02B: MOV D_TMP_B,C
MOV @R0,A
DJNZ R1,LP01B ;
MOV C,D_TMP_B
JNC WW03B
MOV A,#Di_ADDR
ADD A,#3H
MOV R0,A
MOV A,@R0
MOV C,D_TMP_B
MOV ACC.0,C
MOV @R0,A
WW03B: DJNZ R3,LLOP0B
;SHIF IS OVER
SH_O: MOV R6,#8H
MOV R2,#0H ;SHIF VALUE OF PC_2 TABLE
LLOP11: MOV R4,#0
MOV R5,#6H ;LLOP110 VIABLE
LLOP110: MOV A,R4
RL A
MOV R4,A
MOV A,R2
MOV DPTR,#PC_2
MOVC A,@A+DPTR
INC R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -