我被要求通过程序代码将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
欢呼!
问题1:为什么我需要用#0AH进行DIV运算以获得二进制值的BCD?
近来,计算机(并且微控制器是计算机)中的每个整数值通常都以二进制形式存储。因此,这里没有什么特别的事情。如果要使用BCD(二进制编码的十进制),则将需要数百个,十个以及一个以4位分开的位。为此,您需要除以10(并保存余数),并且可以将其编码为#0AH
。但是,我不会写这个,而是写#10
,它更清楚地表明内容。
让我们假设要转换的数字在累加器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传输[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
最后的注释:如果您想查看此处未描述的详细信息,请使用模拟器尝试代码。