3

在 8085 处理器上,将 BCD 转换为二进制表示时,将 BCD 除以 2 的有效算法会派上用场。您可能会想到递归减法或乘以 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
4

1 回答 1

0

假设一个两位数的 BCD 数表示为:

D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
对于除以 2,对于二进制(或十六进制),只需将数字右移一位。如果存在溢出,则余数为 1,否则为 0。当 D 4为 0 时,同样的事情适用于两位(8 位)BCD 数,即从高位四位没有有效的位移。现在如果 D 4是 1(在移位之前),那么移位将在低四位中引入 8(1000),这显然会危及这个过程。请注意,在 BCD 中,位移应该引入 10/2 = 5 而不是 16/2 = 8。因此我们可以简单地通过从低四位中减去 8-5 = 3 来进行调整,即从整数中减去 03H。下面的代码总结了这个策略。我们假设累加器保存数据,除法后的结果保存在累加器中,余数保存在寄存器 B 中。

      MVI B,00H ; 余数 = 0

      STC
      管委会;清除进位标志
      RAR;右移数据

      JNC 跳过
      印度卢比 B ; CY=1 所以余数 = 1

跳过:MOV D,A;备份
      ANI 08H ; 如果在班次后获得 D3(或在班次前获得 D4)
      移动 A,D ; 从备份中获取数据
      JZ 鳍; 如果班次前的 D4 为 0
      隋 03H ; 班次调整

鳍:HLT;A有结果,B有余数
于 2021-06-25T11:48:43.883 回答