Assembly 二进制到BCD转换
我被要求将8位二进制转换为3位BCD 我在网上看到人们使用Assembly 二进制到BCD转换,assembly,binary,8051,bcd,Assembly,Binary,8051,Bcd,我被要求将8位二进制转换为3位BCD 我在网上看到人们使用DIV,但我一点也不明白,为什么我要除以#0AH 如果要求我使用2对8位寄存器将16位减去16位,我是否需要使用CPL和+1将其传输到2的comp,或者只使用SUBB命令 R4-7是寄存器 MOV A, R5 SUBB A, R7 JNC L1 DEC R4 L1: MOV 20H,A CLR C MOV A, R4 S
DIV
,但我一点也不明白,为什么我要除以#0AH
如果要求我使用2对8位寄存器将16位减去16位,我是否需要使用CPL
和+1
将其传输到2的comp,或者只使用SUBB
命令
R4-7
是寄存器
MOV A, R5
SUBB A, R7
JNC L1
DEC R4
L1: MOV 20H,A
CLR C
MOV A, R4
SUBB A, R6
MOV 21H,A
END
问题1:为什么我需要
DIV
by#0AH来获取二进制值的BCD?
如今,计算机(微控制器是计算机)中的每个整数值通常都以二进制形式存储。所以这里没有什么特别的事情要做。如果您想要BCD(二进制编码的十进制数),您将需要数百位、十位和四位分隔的数字。为此,您需要除以10(并保存余数),可以将其编码为#0AH
。然而,我不会写这篇文章,而是写一篇更加清晰的文章
让我们假设要转换的数字在累加器A
中,并且您希望结果在寄存器对R0(MSByte)和R1(LSByte)中。您需要多个寄存器,因为您得到的3个数字总共是12位宽
DIV
将A
除以B
,并在A
中给出整数商,在B
中给出余数
MOV B,#10
DIV AB ; floor(number / 10) in A, 1s in B
MOV R1,B ; 1s are now in R1 (bits 3 to 0)
MOV B,#10
DIV AB ; floor(number / 100) in A, 10s in B
MOV R0,A ; 100s are now in R0 (bits 3 to 0)
MOV A,B ; 10s are now in ACC (bits 3 to 0)
SWAP A ; 10s are now in bits 7 to 4 in ACC
ORL A,R1
MOV R1,A ; 10s and 1s are now in R1
问题2:我是否需要通过CPL
和+1传输第二个操作数[回答者:求反],还是只使用SUBB
?
不,您只需使用SUBB
。在第一次SUBB
之前,您将清除进位标志
让我们假设第一个操作数(要进行减法运算的“最小值”)位于寄存器对R0(MSByte)和R1(LSByte)中,第二个操作数(要进行减法运算的“最小值”)位于寄存器对R2(MSByte)和R3(LSByte)中。结果(“差异”)应位于寄存器对R4(MSByte)和R5(LSByte)中
最后一点注意:如果您希望看到此处未描述的详细信息,请使用模拟器来尝试代码。0x0A是10,因此您可以除以10。如果除以10,DIV还将返回与最后一个十进制数字相等的余数。例如:123%10=3,这是最后一个数字。因此,如果您想将示例83(=B01010011)转换为BCD。然后你基本上会这样做:
(83/10)至于减法,SUBB的全部要点是你不需要转换,也不需要自己处理。它是专门为多字节减法而设计的。
CLR C
MOV A,R1
SUBB A,R3
MOV R5,A
MOV A,R0
SUBB A,R2 ; borrow bit from LSByte subtraction is taken into account
MOV R4,A