二进制到 BCD 的转换

Los*_*awn 2 binary assembly 8051 bcd

我被要求将 8 位二进制转换为 3 位 BCD。

我看到网上有人使用DIV但我根本不明白那种方式,我为什么要除以#0AH

如果我被要求使用 2 对 8 位寄存器将 16 位减去 16 位,我是否需要使用CPL+1或仅使用SUBB命令将其传输到 2 的 comp ?

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
Run Code Online (Sandbox Code Playgroud)

the*_*bee 5

问题1:为什么我需要DIV通过#0AH 来获取二进制值的BCD?

如今,计算机(微控制器就是计算机)中的每个整数值通常都以二进制形式存储。所以这里没有什么特别的。如果您想要 BCD(二进制编码的十进制),您将需要以 4 位分隔的百位、十位和个位。为此,您需要除以10(并保存余数),这可以编码为#0AH. 但是,我不会写这个,而是写出#10更清楚地表明什么是精神。

让我们假设要转换的数字在 accumulator 中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
Run Code Online (Sandbox Code Playgroud)

问题 2:我是否需要通过和 +1来传输[answerer: negate]第二个操作数,CPL或者我可以只使用SUBB

不,您只需使用SUBB. 在第一个之前,SUBB您将清除进位标志。

假设第一个操作数(减去“被减数”)在寄存器对 R0(MSByte)和 R1(LSByte)中,第二个操作数(减去“被减数”)在寄存器对 R2(MSByte)中) 和 R3 (LSByte)。结果(“差异”)应进入寄存器对 R4(MSByte)和 R5(LSByte)。

    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
Run Code Online (Sandbox Code Playgroud)

最后说明:如果您想查看此处未描述的详细信息,请使用模拟器来尝试代码。