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

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

[复制链接]

该用户从未签到

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

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

    [LV.1]初来乍到

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

    该用户从未签到

    3#
    发表于 2021-9-28 16:42 | 只看该作者
    代码感觉很有条理! S6 G$ D4 M# {7 F. c0 @- Y
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-19 11:57 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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