4277|9

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求4位BCD码减法程序 [复制链接]

51系统

求汇编语言程序...给我参考参考,现在还不会呢

最新回复

谢谢  详情 回复 发表于 2010-4-22 12:28
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我记得以前的教材是有bcd加减法的运算啊
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 wslxs2008 的回复:
我记得以前的教材是有bcd加减法的运算啊


这个还是问答题呢...没有减法
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
关于BCD码的减法程序,如果用非压缩BCD数比较简单,下面我只介绍一下四位压缩BCD数的减法程序,我们这里假定被减数大于减数,我这里设定被减数位6723-4545=2178,结果保存在了寄存器R4R5中

汇编如下
       ORG 00H
START: MOV SP,#60H
    ;我这里设定的是R4R5为被减数,R6R7为减数,且 R4R5>R6R7
    ;R5,R7中存放压缩BCD数的低两位,R4,R6中存放压缩BCD数的高两位
      MOV R4,#67H
      MOV R5,#23H
      MOV R6,#45H
      MOV R7,#45H
      LCALL CLEAR
;提取压缩BCD数的低两位,被减数和减数分别存放在R5和R7中,结果放在R5中
;把一个寄存器里的两位压缩BCD数分别取出放在两个寄存器中,其中被减数放在R0,R1中,减数放在R2,R3中
   D1: CLR A
       MOV A,R5
       SWAP A
       ANL A,#0FH
       MOV R0,A
     
       CLR A
       MOV A,R5
       ANL A,#0FH
       MOV R1,A

   D2: CLR A
       MOV A,R7
       SWAP A
       ANL A,#0FH
       MOV R2,A
     
       CLR A
       MOV A,R7
       ANL A,#0FH
       MOV R3,A
      
      
       MOV R5,#00H  
      
LSUB1: CLR A
       CLR C
       MOV A,R1
       SUBB A,R3
       JC N1   ;无借位则执行下一句
       MOV R5,A
       LJMP LSUB2
  ;有借位的话
  N1:  CLR C
       DEC R0
       SUBB A,#6
       ANL A,#0FH
       MOV R5,A
      
LSUB2: CLR A
       CLR C
       MOV A,R0
       SUBB A,R2
       JC N2   ;无借位则执行下一句
       SWAP A
       ADD A,R5
       MOV R5,A
      
       JMP T2
   ;有借位的话
   N2: CLR C
       SUBB A,#6
       ANL A,#0FH
       SWAP A
       ADD A,R5
       MOV R5,A
      
;对于这位向R4寄存器中的高两位借位的为的问题作如下处理
      CLR A
      CLR C
      MOV A,R4
      ANL A,#0FH
      SUBB A,#1
      JC L1
      DEC R4
      LJMP T2
  L1: CLR C
      CLR A
      MOV A,R4
      CLR C
      CLR A
      SUBB A,#7
      MOV R4,A

T2:
       LCALL CLEAR
;开始高两位的减法,被减数和减数的高两位分别放在R4 和R6中,结果的高两位放在R4中

   C1: CLR A
       MOV A,R4
       SWAP A
       ANL A,#0FH
       MOV R0,A
     
       CLR A
       MOV A,R4
       ANL A,#0FH
       MOV R1,A

   C2: CLR A
       MOV A,R6
       SWAP A
       ANL A,#0FH
       MOV R2,A
     
       CLR A
       MOV A,R6
       ANL A,#0FH
       MOV R3,A
      
       MOV R4,#00H
            
      
HSUB1: CLR A
       CLR C
       MOV A,R1
       SUBB A,R3
       JC M1   ;无借位则执行下一句
       MOV R4,A
       JMP HSUB2
  ;有借位的话
  M1:  CLR C
       DEC R0
       SUBB A,#6
       ANL A,#0FH
       MOV R4,A
      
HSUB2: CLR A
       CLR C
       MOV A,R0
       SUBB A,R2
;    //  JC N2   ;无借位则执行下一句
       SWAP A
       ADD A,R4
       MOV R4,A
       LJMP ENDD
CLEAR: MOV R0,#0
       MOV R1,#0
       MOV R2,#0
       MOV R3,#0
RET
ENDD: NOP
END
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
想了想,还是被减数与减数大小顺序不定的情况也包含进去吧,进行了一点小小的修改,嘿嘿
具体如下
       ORG 00H
START: MOV SP,#60H
    ;我这里设定的是R4R5为被减数,R6R7为减数,且 R4R5>R6R7
    ;R5,R7中存放压缩BCD数的低两位,R4,R6中存放压缩BCD数的高两位
      MOV R4,#67H
      MOV R5,#23H
      MOV R6,#45H
      MOV R7,#45H
      LCALL CLEAR
;提取压缩BCD数的低两位,被减数和减数分别存放在R5和R7中,结果放在R5中
;把一个寄存器里的两位压缩BCD数分别取出放在两个寄存器中,其中被减数放在R0,R1中,减数放在R2,R3中
   D1: CLR A
       MOV A,R5
       SWAP A
       ANL A,#0FH
       MOV R0,A
     
       CLR A
       MOV A,R5
       ANL A,#0FH
       MOV R1,A

   D2: CLR A
       MOV A,R7
       SWAP A
       ANL A,#0FH
       MOV R2,A
     
       CLR A
       MOV A,R7
       ANL A,#0FH
       MOV R3,A
      
      
       MOV R5,#00H  
      
LSUB1: CLR A
       CLR C
       MOV A,R1
       SUBB A,R3
       JC N1   ;无借位则执行下一句
       MOV R5,A
       LJMP LSUB2
  ;有借位的话
  N1:  CLR C
       DEC R0
       SUBB A,#6
       ANL A,#0FH
       MOV R5,A
      
LSUB2: CLR A
       CLR C
       MOV A,R0
       SUBB A,R2
       JC N2   ;无借位则执行下一句
       SWAP A
       ADD A,R5
       MOV R5,A
      
       JMP T2
   ;有借位的话
   N2: CLR C
       SUBB A,#6
       ANL A,#0FH
       SWAP A
       ADD A,R5
       MOV R5,A
      
;对于这位向R4寄存器中的高两位借位的为的问题作如下处理
      CLR A
      CLR C
      MOV A,R4
      ANL A,#0FH
      SUBB A,#1
      JC L1
      DEC R4
      LJMP T2
  L1: CLR C
      CLR A
      MOV A,R4
      CLR C
      CLR A
      SUBB A,#7
      MOV R4,A

T2:
       LCALL CLEAR
;开始高两位的减法,被减数和减数的高两位分别放在R4 和R6中,结果的高两位放在R4中

   C1: CLR A
       MOV A,R4
       SWAP A
       ANL A,#0FH
       MOV R0,A
     
       CLR A
       MOV A,R4
       ANL A,#0FH
       MOV R1,A

   C2: CLR A
       MOV A,R6
       SWAP A
       ANL A,#0FH
       MOV R2,A
     
       CLR A
       MOV A,R6
       ANL A,#0FH
       MOV R3,A
      
       MOV R4,#00H
            
      
HSUB1: CLR A
       CLR C
       MOV A,R1
       SUBB A,R3
       JC M1   ;无借位则执行下一句
       MOV R4,A
       JMP HSUB2
  ;有借位的话
  M1:  CLR C
       DEC R0
       SUBB A,#6
       ANL A,#0FH
       MOV R4,A
      
HSUB2: CLR A
       CLR C
       MOV A,R0
       SUBB A,R2
;    //  JC N2   ;无借位则执行下一句
       SWAP A
       ADD A,R4
       MOV R4,A
       LJMP ENDD
CLEAR: MOV R0,#0
       MOV R1,#0
       MOV R2,#0
       MOV R3,#0
RET
ENDD: NOP
END
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
额。。。。。对不起 ,第二次搞错了 还是那个没变 在这里呢

       ORG 00H
START: MOV SP,#60H
     ;我这里设定的是R4R5为被减数,R6R7为减数,
      ;R5,R7中存放压缩BCD数的低两位,R4,R6中存放压缩BCD数的高两位
       MOV R4,#05H
      MOV R5,#05H
      MOV R6,#45H
      MOV R7,#45H
      LCALL CLEAR
      ;先判断两个数的大小,然后将大数放在前面然后进行运算
       CLR A
      CLR C
      MOV A,R4
      SUBB A,R6
      JZ NEXT
      JC CHANG
      LJMP D1
NEXT: CLR A
      CLR C
      MOV A,R5
      SUBB A,R7
      JZ NEXT1
      JC CHANG
      LJMP D1
NEXT1: MOV R4,#0
       MOV R5,#0
       LJMP D1
CHANG: MOV A,R4
       XCH A,R6
       MOV R4,A
       MOV A,R5
       XCH A,R7
       MOV R5,A
;减法正式开始
;提取压缩BCD数的低两位,被减数和减数分别存放在R5和R7中,结果放在R5中
;把一个寄存器里的两位压缩BCD数分别取出放在两个寄存器中,其中被减数放在R0,R1中,减数放在R2,R3中
   D1: CLR A
       MOV A,R5
       SWAP A
       ANL A,#0FH
       MOV R0,A
     
       CLR A
       MOV A,R5
       ANL A,#0FH
       MOV R1,A

   D2: CLR A
       MOV A,R7
       SWAP A
       ANL A,#0FH
       MOV R2,A
     
       CLR A
       MOV A,R7
       ANL A,#0FH
       MOV R3,A
      
      
       MOV R5,#00H  
      
LSUB1: CLR A
       CLR C
       MOV A,R1
       SUBB A,R3
       JC N1   ;无借位则执行下一句
       MOV R5,A
       LJMP LSUB2
  ;有借位的话
  N1:  CLR C
       DEC R0
       SUBB A,#6
       ANL A,#0FH
       MOV R5,A
      
LSUB2: CLR A
       CLR C
       MOV A,R0
       SUBB A,R2
       JC N2   ;无借位则执行下一句
       SWAP A
       ADD A,R5
       MOV R5,A
      
       JMP T2
   ;有借位的话
   N2: CLR C
       SUBB A,#6
       ANL A,#0FH
       SWAP A
       ADD A,R5
       MOV R5,A
      
;对于这位向R4寄存器中的高两位借位的为的问题作如下处理
      CLR A
      CLR C
      MOV A,R4
      ANL A,#0FH
      SUBB A,#1
      JC L1
      DEC R4
      LJMP T2
  L1: CLR C
      CLR A
      MOV A,R4
      CLR C
      CLR A
      SUBB A,#7
      MOV R4,A

T2:
       LCALL CLEAR
;开始高两位的减法,被减数和减数的高两位分别放在R4 和R6中,结果的高两位放在R4中

   C1: CLR A
       MOV A,R4
       SWAP A
       ANL A,#0FH
       MOV R0,A
     
       CLR A
       MOV A,R4
       ANL A,#0FH
       MOV R1,A

   C2: CLR A
       MOV A,R6
       SWAP A
       ANL A,#0FH
       MOV R2,A
     
       CLR A
       MOV A,R6
       ANL A,#0FH
       MOV R3,A
      
       MOV R4,#00H
            
      
HSUB1: CLR A
       CLR C
       MOV A,R1
       SUBB A,R3
       JC M1   ;无借位则执行下一句
       MOV R4,A
       JMP HSUB2
  ;有借位的话
  M1:  CLR C
       DEC R0
       SUBB A,#6
       ANL A,#0FH
       MOV R4,A
      
HSUB2: CLR A
       CLR C
       MOV A,R0
       SUBB A,R2
;    //  JC N2   ;无借位则执行下一句
       SWAP A
       ADD A,R4
       MOV R4,A
       LJMP ENDD
CLEAR: MOV R0,#0
       MOV R1,#0
       MOV R2,#0
       MOV R3,#0
RET
ENDD: NOP
END
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
有个bcd整定的命令可以用一下,就简单了!汇编忘了!
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

8
 
在51单片机系统指令里只有十进制加法调整指令,加法的没有,所以看起来很简单,单真正写起来还显得有些麻烦,不过只能这么麻烦了,要是非压缩的还好些,压缩的bcd数最麻烦了。。。。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(中级)

9
 
额。。错了,是加法的十进制调整指令有,减法的调整指令没有,所以比较麻烦
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 5 楼 chutianya 的回复:
额。。。。。对不起 ,第二次搞错了 还是那个没变 在这里呢

  ORG 00H
START: MOV SP,#60H
  ;我这里设定的是R4R5为被减数,R6R7为减数,
  ;R5,R7中存放压缩BCD数的低两位,R4,R6中存放压缩BCD数的高两位
  MOV R4,#05H
  MOV R5,#05H
  MOV R6,#45H
  MOV R7,#45H
  LC……


谢谢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 7

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表