CPU上奇偶校验标志的用途是啥?

Posted

技术标签:

【中文标题】CPU上奇偶校验标志的用途是啥?【英文标题】:What is the purpose of the Parity Flag on a CPU?CPU上奇偶校验标志的用途是什么? 【发布时间】:2014-10-31 15:52:51 【问题描述】:

某些 CPU(尤其是 x86 CPU)在其状态寄存器上具有奇偶校验标志。该标志表示运算结果的位数是奇数还是偶数。

奇偶校验标志在编程上下文中的实际实际用途是什么?

旁注: 我假设它打算与奇偶校验位一起使用以执行基本的错误检查,但这样的任务似乎并不常见以保证整个 CPU 标志。

【问题讨论】:

1970 年代的硬件,比如纸带打孔器和串行端口,那些旧的东西更容易掉下来 :) 拇指轮和数码管产生了 BCD 指令,比如 AAA。 @HansPassant BCD 我明白保持,7-segs 和 nixies 仍然被业余爱好者使用(可能是小气鬼或讨厌点矩阵的疯子)。 恐怕对业余爱好者来说是个坏消息,它们实际上是在 x64 中被丢弃,以便为 64 位指令腾出空间。 @HansPassant '向后兼容'。 【参考方案1】:

回到“过去”时,性能始终是一个问题,这更有意义。它用于通信中以验证完整性(进行错误检查),并且大部分通信是串行的,与并行通信相比,它更多地使用奇偶校验。在任何情况下,CPU 仅使用 8 个 XOR 门来计算它是微不足道的,但如果没有 CPU 支持,则很难计算。在没有硬件支持的情况下,它需要一个实际的循环(可能是展开的)或一个查找表,这两者都非常耗时,因此收益大于成本。但现在,它更像是一种遗迹。

【讨论】:

我认为您应该添加英特尔 x86(和克隆)处理器今天仍然拥有它的原因 - 英特尔试图保持与每个早期芯片的向后兼容性(尽可能)。因此,由于产品线的根源来自 1978 年的 8086,因此每一代芯片都在 35 年内保留了该功能。 这里最奇怪的是,最初英特尔设计为在修改条件代码的每个操作之后提供此标志。一个不太奇怪的方法是提供一个单独的指令来检查奇偶校验并修改选定的 CC 标志(例如 CF),但 8080 并不是这样设计的,现在甚至 64 位操作也以相同的方式设置奇偶校验。一步预测和保留旧的传统相结合是英特尔最可怕的功能。 @Netch 这就是向后兼容的代价。就我个人而言,如果新方法更好,我可以撕掉一些东西并替换它,但我认为改变这个可能有点晚了。 32 位支持并没有真正改变 ISA,而是将其扩展到 32 位。这意味着特殊的外壳 32 位操作不会生成奇偶校验位,而没有实际收益。奇偶校验生成的硬件仍然存在,只是现在会有额外的硬件有条件地不生成它。记得早在 1985 年,当 80386 被引入奇偶校验时,计算它的成本仍然很重要。至于 64 位 ISA,您仍然会遇到额外的芯片空间被用于禁用仍需要实现以实现向后兼容性的功能的问题。 如果你想要一个不遵循“‘兼容性’的脑损伤政策”的 ISA,英特尔将其称为 Itanium。【参考方案2】:

奇偶校验标志是过去在软件中进行奇偶校验的遗物。

TL;DR

什么是奇偶校验

正如 Randall Hyde 在汇编语言的艺术,第 2 版中所说的那样

奇偶校验是一种非常简单的错误检测方案,最初用于电报和其他串行通信协议。这个想法是计算一个字符中设置的位数,并在传输中包含一个额外的位,以指示该字符是包含偶数还是奇数的设置位。传输的接收端也会对位进行计数,并验证额外的“奇偶校验”位是否表示传输成功。

为什么奇偶标志被添加到 CPU 架构中

在过去,serial communication hardware (UART) 缺乏对传输数据进行奇偶校验的能力,因此程序员必须在软件中进行。还有一些非常古老的设备,如纸带打孔器和阅读器,使用 7 个数据位和一个奇偶校验位,程序员必须在软件中进行奇偶校验以验证数据完整性。为了能够使用奇偶校验位进行错误检测,通信双方必须事先就每个传输的字节应该具有奇校验还是偶校验(通信协议的一部分)达成一致。

在没有 CPU 支持的情况下,在软件中进行奇偶校验的主要方法是位计数或使用查找表。与在 CPU 中通过单条指令计算的奇偶校验标志相比,两者都非常昂贵。出于这个原因,英特尔在 1972 年 4 月将奇偶校验标志引入了他们的8008 8-bit CPU。下面是一个示例,说明如何在接收端测试每个字节的完整性。

mov        al,<byte to be tested>
test       al,al
jp         <somewhere>         ; byte has even parity
                               ; byte has odd parity 

然后程序可以根据奇偶校验标志的值执行各种条件逻辑。

英特尔 CPU 中条件奇偶校验指令的演变

1972 - Parity Flag 是 Intel 8008 首次引入的。有条件指令用于跳转(JPOJPE)、调用(CPOCPE)和返回(@987654337) @, RPE)。 1978 - 英特尔 8086 丢弃除条件跳转之外的所有内容(JNP/JPOJP/JPE)。 1985 - 条件集指令 SETPE/SETPSETPO/SETNP 与 Intel 80386 一起添加。 1995 - Pentium Pro 添加了条件移动指令CMOVP/CMOVPECMOVNP/CMOVPO

从那时起,这套使用奇偶校验标志的指令保持不变。

如今,此标志的主要用途已由硬件接管。在汇编语言的艺术,第 2 版中引用 Randall Hyde:

串行通信芯片和其他使用奇偶校验进行错误检查的通信硬件通常在硬件中计算奇偶校验;您不必为此使用软件。

奇偶校验标志的历史由它仅在低 8 位上工作这一事实证明,因此它的用途有限。根据英特尔® 64 和 IA-32 架构软件开发人员手册,奇偶校验标志为:

如果结果的最低有效字节包含偶数个1,则设置;否则清除。

有趣的事实:用他自己的话来说,网络工程师 Wolfgang Kern 扫描了他在某个时间点 (~14 GB) 编写的所有代码以查找 JPEJPO 指令,发现它只在一个 RS232 驱动模块和一个很老的 8 位 计算。

来源

The Intel 8008 support page Intel 8080 Assembly Programming Manual Complete 8086 Instruction Set Wikipedia x86 instruction listings Intel® 64 and IA-32 Architectures Software Developer Manuals 汇编语言的艺术,Randall Hyde 第 2 版

【讨论】:

*80386 而不是 80383 @sivizius:现在 x86 的 PF 主要用于浮点代码,因为 FP 在结果无序时比较集合 PF。 (一个或两个操作数都是 NaN)。这是由于 x87 的历史原因:fucom st1FNSTSW AX/sahf 最终将 FP 状态字中的 c2 放入 PF,然后像 fucomi 和 SSE ucomiss 这样的后续指令将比较结果放入整数标志中直接用同一个映射。 (见ray.masmcode.com/tutorial/fpuchap7.htm)。这是 gcc7.2 使用 JP 生成 x86-64 代码的真实示例:godbolt.org/g/hHRCzv @AlexYursha: 使用PF为低8获取64位整数的奇偶校验:x ^= (x&gt;&gt;32);x^=(x&gt;&gt;16);xor al, ah,然后根据整个事物的奇偶校验设置PF . PF 为您节省了另外三个移位/异或步骤。 (并且没有 BMI2 rorx 进行复制+移位,x^= x&gt;&gt;16 需要 MOV / SHR / XOR。) @Alex:哎呀,我刚刚意识到 PF 不是 CPU 上更宽寄存器与popcnt 奇偶校验的最佳解决方案的一部分。如Cody Gray points out、popcnt rax, rax / and eax, 1 为您提供 64 位寄存器的奇偶校验。无需缩小到 8 位和setp @Peter Cordes:您在pushf 上的链接错误。这是一个 8086 级指令,而不是 186。这个错误显然在您的链接修订和我从 NASM 2.05 中提取的那个之间的某个时间得到修复:ulukai.org/ecm/doc/insref.htm#insPUSHF【参考方案3】:

有一个实用的微优化可以通过奇偶校验实现——例如在使用蝶形内核的傅立叶变换地址生成中使用的位交换。

要交换第 7 位和第 0 位,可以利用奇偶校验 (a&0x81) 后跟条件 (a^=0x81)。重复位 6/1、5/2 和 4/3。

【讨论】:

【参考方案4】:

我个人认为平价旗死的传言被夸大了。在某些情况下它可能非常有用。考虑以下汇编语言过程:

push       rbp
mov        rbp, rsp
xor        eax, eax
ucomisd    xmm0, xmm1
setnp      al
pop        rbp
ret

这需要 xmm0、xmm1 中的两个双精度参数,并返回一个布尔结果。看看你能不能弄清楚它在做什么。 ?

【讨论】:

确实,这是 PF 在现代代码中的主要用途,但它实际上并不是任何东西的奇偶校验。 (剧透警报:comments on a previous answer 提及此用例。)

以上是关于CPU上奇偶校验标志的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

奇偶校验码的特点是啥?为啥说它是可靠性代码?

奇偶校验位

奇偶校验

奇偶校验码 ,奇偶校验码检错原理,奇偶校验码的缺点。

奇偶效验码和海明码

使用标记/空间奇偶校验和无奇偶校验有啥区别?