找回密码
 注册
关于网站域名变更的通知
查看: 317|回复: 2
打印 上一主题 下一主题

AVR 系列单片机汇编 数值运算子程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-28 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 `
  • TA的每日心情
    开心
    2022-12-27 15:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-9-28 11:24 | 只看该作者
    学习了  感谢分享

    该用户从未签到

    3#
    发表于 2021-9-28 16:42 | 只看该作者
    代码感觉很有条理0 _9 E/ j- e4 {7 o
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-4 09:16 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表