Pha*_*rap 17 assembly cpu-architecture parity eflags
某些CPU(特别是x86 CPU)在其状态寄存器中具有奇偶校验标志.该标志指示操作结果的位数是奇数还是偶数.
奇偶校验标志在编程环境中起什么实际用途?
旁注: 我假设它打算与奇偶校验位一起使用以执行基本的错误检查,但是这样的任务似乎并不常见,以保证整个CPU标志.
Dwa*_*ell 20
回到"过去",当表现始终是一个问题,它更有意义.它用于通信以验证完整性(进行错误检查),并且大部分通信是串行的,这比并行通信更多地使用奇偶校验.在任何情况下,这是微不足道的CPU计算它仅使用8异或门,但在其他方面是相当难以计算,而无需CPU的支持.在没有硬件支持的情况下,它需要一个实际的循环(可能是展开的)或查找表,这两个都非常耗时,因此其好处超过了成本.但现在,它更像是一种遗迹.
Ale*_*sha 12
Parity Flag是过去在软件中进行奇偶校验的遗物.
TL; DR
正如兰德尔·海德(Randall Hyde)在"汇编语言艺术"第2版中所说:
奇偶校验是一种非常简单的错误检测方案,最初由电报和其他串行通信协议使用.想法是计算字符中的设置位数,并在传输中包括一个额外的位,以指示该字符是否包含偶数或奇数个设置位.传输的接收端也将对这些位进行计数,并验证额外的"奇偶校验"位指示成功传输.
在过去,有一些串行通信硬件(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)
然后程序可以基于奇偶校验标志的值执行各种条件逻辑.
JPO,JPE),调用(CPO,CPE)和返回(RPO,RPE)都有条件指令.JNP/JPO,JP/JPE)之外都会丢弃所有内容.SETPE/SETP,SETPO/SETNP并随英特尔80386一起添加.CMOVP/CMOVPE,CMOVNP/CMOVPO都添加了Pentium Pro的.从那时起,这组利用奇偶校验标志的指令仍然是固定的.
如今,这个标志的主要目的已被硬件接管.引用兰德尔海德的汇编语言艺术,第2版:
使用奇偶校验进行错误检查的串行通信芯片和其他通信硬件通常在硬件中计算奇偶校验; 您不必为此目的使用软件.
Parity Flag的古老性证明它仅适用于低8位,因此它的用途有限.根据英特尔®64和IA-32架构软件开发人员手册,奇偶标志是:
设置结果的最低有效字节是否包含偶数个1位; 否则清除.
有趣的事实:用他自己的话说,网络工程师Wolfgang Kern扫描了他在某些时候(~14 GB)编写的所有代码JPE和JPO指令,并且只在RS232驱动模块和非常古老的8位计算中找到它.
通过奇偶校验可以实现一种实用的微优化——即位交换,例如在使用蝴蝶内核的傅立叶变换地址生成中使用的位交换。
要交换位 7 和 0,可以利用 (a&0x81) 的奇偶校验,后跟条件 (a^=0x81)。对位 6/1、5/2 和 4/3 重复上述操作。
| 归档时间: |
|
| 查看次数: |
7066 次 |
| 最近记录: |