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

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

[复制链接]

该用户从未签到

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

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

    [LV.1]初来乍到

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

    该用户从未签到

    3#
    发表于 2021-9-28 16:42 | 只看该作者
    代码感觉很有条理: \& m" h( M, U/ A* k
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-5 08:56 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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