📄 des.asm
字号:
permute rw3, 0, 3
permute rw4, 7, 2
permute rw4, 6, 1
permute rw4, 5, 0
incf fsr0, f ; The FSR now points to D5
permute rw4, 4, 7
permute rw4, 3, 6
permute rw4, 4, 5
permute rw4, 3, 4
permute rw4, 2, 3
permute rw4, 1, 2
permute rw4, 0, 1
permute rw1, 7, 0
; xor trw1(i) with subkey(i+1), result placed in trw1(i)
; note that trw1=darray[0], ..., trw6=darray[5].
; XOR48 k1, trw1
movfp indf1, wreg ; Get subkey[i][0]
xorwf darray
movfp indf1, wreg ; Get subkey[i][1]
xorwf darray+1
movfp indf1, wreg ; Get subkey[i][2]
xorwf darray+2
movfp indf1, wreg ; Get subkey[i][3]
xorwf darray+3
movfp indf1, wreg ; Get subkey[i][4]
xorwf darray+4
movfp indf1, wreg ; Get subkey[i][5]
xorwf darray+5
nop ; DEBUG
call _Smatrix ; Result back in trw(i)
nop ; DEBUG
call _matrixP
nop ; DEBUG
movfp lw1, wreg
xorwf rw1, f
movfp lw2, wreg
xorwf rw2, f
movfp lw3, wreg
xorwf rw3, f
movfp lw4, wreg
xorwf rw4, f
return
;********************************************************
;* The input array is at trw(i), the output is stored *
;* back in the trw(i). *
;********************************************************
_Smatrix
;-- S1 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw1, bit7
bsf row, bit1
btfsc trw1, bit2
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw1, bit6
bsf row, bit3
btfsc trw1, bit5
bsf row, bit2
btfsc trw1, bit4
bsf row, bit1
btfsc trw1, bit3
bsf row, bit0
;-- Read the corresponding value from the table
movlw low Offset1
addwf row, w
movpf wreg, tblptrl ; (tblptr) = Offset1
movlw high Offset1
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp ; (tblat) = Offet1 --> junk value
tlrd 0, temp
;-- S2 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw1, bit1
bsf row, bit1
btfsc trw2, bit4
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw1, bit0
bsf row, bit3
btfsc trw2, bit7
bsf row, bit2
btfsc trw2, bit6
bsf row, bit1
btfsc trw2, bit5
bsf row, bit0
;-- Read the corresponding value from the table
movfp temp, wreg ; Save previous result
movwf trw1
movlw low Offset2
addwf row, w
movpf wreg, tblptrl
movlw high Offset2
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
;-- S3 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw2, bit3
bsf row, bit1
btfsc trw3, bit6
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw2, bit2
bsf row, bit3
btfsc trw2, bit1
bsf row, bit2
btfsc trw2, bit0
bsf row, bit1
btfsc trw3, bit7
bsf row, bit0
;-- Read the corresponding value from the table
swapf trw1, f
movfp temp, wreg ; Save previous result
addwf trw1, f
movlw low Offset3
addwf row, w
movpf wreg, tblptrl
movlw high Offset3
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
;-- S4 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw3, bit5
bsf row, bit1
btfsc trw3, bit0
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw3, bit4
bsf row, bit3
btfsc trw3, bit3
bsf row, bit2
btfsc trw3, bit2
bsf row, bit1
btfsc trw3, bit1
bsf row, bit0
;-- Read the corresponding value from the table
movfp temp, wreg ; Save previous result
movwf trw2
movlw low Offset4
addwf row, w
movpf wreg, tblptrl
movlw high Offset4
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
;-- S5 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw4, bit7
bsf row, bit1
btfsc trw4, bit2
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw4, bit6
bsf row, bit3
btfsc trw4, bit5
bsf row, bit2
btfsc trw4, bit4
bsf row, bit1
btfsc trw4, bit3
bsf row, bit0
;-- Read the corresponding value from the table
swapf trw2, f
movfp temp, wreg ; Save previous result
addwf trw2, f
movlw low Offset5
addwf row, w
movpf wreg, tblptrl
movlw high Offset5
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
;-- S6 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw4, bit1
bsf row, bit1
btfsc trw5, bit4
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw4, bit0
bsf row, bit3
btfsc trw5, bit7
bsf row, bit2
btfsc trw5, bit6
bsf row, bit1
btfsc trw5, bit5
bsf row, bit0
;-- Read the corresponding value from the table
movfp temp, wreg ; Save previous result
movwf trw3
movlw low Offset6
addwf row, w
movpf wreg, tblptrl
movlw high Offset6
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
;-- S7 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw5, bit3
bsf row, bit1
btfsc trw6, bit6
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw5, bit2
bsf row, bit3
btfsc trw5, bit1
bsf row, bit2
btfsc trw5, bit0
bsf row, bit1
btfsc trw6, bit7
bsf row, bit0
;-- Read the corresponding value from the table
swapf trw3, f
movfp temp, wreg ; Save previous result
addwf trw3, f
movlw low Offset7
addwf row, w
movpf wreg, tblptrl
movlw high Offset7
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
;-- S8 --
clrf row, f ; Clear S_Matrix pointer
btfsc trw6, bit5
bsf row, bit1
btfsc trw6, bit0
bsf row, bit0
rlncf row, 1
rlncf row, 1
rlncf row, 1
rlncf row, 1 ; row pointer
btfsc trw6, bit4
bsf row, bit3
btfsc trw6, bit3
bsf row, bit2
btfsc trw6, bit2
bsf row, bit1
btfsc trw6, bit1
bsf row, bit0
;-- Read the corresponding value from the table
movfp temp, wreg ; Save previous result
movwf trw4
movlw low Offset8
addwf row, w
movpf wreg, tblptrl
movlw high Offset8
addwfc zero, w
movpf wreg, tblptrh
tablrd 0, 1, temp
tlrd 0, temp
swapf trw4, f
movfp temp, wreg ; Save previous result
addwf trw4, f
return
;********************************************************
;* This routine performs the matrix P portion of the *
;* function block of the DES. *
;* *
;* *
;* Generate 32 bits out of the 32 using the matrix P *
;* shown below. *
;* *
;* Matrix P *
;* *
;* 16 7 20 21 *
;* 29 12 28 17 *
;* 1 15 23 26 *
;* 5 18 31 10 *
;* 2 8 24 14 *
;* 32 27 3 9 *
;* 19 13 30 6 *
;* 22 11 4 25 *
;* *
;********************************************************
_matrixP
movlw rw1
movpf wreg, blkPtr ; Prepare for indirect addressing
movlw 0xcf ; Do not change fsr1 status
andwf alusta, f
bsf _fs0
movfp blkPtr, wreg ; Load destination address
movwf fsr0
clrf indf0 ; Clear the destination block D0
clrf indf0 ; Clear the destination block D1
clrf indf0 ; Clear the destination block D2
clrf indf0 ; Clear the destination block D3
movfp blkPtr, wreg ; Reload destination address
movwf fsr0
bsf _fs1 ; Turn off FSR0 auto increment
permute trw2, 0, 7 ; The FSR now points to D0
permute trw1, 1, 6
permute trw3, 4, 5
permute trw3, 3, 4
permute trw4, 3, 3
permute trw2, 4, 2
permute trw4, 4, 1
permute trw3, 7, 0
incf fsr0, f ; The FSR notrw points to D1
permute trw1, 7, 7
permute trw2, 1, 6
permute trw3, 1, 5
permute trw4, 6, 4
permute trw1, 3, 3
permute trw3, 6, 2
permute trw4, 1, 1
permute trw2, 6, 0
incf fsr0, f ; The FSR now points to D2
permute trw1, 6, 7
permute trw1, 0, 6
permute trw3, 0, 5
permute trw2, 2, 4
permute trw4, 0, 3
permute trw4, 5, 2
permute trw1, 5, 1
permute trw2, 7, 0
incf fsr0, f ; The FSR now points to D3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -