打印
[AVR单片机]

电工常识之(3):用AVR位操作指令编写一个8位乘法器

[复制链接]
4810|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuyiyi|  楼主 | 2010-8-14 10:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上次飞船摆雷台公布PK题目:愿意接受用AVR写布尔表达式乘法器的,请速报上名来。

主要内容如下:
摆雷台的人是:粉丝
所用器件----AVR
PK内容,用汇编语言写出一个布尔处理的4*4乘法器。

///////////////////////////////////////////////////////////////////////

俺同事123JJ应战,粉丝正式公告:接受123JJ用AVR布尔功能写4*4硬件乘法器挑战!

期限定一个星期,用AVR的布尔提供的功能实现4*4的硬件乘法器功能。语言---AVR汇编。编译器avrstudio ,即日起生效!

///////////////////////////////////////////////////////////////////////

后来,由于大家众所周知的原因,和二姨家的大多数PK话题一样,流产了,大家笑过之后只当什么都没发生,新的一天又开始了。

由于都弃权放弃了PK,俺捡来写一个吧!

粉丝的题目是:用AVR的布尔提供的功能实现4*4的硬件乘法器功能。语言---AVR汇编。编译器avrstudio 。

由于实在太简单了,俺就跳过,直接写一个 网友 英雄无敌六 所建议的8*8乘法器。


当然,这种大二大三水平的题目,只适合菜鸟初学者学习,老鸟请绕道,呵呵!
评分
参与人数 1威望 +1 收起 理由
无名刀客 + 1

相关帖子

来自 2楼
xuyiyi|  楼主 | 2010-8-14 10:23 | 只看该作者
;-------------------------------------------------------------
;
;                   8位乘法器
;
;
;            输入两个8位常数 var1 和 var2,
;            输出一个16位数 R17,R18(低在先)
;
;-------------------------------------------------------------

.INCLUDE "MUL__8_8.inc"


       .EQU   var1 = 179
       .EQU   var2 = 132


.CSEG

.org 0  
         RJMP  START

ADD8_8:  ADD   R17,R16    ; R16+R17--->R17,R18(低在先)
         LDI   R18,0
         ADC   R18,R18
         RET

MUL__8x8:SET__Rn  R19
         CLR__Rn  R18
         CLC
MLOOP1:  BRCS  MLOOP2
         RJMP  MLOOP3
MLOOP2:  ADDC__8_8   R18,R16
MLOOP3:  ROR__Rn     R18
         ROR__Rn     R17  
         DEC__Rn     R19
         BRTC  MLOOPEND
         RJMP  MLOOP1
MLOOPEND:RET


MUL8x8:  LDI   R19,9      ; R16*R17--->R17,R18(低在先)
         CLR   R18
         CLC
MLOOP5:  BRCC  MLOOP4
         ADD   R18,R16
MLOOP4:  ROR   R18
         ROR   R17
         DEC   R19
         BRNE  MLOOP5
         RET


START:

         LDI     R28,0x00      
         LDI     R29,0x01        
         OUT     0x3E,R29      
         OUT     0x3D,R28        

;-------------------------------------------------------------
;           常规8位乘法器
;        R16*R17--->R17,R18(低在先)
;-------------------------------------------------------------

         LDI   R16,var1        ; 读入乘数、被乘数
      LDI   R17,var2
         RCALL MUL8x8          ; 8位数相乘

;---------------------END-------------------------------------

         NOP
         NOP

;-------------------------------------------------------------
;         布尔指令模拟8位乘法器
;        R16*R17--->R17,R18(低在先)
;-------------------------------------------------------------

         LDI__Rn   R16,var1     ; 布尔指令模拟读入乘数、被乘数
      LDI__Rn   R17,var2
         RCALL     MUL__8x8     ; 布尔指令模拟8位数相乘

;---------------------END-------------------------------------
         NOP
         NOP
STARTEND:
         RJMP  STARTEND

.EXIT

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
无名刀客 + 1
来自 3楼
xuyiyi|  楼主 | 2010-8-14 10:27 | 只看该作者
MUL__8_8.inc 文件:


;-------------------------------------------------------------
;
;                   8位乘法器
;
;
;            输入两个8位常数 var1 和 var2,
;            输出一个16位数 R17,R18(低在先)
;
;-------------------------------------------------------------

.macro  LDI__Rn
.if  ((@1 >> 7) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,7
.if  ((@1 >> 6) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,6
.if  ((@1 >> 5) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,5
.if  ((@1 >> 4) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,4
.if  ((@1 >> 3) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,3
.if  ((@1 >> 2) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,2
.if  ((@1 >> 1) & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,1
.if  (@1 & 0x01)
    SET
.else
    CLT
.endif
    BLD  @0,0
.endmacro

.macro  CLR__Rn
CLT
BLD  @0,7
BLD  @0,6
BLD  @0,5
BLD  @0,4
BLD  @0,3
BLD  @0,2
BLD  @0,1
BLD  @0,0
.endmacro

.macro  SET__Rn
SET
BLD  @0,7
BLD  @0,6
BLD  @0,5
BLD  @0,4
BLD  @0,3
BLD  @0,2
BLD  @0,1
BLD  @0,0
.endmacro

.macro   BMOV    ; Rn,b <--- Ri,b
        BST  @2, @3
        BLD  @0, @1
.endmacro

.macro   ROR__Rn      ; Rn,Cy,n(辅助进位)
        BRCS  ROR_Rn1
        CLT
        RJMP  ROR_Rn2
ROR_Rn1:SET
ROR_Rn2:BLD   R20,0
        BST   @0,0
        BRTS  ROR_Rn3
        CLC
        RJMP  ROR_Rn4
ROR_Rn3:SEC
ROR_Rn4:BMOV  @0,0,@0,1
        BMOV  @0,1,@0,2
        BMOV  @0,2,@0,3
        BMOV  @0,3,@0,4
        BMOV  @0,4,@0,5
        BMOV  @0,5,@0,6
        BMOV  @0,6,@0,7
        BMOV  @0,7,R20,0
.endmacro

.macro   DEC__Rn      ; Rn,Cy,n(辅助进位)
        BMOV  R20,0,@0,0
        BMOV  @0,0,@0,1
        BMOV  @0,1,@0,2
        BMOV  @0,2,@0,3
        BMOV  @0,3,@0,4
        BMOV  @0,4,@0,5
        BMOV  @0,5,@0,6
        BMOV  @0,6,@0,7
        CLT
        BLD   @0,7
        BST   R20,0
.endmacro

.macro   ADDC__1_1   ;(An,n),(Bn,n),(Cy,n)  
; (An,n)+(Bn,n)+(Cy,n)==(Cy,n),(An,n)
            SBRS   @4,@5       ; Cy,n
            RJMP   CyC
CyS:     SBRC   @2,@3       ; Bn,n
            RJMP   SBnS
SBnC:   SBRS   @0,@1       ; An,n
            RJMP   SAnC
SAnS:   CLT            
            BLD    @0,@1       ; An,n
            RJMP   ADDC__1_1_END
SAnC:   CLT            
            BLD    @4,@5       ; Cy,n
            SET
            BLD    @0,@1       ; An,n
SBnS:   RJMP   ADDC__1_1_END
CyC:    SBRS   @0,@1       ; An,n
            RJMP   CAnC
CAnS:   SBRS   @2,@3       ; Bn,n
            RJMP   CBnC
CBnS:   SET            
            BLD    @4,@5       ; Cy,n
            CLT
            BLD    @0,@1       ; An,n
CBnC:   RJMP   ADDC__1_1_END
CAnC:   BMOV   @0,@1,@2,@3 ; An,n,Bn,n
ADDC__1_1_END:
.endmacro

.macro   ADDC__8_8    ; Rm, Rn,(Cy,n)
      ; Rm+Rn--->Rm,(Cy,n)(低在先)
        CLR__Rn    R20
        ADDC__1_1  @0,0,@1,0,R20,0
        ADDC__1_1  @0,1,@1,1,R20,0
        ADDC__1_1  @0,2,@1,2,R20,0
        ADDC__1_1  @0,3,@1,3,R20,0
        ADDC__1_1  @0,4,@1,4,R20,0
        ADDC__1_1  @0,5,@1,5,R20,0
        ADDC__1_1  @0,6,@1,6,R20,0
        ADDC__1_1  @0,7,@1,7,R20,0
        BST   R20,0
        BRTS  ADDC_1
        CLC
        RJMP  ADDC_2
ADDC_1: SEC
ADDC_2:
.endmacro

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
无名刀客 + 1
地板
xuyiyi|  楼主 | 2010-8-14 10:20 | 只看该作者
大家知道,AVR的布尔操作指令比51单片机要弱,指令中不但没有异或布尔操作指令,连最基本的与、或布尔操作指令都没有。

看来用常规的方法编写,确实有点困难,只能另开途径。


下面是用AVR布尔操作指令编写的8位乘法器源码,为了方便网友们对比验证运行结果,特插入了一个普通的8位乘法器,便于读者分段运行,验证对比运行结果。

使用特权

评论回复
5
xuyiyi|  楼主 | 2010-8-14 10:27 | 只看该作者
------如何用AVR位操作指令组建一个8位乘法器------

------连载完,谢谢关注------

使用特权

评论回复
6
无名刀客| | 2010-8-14 10:32 | 只看该作者
好文,学习了。

使用特权

评论回复
7
李冬发| | 2010-8-14 10:42 | 只看该作者
看来飞船不知道AVR的位指是啥样的。

使用特权

评论回复
8
123jj| | 2010-8-14 13:31 | 只看该作者
看来飞船不知道AVR的位指是啥样的。
李冬发 发表于 2010-8-14 10:42



不会吧?!

飞船大力推广汇编及混编,号称

打造最强单片机“汇编”与“C”的混编论坛,让世人重新定位8位单片机---> AVR

不可能不知道AVR的位指是啥样的。只是最近太忙,忙于干大事业,这种小事就免了吧。

使用特权

评论回复
9
123jj| | 2010-8-14 18:01 | 只看该作者
再顶!顶顶更健康,哈哈!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

2448

帖子

6

粉丝