【问题标题】:How to calculate parity of a 32bits number in assembly?如何在汇编中计算 32 位数字的奇偶校验?
【发布时间】:2015-01-18 09:21:10
【问题描述】:

我需要计算一个 32 位数字的奇偶校验并返回它。为此,我必须使用 XOR、SHR、SETP(或类似的)和 movzx。有人有想法吗?

【问题讨论】:

  • 您在这里谈论的是特定的 ISA 吗?如果是这样,请将该信息添加到您的问题中。
  • 还有一些代码。 Stackoverflow 可以帮助您解决您的代码 的问题,而不是为您提供您的工作
  • 提示:检查 x86 条件代码位。

标签: assembly x86 parity


【解决方案1】:

使用此代码:

    mov ebx, 1234 ;Replace this number with the value of which you want to know the parity
    mov cx, 4
a:
    or bl,  bl
    lahf
    ror eax, 8
    ror ebx, 8
    loop a
    xor ah, al
    ror eax, 16
    xor al, ah
    rol eax, 8
    xor ah, al
    and ah, 4
    sahf ;now the parity flag is defined

【讨论】:

  • 将原始数据水平异或到 8 位要容易得多,而不是分别获取每个 8 位的奇偶校验位,然后将其异或到 1 个字节。例如mov edx, eax / shr edx, 16 / xor eax, edx / xor al, ah / 阅读 PF。
【解决方案2】:

当然,有很多方法可以做到这一点。如果您决定使用硬件奇偶校验标志,请记住它只检查低 8 位。使用这种方法的解决方案可能是将您的 32 位输入处理为四个 8 位值,并在部分结果上使用 XOR

p(31:0) = p(31:24) ^ p(23:16) ^ p(15:8) ^ p(7:0)

要获得 8 位单位,您可以使用 SHR,要获得部分值,您可以使用 XOR,使用 SETP。这应该足以让您入门。

另一个可能更有效的选择是异或字节并获取它们的奇偶校验:

p(31:0) = p(31:24 ^ 23:16 ^ 15:8 ^ 7:0)

【讨论】:

  • 提示提示!查看完整的 x86 CC 位集!
  • @IraBaxter 我想我需要更多提示 :) 我一直在谈论使用 PF,不知道你可以使用什么其他标志...
  • @Jester:我的傻瓜,我以为你没有使用硬件奇偶校验标志,并且它适用于所有 32 位(不仅仅是 LS 字节)。适当地自我惩罚,您的答案非常好,但符号 p(...) 对我来说并不清楚。 +1 有正确的答案并挂在那里!
  • 可能是正确答案(只有 2 个异或):mov eax, ;移动 ebx, eax; shr ebx 16; xor eax, ebx;移动 ebx, eax; shr ebx, 8; xor eax, ebx; JP ...
  • @IraBaxter,您可以使用 8 位寄存器进一步简化:xor al, ah
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 2013-06-25
  • 2013-03-05
  • 2015-06-05
  • 2013-03-13
  • 2017-06-22
  • 2015-04-04
相关资源
最近更新 更多