矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3178|回复: 20

学习MCS-51单片机汇编BCD码减法

[复制链接]
     
发表于 2023-10-27 17:37:37 | 显示全部楼层 |阅读模式
BCD码加法可用十进制调整指令"DA"
但用在BCD码减法无效,左查右找及个人理解,写一小段代码
相信会有更快捷的汇编算法

;---------------------------------
; 两字节BCD码减法
; 被减数、差在R6.R7,最高位R6

SUB_BCD:  clr    C                ; CY=0,清进/借位标志
          mov    A,#1             ; 立即数(减数)"1"->累加器ACC
          xch    A,R7             ; ACC和R7内容互换
          subb   A,R7             ; ACC-R7(低8位R7减1)     
          jb     AC,SUB_A         ; 查询,AC=1(发生半字节借位)? 是,到处理
          mov    R7,A             ; 否,ACC->R7
          ret
SUB_A:    jc     SUB_B            ; 再查,CY=1(发生字节借位)? 是,到处理
          subb   A,#0x6           ; 否,被减数(ACC内容)减立即数6H,二进制1111-0110=1001(十进制"9")
          mov    R7,A
          ret
SUB_B:    clr    C                ; 清CY,避免减借位位
          subb   A,#0x66          ; 被减数(ACC内容)减立即数66H,二进制11111111-01100110=10011001(十进制"99")
          mov    R7,A

          mov    A,#1             ; 发生借位,高8位减1
          xch    A,R6
          subb   A,R6             ; ACC-R6
          jb     AC,SUB_C
          mov    R6,A             ; ACC->R6(高8位)
          ret
SUB_C:    jc     SUB_D
          subb   A,#0x6
          mov    R6,A
          ret
SUB_D:    clr    C
          subb   A,#0x66
          mov    R6,A
          ret
;---------------------------------
; 两字节BCD码加法
; 被加数、和在R6.R7,最高位R6

ADD_BCD:  mov    A,#1             ; 立即数(加数)"1"->累加器ACC
          xch    A,R7             ; ACC和R7内容互换
          add    A,R7             ; 被加数低8位(ACC内容)+加数
          da     A                ; 十进调整,结果在ACC
          mov    R7,A             ; ACC->R7(低8位)
          jc     ADD_A            ; CY=1(发生进位)? 否,返回
          ret
ADD_A:    mov    A,#0             ; 是,ACC清零
          xch    A,R6
          addc   A,R6             ; 被加数高8位(ACC内容)+进位位
          da     A
          mov    R6,A             ; ACC->R6(高8位)
          ret

评分

2

查看全部评分

     
发表于 2023-10-27 18:03:21 | 显示全部楼层
请问现在哪里在用BCD码??

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-27 18:17:43 | 显示全部楼层
w6955 发表于 2023-10-27 18:03
请问现在哪里在用BCD码??

谢谢关注!

没事写着玩儿
当然可以用十六进制加或减法,再转换为BCD码
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-27 22:56:29 | 显示全部楼层
;         MCU=AT89C51, Fosc=11.0592MHz

BARGB0    equ    0x08             ; 高8位
BARGB1    equ    0x09
;---------------------------------
          org    0x0000           ; 复位矢量
          ajmp   C51_STAR         ; 到主代码
;----------------------------------------------------------------
; 主代码
          org    0x0036           ; 存放起地址
C51_STAR: mov    SP,#0x4F         ; 堆栈指针[50H起]

          mov    R6,#0
          mov    R7,#0

          call   SUB_HEX          ; 调用减法
          mov    BARGB0,R6        ; 复制待转内容
          mov    BARGB1,R7
          call   HEX2BCD          ; 调用HEX转BCD
          sjmp   $
;----------------------------------------------------------------
; 二进制数两字节无符号减法
; 被减数、差在R6.R7,最高位R6

SUB_HEX:  clr    C                ; 清进/借位标志CY
          mov    A,#0x1           ; 立即数(减数)"0x1"->累加器ACC
          xch    A,R7             ; ACC和R7内容互换
          subb   A,R7             ; 被减数低8位(ACC内容)-减数
          mov    R7,A             ; A->R7(低8位)

          mov    A,#0x0           ; A清零
          xch    A,R6
          subb   A,R6             ; 被减数高8位(ACC内容)-借位位
          mov    R6,A             ; A->R7(高8位)
          ret
;---------------------------------
; 二进制数两字节无符号加法
; 被加数、和在R6.R7,最高位R6

ADD_HEX:  mov    A,#0x1           ; 立即数(加数)"0x1"->累加器ACC
          xch    A,R7             ; ACC和R7内容互换
          add    A,R7             ; 被加数低8位(ACC内容)+加数
          mov    R7,A             ; A->R7(低8位)

          mov    A,#0x0           ; A清零
          xch    A,R6
          addc   A,R6             ; 被加数高8位(ACC内容)+进位位
          mov    R6,A             ; A->R6(高8位)
          ret                                                                               
;---------------------------------
; 二进制数转BCD码
; 待转换数在BARGB0.BARGB1,最高位在BARGB0
; 压缩BCD码在R3.R4.R5,最高位在R3

HEX2BCD:  mov    R2,#16           ; 循环16次
          mov    R3,#0
          mov    R4,#0            ; 清零待用
          mov    R5,#0

TO_BCD:   mov    A,BARGB1         ; 低8位内容->A
          rlc    A                ; 带C左移
          mov    BARGB1,A

          mov    A,BARGB0
          rlc    A
          mov    BARGB0,A

          mov    A,R5             ; 低位开始,R5的内容->A
          addc   A,R5             ; 带进位自身相加(相当于乘2)
          da     A                ; 十进制调整
          mov    R5,A

          mov    A,R4
          addc   A,R4
          da     A       
          mov    R4,A

          mov    A,R3
          addc   A,R3
          da     A
          mov    R3,A
          djnz   R2,TO_BCD       ; 已处理完16bit?否,继续
          ret
;----------------------------------------------------------------
          end
回复 支持 反对

使用道具 举报

     
发表于 2023-10-28 01:10:00 | 显示全部楼层
见你也玩汇编,
送你几个汇编运算的代码:



二进制数运算.rar (1.56 KB, 下载次数: 143)

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-28 09:06:33 | 显示全部楼层
本帖最后由 mov99 于 2023-10-28 09:11 编辑
lxa000 发表于 2023-10-28 01:10
见你也玩汇编,
送你几个汇编运算的代码:


谢谢分享! 已下载,学习中

要是有"四字节(32x32位)无符号数除法"更好了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-28 16:08:52 | 显示全部楼层
找到了 32X32位二进制无符号除法
http://www.360doc.com/content/12/0121/07/46444674_931067068.shtml
在此,感谢原作!
回复 支持 反对

使用道具 举报

     
发表于 2023-10-28 20:21:30 | 显示全部楼层
图中的书是当年的工具书,很不错。如果只是玩玩汇编语言,也可以,但要解决实际应用项目,编程工作效率太低。现在的单片机,性能在提高,价格在降低,除了特殊场合,用C语言应该更符合现实。

补充内容 (2023-10-29 08:05):
还有,单片机C语言编译质量在改善。

MCS-51子程序

MCS-51子程序

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-28 20:25:12 | 显示全部楼层
zjnbdxsh 发表于 2023-10-28 20:21
图中的书是当年的工具书,很不错。如果只是玩玩汇编语言,也可以,但要解决实际应用项目,编程工作效率太低 ...

谢谢关注!

做项目必须用C编程
我整这个纯属鼓捣玩
回复 支持 反对

使用道具 举报

     
发表于 2023-10-28 21:15:11 | 显示全部楼层
mov99 发表于 2023-10-28 09:06
谢谢分享! 已下载,学习中

要是有"四字节(32x32位)无符号数除法"更好了

有一个,
不知道是不是你需要的:


多字节无符号数除法子程序.rar (456 Bytes, 下载次数: 92)
回复 支持 反对

使用道具 举报

     
发表于 2023-10-29 16:57:21 | 显示全部楼层
减法是不能用DA A指令的,有点啰嗦。很多年没有用ASM了。这些年都用C了。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-29 17:08:35 | 显示全部楼层
快乐毛毛虫 发表于 2023-10-29 16:57
减法是不能用DA A指令的,有点啰嗦。很多年没有用ASM了。这些年都用C了。

谢谢关注!

汇编语言是有点麻烦,必须对单片机详细了解后才能写代码,简单的控制及加、减、乘、除运算还凑合
浮点运算想都不用去想;不搞工程,能满足业余制作闲玩,够用了
回复 支持 反对

使用道具 举报

     
发表于 2023-10-29 17:51:49 | 显示全部楼层
减法BCD调整没有这么麻烦,用汇编的时候用过,想着是加一个数既可以调整,上学时老师讲课DA A时说过,现在用C了,怎么调整忘了。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-10-29 18:51:23 | 显示全部楼层
mov99 发表于 2023-10-29 17:08
谢谢关注!

汇编语言是有点麻烦,必须对单片机详细了解后才能写代码,简单的控制及加、减、乘、除运算 ...

汇编语言入门快,上手快,但是后面计算就相当啰嗦了。我从1997年开始上51单片机汇编语言课,到了2012这样吧,改上C了。现在用32了。
现在高校里,有部分高校还是上汇编,这个是落后了。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-29 23:07:11 | 显示全部楼层
快乐毛毛虫 发表于 2023-10-29 18:51
汇编语言入门快,上手快,但是后面计算就相当啰嗦了。我从1997年开始上51单片机汇编语言课,到了2012这样 ...

老师好!谢谢关注!

也想过学C骗程,比如,某芯片输出的电压对应的是分贝值,通过单片机采样把测量的结果换算为有效值电压(分贝转电压),或分贝转功率,可能要用到指数、对数运算,这样又涉及浮点运算,用汇编工作量很大,但用C编程也许是几条语句搞定;现在, 记忆力减、理解能力严重减退,纯属闲玩单片机
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 19:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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