Цитата(_Артём_ @ Feb 21 2012, 20:02)

А есть готовый реализации?
CODE
;*******************************************************************************
***
;*******************************************************************************
***
; код TEA128Y
; меняються регистры r4, ..., r25
;*******************************************************************************
***
#ifndef TEA128_INC_
#define TEA128_INC_
.DSEG
d_TEA128_DATA: .BYTE 16
d_TEA128_KEY: .BYTE 16
;*******************************************************************************
***
.CSEG
.def d0=r4
.def d1=r5
.def d2=r6
.def d3=r7
.def c0=r8
.def c1=r9
.def c2=r10
.def c3=r11
.def b0=r12
.def b1=r13
.def b2=r14
.def b3=r15
.def Tea_cnta=r16
.def Tea_cntb=r17
.def s0=r18
.def s1=r19
.def s2=r20
.def s3=r21
.def a0=r22
.def a1=r23
.def a2=r24
.def a3=r25
;*******************************************************************************
***
;Обмен с памятью, загрузка костант
.MACRO MLDI32 ;r3,r2,r1,r0, lab data
ldi @0, @4
ldi @1, @5
ldi @2, @6
ldi @3, @7
.ENDMACRO
.MACRO MLDD32 ;r3,r2,r1,r0, lab data
ldd @3, Y+@4+0
ldd @2, Y+@4+1
ldd @1, Y+@4+2
ldd @0, Y+@4+3
.ENDMACRO
.MACRO MLDS32 ;r3,r2,r1,r0, lab data
lds @3, @4+0
lds @2, @4+1
lds @1, @4+2
lds @0, @4+3
.ENDMACRO
.MACRO MSTD32 ;r3,r2,r1,r0, lab data
std Y+@4+3, @0
std Y+@4+2, @1
std Y+@4+1, @2
std Y+@4+0, @3
.ENDMACRO
.MACRO MSTS32 ;r3,r2,r1,r0, lab data
sts @4+3, @0
sts @4+2, @1
sts @4+1, @2
sts @4+0, @3
.ENDMACRO
.MACRO MSUBI32 ;r3,r2,r1,r0, data
subi @3, @7
sbci @2, @6
sbci @1, @5
sbci @0, @4
.ENDMACRO
.MACRO MCLR32 ;r3,r2,r1,r0
clr @0
clr @1
clr @2
clr @3
.ENDMACRO
.MACRO MADD32
add @3, @7
adc @2, @6
adc @1, @5
adc @0, @4
.ENDMACRO
.MACRO MSUB32
sub @3, @7
sbc @2, @6
sbc @1, @5
sbc @0, @4
.ENDMACRO
.MACRO MLSL32
lsl @3
rol @2
rol @1
rol @0
.ENDMACRO
.MACRO MLSR32
lsr @0
ror @1
ror @2
ror @3
.ENDMACRO
.MACRO MEOR32
eor @3, @7
eor @2, @6
eor @1, @5
eor @0, @4
.ENDMACRO
.MACRO FMEMCPY
ldi ZL, low(@1 << 1)
ldi ZH, high(@1 << 1)
ldi XL, low(@0)
ldi XH, high(@0)
ldi r16, @2
call STX_LPM_LOOP
.ENDMACRO
;*******************************************************************************
***
;*******************************************************************************
***
; кодирование
;*******************************************************************************
***
;*******************************************************************************
***
Tea128_enc:
; lds YL, d_TEA128_DATA_L
; lds YH, d_TEA128_DATA_H
ldi Tea_cnta,32
MCLR32 s3, s2, s1, s0 ;sum
Tea128_enc_while:
MSUBI32 s3, s2, s1, s0, 0x61, 0xc8, 0x86, 0x47 ; sum += delta
;*******************************************************************************
***
rcall lfunc_y
MADD32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Сохранил y
;*******************************************************************************
***
rcall lfunc_z
MADD32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Сохранил z
;*******************************************************************************
***
dec Tea_cnta
breq Tea128_enc_end
rjmp Tea128_enc_while
Tea128_enc_end:
ret
;*******************************************************************************
***
;*******************************************************************************
***
; декодирование
;*******************************************************************************
***
Tea128_dec:
; lds YL, d_TEA128_DATA_L
; lds YH, d_TEA128_DATA_H
ldi Tea_cnta,32
MLDI32 s3, s2, s1, s0, 0xC6, 0xEF, 0x37, 0x20 ;sum
Tea128_dec_while:
;*******************************************************************************
***
rcall lfunc_z
MSUB32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Сохранил z
;*******************************************************************************
***
rcall lfunc_y
MSUB32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Сохранил y
;*******************************************************************************
***
MSUBI32 s3, s2, s1, s0, 0x9E, 0x37, 0x79, 0xB9 ; sum -= delta
dec Tea_cnta
breq Tea128_dec_end
rjmp Tea128_dec_while
Tea128_dec_end:
ret
;*******************************************************************************
***
lfunc:
movw d0,a0
movw d2,a2
ldi Tea_cntb,4
lshift4:
MLSL32 d3, d2, d1, d0
dec Tea_cntb
brne lshift4
MADD32 d3, d2, d1, d0, b3, b2, b1, b0
;воспользуюсь b0...3
movw b0,a0
movw b2,a2
ldi Tea_cntb,5
rshift5:
MLSR32 b3, b2, b1, b0
dec Tea_cntb
brne rshift5
MADD32 b3, b2, b1, b0, c3, c2, c1, c0
MEOR32 d3, d2, d1, d0, b3, b2, b1, b0
MADD32 a3, a2, a1, a0, s3, s2, s1, s0
MEOR32 d3, d2, d1, d0, a3, a2, a1, a0
ret
;*******************************************************************************
***
lfunc_y:
MLDD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Загрузил z
MLDS32 b3, b2, b1, b0, d_TEA128_KEY+0 ; Загрузил k[0]
MLDS32 c3, c2, c1, c0, d_TEA128_KEY+4 ; Загрузил k[1]
rcall lfunc ; результата d0...3
MLDD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Загрузил y
ret
;*******************************************************************************
***
lfunc_z:
MLDD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Загрузил y
MLDS32 b3, b2, b1, b0, d_TEA128_KEY+8 ; Загрузил k[2]
MLDS32 c3, c2, c1, c0, d_TEA128_KEY+12 ; Загрузил k[3]
rcall lfunc ; результата d0...3
MLDD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Загрузил z
ret
;*******************************************************************************
***
d_TEA128_KEY_DB: .db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
TEA128_KEY_INIT:
; ldi YL, low(d_TEA128_DATA)
; ldi YH, high(d_TEA128_DATA)
; sts d_TEA128_DATA_L, YL
; sts d_TEA128_DATA_H, YH
FMEMCPY d_TEA128_KEY, d_TEA128_KEY_DB, 16
ret
#endif /* TEA128_INC_ */
вот математика на asm, давно делал

RTEA может выйти и покороче.