mov99 发表于 2023-10-27 17:37:37

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

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

w6955 发表于 2023-10-27 18:03:21

请问现在哪里在用BCD码??

mov99 发表于 2023-10-27 18:17:43

w6955 发表于 2023-10-27 18:03
请问现在哪里在用BCD码??

谢谢关注!

没事写着玩儿:lol
当然可以用十六进制加或减法,再转换为BCD码

mov99 发表于 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         ; 堆栈指针

          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

lxa000 发表于 2023-10-28 01:10:00

见你也玩汇编,
送你几个汇编运算的代码:



mov99 发表于 2023-10-28 09:06:33

本帖最后由 mov99 于 2023-10-28 09:11 编辑

lxa000 发表于 2023-10-28 01:10
见你也玩汇编,
送你几个汇编运算的代码:

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

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

mov99 发表于 2023-10-28 16:08:52

找到了 32X32位二进制无符号除法
http://www.360doc.com/content/12/0121/07/46444674_931067068.shtml
在此,感谢原作!

zjnbdxsh 发表于 2023-10-28 20:21:30

图中的书是当年的工具书,很不错。如果只是玩玩汇编语言,也可以,但要解决实际应用项目,编程工作效率太低。现在的单片机,性能在提高,价格在降低,除了特殊场合,用C语言应该更符合现实。

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

mov99 发表于 2023-10-28 20:25:12

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

谢谢关注!

做项目必须用C编程
我整这个纯属鼓捣玩:)

lxa000 发表于 2023-10-28 21:15:11

mov99 发表于 2023-10-28 09:06
谢谢分享! 已下载,学习中

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

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


快乐毛毛虫 发表于 2023-10-29 16:57:21

减法是不能用DA A指令的,有点啰嗦。很多年没有用ASM了。这些年都用C了。

mov99 发表于 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了,怎么调整忘了。

快乐毛毛虫 发表于 2023-10-29 18:51:23

mov99 发表于 2023-10-29 17:08
谢谢关注!

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

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

mov99 发表于 2023-10-29 23:07:11

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

老师好!谢谢关注!

也想过学C骗程,比如,某芯片输出的电压对应的是分贝值,通过单片机采样把测量的结果换算为有效值电压(分贝转电压),或分贝转功率,可能要用到指数、对数运算,这样又涉及浮点运算,用汇编工作量很大,但用C编程也许是几条语句搞定;现在,:lol 记忆力减、理解能力严重减退,纯属闲玩单片机
页: [1] 2
查看完整版本: 学习MCS-51单片机汇编BCD码减法