我的理解是,为了评估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
and的结果CY=0
是不可能的。
它是 GNUSim8085 的实现问题还是由于溢出而实际上发生在物理 Intel 8085 芯片中?
有些 CPU 不使用最低位中的“全加器”来计算借位减法。
但是,我怀疑 8085 是那些 CPU 之一。
看一下GNUSim8085 的源代码,你会看到这样的注释(这个来自于执行的函数SBI
):
/* I'm not sure abt the new code
* Old code:
阅读这样的评论,我认为该模拟器中仍然存在一些错误。
编辑
如果有人拥有实际的 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
.