|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
;***************************************************************************
6 Z- q! h0 V/ P/ B8 H$ y$ F;*3 {" |5 ? y; E) w( E7 E
;* "mpy16u" - 16x16 Bit Unsigned Multiplication
0 d% q0 Q4 r0 g Y;*
' F! O% S" \0 Y5 O5 v: `' E;* This subroutine multiplies the two 16-bit register variables
) R D+ v/ Y) C9 E1 ~ K7 M;* mp16uH:mp16uL and mc16uH:mc16uL.8 X R, K# s" m% g& X
;* The result is placed in m16u3:m16u2:m16u1:m16u0.9 p! \! Q* n8 `# M
;*# W- i& |# C( A- g; B
;* Number of words :14 + return
! I" [, r4 u( V8 s0 w;* Number of cycles :153 + return5 f# l% f, S9 p, u$ A$ _: t: `- c
;* Low registers used :None( _8 {. V# s) u, A- u% k1 X2 k
;* High registers used :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
8 ?& Z( d; }) t;* m16u3,mcnt16u)
4 u \2 f3 Q' u5 ]2 V. s;*
# m9 Y$ r9 d* q0 f1 ~1 v4 x0 c;***************************************************************************' X) k T' ^ c$ y$ y
/ g% O2 D( |2 z& Q4 l) @( F
;***** Subroutine Register Variables3 F' s9 @8 ?/ ]- q0 Z
. ~$ q* r9 f$ i% C! f
.def mc16uL =r16 ;multiplicand low byte/ |, H/ D$ W; v, Y
.def mc16uH =r17 ;multiplicand high byte
6 w+ Y4 @) z! N$ S* ^7 N.def mp16uL =r18 ;multiplier low byte" _( f+ S2 A% p' S# B
.def mp16uH =r19 ;multiplier high byte
- g$ }8 K1 o: Y9 T0 j3 n: l.def m16u0 =r18 ;result byte 0 (LSB)
8 x4 M, r. f( ?.def m16u1 =r19 ;result byte 1
% V- E0 L$ p, H: @0 b! Y. H.def m16u2 =r20 ;result byte 25 k* h/ c' d9 e# S
.def m16u3 =r21 ;result byte 3 (MSB)
& D$ N7 O( p9 h8 s. ~.def mcnt16u =r22 ;loop counter
% y8 X# @/ m% X8 x+ p" \ k6 z7 S. ?0 @: |2 z8 E
;***** Code/ C/ F3 p! _( [
l8 i( i3 B. s+ Ampy16u: clr m16u3 ;clear 2 highest bytes of result- H3 i) Z. H, v s V
clr m16u26 z3 @6 d+ e, Z: I
ldi mcnt16u,16 ;init loop counter
) u( \1 W9 }' q% I% p7 \ lsr mp16uH
, _( k' O* f3 |% p. C& b ror mp16uL6 r# m* C7 J& c6 a$ M
; s+ W4 r; T, L! z$ d+ A6 n0 {. C
m16u_1: brcc noad8 ;if bit 0 of multiplier set# n/ P3 V) d0 ^/ k$ ] x: ]
add m16u2,mc16uL ;add multiplicand Low to byte 2 of res. I: O3 R5 T: y% n Q+ J
adc m16u3,mc16uH ;add multiplicand high to byte 3 of res
" R" L0 |' J" ^noad8: ror m16u3 ;shift right result byte 30 p5 p4 v' [$ u5 `! s
ror m16u2 ;rotate right result byte 27 s; C# O4 F/ K3 a4 t( Y: _4 G& Z
ror m16u1 ;rotate result byte 1 and multiplier High" W5 }. x: }+ Z6 i7 y
ror m16u0 ;rotate result byte 0 and multiplier Low9 K" d& k) G7 v; q6 W5 F m9 V
dec mcnt16u ;decrement loop counter
) e; f. V5 {* g7 Q6 M brne m16u_1 ;if not done, loop more
7 T4 r% r7 v; N( Q' N7 s9 z ret
& D7 Q& X0 z9 B7 |, F5 ^. }; f: O" d3 c' \4 n
) o. v" I! Q2 b( h
( v- d& p2 n' O; \# T2 b
& A/ ]3 n, j; O' f- l
;......................2 L8 F) \- U. R' R' B
( a% |# `) ?/ a( M;被除数:R19(HIGH)R18 R17 R16(LOW)
) f: d$ y: Z, B$ M& R( W7 `9 R0 y
;除数:R21(HIGH)R20
& P% Q+ ~0 @6 V+ t( Q5 K+ w+ A" L. W" { W9 j" U% M
;结果:R17(HIGH)R16 f" n% F$ M* h! f
;余数:R19(HIGH)R18
. r0 Z) `5 }/ s3 e* U; ^& |9 S0 M;计数器,R22- o" n* [! w7 D" }! E" y3 v
# r: Z' h3 I7 w6 `- \$ Z) M( n9 S;...................................................9 Y' i" n. W( p- r
d32v16u: ; 32位/16位无符号除法
" V2 K+ p) w1 y n cp r18,r20 ;被除数高16位 > 除数
5 P3 I! k: S+ S# }2 e cpc r19,r21 ;结果溢出. G0 X" R6 F; `! m, g& _' R& M: [
brcc cc
; D* b* r3 h, m$ S3 n) I7 X ldi r22,$10 ;初始化循环计数器$ R' l* C8 R/ z2 a6 H7 n
rol r16 ;左移被除数& y% ^- l7 T) E8 F! }
rol r17
3 t. T& z7 q) [" `6 uaa:
/ w3 W' P) F3 }% _1 x# V+ x9 i rol r18 ;左移余数(被除数移到除数)
# s7 R, R6 f/ Y" Z' j+ i! H) a1 D4 ?! P bst r19,7
, t6 Z9 J& F5 n: M( @* H1 P! K rol r19$ j4 O+ c9 ^: h; W; N2 K6 n+ H. d
sub r18,r20 ;余数-除数1 B+ r5 \* K" I/ ?; C/ `
sbc r19,r21) y* r) R4 ]6 F# N( L& k( h! H5 b' ?
brts loop ;够减,跳至 loop! K( D6 G K" E$ a2 S9 X
brcc loop1 S1 _5 X9 W% \* o5 x* u5 d/ x
add r18,r20 ;不够减,再加除数
9 _; h; o4 V1 @* w8 \5 h adc r19,r21
$ {" l! |! |! w! g4 W& _: T clc ;清进位位 T( u9 q) Z0 f5 a: m
rjmp loop1
+ v4 _2 \: s2 E) r, v3 }loop:8 ~% a: b7 ?! B2 M
sec ;置进位位
9 n4 S) k9 l1 m" q' Iloop1:
6 M( O# z' R5 ^, P& i0 N rol r16 ;左移结果6 A4 s. X- b8 N+ t0 _, P
rol r17
# t, d/ w9 Z9 _+ }* W u# l9 G+ n dec r22 ;计数器减 1
* k2 X4 r+ w0 m. p brne aa ;不为 0,再循环( l `+ y1 y) W/ |; Q9 X& y' y0 d
clt ;清 t 标志! n- }) q4 \6 ?. e* t
ret
, Z' X9 J0 F+ f: ^" T8 Mcc:1 f5 @1 @ i! g p7 r* w9 Z
set ;置 t 标志9 a, C% O" v" C
ret
9 w, f/ ?& Q$ {2 `; \0 T% G2 b7 q% k. E( q
;.................................... Y& l0 B7 Z7 q: C& R" K/ U7 M5 A
! `4 J- L: z" z
5 h$ z& Y5 _1 K
9 \: q5 u1 B& ~4 q& x6 z+ l" N" f, b1 O- _
$ N) s+ u* C; Q1 M; z- K# T
5 x/ J4 }# i+ d
! D# V9 @) z; g* k( ^" Y4 C9 G2 W: s4 L. N0 X. y8 p, ^
0 C: \" U) t# T0 D+ {0 i: L* x
( q6 y2 b/ v$ m/ s5 D
2 k$ K/ ?" c; r0 q; _: e5 |* Z; X+ a;......................
% v$ n$ n: w2 K9 H; m0 {# R' T8 i8 Q0 [$ P7 @1 _* O) {
;被除数:R17(HIGH) R16(LOW). t9 w* y9 ]8 q; v7 C6 M
% K8 D1 w X6 l;除数:R21(HIGH)R20( R4 t. s9 N+ W% z& {4 O, c
: }$ Y( E% e% {0 L: R* {
;结果:R17(HIGH)R16; B- Q$ C7 M" ?; f
;余数:R19(HIGH)R18
2 ~" Y9 a8 P" W/ o) T" \;计数器,R22' g1 I2 L6 v- P% P7 L- [7 N. E
( k7 _, s R; I4 d: Y;...................................................' T$ I* k7 X( o- x
d16v16u: ; 32位/16位无符号除法) z2 A; l) }8 p) x8 m$ C
; cp r18,r20 ;被除数高16位 > 除数
$ u7 i( r* j3 ]) C) b& O% L4 P. E; cpc r19,r21 ;结果溢出
0 F# p$ S, c U' x. ~) I; brcc cc
" k. W y8 ?8 J. L! A Q
* ]' Z7 M' t4 w: L) m# m8 w clr r194 u- J8 e& I' y) Y6 _ v% s) q
clr r18
( ?6 T0 j/ ~8 N e, o* b7 Y# U
ldi r22,$10 ;初始化循环计数器
' \4 c5 ^( u9 h* p( t$ S1 E$ E1 F% o rol r16 ;左移被除数! L- U! x* g8 S- A: r4 y$ i
rol r17
5 E! [) k1 _: z5 svaa:+ |$ h9 Z5 F- X
rol r18 ;左移余数(被除数移到除数)
9 S5 c7 V; A) e$ | bst r19,7
0 S- v% ?3 q0 ]! ]) w rol r19
3 |( @' Y& y* Q sub r18,r20 ;余数-除数
0 V7 n4 \7 M% ]. e( t9 a sbc r19,r21
" J J9 L: {, ?7 A6 O! l brts vloop ;够减,跳至 loop8 }* G1 G e1 {8 n
brcc vloop8 v; {% h+ w/ J- C9 ]5 q, N$ N: K; @
add r18,r20 ;不够减,再加除数
8 c4 u0 ]- K$ X* d7 y) t& L) S) B adc r19,r21
3 Z% d; ^7 Q5 ^ g5 T7 C clc ;清进位位2 R, i9 ~3 G6 m p8 ~
rjmp vloop1
9 E. ]+ X) o2 k5 B! Z9 C9 Ovloop:
5 E) \5 p/ M8 j a; p sec ;置进位位9 x8 ~: h2 {7 s, i& N
vloop1:
0 _1 W: C! O# T- |6 \- M rol r16 ;左移结果
( h% ~0 f" H( D9 ~9 n rol r17
7 |# s) z9 c# t. } dec r22 ;计数器减 1
6 ^ e7 `, Q4 ~9 r# s4 i! \ brne vaa ;不为 0,再循环* |4 {2 t8 A; \: s& X. I0 y7 ~4 v2 A
clt ;清 t 标志
& u, D8 u4 I; x* ^) V ret
' h2 f9 N% I8 F;cc:
. k& z# F% {/ m2 d; I+ w+ [; set ;置 t 标志
`4 [5 x5 d% U9 U; ret
6 }( l( ]. k3 W& b5 |6 n6 m( o. }1 K* n1 H: ?. v- w
$ H& ]- p8 L& T5 r- J- @
;..............................
; F7 z8 L7 c4 I. N+ }) A2 S- T% v: r: n' }
3 i) ~) a) K) s% H, I# [
& Q: u$ p; w7 y9 }" P3 W- R
6 m4 T7 {& v6 H2 g0 K+ S0 I1 A+ l+ J' `1 r1 [7 v
2 \: ]% L8 D9 b" m) q
; B: U; E' V2 C
. g; j! n' r( `* v( P' D" ?, J; h: \* r1 d# B9 C' f
" }% M0 U- c, G; k( a' _;...r17:r16(hex)--->r20(万位):r19(千位):r18(百位):r17(十位):r16(bcd)3 B* f+ X" L9 z9 J5 r- x* I
; 结果值在每字节里只存一位,即在每字节的低半字节里
4 |: ^2 z# o; G1 ? U- S;.....................;调用16位二进制转5位十进制子程0 O! v0 p3 ?. h5 W* f& _) H% b
b16td5:+ B& d; @& j* S, T) \
ser r20 ;r20先送-1' g" _9 F: L1 P: L, x) k; o6 s
b16td5_1: + G& V" P' A, b
inc r20 ;r20增11 `6 q6 B; a4 Y* _8 U& h
subi r16,low(10000) ;(r17:r16)-10000
3 a) F% m% D# o% [" t3 t4 T# p sbci r17,high(10000)
7 e& {, R7 D$ t brcc b16td5_1 ;够减则返回b16td5_1
- E! }% ~! I5 r5 s subi r16,low(-10000) ;不够减+10000,恢复余数
7 w+ _- d9 K s# F- y: E# S sbci r17,high(-10000) W3 w s9 C, }1 q3 O- o5 E
ser r19 ;r19先送-1
. H. P& y' }6 ]# zb16td5_2:
1 F5 O2 T. h" [# W3 G inc r19 ;r19增1 N, r; O. B! `% A5 E* y; B
subi r16,low(1000) ;(r17:r16)-1000
0 E5 b! D! Q) V5 A! a sbci r17,high(1000) , }4 |6 o$ B( f1 I4 j7 K- |
brcc b16td5_2 ;够减则返回b16td5_2* B* ~8 |' t5 g9 L, U- ?
subi r16,low(-1000) ;不够减+1000,恢复余数
( U' |4 {- U0 C4 R4 ^, q% q sbci r17,high(-1000)" A4 Y7 m% a$ W: `: f6 O3 }* I
ser r18 ;r18先送-1, d4 n/ \" o* R; `7 ?
b16td5_3:
3 u# z$ ~$ q9 j( a5 b inc r18 ;r18增1 ! [1 T) F$ c% e' L! a3 [
subi r16,low(100) ;(r17:r16)-100
" ]) b3 j5 a/ E" I5 i/ I sbci r17,high(100)
9 o3 ]- {3 F8 s! T: x% t brcc b16td5_3 ;够减则返回b16td5_3# ]1 f1 i# b4 m- M" }
subi r16,low(-100) ;不够减+100,恢复余数* @- \$ ]" M, e5 @
sbci r17,high(-100)5 g/ k2 m% D- h9 @
ser r17 ;r17先送-1 p$ q7 I' s1 u6 [5 i4 N/ e
b16td5_4:
( G B* I b, e2 _ inc r17 ;r17增1! o8 v5 |; |8 |
subi r16,10 ;(r17:r16)-10 ' G4 Q$ @( h. w5 u: a9 a
brcc b16td5_4 ;够减则返回b16td5_4 + J# I# ^" m' f# P: r
subi r16,-10 ;不够减+10,恢复余数, {+ N5 p9 t7 ?6 t4 d7 X, b
ret
; r7 c2 ]) T5 P6 T! l% n;...........................................% T7 X+ ^0 R& e, S5 d% m! W) `7 q
) t) b: {) V( J ~+ L7 o& ~8 x1 A7 |6 {3 E+ w) c( i8 ?) H
- b) `- U& ~* M- T8 J# ?, x% ^, _
! a$ C- B# r3 E3 l
; q& j) f# `7 |$ L1 V0 _* k0 x9 X% d3 l6 W0 B8 Y- g0 K0 n5 M; v9 b
" b& d$ Z0 n- j
;...............;r16(high)r19(low)/r17 =r16(结果)+r19(余数)0 } U' M" f' |+ Z# G
4 S5 v1 N1 h4 F" I- G( ~+ m
d16v8u: ;16/8无符号除法, P. [3 W+ q) f& R9 A
cp r16,r17 ;被除数高字节 > 除数
) P+ i; r0 ^4 g8 M/ D brcc ddd ;结果溢出2 q2 m6 U4 @' L3 H; G3 N% ?2 {
ldi r18,8 ;初始化循环计数器7 R+ d2 k( K% ]+ }& v
rol r19 ;左移余数(被除数低字节)' q3 l# w. X' H0 E
aaa:* [+ w- C$ P! X% K3 y
bst r16,79 C( U8 k( k, \4 l2 `9 X
rol r16 ;左移被除数高字节# q% p1 J% V& s8 R0 d
sub r16,r17 ;r16减r17- c: B4 v3 n5 n" b3 o
brts bbb
5 a4 `1 i" b4 l* y, J+ z+ G brcc bbb1 |+ X/ s4 [$ `1 p/ S( l
add r16,r17 ;结果为负,则r16加r17
3 j4 q* L8 L6 f* g! g1 @8 E% w! D clc ;清进位位
2 J( R8 A! L: V( i rjmp ccc) Q% @/ M7 ?" f
bbb:
, X' o; K) x; ?' h% y sec ;够减,置进位位7 q+ R* N4 }% y5 d+ ~$ G
ccc:
7 ]1 c' E. B* b" z rol r19 ;左移余数
' u4 x8 X: y- `( u+ }7 F+ Y dec r18 ;减计数器/ Y0 i' I U! s& o
brne aaa ;没完成再循环
# K3 I' U% j4 p: G( H clc# S5 f: X, C5 f9 J) l
mov r17,r16 # w, `% A, m4 Q# u9 b+ v
mov r16,r19 ;r16存放结果
. t% j% ^6 r# p+ ^ mov r19,r17 ;r19存放余数
' E" w- @& `$ }4 i) F. Z ret) k9 F5 d7 T2 e* g' J6 g7 g3 _
ddd:% \* b4 }5 O1 p V0 n: T
set
% Y1 a, U4 c+ E* c+ h. {$ H ret
, C. g; p+ V k2 C; a" G* X2 a. W) ~% @) B
;..................................+ f4 U- e% x6 h" Z, e
|
|