0

我有以下代码来计算 1 的数量并将其保存到 reg B。我需要修改它以查找奇偶校验是偶数还是奇数......

LXI H, var1
MVI B, 00H
MVI D, 00H
MVI C, 08H
MOV A, M

LOOP: RAR
JNC SKIP
INR B
SKIP: DCR C
JNZ LOOP

HLT

var1: db 72
4

2 回答 2

4

B保持输入中设置位的计数:只需按位AND注册Bvalue 1。如果结果为1,则为奇校验。如果结果为0,则为偶数。那是因为偶数总是0在最低有效位,奇数总是有1

访问8080 级程序集的非常模糊的记忆,但我认为它会是这样的:

          MOV      A, B
          ANI      01H
          JZ       par_even
par_odd   ; parity is odd here, work your magic
          JMP      par_done

par_even  ; parity is even here, work other magic

par_done  ; carry on processing here

例如,72您使用的值 is64 + 8或 binary 01001000

因此,假设您的位计数代码正常工作,寄存器B将设置为 2,或00000010. 与它相加00000001给你 0,因此是奇偶校验。

或者,值254, or11111110会将寄存器设置B7, 或00000111。与00000001得到1,因此奇等价。

你也可以使用类似的东西:

ANA    A
JPE    par_even

其中 A 是而不是 1 位的计数。

可能需要 ANA 的原因是确保根据累加器的内容设置奇偶校验标志。只有某些操作会设置标志,并且将累加器与自身进行与运算将使其保持不变,但会根据它设置 P、S 和 Z 标志。

于 2013-03-17T03:00:51.790 回答
3

偶校验意味着在一个八位字节中设置了偶数个比特。根据这篇对Intel 8085 架构的简单介绍:

标志是一个 8 位寄存器,包含 5 个 1 位标志:
- 符号 - 如果设置了结果的最高有效位,则设置。
- 零 - 如果结果为零,则设置。
- 辅助进位 - 如果结果的位 3 到位 4 有进位,则设置。
-奇偶校验- 如果奇偶校验(结果中设置的位数)为偶数,则设置。
- 进位 - 如果在加法期间有进位,或在减法/比较期间借位,则设置。

奇偶校验标志可以最容易地使用条件分支进行测试(链接到源代码

JPE label;   // Jump if parity is Even 
JPO label;   // or jump if parity is Odd

该标志由处理单个输出寄存器的大多数算术和逻辑指令设置。反例是MOVCMP,它们不存储结果。依次修改寄存器对的算术运算(INXDEX等)没有明确的结果。

于 2013-03-17T07:35:13.650 回答