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

Pha*_*rap 17 assembly cpu-architecture parity eflags

某些CPU(特别是x86 CPU)在其状态寄存器中具有奇偶校验标志.该标志指示操作结果的位数是奇数还是偶数.

奇偶校验标志在编程环境中起什么实际用途?

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

Dwa*_*ell 20

回到"过去",当表现始终是一个问题,它更有意义.它用于通信以验证完整性(进行错误检查),并且大部分通信是串行的,这比并行通信更多地使用奇偶校验.在任何情况下,这是微不足道的CPU计算它仅使用8异或门,但在其他方面是相当难以计算,而无需CPU的支持.在没有硬件支持的情况下,它需要一个实际的循环(可能是展开的)或查找表,这两个都非常耗时,因此其好处超过了成本.但现在,它更像是一种遗迹.

  • 我认为你应该补充今天英特尔x86(和克隆)处理器仍然拥有它的原因 - 英特尔试图保持与每个早期芯片的向后兼容性(尽可能多).因此,该系列产品的根源于1978年的8086,每一代芯片都保留了35年的功能. (3认同)
  • 最奇怪的是,最初英特尔设计在_each_操作后提供此标志,修改条件代码.一种不太奇怪的方法是提供单独的指令来检查奇偶校验并修改所选择的CC标志(例如CF),但8080不是这样设计的,现在甚至64位操作也以相同的方式设置奇偶校验.这种一步预测和保留旧遗产的组合是英特尔最恐怖的功能. (2认同)
  • 32位支持并没有真正改变ISA,因为它扩展到32位.这意味着特殊的外壳32位操作不会产生奇偶校验位,因为没有实际的增益.用于奇偶校验生成的硬件仍然存在,现在将有额外的硬件有条件地不生成它.并且记得1985年80386引入奇偶校验并且计算它的成本仍然相关.对于64位ISA,您仍然存在额外的芯片空间用于禁用仍需要实现向后兼容性的功能的问题. (2认同)
  • 如果你想要一个不遵循"兼容性"的脑损坏政策的ISA,英特尔称之为Itanium. (2认同)

Ale*_*sha 12

Parity Flag是过去在软件中进行奇偶校验的遗物.

TL; DR

什么是平价

正如兰德尔·海德(Randall Hyde)在"汇编语言艺术"第2版中所说:

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

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

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

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

mov        al,<byte to be tested>
test       al,al
jp         <somewhere>         ; byte has even parity
                               ; byte has odd parity 
Run Code Online (Sandbox Code Playgroud)

然后程序可以基于奇偶校验标志的值执行各种条件逻辑.

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

  • 1972年 - 奇偶校验标志首次引入英特尔8008.跳转(JPO,JPE),调用(CPO,CPE)和返回(RPO,RPE)都有条件指令.
  • 1978年 - 英特尔8086除了条件跳转(JNP/JPO,JP/JPE)之外都会丢弃所有内容.
  • 1985年 - 条件设置说明SETPE/SETP,SETPO/SETNP并随英特尔80386一起添加.
  • 1995年 -有条件的移动指令CMOVP/CMOVPE,CMOVNP/CMOVPO都添加了Pentium Pro的.

从那时起,这组利用奇偶校验标志的指令仍然是固定的.

如今,这个标志的主要目的已被硬件接管.引用兰德尔海德的汇编语言艺术,第2版:

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

Parity Flag的古老性证明它仅适用于低8位,因此它的用途有限.根据英特尔®64和IA-32架构软件开发人员手册,奇偶标志是:

设置结果的最低有效字节是否包含偶数个1位; 否则清除.

有趣的事实:用他自己的话说,网络工程师Wolfgang Kern扫描了他在某些时候(~14 GB)编写的所有代码JPEJPO指令,并且只在RS232驱动模块和非常古老的8位计算中找到它.

来源

  • @sivizius:如今,x86 PF 的主要用途是在浮点代码中,因为当结果无序时,FP 会比较 set PF。(一个或两个操作数都是 NaN)。这是由于 x87 的历史原因:`fucom st1` `FNSTSW AX` / `sahf` 最终将 FP 状态字中的 `c2` 放入 PF,然后像 `fucomi` 和 SSE `ucomiss` 这样的指令将比较结果放入整数标志直接具有相同的映射。(参见 http://www.ray.masmcode.com/tutorial/fpuchap7.htm)。这是 gcc7.2 使用 `JP` 生成 x86-64 代码的真实示例:https://godbolt.org/g/hHRCzv (2认同)

Aki*_*nen 5

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

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