发布于 2021-10-16 17:55:55
他们只是不同的任意性选择。
首先要注意的是,“实际奇偶校验标志”是只在某些体系结构上提供的硬件特性;在目前主流使用的体系结构中,我认为x86是唯一具有这种标志的。因此,这种旗帜的存在,更不用说确切的语义,在任何方面都不是一个普遍的标准。
我认为GCC的选择更符合逻辑:0和1分别对应于偶数和奇数,因为0是偶数,1是奇数。我不知道为什么x86和它的前身选择做相反的事情。你可能得回到过去问问设计师。
无论如何,8086奇偶标志的实际值并不是很重要;程序员通常会使用JPE和JPO汇编程序助记符来测试它,这只允许您指定“跳转如果奇偶”或“跳转如果奇数”,而不必记住哪一个对应于标志中的0或1位。只有当您希望通过PUSHF或LAHF实际检查标志注册中的位时,该值才会变得相关,这仅在非常模糊的情况下才有用。
我看了一下历史。英特尔8086从8080中复制了它的标志,而8080也是如此。它的前身,8008,也有一个奇偶“触发器”,它似乎是设定在偶数平等,但这有点不清楚,因为你只能有条件地跳转的状态,翻转-触发器,而不是实际阅读。据说8008是从Datapoint 2200派生出来的,它实际上记录了它的奇偶翻转:设置为奇数,重置为偶数。但是,80xx语义可能是一些内部实现细节,没有任何深层次的意义,比如奇偶校验电路恰好产生了这样的结果,而且他们也没有费心地添加另一个非门来反转它。任何进一步的调查可能更多关于Retrocomputing.SE的话题。
无论如何,x86奇偶校验标志对于GCC的__builtin_parity()来说只是一点用处,因为它只测试一个字节。如果没有其他选项,则可以通过xor‘s将其字节放在一起,并使用GCC/clang会这么做来实现更大的值。它通过使用setnp而不是setp来处理标志的反向含义(人类程序员只需要编写setpo,而不必考虑标志的set/clear值)。
然而,过去10年中几乎所有的x86 CPU都支持popcnt指令和GCC/clang将在可用的情况下使用这个 (然后只提取低位)。
https://stackoverflow.com/questions/69598048
复制相似问题