对使用组件8051的BCD二进制文件

问题描述 投票:1回答:1

我被要求通过程序代码将8位二进制转换为BCD的3位数字我看到在线用户使用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

欢呼!

assembly binary subtraction 8051 bcd
1个回答
0
投票

问题1:为什么我需要用#0AH进行DIV运算以获得二进制值的BCD?

近来,计算机(并且微控制器是计算机)中的每个整数值通常都以二进制形式存储。因此,这里没有什么特别的事情。如果要使用BCD(二进制编码的十进制),则将需要数百个,十个以及一个以4位分开的位。为此,您需要除以10(并保存余数),并且可以将其编码为#0AH。但是,我不会写这个,而是写#10,它更清楚地表明内容。

让我们假设要转换的数字在累加器A中,并且您希望将结果存入寄存器对R0(MSByte)和R1(LSByte)中。您需要一个以上的寄存器,因为您会得到3位数字,总共12位宽。

[DIVA除以​​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传输[answerer:negate]第二个操作数,或者我可以只使用SUBB?

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

假定第一个操作数(从中减去“减数”)在寄存器对R0(MSByte)和R1(LSByte)中,第二个操作数(从中减去“ subtrahend”)在寄存器对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

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

© www.soinside.com 2019 - 2024. All rights reserved.