学习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 请问现在哪里在用BCD码?? w6955 发表于 2023-10-27 18:03
请问现在哪里在用BCD码??
谢谢关注!
没事写着玩儿:lol
当然可以用十六进制加或减法,再转换为BCD码 ; 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 见你也玩汇编,
送你几个汇编运算的代码:
本帖最后由 mov99 于 2023-10-28 09:11 编辑
lxa000 发表于 2023-10-28 01:10
见你也玩汇编,
送你几个汇编运算的代码:
谢谢分享! 已下载,学习中
要是有"四字节(32x32位)无符号数除法"更好了:) 找到了 32X32位二进制无符号除法
http://www.360doc.com/content/12/0121/07/46444674_931067068.shtml
在此,感谢原作! 图中的书是当年的工具书,很不错。如果只是玩玩汇编语言,也可以,但要解决实际应用项目,编程工作效率太低。现在的单片机,性能在提高,价格在降低,除了特殊场合,用C语言应该更符合现实。
补充内容 (2023-10-29 08:05):
还有,单片机C语言编译质量在改善。 zjnbdxsh 发表于 2023-10-28 20:21
图中的书是当年的工具书,很不错。如果只是玩玩汇编语言,也可以,但要解决实际应用项目,编程工作效率太低 ...
谢谢关注!
做项目必须用C编程
我整这个纯属鼓捣玩:) mov99 发表于 2023-10-28 09:06
谢谢分享! 已下载,学习中
要是有"四字节(32x32位)无符号数除法"更好了
有一个,
不知道是不是你需要的:
减法是不能用DA A指令的,有点啰嗦。很多年没有用ASM了。这些年都用C了。 快乐毛毛虫 发表于 2023-10-29 16:57
减法是不能用DA A指令的,有点啰嗦。很多年没有用ASM了。这些年都用C了。
谢谢关注!
汇编语言是有点麻烦,必须对单片机详细了解后才能写代码,简单的控制及加、减、乘、除运算还凑合
浮点运算想都不用去想;不搞工程,能满足业余制作闲玩,够用了 减法BCD调整没有这么麻烦,用汇编的时候用过,想着是加一个数既可以调整,上学时老师讲课DA A时说过,现在用C了,怎么调整忘了。 mov99 发表于 2023-10-29 17:08
谢谢关注!
汇编语言是有点麻烦,必须对单片机详细了解后才能写代码,简单的控制及加、减、乘、除运算 ...
汇编语言入门快,上手快,但是后面计算就相当啰嗦了。我从1997年开始上51单片机汇编语言课,到了2012这样吧,改上C了。现在用32了。
现在高校里,有部分高校还是上汇编,这个是落后了。 快乐毛毛虫 发表于 2023-10-29 18:51
汇编语言入门快,上手快,但是后面计算就相当啰嗦了。我从1997年开始上51单片机汇编语言课,到了2012这样 ...
老师好!谢谢关注!
也想过学C骗程,比如,某芯片输出的电压对应的是分贝值,通过单片机采样把测量的结果换算为有效值电压(分贝转电压),或分贝转功率,可能要用到指数、对数运算,这样又涉及浮点运算,用汇编工作量很大,但用C编程也许是几条语句搞定;现在,:lol 记忆力减、理解能力严重减退,纯属闲玩单片机
页:
[1]
2