|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
;***************************************************************************
/ b5 X" P( T( R* C/ |, u;*4 y& m# m. g+ a
;* "mpy16u" - 16x16 Bit Unsigned Multiplication! ]" o* Y' |4 M$ _3 O
;*
2 o& v1 P# l9 O# U; a8 ^) J;* This subroutine multiplies the two 16-bit register variables: }! t9 ^ @& \% b/ h. Z, x% Q$ z
;* mp16uH:mp16uL and mc16uH:mc16uL.) z9 k( }! @ J7 z: n6 s5 f
;* The result is placed in m16u3:m16u2:m16u1:m16u0.
+ [) w$ |2 {/ S1 a;*
0 ?" }" e" r4 E D* t2 };* Number of words :14 + return
7 ` t3 {5 r6 @1 y;* Number of cycles :153 + return
1 r# i" L0 x* p+ ]8 g/ A( c6 W6 @5 X;* Low registers used :None/ [, o9 a5 R# M- k3 _% @
;* High registers used :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
0 J$ ]& A! I. ^;* m16u3,mcnt16u)
$ R* B* H4 e u$ F+ B;*
$ f" ~! s5 o( R1 ^$ b% n8 f4 I8 _. k;***************************************************************************
3 M) D3 F' Z( o) i& W
" ^* U0 W/ g% h0 T;***** Subroutine Register Variables, D: m5 f2 u7 v# G; h( @0 R9 z
$ W. f0 f/ t7 \+ M1 @- [3 o& ]( u8 c
.def mc16uL =r16 ;multiplicand low byte
5 b6 Z4 M, M9 ` s. h! K.def mc16uH =r17 ;multiplicand high byte0 X% R& I- u% c" K
.def mp16uL =r18 ;multiplier low byte& ?9 @4 R- t- R T9 `
.def mp16uH =r19 ;multiplier high byte- U+ a; q: Y$ ?+ f- S1 v
.def m16u0 =r18 ;result byte 0 (LSB)* E$ U! y" S0 S' Y9 S3 A
.def m16u1 =r19 ;result byte 1
1 ^+ x- `; R/ Z6 l.def m16u2 =r20 ;result byte 2" X" A# U4 S6 t/ P3 A2 t
.def m16u3 =r21 ;result byte 3 (MSB)
+ G' @& x4 i! V: C.def mcnt16u =r22 ;loop counter' l4 w8 r! \$ ?" g- y) \% S
2 X' m: a- l; d;***** Code8 P- ]8 |- r1 b: v+ W- m- r5 \
; L1 G2 C$ o* m% [8 }mpy16u: clr m16u3 ;clear 2 highest bytes of result1 M; m/ B" U! C5 l0 ?
clr m16u2
. x: D6 k9 J7 [* d3 ^8 \0 Y4 j; [6 C& V ldi mcnt16u,16 ;init loop counter
9 c( y- z8 E! | lsr mp16uH: X, t8 u- K% B, R! W. h! _2 w$ T
ror mp16uL9 Y( F- T# U# O- Q z, |
+ R$ b, a# M' n/ f: F. `) j( t% Pm16u_1: brcc noad8 ;if bit 0 of multiplier set
+ u8 T% {7 |! Q0 R+ Y2 p+ j add m16u2,mc16uL ;add multiplicand Low to byte 2 of res: D9 v" j, ^4 W
adc m16u3,mc16uH ;add multiplicand high to byte 3 of res% x! ]* A: A F2 q: j6 c& f
noad8: ror m16u3 ;shift right result byte 3
- s9 c- v: Z* ?; p; O& A( o ror m16u2 ;rotate right result byte 20 ^. L8 Y8 J& e! S& J/ `
ror m16u1 ;rotate result byte 1 and multiplier High
. y6 Y7 D6 r) {$ I; V* a% o/ e ror m16u0 ;rotate result byte 0 and multiplier Low0 Q$ b2 W( y9 O3 M, f& f! L
dec mcnt16u ;decrement loop counter
9 B8 q$ a; v& }; O: J1 R/ q brne m16u_1 ;if not done, loop more
! \" O) q, a- K) Z1 v; E6 A3 L ret: m1 t* o+ ]* ~: V+ G
1 l( j5 x- k, D5 r5 `$ y) {5 W
y* u f- }1 H' Y- D) |% J/ D
5 P' H& N' o% ?6 D7 o, x* ]# R3 F
;......................% r6 {$ ~" m+ K3 \- l; `
& ~' O& D8 V T, w6 a' @+ d;被除数:R19(HIGH)R18 R17 R16(LOW)6 ?4 W2 F2 U* d- O5 |2 R( |# O
" c7 U5 C( t$ Q0 d;除数:R21(HIGH)R20
% t- d7 y& ~# l. m
; Q7 u5 V% Z- ^( E% m2 l, B- H$ };结果:R17(HIGH)R161 t5 t6 E% j0 A; @# u
;余数:R19(HIGH)R181 _2 k! R: A9 ]4 L$ V, q9 O
;计数器,R222 ~6 K0 |; A4 D' z2 f. o
4 i: M/ T4 I6 R c* d4 u;...................................................
/ p# `, v. p$ E; wd32v16u: ; 32位/16位无符号除法( B4 t0 ~4 E7 z- S
cp r18,r20 ;被除数高16位 > 除数7 G: k; B% f9 F1 Y9 }0 [* t; h
cpc r19,r21 ;结果溢出
; v. A% J0 X& p6 W' ^ brcc cc , p6 Z4 |: D& y- b. Z
ldi r22,$10 ;初始化循环计数器' {3 ^8 A- P6 o, d4 j
rol r16 ;左移被除数7 L0 j/ e- ^1 g; h/ p
rol r17$ w [; R8 ?$ a' e
aa:
* ?3 H) i& {+ n1 b4 \ rol r18 ;左移余数(被除数移到除数)
. F6 m1 J* f/ z. W) w- l' O9 Z bst r19,7
6 q" c8 {' k" V9 K rol r19, ?+ C/ M* J$ @; o9 K3 \1 D3 l* M( h
sub r18,r20 ;余数-除数$ }+ m$ |8 E! I8 S
sbc r19,r21* }# m" y" z- ]+ F1 V7 n
brts loop ;够减,跳至 loop
4 c5 V3 i; D7 _$ N brcc loop
4 ]; F- K! T. N# W% p& u* K- g add r18,r20 ;不够减,再加除数
) m' R+ s6 `7 E% B+ S0 W6 B adc r19,r21
* j/ n5 K; W% J+ N! k clc ;清进位位
. R3 v/ ]% F8 a. u$ b5 P J; k rjmp loop1
+ o. J. {5 e2 S; `& B4 Hloop:: p* b! I$ Y3 y/ y
sec ;置进位位1 [( y5 c' B0 w
loop1:
3 q$ @' }& u5 Y. N. F3 K7 F! { rol r16 ;左移结果
~3 W4 g0 \0 Y rol r17
: o4 r9 B: j5 v dec r22 ;计数器减 1
y7 c/ E- L& V2 [* f! g2 | brne aa ;不为 0,再循环+ d: M$ H/ N1 H3 j/ v: _
clt ;清 t 标志0 ^8 ?) q) L; M
ret4 O* {2 F A2 O. P1 _
cc:
" s. w# q# _! h% Z' B. k set ;置 t 标志
7 v0 ]( o% ]; {' U ret: ?0 w6 @ n. [, |6 N0 E
% ~# w, N- s6 f/ D
;...................................9 s/ V2 d4 o3 n0 a
3 c: f1 |" z$ V7 s
" p9 U2 z" ]; m! I% Q. v3 r+ ^( G% f6 i P
* A+ I8 B M8 Y1 h0 y. z9 f
4 L9 X: M' }7 W% d1 l
' S( h# z+ y! z9 h. F
- C! u l# M: D& g) E8 _9 l D7 G9 K
1 J# q0 n& }' c
0 x1 e, X' [" E2 C! l+ J
: [* g+ \# d! f- Q$ i$ L: S;......................
* K x% h+ `! x2 i5 D& B; F+ G
, i* B; @* H8 a# G: L;被除数:R17(HIGH) R16(LOW)$ v! y# }% z; Q8 _
) S S* `8 L d. s;除数:R21(HIGH)R208 j4 H5 A# @" q# @( v5 k
. j( h8 B: |9 g! x7 q4 `" F& ^
;结果:R17(HIGH)R16" i% j$ v# y1 s7 Z
;余数:R19(HIGH)R18. \! R9 o8 p+ M6 U. d; P
;计数器,R22
2 p/ p* L8 W* a3 x% n p: @/ L$ l3 m' `7 r c' U
;...................................................; q# c* S J! u/ g& K3 p
d16v16u: ; 32位/16位无符号除法
# W; U! g% D1 s9 E: j: r! X; cp r18,r20 ;被除数高16位 > 除数
' O# o# J1 f) A5 @; cpc r19,r21 ;结果溢出% J, e7 p! {, T- S2 g, {
; brcc cc S: E! O0 k- X* ^8 _. n
( _- h1 O+ Z& l- K9 e5 C. D* G
clr r19/ L- v8 h5 @9 ?+ p9 g
clr r18, f _6 ?7 E2 |0 U) j# J
9 ]% Y: [/ D s3 M ldi r22,$10 ;初始化循环计数器4 E6 a% Q% ~8 d( F+ O+ D9 e
rol r16 ;左移被除数
' m( r/ a4 g$ G! [( ? rol r17
; }; B8 w6 o3 [ Z7 @' U; P! L L4 `" X, jvaa:
8 ^1 E9 g+ k/ C) L0 ` rol r18 ;左移余数(被除数移到除数)& p- s7 {3 k. v, O1 ]3 q" ~
bst r19,7& J" b+ J' F$ n0 [) s, g
rol r19
' v% E7 w- v# l+ l9 p6 q sub r18,r20 ;余数-除数
" u: }, h2 [" z+ O+ y sbc r19,r21& d9 [: b( Y# U
brts vloop ;够减,跳至 loop: M5 a& ~* ^3 P7 W: x
brcc vloop0 A/ ?0 H3 Q) u [/ m7 ~" m& s; g
add r18,r20 ;不够减,再加除数
; Y0 {! a6 y" R9 j2 D7 l adc r19,r21
/ A i0 H& K6 a: a0 b f clc ;清进位位$ U- h0 N! G' g6 N
rjmp vloop1
& p3 }1 [& O1 w* \% n7 M1 Wvloop:! B4 k* H( q. B$ x
sec ;置进位位
3 T/ [: z1 V2 `8 N/ u$ w/ Q; Q( N7 }vloop1:
5 p3 r+ ^& y7 Q4 \ rol r16 ;左移结果
8 t3 Y' ]+ p) q N rol r17 x2 I( @# p) O6 e
dec r22 ;计数器减 1
' P& I( _1 @. u4 @! ~+ L3 [ brne vaa ;不为 0,再循环1 N, T% l. t; b+ n5 N
clt ;清 t 标志. H4 L' l% [( t2 }/ y4 q, m
ret1 ?( M) a& p3 a H9 G3 P
;cc:
. ~- R2 [8 J' W7 R; set ;置 t 标志
T" o) W- [& T7 e; ret
9 b( Q* ]6 S: e$ j& F$ Z9 W7 X9 q$ A) n2 @( o
7 x' B2 |: O: \5 X+ s k
;..............................
' B r7 ^" r; T8 i
& J& b$ v* b3 _: O, l9 M% |/ t
- n/ ?* [# O: ]7 r, N2 \; F" u/ T5 p' R
9 O$ F" p7 K+ s) e* h+ C* l
$ N+ X' h5 O* ~- ?* u( V
& n" m4 x$ z1 _4 _& {
2 n1 d% v1 @, j9 _5 ]# Q: Y8 Z
2 L/ p! O4 U& p7 N" R
( v1 d, }/ w$ c! b8 W( a
* `1 i {& \. J% t+ j o
;...r17:r16(hex)--->r20(万位):r19(千位):r18(百位):r17(十位):r16(bcd)& d5 X5 k' \/ P# `( t0 E" {
; 结果值在每字节里只存一位,即在每字节的低半字节里
. P( ]% v6 _- V;.....................;调用16位二进制转5位十进制子程
: A5 s# w. o# P- _b16td5:# `, w8 f6 H' F Q
ser r20 ;r20先送-1! v1 p3 r7 h" w7 [; J, p+ l
b16td5_1: ! N1 P) x4 a& Z Q% I
inc r20 ;r20增1
+ e& U1 O8 U7 w- W subi r16,low(10000) ;(r17:r16)-10000' V5 ~9 O1 d& B- b) ]
sbci r17,high(10000)
! g: T1 e! Q. y% ]- V brcc b16td5_1 ;够减则返回b16td5_1
2 {; F/ k) G9 w* ^ subi r16,low(-10000) ;不够减+10000,恢复余数
3 B* X2 @2 V9 D& {$ b+ }$ \ sbci r17,high(-10000)
1 }- \+ L; M/ E( F& D+ m ser r19 ;r19先送-1
/ z6 m, z6 r# i; ]% I' |b16td5_2:
. O# Y0 f) f e4 T( O5 V3 l inc r19 ;r19增1 6 b7 m4 X v7 r1 l2 i5 l- D
subi r16,low(1000) ;(r17:r16)-1000
4 U$ S6 d0 y3 Z9 d sbci r17,high(1000) : O! U8 o7 L* b3 ]! E- o' u
brcc b16td5_2 ;够减则返回b16td5_24 s. E5 X8 i+ r' D
subi r16,low(-1000) ;不够减+1000,恢复余数; d7 u& ]9 l" ]$ ]" M2 M" y l
sbci r17,high(-1000)
3 A; G$ y1 g" d ser r18 ;r18先送-1& Y9 y- P, b% L' e$ B e+ {; S% \
b16td5_3:" Z9 [0 g9 T# x0 Y
inc r18 ;r18增1
( J3 i' `! T4 B; B a1 _subi r16,low(100) ;(r17:r16)-100' k o* I' l" o
sbci r17,high(100) 4 Y& Z0 o5 L6 Y! U2 l
brcc b16td5_3 ;够减则返回b16td5_3
- ~- `7 p, z' c8 S5 F, p subi r16,low(-100) ;不够减+100,恢复余数- h: t* b/ k+ A
sbci r17,high(-100)
r+ w( C- Q' q- t ser r17 ;r17先送-1
- q; H0 ~8 c0 k. _! ?. ab16td5_4:
: c. f* a( m' r7 M inc r17 ;r17增15 j) | g/ I& O! D2 u1 S- A: n' U
subi r16,10 ;(r17:r16)-10 ' ]; j4 G3 i" c4 }) z
brcc b16td5_4 ;够减则返回b16td5_4 * |6 F# G- u F( A6 k' D0 K! q4 \
subi r16,-10 ;不够减+10,恢复余数
* s& x( F# ^5 e2 O: x ret
4 ]3 y9 S$ L% r5 O4 b6 R/ V;...........................................
2 R* {1 h( V! }3 V
% G+ N7 ? a3 ?0 `4 o) s: d% }7 k; V* ]3 r+ f# s
$ f0 C9 O) D5 k# N, k" A7 H* a2 m( Z4 {1 F0 i; R
6 ~8 L1 f% A3 R2 L3 _0 B7 E9 t
* H/ s5 d4 v& m- T
, ?1 M- n5 v2 p) O2 c7 R# T9 @$ z;...............;r16(high)r19(low)/r17 =r16(结果)+r19(余数)
: {5 Y% T; y7 w9 {( [8 p9 [" ^* ~3 B8 T+ \. a- y
d16v8u: ;16/8无符号除法$ ^; e8 e; o: f4 d$ n9 ]
cp r16,r17 ;被除数高字节 > 除数
+ r5 Y; N3 y9 p! n7 @ brcc ddd ;结果溢出
5 o* X6 P: h- H( L9 C# W* n2 S ldi r18,8 ;初始化循环计数器
% s/ \+ B3 I4 A rol r19 ;左移余数(被除数低字节)
1 n$ O9 w) ?" }5 xaaa:5 I1 m4 a) q0 u( A% u4 b
bst r16,7- S! x$ g2 L3 B' @4 y" c
rol r16 ;左移被除数高字节1 w6 o4 t( `$ C- P9 O7 {
sub r16,r17 ;r16减r17+ R3 W7 z! I# u* S/ V/ {
brts bbb
* [4 N5 Q |6 d Q: D9 c6 i brcc bbb. `9 |+ P+ B( k# M1 f) ]3 G
add r16,r17 ;结果为负,则r16加r17
5 W; C6 ?% I' C/ E% U clc ;清进位位1 P/ k, l$ m6 J2 P3 b
rjmp ccc2 c5 r. e& C% i4 o; B2 L
bbb:3 p. ?- w/ \" u8 A
sec ;够减,置进位位7 g2 a2 ?# Z, V$ W* K0 C
ccc:) I/ f+ D7 T1 q. z4 B, X) u3 V
rol r19 ;左移余数2 A; y( D) C# Q9 Q
dec r18 ;减计数器
5 R) l; [/ N# v: D5 c _6 N- e brne aaa ;没完成再循环
) B; b; j4 B! l( m [0 _ clc& }/ E; `/ T0 U, |$ R1 @, b
mov r17,r16
9 ?9 j3 C$ t6 n0 W mov r16,r19 ;r16存放结果
9 R( x" N# |% c! u8 k6 q+ V mov r19,r17 ;r19存放余数
1 _5 z. C! f+ f: s9 F ret! Q, e2 _& e) Z5 d
ddd:2 [: y y" i A1 j
set7 R& H+ z# }: Z
ret
# M( ]. r& }; G7 Z* n
# {5 K% M. O1 x6 |# C% s;..................................
6 M2 ~0 [' @. _1 C/ P |
|