AF,PF在现代asm中的用途

问题描述

我已经进行了一些浏览,似乎PFAF很少使用,对于像我这样的初学者,基本上可以忽略不计,因为他们很少会出现。从我发现的用例来看:

除了晦涩难懂的情况外,这两个标志能否被全部忽略?还是曾经有一段时间我应该阅读这些标志并加以利用?

示例:

# AF (CF on 4th bit)
mov $0b1000,%eax
add $0b1000,%eax # [ AF ]


# PF (num 1's is a multiple of two)
inc %eax # [ PF ]

解决方法

除了晦涩的情况...

取决于您所说的“晦涩”:

AF标志用于BCD计算,早期的CPU(对于x86:8088)支持BCD计算,主要用于计算器

早期的CPU不支持浮点(对于x86 CPU,您可以添加单独的x87 FPU,这比计算机本身更昂贵),并且BCD算术是执行浮点计算的简单方法,如果输入(来自键盘)和输出(至显示器)均以十进制表示。

我记得在2000年左右,一些特殊的PASCAL方言用于物理计算,使用BCD算术计算进行高精度计算。

PF标志可用于某些硬件访问情况:

在一些早期的RS-232端口上以奇偶校验发送7位数据字时,实际上您必须发送8位字(无其他奇偶校验)。第8位是必须由CPU计算的奇偶校验。使用PF标志来计算此位很容易!

...在现代汇编中...

或者曾经有一段时间我应该阅读这些标志并加以利用?

据我所知,AF标志根本不打算在早期的x86 CPU中读取:

该标志仅用作BCD操作的输入(就像CF标志是sbbadc指令的输入一样);但是,与CF标志不同的是,它并非旨在直接(使用条件跳转操作)“读取” AF

因此,即使早期的x86程序员也不关心AF标志,但是只有在完成BCD算术后,该标志才由CPU在“后台”使用。

使用现代操作系统(例如Linux和Windows)时,只有设备驱动程序才能访问硬件。并且大多数现代硬件(例如RS-232端口)都能够计算硬件中的奇偶校验。

因此通常也不需要使用PF标志。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...