📄 rc6a.s
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; AVR单片机速度优化 RC6 加密算法
; 在有128bytes RAM 的AVR单片机上执行 rc6 16/10/8(16 bit/10 rounds/8 bytes keys)
; 对多数代码进行了 C 语言优化,对数据相关循环移位,模乘等用ASM优化
; 在4MHz无乘法器的AVR上得到平均 1172 Bytes/s的加解密速度。
; 编译器: AVR-GCC
; 执行速度:
; key_setup 8224 时钟周期
; encrypt 2766 时钟周期/分组(64bit)
; decrypt 2697 时钟周期/分组(64bit)
; 平均 2731 时钟周期/分组(64bit)
;
; 2002 孔卫红 netvideo1@sina.com http://netvideo.yeah.net
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#define __AVR_AT90S2343__
#include "macros.inc"
.macro X_rotl_1 regd
bst (\regd)+1,7
rol (\regd)
rol (\regd)+1
bld (\regd),0
.endm
.macro X_rotr_1 regd
bst (\regd),0
ror (\regd)+1
ror (\regd)
bld (\regd)+1,7
.endm
.macro SwapWord
mov r0,r25
mov r25,r24
mov r24,r0
.endm
;
; uint16_t rotlw(register uint16_t d,register uint8_t n);
;
.global rotlw
.func rotlw
rotlw:
mov r18,r22;
andi r18,15;
sbrc r18,3
XJMP .lsup8
; r18<8
sbrc r18,2
XJMP .lsup4
;// r18<4
.lsup4: ;// 4<=r18<8
SwapWord
subi r18,8
neg r18
XJMP .rshiftn
.lsup8: ;//r18>=8
sbrc r18,2
XJMP .lsup12
;// 8<=r18<12
SwapWord
subi r18,8
XJMP .lshiftn
.lsup12:
subi r18,16
neg r18
XJMP .rshiftn
.endfunc
;/////////////////////////////////////////
.lshiftn:
dec r18
brmi .exit1
X_rotl_1 24
XJMP .lshiftn
.rshiftn:
dec r18
brmi .exit1
X_rotr_1 24
XJMP .rshiftn
.exit1:
ret
;////////////////////////////////////////////
;
;uint16_t rotrw(register uint16_t d,register uint8_t n);
;
.global rotrw
.func rotrw
rotrw:
mov r18,r22;
andi r18,15;
sbrc r18,3
XJMP .rsup8
; r18<8
sbrc r18,2
XJMP .rsup4
;// r18<4
XJMP .rshiftn
.rsup4: ;// 4<=r18<8
SwapWord
subi r18,8
neg r18
XJMP .lshiftn
.rsup8: ;//r18>=8
sbrc r18,2
XJMP .rsup12
;// 8<=r18<12
SwapWord
subi r18,8
XJMP .rshiftn
.rsup12:
subi r18,16
neg r18
XJMP .lshiftn
.endfunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;* Number of words :58 + return
;* Number of cycles :58 + return
;
; unsigned int w_square_mod(unsigned int x);
;
; z=((hi*2^8+lo)*(hi*2^8+lo)) mod 2^16
; = ((2*(hi*2^8)*lo)mod 2^16 + lo*lo)mod 2^16
; = ((2*hi*lo*2^8)mod 2^16 +lo*lo)mod 2^16
; = ((2*hi*lo)mod 2^8)*2^8+lo*lo)mod 2^16
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#define tmp1 r0
#define w1 r30
.global w_square_mod
.func w_square_mod
w_square_mod:
#if __AVR_ENHANCED__
mul r24,r25
mov r25,r0
lsl r25
mov r0,r24
mul r0,r24
mov r24,r0
add r25,r1
clr r1
#else
;(hi_byte*lo_byte) mod 2^8
clr tmp1
sbrc r24,0
add tmp1,r25
lsl r25
sbrc r24,1
add tmp1,r25
lsl r25
sbrc r24,2
add tmp1,r25
lsl r25
sbrc r24,3
add tmp1,r25
lsl r25
sbrc r24,4
add tmp1,r25
lsl r25
sbrc r24,5
add tmp1,r25
lsl r25
sbrc r24,6
add tmp1,r25
;end (byte*byte) mod 2^8
lsl tmp1 ;*2
;;;;;;;;;;;;;;;;;;;;;;;
;lo_byte*lo_byte
;;;;;;;;;;;;;;;;;;;;;;;;
mov w1,r24
#define mc8u w1 ;multiplicand
#define mp8u =r24 ;multiplier
#define m8uL =r24 ;result Low byte
#define m8uH =r25 ;result High byte
;***** Code
mpy8u: clr m8uH ;clear result High byte
lsr mp8u ;shift multiplier
brcc noad80 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad80: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad81 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad81: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad82 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad82: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad83 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad83: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad84 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad84: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad85 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad85: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad86 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad86: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
brcc noad87 ;if carry set
add m8uH,mc8u ; add multiplicand to result High byte
noad87: ror m8uH ;shift right result High byte
ror m8uL ;rotate right result L byte and multiplier
;;;;
; end lo_byte*lo_byte
add r25,tmp1
#endif
ret
.endfunc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -