⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc6a.s

📁 AVR单片机的优化RC6 加密算法(速度快
💻 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 + -