|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
;***************************************************************************
6 K$ l( M) `0 {;*1 D# u$ w; D7 @0 m( Z. n- t
;* "mpy16u" - 16x16 Bit Unsigned Multiplication% J5 H- j/ c8 |- l
;*
" q6 y# u7 {3 Z% g* o;* This subroutine multiplies the two 16-bit register variables
0 _ f1 Y# L1 D/ D- Z1 M& x2 U;* mp16uH:mp16uL and mc16uH:mc16uL.
7 T- k' @; L$ m: ]/ {, j;* The result is placed in m16u3:m16u2:m16u1:m16u0.
8 P+ j& F$ Q% y' ]% s/ R/ t6 \;*
- ^, L3 Q8 C0 Z; B+ h;* Number of words :14 + return
4 J% H! Y* t0 C; c7 i7 k. {5 B;* Number of cycles :153 + return
3 k* k3 [7 p% u' }8 I u& Q0 T;* Low registers used :None# g! T0 M2 c7 M, _: m9 v2 z( w: \! L- h
;* High registers used :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
3 k S& f; B' C: P0 h1 d3 M2 Y5 ];* m16u3,mcnt16u). j) e8 X; N v6 H5 f
;*9 C6 Z; t2 O% w0 Z
;***************************************************************************
7 m( n5 ?( E9 M# ]; n# U7 }! H) F9 @
;***** Subroutine Register Variables- A6 ^& v! R2 u0 e) l! }
; \0 b, l0 f6 V( b" s$ Q
.def mc16uL =r16 ;multiplicand low byte/ F( C! @' G1 Z U' H# h% T
.def mc16uH =r17 ;multiplicand high byte8 I8 n0 b3 F7 J4 m1 O
.def mp16uL =r18 ;multiplier low byte' L5 y e( M. f k& t) ^
.def mp16uH =r19 ;multiplier high byte* ~& w: ~0 _' H! O) P C2 J: @
.def m16u0 =r18 ;result byte 0 (LSB)
! e. m0 K; X/ Y8 j* d.def m16u1 =r19 ;result byte 1
8 A: Y1 u- ~, S, { W9 r8 t+ a.def m16u2 =r20 ;result byte 28 t* W, m4 ~. b- S' o/ E
.def m16u3 =r21 ;result byte 3 (MSB): z) B' B# W7 Q$ W4 t" c
.def mcnt16u =r22 ;loop counter+ P4 ?7 b2 u8 W; H: \, j
1 i1 W+ n `5 K& T# C;***** Code
0 x1 p/ n( h: W' J/ c ?2 T) g
+ f- x" P' A1 r0 vmpy16u: clr m16u3 ;clear 2 highest bytes of result- s; Y% I5 D1 z1 _
clr m16u2, X# B5 y! t/ [
ldi mcnt16u,16 ;init loop counter
& @" W! ?4 b7 F7 n( j6 x3 [ lsr mp16uH
! A1 a. n, ?6 H& V6 l: J' W ror mp16uL
/ {: c1 U# b! ^/ F; @" v. d+ S
& l6 Q7 m' \0 q3 X2 H9 ~m16u_1: brcc noad8 ;if bit 0 of multiplier set
) x0 l0 b0 H2 ]7 t add m16u2,mc16uL ;add multiplicand Low to byte 2 of res
2 B2 ^1 i2 C+ V( M) a+ z adc m16u3,mc16uH ;add multiplicand high to byte 3 of res; D: ~# ~* n4 H0 @+ @" Z( p t2 g9 l
noad8: ror m16u3 ;shift right result byte 3
U+ A1 k5 K9 O3 x, U6 w7 o1 Z ror m16u2 ;rotate right result byte 2! \% C) B) Y' Q
ror m16u1 ;rotate result byte 1 and multiplier High
. m( J! B' k3 o ror m16u0 ;rotate result byte 0 and multiplier Low& k. m0 z- O+ p
dec mcnt16u ;decrement loop counter
H+ M4 g. O1 ^ brne m16u_1 ;if not done, loop more
8 @/ ]4 A! }8 D3 k0 _5 n# Z ret% W7 E$ w& l S
: z5 @+ e' c: r
: v) I* G& A3 A5 @
3 r/ e* B$ B3 W6 a x9 c
: t& M; s+ V/ K' `3 `+ N# q;......................1 d1 v3 q5 C8 J, x$ u
" Y6 P6 f- V/ e- h
;被除数:R19(HIGH)R18 R17 R16(LOW)
7 V1 d9 U _/ n( R$ g( {
7 ?( s1 ^2 X3 @+ P; a0 u1 @. Z;除数:R21(HIGH)R20, k1 G! h# G9 M7 n; n
6 P0 C9 Q* r9 @) o' V;结果:R17(HIGH)R16
8 X* _ w9 g! m* S+ U V- S;余数:R19(HIGH)R18! D; q& S( g6 D" O M+ j+ L
;计数器,R22
4 @: K) o; v# C. q6 }1 k+ @9 J2 a, \/ w9 u
/ C2 Q% S% n$ R- d;...................................................
) Q/ x+ p. e0 V; L, {+ S& zd32v16u: ; 32位/16位无符号除法
, O- x! F3 U! E cp r18,r20 ;被除数高16位 > 除数- Y/ {+ M' V# U
cpc r19,r21 ;结果溢出" H3 `4 a# o* C. q
brcc cc
8 E$ k2 w' W9 o; Y+ h ldi r22,$10 ;初始化循环计数器
1 u' g. F* g( | rol r16 ;左移被除数
; V z2 _3 `2 z A- M# x rol r171 F9 l: m% V, N2 [9 x$ T
aa:
/ W9 c9 _# F. B7 N5 G rol r18 ;左移余数(被除数移到除数)
- V$ C0 P9 A( ^$ c+ J( z8 d: \ bst r19,7
9 f% x4 m! l) X6 y5 t9 P1 z' m rol r19
8 q' O8 N9 r9 G+ |$ j7 P sub r18,r20 ;余数-除数
6 [) \7 e! X" z' l6 F4 t1 a sbc r19,r213 u4 Z6 a* e R; j9 u
brts loop ;够减,跳至 loop6 q& p8 h. c% V- ?. |4 D
brcc loop/ R- C- y3 v. `7 V4 C1 }& X" ?# x
add r18,r20 ;不够减,再加除数0 o* P5 p9 l1 r2 [' R$ h( {
adc r19,r21% N8 V) T' K d" X0 h$ C; [& k
clc ;清进位位5 @2 g/ c8 p# C6 u8 y1 Y
rjmp loop1. `8 c) S' \- H5 W
loop:, r$ V' m! K* {8 M$ f7 l/ m2 j: {
sec ;置进位位6 X) t3 k2 r0 d7 H, X$ \: g
loop1:
6 p% c0 x; m3 u rol r16 ;左移结果
5 ]& g( Q2 D% B: W& R rol r17
F4 Y9 g; Z8 p J; u" ~$ b dec r22 ;计数器减 1! G& q1 u g9 g3 _
brne aa ;不为 0,再循环2 P5 f3 u; S0 l8 }2 R
clt ;清 t 标志
]( m9 y# A" H* V ret
+ t0 B) W2 b. G9 t9 ucc:6 }8 M; h( @( A* z
set ;置 t 标志& H+ x! i$ g w
ret$ t5 E% E N( D. D5 N
/ u7 E; T$ i, D
;...................................
6 n6 n ~6 e, U; c5 Z4 ]. C2 T) G6 P. ?
# I; n& O. x; @# |9 b: H0 \4 p. i3 N
& E* j+ r+ `! K/ z
# R. J: a' r! d5 Q+ ?
3 q. p6 f6 T, g/ o* b" [5 X7 i! n/ ]% u/ q; j p" T: n" N
1 S' q% h6 g! V3 R# P
; b0 o- y0 G( C
3 ?" |1 L% V0 D {" z4 ?3 X9 S: d
4 {6 u# I6 B/ B2 R4 |;......................" ^# `# C; h" W0 Y
+ C8 w; g! ]; {;被除数:R17(HIGH) R16(LOW)& [8 _6 Y# C0 E4 x! d' k$ ?# e
$ G. y4 _6 j8 c0 I* J;除数:R21(HIGH)R20
% H' R$ K) ` _0 u7 C, q2 ?- p: X6 M m" ~, _
;结果:R17(HIGH)R16
! \8 _4 }7 h2 i& W;余数:R19(HIGH)R18
2 L5 ]% v) V B$ n% ?5 P;计数器,R226 q+ Q* P2 r3 J. y" M
( h n" B! \7 E/ L+ V
;...................................................
% t8 U. z9 H* X; P% |: X' A, {2 ud16v16u: ; 32位/16位无符号除法1 p0 H) i5 d* G F# J K$ ]
; cp r18,r20 ;被除数高16位 > 除数$ a5 B7 }3 ]+ W
; cpc r19,r21 ;结果溢出9 b! ~+ T/ P" B; w1 ]- t: h4 b
; brcc cc 4 O. ^2 ?2 m# V3 o- [
( @ I7 ?. a& O- p
clr r19
. ~4 G/ h7 L5 \6 d, N, b+ `* L clr r18% j9 j# O* K7 b, w' d) A
s* i( m3 x/ z) ]* d' d( [* K
ldi r22,$10 ;初始化循环计数器" G/ [% \( n: Q, Y- G
rol r16 ;左移被除数
1 W8 o" I1 h; O+ i, l) h rol r17
7 L; L" \* ?1 C3 Nvaa:5 n5 O. K2 J/ }
rol r18 ;左移余数(被除数移到除数)
7 b5 B( E) L8 [! }9 \ bst r19,7
4 }: K2 T8 t- j- r: p, @ n, F rol r19# @" ]2 M, J% p! n4 N( R1 n$ @' [: t
sub r18,r20 ;余数-除数
; A# K9 _5 ^7 N9 a/ `. Y0 i sbc r19,r21
" U% a6 j* T! f* X8 `, s. B) l6 s brts vloop ;够减,跳至 loop0 \5 v" {3 t' F! \4 D6 n- G; H
brcc vloop
$ D9 ]9 L$ d6 y$ v/ f add r18,r20 ;不够减,再加除数
. T" s# z* A+ _' I adc r19,r21
+ A2 ~7 u1 R# Y% P7 }( I clc ;清进位位2 K0 c) s% N! ]) o5 y) R
rjmp vloop1& u Y& ` k; F; z
vloop:% D* a8 I4 `2 k, L
sec ;置进位位, u% K; A3 i( P* X& I
vloop1:1 ]& ^' e% d. Y: n1 M
rol r16 ;左移结果
2 Q6 [7 [0 ]% R: g; J rol r17& X) U, C. i! X/ ~, Q d
dec r22 ;计数器减 1
- N) R5 b: Y* Z+ e6 d# P) P1 S brne vaa ;不为 0,再循环
& Z. m2 t, r' j+ Q( f5 _ A9 K5 z clt ;清 t 标志
9 a3 t' X& H% S7 N! S% i+ o# A ]$ } ret
* z; y% j# A1 n7 A;cc:0 s9 J) P w: r% Y% G& T
; set ;置 t 标志
# `' q N5 z W3 q; ret
0 N4 {$ ]8 }4 B K" N1 z }4 g( l, q& N( t* ^, J
3 f( d. H- J4 \+ o) b& d6 q3 [% e/ t
;..............................! I- [0 E ~) x e
3 I1 _ y# q6 t8 P' y8 _
[9 V5 ]$ N W- l+ ]6 k3 E( T( s
' A9 X% E7 k) V
; r6 p. i! @$ r
3 n) H# n0 Z/ x( G" q9 q
r% x3 e/ }7 }( |" h% W& M
, `( `) n7 u! t1 Z) R6 M/ l. e
% ?0 |6 D7 b3 u+ c+ V" k* ~& i! f# L4 N# [# T
d: }* B- K+ u! F* G
;...r17:r16(hex)--->r20(万位):r19(千位):r18(百位):r17(十位):r16(bcd)+ m% v6 g8 m+ Q& J6 E! r y
; 结果值在每字节里只存一位,即在每字节的低半字节里 ( x* i. ?* x; ^. I/ Y
;.....................;调用16位二进制转5位十进制子程$ o" F2 O: c& W! w& r
b16td5:
8 c1 O* {+ i9 m4 g( s; c ser r20 ;r20先送-1
. S* ~0 n6 j1 t" E* \b16td5_1:
8 P& D8 p; n( n" _ j inc r20 ;r20增1
. { r/ c; u2 B4 @5 A8 p subi r16,low(10000) ;(r17:r16)-10000
$ P" s& s Y4 p0 G4 c. W sbci r17,high(10000)) B: s$ S2 B4 \) C# ~
brcc b16td5_1 ;够减则返回b16td5_19 y2 Z& j6 t. `) h- s" p
subi r16,low(-10000) ;不够减+10000,恢复余数8 \& X- s1 | A3 L+ ^
sbci r17,high(-10000)
2 U# v( W" k. q( { ser r19 ;r19先送-1
3 ]2 M7 ~/ |/ q& y* `9 G( Db16td5_2:
' T8 F# Z Y# n% T inc r19 ;r19增1 7 R6 g3 ^5 R6 D3 c! S% E
subi r16,low(1000) ;(r17:r16)-1000
8 k k- T% x% b/ R- u sbci r17,high(1000) 5 k# O- e+ g `6 K. D
brcc b16td5_2 ;够减则返回b16td5_2
$ K! @9 r/ f- P subi r16,low(-1000) ;不够减+1000,恢复余数; x. ]: v. q- L9 q% }
sbci r17,high(-1000)
: p( _$ x6 i, b2 p8 n ser r18 ;r18先送-1( ]; \" d* E' K) M$ z0 L/ C: B7 L
b16td5_3:
1 V5 C3 C7 F+ ?" t) K% c: @- p9 x inc r18 ;r18增1 8 O& c7 _+ m) [6 \9 n
subi r16,low(100) ;(r17:r16)-100# m2 ^7 ^' b% K$ t$ ] ?
sbci r17,high(100) 7 B- y8 U3 B/ w
brcc b16td5_3 ;够减则返回b16td5_37 w1 i/ k/ Y# z! X% u
subi r16,low(-100) ;不够减+100,恢复余数
" [! [' X, j+ w, {: ` sbci r17,high(-100)
+ O' |* H% X/ V# w* Z( q8 R ser r17 ;r17先送-1
( r4 C( E9 \) S5 yb16td5_4:
8 p- _; V7 a: m- P2 R$ r+ ^ inc r17 ;r17增15 ^6 u( x+ e/ `/ H, J
subi r16,10 ;(r17:r16)-10
7 k) p& b7 d: L4 r' K' l brcc b16td5_4 ;够减则返回b16td5_4
( O% j G8 o' A0 U& ` subi r16,-10 ;不够减+10,恢复余数5 M0 K+ l6 s% V( H% `
ret% G; Y9 u3 B6 H/ v0 K5 g) R3 w1 m# | H
;...........................................( T2 G: I9 _) B# g# y# u6 t, ]
5 c) A( x% c4 F( T
( f0 ^& X; M6 o9 ^
j$ O. N' Z+ P6 J6 O* P0 j
9 O. m- M. X$ z6 G% q) O, Q! {* n' _
& D0 \2 _) D' j) a+ q4 y7 j8 v0 D) r
;...............;r16(high)r19(low)/r17 =r16(结果)+r19(余数)' i/ h" A; c7 _1 B
& H# z; O9 H& A( g, M
d16v8u: ;16/8无符号除法- G R6 \! a) c _. Q& ^
cp r16,r17 ;被除数高字节 > 除数 * }! e* `% ~2 T. f @4 P7 q0 e& L7 N P
brcc ddd ;结果溢出
6 C, ]0 ]3 s. V; T, }' G% w ldi r18,8 ;初始化循环计数器
2 b5 a" q2 @+ }# T# t" J rol r19 ;左移余数(被除数低字节)
$ V: w: g! E9 {$ [7 Saaa:
{/ O# ~- M. A2 O bst r16,73 h" Z k3 F/ E' e, j
rol r16 ;左移被除数高字节, `6 M/ |. U5 Q, a
sub r16,r17 ;r16减r17
7 b) J' _$ E, K/ P7 | brts bbb
4 F' s' s k" v9 g7 j brcc bbb
, @( N- e$ A' q6 }5 Z' |. ] add r16,r17 ;结果为负,则r16加r176 e0 t0 L- d$ @9 V
clc ;清进位位/ t! R5 O1 p3 P' W/ A$ L! o1 i4 F0 E
rjmp ccc( V& u4 [1 U% }, e6 T! Q
bbb:
' C. X6 N. G' L1 k2 h2 E3 X+ \# i sec ;够减,置进位位. b, o2 z4 _ x2 G4 B
ccc:: g# e% n; `1 x$ X( i" C& I' K7 E' |9 y
rol r19 ;左移余数
( a: c8 {4 B r1 @ dec r18 ;减计数器" _7 O" l: A) f: z# |
brne aaa ;没完成再循环
$ m7 O0 m$ c) E. m' [( R" r clc }. H9 E" P. }2 J+ W" H
mov r17,r16 f1 z5 e u1 r' Z
mov r16,r19 ;r16存放结果% [3 i2 D% {% C5 p* x7 f3 N9 ~2 J
mov r19,r17 ;r19存放余数
! F4 m! \! \ j ret
, n% ]- T, O9 J) ^$ t$ zddd:/ T) `; U. f( p1 T$ w7 N) G! k& N
set
9 R) g5 b+ b: Q% D8 A. o/ R ret
2 J4 U* y: N ]* q$ {( x. n, E) H
2 v- _/ r# v0 z;..................................
; ]. c) h% A! E0 e; M |
|