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

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

[复制链接]

该用户从未签到

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

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

    [LV.1]初来乍到

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

    该用户从未签到

    3#
    发表于 2021-9-28 16:42 | 只看该作者
    代码感觉很有条理
    9 V4 [& u! b; U# z2 `
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-6 13:26 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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