在8085处理器上,将BCD分割为2的有效算法在将BCD转换为二进制表示时非常方便。您可能会想到递归减法或乘以0.5,但这些算法需要冗长的算术。
因此,我想与您分享以下代码(在8085汇编程序中),它可以更有效地执行此操作。该代码已在GNUSim8085和ASM80仿真器上进行了全面测试。如果此代码对您有帮助,请与我分享您的经验。
在运行代码之前,将BCD放在寄存器A中。如果从更高有效字节(值50)接收到余数,则设置进位标志。执行后,寄存器A将包含结果。进位标志用于将余数(如果有的话)传递给下一个不太重要的字节。
该算法在以非常特殊的方式操作C和AC标志之后使用DAA指令,因此考虑到传递给下一个半字节(即半个八位字节)的任何余数值为5而不是8。
;Division of BCD by 2 on an 8085 processor
;Set initial values.
;Register A contains a two-digit BCD. Carry flag contains remainder.
stc
cmc
mvi a, 85H
;Do modified decimal adjust before division.
cmc
cma
rar
adc a
cma
daa
cmc
;Divide by 2.
rar
;Save quotient and remainder to registers B and C.
mov b, a
mvi a, 00H
rar
mov c, a
;Continue working on decimal adjust.
mov a, b
sui 33H
mov b, a
mov a, c
ral
mov a, b
hlt
答案 0 :(得分:0)
假设一个两位数的 BCD 号码表示为:
D7D6D5D4 D3D2D1D0对于除以 2,对于二进制(或十六进制),只需将数字右移一位。如果有溢出,则余数为 1,否则为 0。当 D4 为 0 时,同样的事情适用于两位(8 位)BCD 数,即从高阶四位没有有效的位移位。现在,如果 D4 是 1(在移位之前),那么移位将在低四位中引入 8(1000),这显然会危及这个过程。观察到在 BCD 中,位移应该引入 10/2 = 5 而不是 16/2 = 8。因此我们可以通过从低四位中减去 8-5 = 3 来简单地调整,即从整个数字中减去 03H。下面的代码总结了这个策略。我们假设累加器保存数据,除法后结果保存在累加器中,余数保存在寄存器 B 中。
MVI B,00H ; remainder = 0 STC CMC ; clear the carry flag RAR ; right shift the data JNC SKIP INR B ; CY=1 so, remainder = 1 SKIP: MOV D,A ; backup ANI 08H ; if get D3 after the shift (or D4 before the shift) MOV A,D ; get the data from backup JZ FIN ; if D4 before the shift was 0 SUI 03H ; adjustment for the shift FIN: HLT ; A has the result, B has the remainder