【问题标题】:assembly lang 8085 .. how to find even/odd parity汇编语言 8085 .. 如何找到偶数/奇数奇偶校验
【发布时间】:2013-03-05 14:52:59
【问题描述】:

我有以下代码来计算 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

【问题讨论】:

  • 您要确定哪个值的奇偶性?

标签: assembly parity 8085


【解决方案1】:

使用B 保存输入中设置位的计数:只需按位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      par_done

par_even  ; parity is even here, work other magic

par_done  ; carry on processing here

例如,您使用的值7264 + 8 或二进制01001000

因此,假设您的位计数代码正常工作,寄存器B 将设置为两个,或00000010。与 00000001 进行与运算得到 0,因此是奇偶校验。

或者,值25411111110 会将寄存器B 设置为700000111。与00000001 相加得到1,因此奇偶校验。

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

ANA    A
JPE    par_even

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

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

【讨论】:

  • @Aki,您说 B 是您正在检查的值中 1 位的 数字不是值本身。该值的奇偶性 1位计数是否为偶数,这完全由计数的最低有效位决定。您需要重新阅读答案。我并不是说 LSB 是奇偶校验位。
  • @Jim,我建议你重新阅读问题和答案。当您计算该数字中的 1 位时,根据原始代码,您最终得到 3,即 00000011 - LSB 为 SET,因此奇校验。
  • 啊……现在我明白了。我投了反对票,不应该。出于某种原因,除非编辑答案,否则它不会让我推翻我的投票。
  • 感谢指正。这是对错误问题的正确答案。 (相应地改变了我的投票平价)
【解决方案2】:

偶校验意味着在一个八位字节中设置了偶数个比特。根据这个简单介绍给Intel 8085 architecture

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

使用条件分支最容易测试奇偶校验标志 (link to source)

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

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

【讨论】:

  • 确实如此,但您不能只是盲目地使用奇偶校验位 - 只有某些操作才能设置它。
  • +1 - 但请务必先将值与自身进行 OR。如ORA A。然后用JPEJPO检查奇偶校验位
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 2015-01-18
  • 2011-12-08
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多