Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 二进制到BCD转换_Assembly_Binary_8051_Bcd - Fatal编程技术网

Assembly 二进制到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

我被要求将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
        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