将二进制变为BCD十进制码,用汇编语言,有哪些算法?求教!!!

如题所述

第1个回答  2011-12-02
假若A是16位的二进制数字,转换的数学表达式如下:
A = 2^15+2^14+.....2^1+2^0

在转换的时候,待转换的数是16位(两字节),环路计数器是16次,最大的结果因有65535,所以至少要用2.5字节存结果,取整之后就是3个字节做结果储存。

转换要领如下:结果字节首先清零,
然后待转换字节与结果字节同时向左移,移出待转换字节的最高位,逢1结果翻一翻,见0结果原封不动,环路计数器减1,重复以上过程,直到环路计数器减到零。

注:在逢1结果翻一翻中还是加6修正,51中是有直接指令DA,但精简指令内核的MCU
都没有这条指令,因此处理上就完全不同,可以参考以下代码。看看是用了哪些技巧代替了DA指令。

-----对于单片机汇编算法的初学者,该如何把转换两字节改成转换多字节?-----

以下附上来自AVR stduio 自带的bin2 to BCD 例程。
;****************************************
;* "bin2BCD16" - 16-bit Binary to BCD conversion
;*
;* This subroutine converts a 16-bit number (fbinH:fbinL) to a 5-digit
;* packed BCD number represented by 3 bytes (tBCD2:tBCD1:tBCD0).
;* MSD of the 5-digit number is placed in the lowermost nibble of tBCD2.
;*
;* Number of words :25
;* Number of cycles :751/768 (Min/Max)
;* Low registers used :3 (tBCD0,tBCD1,tBCD2)
;* High registers used :4(fbinL,fbinH,cnt16a,tmp16a)
;* Pointers used :Z
;*
;***************************************************************************
;***** Subroutine Register Variables
.equ AtBCD0 =13 ;address of tBCD0
.equ AtBCD2 =15 ;address of tBCD1
.def tBCD0 =r13 ;BCD value digits 1 and 0
.def tBCD1 =r14 ;BCD value digits 3 and 2
.def tBCD2 =r15 ;BCD value digit 4
.def fbinL =r16 ;binary value Low byte
.def fbinH =r17 ;binary value High byte
.def cnt16a =r18 ;loop counter
.def tmp16a =r19 ;temporary value
;***** Code
bin2BCD16:
ldi cnt16a,16 ;Init loop counter
clr tBCD2 ;clear result (3 bytes)
clr tBCD1
clr tBCD0
clr ZH ;clear ZH (not needed for AT90Sxx0x)
bBCDx_1:lsl fbinL ;shift input value
rol fbinH ;through all bytes
rol tBCD0 ;
rol tBCD1
rol tBCD2
dec cnt16a ;decrement loop counter
brne bBCDx_2 ;if counter not zero
ret ; return
bBCDx_2: ldi r30, AtBCD2+1 ;Z points to result MSB + 1
bBCDx_3:
ld tmp16a,-Z ;get (Z) with pre-decrement
;----------------------------------------------------------------
;For AT90Sxx0x, substitute the above line with:
;
; dec ZL
; ld tmp16a,Z
;
;----------------------------------------------------------------
subi tmp16a,-$03 ;add 0x03
sbrc tmp16a,3 ;if bit 3 not clear
st Z,tmp16a ; store back
ld tmp16a,Z ;get (Z)
subi tmp16a,-$30 ;add 0x30
sbrc tmp16a,7 ;if bit 7 not clear
st Z,tmp16a ; store back
cpi ZL,AtBCD0 ;done all three?
brne bBCDx_3 ;loop again if not
rjmp bBCDx_1
第2个回答  2022-08-07
除以 10,取其余数。

将二进制变为BCD十进制码,用汇编语言,有哪些算法?求教!!!
除以 10,取其余数。

急!急!用汇编语言把二进制转换成十进制,要解释
用汇编语言把二进制数转换成十进制数的方法是:(1)把存放十进制数BCD码的寄存器清零。(2)把存放十进制数BCD码的寄存器内容复制到加数寄存器。(3)把要转换的二进制数由高位到低位逐位读入,若是1,则把累加器的进位寄存器置1,否则置0。(4)把存放十进制数BCD码的寄存器与加数寄存器相加后送回...

怎么将16位二进制数转换成BCD码的汇编语言程序
1、首先左移要转换的二进制码1位; 左移之后,BCD码分别置于百位、十位、个位; 如果移位后所在的BCD码列大于或等于5,则对该值加3;继续左移的过程直至全部移位完成,并检查每一列对应的bcd码是否 2、接着看信号列表。3、然后二进制代码设计。4、十进制代码。5、十六进制,最后就完成了。注意...

将二进制数01001100B,转换成bcd码。使用汇编语言。求大神回复。拜托...
二进制数01001100B?从中,分离出来百位、十位、个位,单独存放。即可。汇编语言,有很多种。

在汇编中 BCD码表怎样表示
1.压缩的BCD码用4位二进制表示一个十进制数位,整个十进制数形成一个顺序的以4位为一组的数串,例如 :bcd1 word 0237h bcd2 dword 12345678h 注意:这里每个十进制占4个二进制位,2个十进制占一个字节 2.非压缩的BCD码则以8位为一组表示一个十进制数位,8位中低4位是以8421码表示十进制...

汇编语言BCD码是什么?
计算机都是2进制来保存数据,因此要把一个10进制数据转换成2进制,才能保存在计算机中。但是10进制跟2进制之间转换很麻烦。而BCD吗就是解决这个问题的。BCD码就是把10进制数的每1位都用4位的二进制表示,如:28的BCD码是0010 1000,由于转换的时候只要计算0~9之间转换,因此非常的方便,口算就可以算...

怎样将三个字节的二进制大数,转换成十进制BCD码
先用公式把16进制转换成10进制 然后按位转换成16进制(不要整体转换).比如89C52,计算一下,得到10进制数564306.分别把5,6,4,3,0,6转换成16进制,就是BCD码了.

转bcd码 51汇编
ds1302时钟芯片,在计时时是以BCD码(就是十进制数了)的形式计数的,用汇编写程序一个是读出时间显示,一个是设置初始时间。一、显示时间、日期,要是数码管还简单些,如30H单元放的是分,显示分十位,则取(30H)的高4位,MOV A,30H,ANL A,#0F0H,SWAP A,A中即为十位。取低4位就...

...一下在汇编语言中20位无符号二进制数转化为BCD码的思路,不甚感激...
汇编语言中20位无符号二进制数转化为BCD码的思路:1 分析:20位无符号二进制数转化为十六进制数为00000H~FFFFFH 转化为最大的十进制数为1百万多。转化后的BCD码的位数包括:百万位、十万位、万位、千位、百位、十位、个位。 占3个半字节。2 你的任务就是:确定出BCD码的百万位、十万位、万...

用汇编语言将2进制整数转换为四位10进制整数。给个思路也行……注意...
余数再除以10 商是十位的值,余数就是个位的值。第二种,用位权累加。循环移位,判断第一位,是1就加1 ,是0不加,第二位加 2,第三位加 4。。8。。16。。32等等。直到最后一位判断完。注意累加时要用BCD加法,就是加数都是BCD码,加完后要用BCD调整。也就是得加 1 2 4 8 16H ...

相似回答
大家正在搜