打印
[AVR单片机]

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

[复制链接]
4627|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuyiyi|  楼主 | 2010-8-12 09:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
上次看网友们在争论,能不能用最基本的与或非位指令组成加法器,答案是肯定的,大家知道,组成任何复杂的大型计算机,其基本原理离不开最基本的原子操作,即每一位的与或非操作,一般将能同时进行N位的与或非操作的计算机芯片,称作N位MPU,在由于现在有部分童鞋普遍注重结果,喜欢玩**技术,如DSP,ARM,FPGA,CPLD等,以至很多基础都没学好,本想以51单片机的布尔(位)操作指令,写一个8位加法器,同理,童鞋们也可举一反三,写一个减法器,乘法器,除法器,等任何扩展软指令,在很早以前,工业控制上的一位机,就是用此法完成数据的加减法的。

相关帖子

来自 2楼
xuyiyi|  楼主 | 2010-8-12 09:32 | 只看该作者
下面是用AVR布尔操作指令编写的8位加法器源码,为了方便网友们对比验证运行结果,特插入了一个普通的8位加法器,便于读者分段运行,验证对比运行结果。



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

.INCLUDE "ADDC__8_8.inc"


       .EQU   var1 = 143
       .EQU   var2 = 102


.CSEG

.org 0  
         RJMP  START

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

START:
;-------------------------------------------------------------
;        常规8位加法器
;-------------------------------------------------------------

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

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

         NOP
         NOP

;-------------------------------------------------------------
;        布尔指令模拟8位加法器
;-------------------------------------------------------------

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

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

.EXIT

使用特权

评论回复
来自 3楼
xuyiyi|  楼主 | 2010-8-12 09:39 | 只看该作者
ADDC__8_8.inc 文件:


;-------------------------------------------------------------
;
;                   8位加法器
;
;             R16+R17--->R17,R18(低在先)
;
;
;            输入两个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   BMOV    ; Rn,b <--- Ri,b
        BST  @2, @3
        BLD  @0, @1
.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   ; R16+R17--->R17,R18(低在先)
        CLR__Rn    R18
        ADDC__1_1  R17,0,R16,0,R18,0
        ADDC__1_1  R17,1,R16,1,R18,0
        ADDC__1_1  R17,2,R16,2,R18,0
        ADDC__1_1  R17,3,R16,3,R18,0
        ADDC__1_1  R17,4,R16,4,R18,0
        ADDC__1_1  R17,5,R16,5,R18,0
        ADDC__1_1  R17,6,R16,6,R18,0
        ADDC__1_1  R17,7,R16,7,R18,0
.endmacro

使用特权

评论回复
地板
xuyiyi|  楼主 | 2010-8-12 09:22 | 只看该作者
后来,飞船提议,本栏是AVR版块,一定要用AVR的布尔(位)操作指令写,俺只能听版主的,改用AVR位汇编指令,写一个8位加法器!

    大家知道,AVR的布尔操作指令比51单片机要弱,指令中不但没有异或布尔操作指令,连最基本的与、或布尔操作指令都没有。

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

使用特权

评论回复
5
zusen| | 2010-8-12 09:32 | 只看该作者
上程序,哈

使用特权

评论回复
6
xuyiyi|  楼主 | 2010-8-12 09:40 | 只看该作者
------如何用AVR位操作指令组建一个8位加法器------

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

使用特权

评论回复
7
zusen| | 2010-8-12 09:44 | 只看该作者
人家要乘法哦

使用特权

评论回复
8
xuyiyi|  楼主 | 2010-8-12 09:53 | 只看该作者
饭一口一口吃,慢慢来,俺写个加法算给个提示,离一个星期时限还有好几天,那两位PK者,如有兴趣,写个乘法也不难,大家一起动手写,一起乐,谁先写出算谁赢,何乐而不为?

匠人言:“独乐乐不如众乐乐”,哈哈!

使用特权

评论回复
9
hotpower| | 2010-8-13 07:24 | 只看该作者
俺从来都认为汇编的最高境界是如何使用宏,宏的最高境界是将其做成类C的“高级语言”。
裤子2条发放,若飞船有意见,就让他拿出原创来

使用特权

评论回复
10
宇宙飞船| | 2010-8-13 07:55 | 只看该作者
用宏不是不好,但若起的名字没有意义,嵌套过多,同看机器码没有啥分别。
  BLD    @0,@1       ; An,n
   BLD    @4,@5       ; Cy,n      
看了这两句有啥感觉?给俺的感觉是让人摸不着头脑。

使用特权

评论回复
11
宇宙飞船| | 2010-8-13 08:11 | 只看该作者
用宏的可以做成C风格,但起名字好坏,决定了程序的可读性。

DELAY(100ms )    //例如象这样起
DELAY(20us )

使用特权

评论回复
12
xuyiyi|  楼主 | 2010-8-13 08:12 | 只看该作者
谢谢飞船大师指点,俺从没用过AVR汇编,也不懂AVR汇编的精髓,这次是应您的要求,学用AVR汇编写的处女作。

关于宏定义,俺是抄ATMEL公司AVR汇编宏定义的实例,事实上俺也不会用宏,请飞船大师多多指教,怎样写才能让人摸得着头脑,让菜鸟一看就会,一点就通。

请飞船大师在百忙当中,抽点宝贵的时间,写个示范样本出来,让俺等菜鸟学习学习,谢谢。

使用特权

评论回复
13
xuyiyi|  楼主 | 2010-8-13 08:19 | 只看该作者
俺从来都认为汇编的最高境界是如何使用宏,宏的最高境界是将其做成类C的“高级语言”。
裤子2条发放,若飞船有意见,就让他拿出原创来
hotpower 发表于 2010-8-13 07:24


谢谢大叔的裤子,俺一定努力,多抄多写点东东贴出来。

使用特权

评论回复
14
宇宙飞船| | 2010-8-13 08:20 | 只看该作者
.equ  100ms  = 0x010
.equ  20us     = 0x001

.marco Delay
            ldi   temp,@0
           call   delay_1
.endmarco

DELAY(100ms )   
DELAY(20us )

使用特权

评论回复
15
xuyiyi|  楼主 | 2010-8-13 08:29 | 只看该作者
LS的太简单,那是大二大三玩的,请飞船大师在百忙当中,抽点宝贵的时间,请将5楼的宏定义改写成让人摸得着头脑,让菜鸟一看就会,一点就通的示范样本出来,让俺等菜鸟学习学习,也好让大叔名正言顺的给您穿条裤子,谢谢。

使用特权

评论回复
16
acgean| | 2010-8-13 12:36 | 只看该作者
出个除法吧, AVR 的除法是个软肋

使用特权

评论回复
17
此心向学| | 2010-8-13 14:38 | 只看该作者

使用特权

评论回复
18
123jj| | 2010-8-13 14:43 | 只看该作者
呵呵!
LS的如意金箍棒厉害!

使用特权

评论回复
19
123jj| | 2010-8-13 14:45 | 只看该作者
出个除法吧, AVR 的除法是个软肋
acgean 发表于 2010-8-13 12:36



对于用布尔操作指令来说,除法和乘法差不多,就依飞船的意思,写个乘法的吧!

使用特权

评论回复
20
xuyiyi|  楼主 | 2010-8-13 15:25 | 只看该作者
对用移位法来做乘法或除法,这两者的复杂性差不多,编程方法也相近,编写也是比较容易的。

使用特权

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

本版积分规则

55

主题

2448

帖子

6

粉丝