gpt4 book ai didi

division - 如何在 8085 处理器上将 BCD 除以 2?

转载 作者:行者123 更新时间:2023-12-05 07:52:21 26 4
gpt4 key购买 nike

在 8085 处理器上,一种将 BCD 除以 2 的高效算法在将 BCD 转换为二进制表示时会派上用场。您可能会想到递归减法或乘以 0.5,但是这些算法需要冗长的算术运算。

因此,我想与您分享以下代码(在 8085 汇编程序中),它可以更有效地完成此操作。该代码已在 GNUSim8085 和 ASM80 仿真器上进行了全面测试。如果此代码对您有帮助,请与我分享您的经验。

在运行代码之前,将 BCD 放入寄存器 A。如果要从更高有效字节(值 50)接收余数,则设置进位标志。执行后,寄存器 A 将包含结果。进位标志用于将余数(如果有)传递到下一个较低有效字节。

该算法在以非常特殊的方式处理 C 和 Acflags后使用 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

最佳答案

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

D7D6D5D4 D3D2D1D0
对于除以 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 ; remainder = 0      STC      CMC       ; clear the carry flag      RAR       ; right shift the data      JNC SKIP      INR B     ; CY=1 so, remainder = 1SKIP: 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 shiftFIN:  HLT       ; A has the result, B has the remainder

关于division - 如何在 8085 处理器上将 BCD 除以 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com