|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
;***************************************************************************
; ]& f" w' q; ]0 W% J( s: l;*/ r* p6 G7 |2 F6 U4 A' }% O
;* "mpy16u" - 16x16 Bit Unsigned Multiplication& Z; i6 W$ g- M/ l( q
;*
" f$ q& J' x, [% d7 g2 i* v4 p;* This subroutine multiplies the two 16-bit register variables
6 f1 ?4 H5 s7 ? |;* mp16uH:mp16uL and mc16uH:mc16uL.+ L6 V7 x+ {4 N" w* x$ V# ?* v
;* The result is placed in m16u3:m16u2:m16u1:m16u0.( e" F( k2 m) X% ]
;*; R; z8 c3 A+ i4 g- k. z* H9 i7 ^
;* Number of words :14 + return
4 x; }* v6 ^$ u0 q$ {9 S;* Number of cycles :153 + return
3 M& Q7 A( f/ r3 ]3 \1 }4 G; A; X;* Low registers used :None! e# S; F4 T! ]0 j E( q
;* High registers used :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
( E9 R! @ ^7 n& P5 |/ K: k. o;* m16u3,mcnt16u)! s5 p& m. z2 A" m! d+ {
;*
3 P w% W& x6 m4 L3 `;***************************************************************************( @; J3 a9 a, F% O
5 D& ^" O0 F3 N" ?+ ~, U. M;***** Subroutine Register Variables0 C- O- k5 J- G/ Q o
6 v0 p# b5 l; S9 P. d$ Y.def mc16uL =r16 ;multiplicand low byte5 u; _ v, Z! M( U$ e
.def mc16uH =r17 ;multiplicand high byte; u4 e, _- ?$ Y0 L+ J# X
.def mp16uL =r18 ;multiplier low byte$ ]8 [; n0 P/ I9 h4 {3 o; Z$ W
.def mp16uH =r19 ;multiplier high byte
k. ^+ t3 P& G2 v.def m16u0 =r18 ;result byte 0 (LSB)
* \8 M' f! H9 U w6 U.def m16u1 =r19 ;result byte 1
7 @8 h2 z3 l' }, I8 l.def m16u2 =r20 ;result byte 2
9 P6 r6 x8 k$ O9 A5 }$ Y) V.def m16u3 =r21 ;result byte 3 (MSB)8 O1 d2 U' P. ?2 l0 z
.def mcnt16u =r22 ;loop counter
# P% C* c8 I+ ~+ v9 t% F9 P" A: e4 R. L
;***** Code
# I% s0 x8 o9 K' [+ F# P8 o6 O
0 j- X+ b& a, k6 ?# ~mpy16u: clr m16u3 ;clear 2 highest bytes of result
" } k3 X8 d5 @2 k& s clr m16u25 [9 B7 ?3 ^/ B
ldi mcnt16u,16 ;init loop counter
* x3 M8 l7 W3 o& z/ k9 G4 S8 n lsr mp16uH
, u! Y+ W7 {, H; e3 _ ror mp16uL2 e p+ p4 S3 {: o* u
) ?' W X* h! G4 t: ^
m16u_1: brcc noad8 ;if bit 0 of multiplier set; I; w/ W% w" Z" n. H/ j
add m16u2,mc16uL ;add multiplicand Low to byte 2 of res: W! i' n5 T6 |# Y6 u5 u
adc m16u3,mc16uH ;add multiplicand high to byte 3 of res
7 t; G! \' O* E/ \& h4 r3 k e; Vnoad8: ror m16u3 ;shift right result byte 3! h' M9 v9 i( E; L, g
ror m16u2 ;rotate right result byte 2" R2 w c) o) p( I6 K6 f, m
ror m16u1 ;rotate result byte 1 and multiplier High
9 P2 w6 U+ @4 R0 E4 U P: d, d, s2 h8 e ror m16u0 ;rotate result byte 0 and multiplier Low( Y8 _) u% N) g
dec mcnt16u ;decrement loop counter
' k* S T8 Z) J6 G" x n( k) P brne m16u_1 ;if not done, loop more8 ]4 x6 c# s, |1 t6 O
ret
# q" u6 ]0 u e+ S7 E7 ]
" x6 L& p" m1 z J: d- j# I+ R/ K8 m% x/ a" o7 i
$ x/ U' o) U4 f& y8 e9 f/ }! w1 K
;......................
8 w- `5 S# }/ r/ f+ R
. D2 ~1 q5 {# p$ a;被除数:R19(HIGH)R18 R17 R16(LOW)
- Z7 {: a* A8 D! l* k" P# d1 F J1 t' }: v4 i/ h- t" m/ F
;除数:R21(HIGH)R20# J, X/ V8 H. Y0 F) ^! w
% k4 g; d- G- _, O5 z: k;结果:R17(HIGH)R16& j' @" c- H, q2 J
;余数:R19(HIGH)R18
. J) g1 A6 k# Z% R7 I% D) k# p;计数器,R220 |2 x% `, E$ f2 P% X
( `* W7 ~( T8 P3 H7 ]3 A9 m;.................................................../ D* x. |2 N# |/ p7 m* q8 ^
d32v16u: ; 32位/16位无符号除法) O8 K! q5 w# ?; S5 c# y9 T* m
cp r18,r20 ;被除数高16位 > 除数
7 }5 m7 @4 j" d cpc r19,r21 ;结果溢出8 I* x0 g m$ {: X
brcc cc
4 k: P, t5 }9 _- Y' q* k; h ldi r22,$10 ;初始化循环计数器
1 w6 m9 D/ M( d& n rol r16 ;左移被除数2 ~3 {+ d; g: _1 ]6 P! M
rol r17
- E$ P" {1 x" N* ~/ naa:
" H' Y0 q5 b* V) _3 M rol r18 ;左移余数(被除数移到除数) ~: q6 g$ n* p9 l1 s3 h
bst r19,7
7 y; H( T- F9 K' E" `8 Y6 I- ~! D rol r19
; P4 T: i' ^' v8 ] sub r18,r20 ;余数-除数
9 w8 G/ n3 O1 Z' [. ^ sbc r19,r212 ^- t" ^- ]' m6 T) z; x& }: G
brts loop ;够减,跳至 loop
0 ?1 @% _# H; l' R# x* V brcc loop
8 M/ h6 B; C/ L# N3 n- I add r18,r20 ;不够减,再加除数
0 [/ M% F( ~2 E( A. u8 G adc r19,r21
& O6 V6 ?6 s& @6 {1 g n6 } clc ;清进位位8 U; l$ F" r9 U
rjmp loop10 v* U8 Y( [5 d% y: A9 ]- J
loop:2 D$ @' l }* [+ w
sec ;置进位位2 f" ^3 N3 u. X+ G6 L
loop1:% @, G% {4 r$ {. e4 S
rol r16 ;左移结果
4 |: ~/ ~+ C% R. V1 \3 k rol r17
0 r/ o! x2 G+ o; }' m dec r22 ;计数器减 1( Z4 Z4 p2 ]; ?% K" `8 b# N" l4 D
brne aa ;不为 0,再循环- _0 B b" b- q
clt ;清 t 标志
Y" O1 ^# r$ f- Z ret9 w0 d. n; x q
cc:
0 K9 W) \+ {2 E9 p" @ set ;置 t 标志
5 T1 f1 S; R) k) s ret4 Y5 B7 G0 B; l' W! N5 h2 d
, v' t& i" L! @: l5 t2 t/ ]
;...................................
# D5 F) V H3 w. A1 v
; I% [6 v( [: t I+ ^( `
4 `5 h9 h( T% B9 |/ L6 q% A8 r# D2 t5 y8 v, B$ k$ J! S
% H1 v" t, A& W; {. u" V/ t4 d) c, p" w: _" j8 R
3 Z: q# K4 r# ?& V% {$ E9 {
: ]+ U' s/ j ~6 `6 g
/ \: Z7 m" z/ Q3 V8 p4 T2 C" I8 r$ \2 D2 X- u7 o
. x0 P$ H) x, x5 k$ q7 V% t" F3 D- ~4 L, v
;......................% B" [7 B! ^! l8 y
' d8 W: t9 d; X4 N
;被除数:R17(HIGH) R16(LOW)
4 t$ K( ]9 p* Z3 C9 f6 D1 @% W
( x: A( {* G$ v: n R: Z0 _& y;除数:R21(HIGH)R20
( Y( u7 z7 ] k' b% ?+ j6 v7 M. ?, b# W Z5 W4 \
;结果:R17(HIGH)R162 |' v2 `/ R8 ~6 [) t5 Y! ]
;余数:R19(HIGH)R18! z' O7 e% Y- e& O- _! x
;计数器,R224 C+ V" p2 B% f) F; {* a' v+ G% Y3 x
+ ]# ?; |. L6 V; b7 I
;...................................................6 M, s. @) u/ k! m$ r1 q: u8 K
d16v16u: ; 32位/16位无符号除法
+ ~+ U) N9 }' J$ \" u6 G; cp r18,r20 ;被除数高16位 > 除数
5 F& _6 Y( j5 j% w' ]& X; cpc r19,r21 ;结果溢出 |! K9 q, Q- M- X! H) t/ w
; brcc cc % y5 b' p. ~/ _
: l6 @( ]0 F/ s! j# b clr r19
5 f7 _# H3 q2 s: j' w clr r18
% L0 P0 Z+ t$ ]7 F) B0 j9 [ 9 @, }8 _1 K1 h8 _# j
ldi r22,$10 ;初始化循环计数器
o2 {1 L+ G. P2 F3 P# Y rol r16 ;左移被除数5 Y4 M) m% @5 f0 f" Z6 z/ Y7 w8 K8 {
rol r17, v" k" U( |6 D
vaa:$ X. Z7 p1 H7 E3 B& v& {/ @2 |
rol r18 ;左移余数(被除数移到除数)
+ B& T1 ~! y4 g% T# Q bst r19,7
* k* ^; ?: t+ T/ N7 O rol r19
- f+ L2 v4 \& G) M sub r18,r20 ;余数-除数' c- x" H$ E- v8 B
sbc r19,r21; e2 }9 r( l3 U
brts vloop ;够减,跳至 loop
/ P$ \. ~( e" U2 q. I0 H brcc vloop
4 x* G3 a3 U I: D add r18,r20 ;不够减,再加除数
" R8 E8 A4 B: ^* R( b# z adc r19,r214 h/ z1 y0 R3 }" I; V
clc ;清进位位 g; ?1 j( W# _
rjmp vloop14 A. t. Y6 _; J4 y4 U
vloop:
4 m3 O9 T8 D! ? Y+ \ sec ;置进位位0 j% m) s* g0 z' S; l
vloop1:" |( m* `& n3 k/ P1 X
rol r16 ;左移结果0 d; b- r5 `. V% [( Q
rol r17; f8 }* Q, l/ q6 M# c; | Y
dec r22 ;计数器减 1
: p* g/ r9 `) O% X/ @ brne vaa ;不为 0,再循环* i" W! `2 [$ \8 [( U# Y
clt ;清 t 标志' V% @* M* }. ~6 F
ret) z, }* r2 m4 t- N# G
;cc:
/ _+ r$ K0 d3 R; set ;置 t 标志0 a: _% P5 x/ L. j
; ret
. T5 V0 k0 `/ a3 h n
* s" T# N$ X1 S0 K) y
* f+ ]% d7 |: ?3 V5 n# g3 C;..............................$ H! f q O! S. S( Q
4 Q$ l/ M( [7 w" c
* S1 o: |0 x1 n$ g2 E$ b2 v
& X% q% B5 H! {/ k# J4 P N
, L% M# B! W& L$ z* A& s% e$ A+ f4 d9 h8 P \
7 u/ g& n1 C1 z
4 k5 M. e7 [7 ?. {
+ S' T+ [$ o# l2 N
3 A0 u7 J) e% p. s4 y" ?, D" W N* V1 \
;...r17:r16(hex)--->r20(万位):r19(千位):r18(百位):r17(十位):r16(bcd)
+ x% R; Z2 M! q$ q% x/ Q/ [ ; 结果值在每字节里只存一位,即在每字节的低半字节里
( Q/ I% C2 w5 };.....................;调用16位二进制转5位十进制子程
" y) {; n2 H& j( {b16td5:
$ r* {+ ?4 E9 E ser r20 ;r20先送-1) B. g: U, }0 `; s5 e1 N5 h
b16td5_1: * C; E, T7 e U- v
inc r20 ;r20增1
, }- e" Z2 |% E# q subi r16,low(10000) ;(r17:r16)-10000
, f6 i4 f( C0 u: L) I sbci r17,high(10000)! b; o: g# Z* V
brcc b16td5_1 ;够减则返回b16td5_1
0 L7 P% l# h8 `# e" C# ?2 [ subi r16,low(-10000) ;不够减+10000,恢复余数. S- N% J, V+ K) t$ r; v! I2 q
sbci r17,high(-10000)
, {+ I b o z' \. a8 v ser r19 ;r19先送-1
! Y: y* z3 C; G7 _+ Sb16td5_2:
! q3 W3 k# x* t inc r19 ;r19增1 & d) b& A5 S, d. i& N5 t$ S/ }
subi r16,low(1000) ;(r17:r16)-1000
( B# `: J& Y2 F9 b8 y. A$ `/ h sbci r17,high(1000)
( G; E) ~* \' P- @' N brcc b16td5_2 ;够减则返回b16td5_2
+ `& o% A8 e+ M- }( E! l1 G2 ~ subi r16,low(-1000) ;不够减+1000,恢复余数
" U c4 R' \3 |1 | sbci r17,high(-1000)
+ v+ Q$ o8 L# K, |0 ~ ser r18 ;r18先送-1
$ `/ k& a9 D. k. z5 pb16td5_3:' @" E0 `/ T8 ~' T: ]
inc r18 ;r18增1
! C/ Y5 B- S7 o6 v5 usubi r16,low(100) ;(r17:r16)-100
* Z6 c8 p5 `7 C) d/ Q+ y; @ sbci r17,high(100) 7 p- w% T; u e# Q; J* l
brcc b16td5_3 ;够减则返回b16td5_3! ~3 T2 l1 p* ~7 v+ i, K$ R
subi r16,low(-100) ;不够减+100,恢复余数/ [+ e p8 D: c- y
sbci r17,high(-100)8 L9 a& ~/ }4 p6 n
ser r17 ;r17先送-1
* {+ e$ _6 p9 B$ |* ob16td5_4:
7 e/ @: \ i2 c J inc r17 ;r17增1/ I5 a9 ?3 t5 e6 V
subi r16,10 ;(r17:r16)-10
( W" p; c% |9 N8 P brcc b16td5_4 ;够减则返回b16td5_4 / z. [! `+ o [
subi r16,-10 ;不够减+10,恢复余数
6 i" \( q9 t* a) X, j; C$ q/ x ret: _% I8 b5 h4 z* b1 [
;...........................................$ Q8 R0 W6 ?2 M1 t! S$ f: ]7 m
: d8 O. x( l+ N! O2 N) K; L3 u
. ]& c9 N7 H$ Q
4 y5 S9 }0 V# r, R
: W/ J0 z9 i! K7 {5 `5 ?- k a4 T& b2 G/ `
' @0 S z( d7 M2 w' H4 \;...............;r16(high)r19(low)/r17 =r16(结果)+r19(余数)+ e# N" Q s1 D; P+ a5 }) Y
7 w" j) h, N8 R# J { V r* f: `d16v8u: ;16/8无符号除法% Q7 W& v2 i% }# ~. @' ]
cp r16,r17 ;被除数高字节 > 除数
1 u# u" F# C4 V# U$ R8 ~7 a brcc ddd ;结果溢出. D$ Q. Q8 _9 L
ldi r18,8 ;初始化循环计数器
/ k3 H& c( V, i& T$ X3 G! _# { rol r19 ;左移余数(被除数低字节) }6 }; r- q2 K6 d9 O
aaa:
7 F1 b" B4 ]: B9 _0 s( Z- T* S bst r16,7
. v6 Y( t* M' Z$ F+ r: b rol r16 ;左移被除数高字节
( V9 F1 P6 i( }% _$ e4 v& o, l sub r16,r17 ;r16减r17
* m/ G! D; t$ Z6 ]# J brts bbb
3 Q7 ]5 Y0 F [$ F( |7 C3 \& h brcc bbb
( U! o+ n% o; V6 b8 R add r16,r17 ;结果为负,则r16加r17
8 M% C" P5 _$ c! m* v, m clc ;清进位位
+ s( B! y0 J3 G/ G% Z8 [9 B! o rjmp ccc
$ G. c+ N( }3 s; ~8 T7 Ibbb:% Y! L' X( x d
sec ;够减,置进位位
" J" c9 Q0 N: v) uccc:
* p0 [7 \% g2 p; e4 f- t/ @ rol r19 ;左移余数
) ~( J! U0 B9 n- H! c dec r18 ;减计数器
2 D+ r/ p# h" K+ r Z brne aaa ;没完成再循环
' [, a+ ~/ q. {: B& J clc
, P% Z& D6 V. h4 i6 |' k/ H# ^3 r mov r17,r16
0 I5 k, M8 d: h8 t8 a* M4 }, E/ A mov r16,r19 ;r16存放结果* p W* N5 Y' {+ q: i
mov r19,r17 ;r19存放余数
1 R% y8 |, s: X. U. \! C3 Q ret
?* |$ M3 X. f' x% Yddd:: [' x& y( t9 m) _
set
. g+ K7 C$ o" k' X ret
( O, B! U5 Y2 b" J0 X& c7 H) G5 H. m% R3 c
;..................................
5 s) d. }: r1 z; d3 s1 M3 ` |
|