我的理解是,为了评估X - Y - borrow,我们可以执行X - (Y + borrow) 或(X - Y) - borrow。
通常,真正的 CPU 不会执行两个操作,但它们使用使用“全加减法器”的 ALU。这些电路在一次操作中执行借位减法。
通常,每个位都有一个电路(例如 8 个电路用于 8 位减法)。
计算进位标志的电路也计算结果的高位(第7位);它将两个数字的高位(第 7 位)和一个内部标志(可以是 0 或 1)作为输入。它没有其他信息!
我们计算90h-80h:结果是10h或0Fh(取决于进位标志之前的状态)并且进位是明确的。这意味着电路将计算0作为结果的高位,如果两个输入数字的高位都是1并且“内部标志”具有特定状态(0或1),则清除进位。
我们计算80h-90h:结果是0F0h 或0EFh 并设置进位。这意味着电路将计算1作为结果的高位,如果两个输入数字的高位都是1并且“内部标志”具有其他状态,则设置进位。
计算0FFh-0FFh,两个输入值的高位也设置为1。这意味着:根据“内部标志”,电路要么将输出的高位设置为0并清除进位,要么将输出的高位设置为1并设置进位。
所以A=0xFFh 和CY=0 的结果是不可能的。
这是 GNUSim8085 的实现问题还是由于溢出实际上发生在物理 Intel 8085 芯片中?
有些 CPU 不使用最低位的“全加器”来计算借位减法。
但是,我怀疑 8085 是那些 CPU 之一。
看看source code of GNUSim8085,你会看到这样的cmets(这个取自执行SBI的函数):
/* I'm not sure abt the new code
* Old code:
看了这样的cmets,我觉得那个模拟器还是有一些bug的。
编辑
如果有人拥有实际的 8085 套件 ...
CY=0 的结果肯定是一个错误!
为什么?因为从 32 位数字中减去 32 位常数会导致错误的结果:
1000FF00h - 0FF01h = 0FFFFFFFh (if CY=1 in your example)
1000FF00h - 0FF01h = 1000FFFFh (if CY=0 in your example)
如果英特尔真的生产了一些(有缺陷的)8085 IC 导致CY=0,英特尔会在以后生产的 IC 中纠正这个错误!
因此,您肯定会发现真正的 8085 IC 会导致 CY=1,而纯粹的猜测可能也可能是(错误的)IC 导致 CY=0。
顺便说一句:使用 8085 模拟器 "sim8085",您的示例结果为 CY=1。