我有以下代码来计算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
答案 0 :(得分:3)
按位AND
注册B
,其值为1
。如果结果为1
,则为奇数奇偶校验。如果结果是0
,则它甚至是奇偶校验。那是因为偶数在最低位总是0
,奇数总是1
。
访问非常 8080级程序集的模糊记忆,但我认为它会是这样的:
MOV A, B
ANI 01H
JZ par_even
par_odd ; parity is odd here, work your magic
JMP over
par_even ; parity is even here, work other magic
par_done ; carry on processing here
例如,您使用的值72
为64 + 8
或二进制01001000
。
因此,假设您的位计数代码正常工作,则注册B
将设置为2,或00000010
。与00000001
进行AND运算可得到0,因此均衡。
或者,值254
或11111110
会将注册B
设置为7
或00000111
。使用00000001
进行AND运算得{4},因此奇偶校验。
您还可以使用以下内容:
1
其中A是值而不是1位的计数。
可能需要ANA的原因是确保根据累加器的内容设置奇偶校验标志。只有某些操作设置了标志,并且累加器与其自身的运算将保持不变,但是基于它设置P,S和Z标志。
答案 1 :(得分:1)
偶数奇偶校验意味着在八位字节中设置了偶数位。根据{{3}}的简要介绍:
Flag是一个8位寄存器,包含5个1位标志:
- 符号 - 设置是否设置了结果的最高位。
- 零 - 如果结果为零则设置 - 辅助进位 - 如果从结果的第3位到第4位有进位,则设置 - 奇偶校验 - 设置奇偶校验(结果中的设置位数)是否为偶数。
- 进位 - 设置是否在添加期间有进位,或在减法/比较期间借用。
可以使用条件分支(Intel 8085 architecture)
最容易地测试奇偶校验标志JPE label; // Jump if parity is Even
JPO label; // or jump if parity is Odd
该标志由处理单个输出寄存器的大多数算术和逻辑指令设置。反例是 MOV 和 CMP ,它们不存储结果。依次修改寄存器对的算术运算( INX , DEX 等)没有明确的结果。