我有以下代码来计算 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
B
保持输入中设置位的计数:只需按位AND
注册B
value 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
会将寄存器设置B
为7
, 或00000111
。与00000001
得到1
,因此奇等价。
你也可以使用类似的东西:
ANA A
JPE par_even
其中 A 是值而不是 1 位的计数。
您可能需要 ANA 的原因是确保根据累加器的内容设置奇偶校验标志。只有某些操作会设置标志,并且将累加器与自身进行与运算将使其保持不变,但会根据它设置 P、S 和 Z 标志。
偶校验意味着在一个八位字节中设置了偶数个比特。根据这篇对Intel 8085 架构的简单介绍:
标志是一个 8 位寄存器,包含 5 个 1 位标志:
- 符号 - 如果设置了结果的最高有效位,则设置。
- 零 - 如果结果为零,则设置。
- 辅助进位 - 如果结果的位 3 到位 4 有进位,则设置。
-奇偶校验- 如果奇偶校验(结果中设置的位数)为偶数,则设置。
- 进位 - 如果在加法期间有进位,或在减法/比较期间借位,则设置。
奇偶校验标志可以最容易地使用条件分支进行测试(链接到源代码)
JPE label; // Jump if parity is Even
JPO label; // or jump if parity is Odd
该标志由处理单个输出寄存器的大多数算术和逻辑指令设置。反例是MOV和CMP,它们不存储结果。依次修改寄存器对的算术运算(INX、DEX等)没有明确的结果。