某些CPU(特别是x86 CPU)在其状态寄存器中具有奇偶校验标志。该标志指示操作结果的位数是奇数还是偶数。
奇偶校验标志在编程环境中的实际用途是什么?
旁注: 我假设它打算与奇偶校验位一起使用以执行基本的错误检查,但是这样的任务似乎并不常见,以保证整个CPU标记。
答案 0 :(得分:18)
回到“过去”,当表现始终是一个问题,它更有意义。它用于通信以验证完整性(进行错误检查),并且大部分通信是串行的,这比并行通信更多地使用奇偶校验。在任何情况下,CPU仅使用8个XOR门来计算它是微不足道的,但是如果没有CPU支持则相当难以计算。在没有硬件支持的情况下,它需要一个实际的循环(可能是展开的)或查找表,这两个都非常耗时,因此其好处超过了成本。但现在,它更像是一种遗迹。
答案 1 :(得分:11)
Parity Flag是过去在软件中进行奇偶校验的遗物。
<强> TL; DR 强>
正如兰德尔·海德(Randall Hyde)所说,汇编语言艺术,第2版:
奇偶校验是一种非常简单的错误检测方案,最初由电报和其他串行通信协议使用。想法是计算字符中的设置位数,并在传输中包括一个额外的位,以指示该字符是否包含偶数或奇数个设置位。传输的接收端也会对这些位进行计数,并验证额外的“奇偶校验”位是否表示传输成功。
在过去,有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
然后程序可以根据奇偶校验标志的值执行各种条件逻辑。
JPO
,JPE
),呼叫(CPO
, CPE
)并返回(RPO
,RPE
)。JNP/JPO
,JP/JPE
)之外,英特尔8086会丢弃所有内容。SETPE/SETP
和SETPO/SETNP
随英特尔80386一起添加。CMOVP/CMOVPE
,CMOVNP/CMOVPO
。从那时起,使用奇偶校验标志的这组指令保持不变。
如今,此标志的主要目的已由硬件接管。引用Randall Hyde的汇编语言艺术,第2版:
使用奇偶校验进行错误检查的串行通信芯片和其他通信硬件通常会计算硬件中的奇偶校验;您不必为此目的使用软件。
奇偶校验标志的古老性由它仅在低8位工作的事实证明,因此它的用途有限。根据英特尔®64和IA-32架构软件开发人员手册,奇偶校验标志为:
设置结果的最低有效字节是否包含偶数个1位;否则就清楚了。
有趣的事实:用他自己的话说,网络工程师Wolfgang Kern扫描了他在JPE
和JPO
指令的某些点(~14 GB)编写的所有代码,并且只在RS232驱动程序中找到它模块和一个非常古老的8位
计算
答案 2 :(得分:2)
可以通过奇偶校验实现一种实用的微优化 - 例如在使用蝶形内核生成傅立叶变换地址时使用的位交换。
要交换位7和0,可以利用(a&amp; 0x81)的奇偶校验,然后是条件(a ^ = 0x81)。对位6 / 1,5 / 2和4/3重复。
答案 3 :(得分:2)
我个人认为平价旗死亡的传闻被夸大了。它在某些情况下非常有用。考虑以下汇编语言程序:
push rbp
mov rbp, rsp
xor eax, eax
ucomisd xmm0, xmm1
setnp al
pop rbp
ret
这需要 xmm0、xmm1 中的两个双精度参数,并返回一个布尔结果。看看你能不能弄清楚它在做什么。 ?