0

我正在阅读一本关于 Zilog Z80 处理器的书,其中每当作者出于某种可能的原因想要清除进位位时,他都会执行以下任何操作:

XOR A
AND A
OR  A

这对 F 寄存器中的 C 位有何影响?换句话说,对某个寄存器 (A) 执行操作如何影响另一个寄存器 (F)?

4

4 回答 4

7

我想我理解你的担心。标志寄存器获取操作的结果,因此 AND、OR、XOR 都影响零标志、符号标志和奇偶校验标志是有意义的。这些都是结果的直接属性。但是这些运算不是算术运算,因此进位不是自然属性。

我认为答案在于 ALU 本身。作为程序员,我们将 ALU 视为一个多功能盒。您给它一个值和一个操作,它会在累加器设置标志上执行该操作作为副产品。在内部,我们怀疑每个操作都有一个单独的电路:加法、减法、与、或、异或。

实际上,它更像是每个位的多功能功能,可以对其进行修改以执行所需的操作。在高层次上,我们可以通过 add 与 add with carry 看到这一点。在内部,这些指令的唯一区别是进位标志是否用于执行加法。同样,减法只不过是将数字的二进制补码相加。所以减法只有操作数的一些前端变化,并使用相同的加法电路。

现在考虑我们如何对单个位进行加法。忽略进位,请注意 0+0 = 0、0+1 = 1+0 = 1 和 1+1 = 0。那么进位呢?进位 (0+0) = 进位 (0+1) = 进位 (1+0) = 0 且进位 (1+1) = 1。

认识这些功能吗?两位的进位是它们的与。两个位相加的结果是它们的 XOR。如果你进一步扩展这个想法,你会看到一个简单的电路如何将两个位与一个进位输入相加,并产生结果位和一个进位输出。将它们中的 8 个链接在一起,您正在添加数字。

如果您正在设计处理器,您可能还会注意到几乎可以免费获得 XOR。XOR 只是将两个数字相加,但阻止了位到位的进位。类似的快捷方式可以提取您通常从进位计算中获得的 AND 值,我敢肯定还有一些其他技巧可以在其中找到 OR。细节在这里变得非常重要,因为 Z-80 的设计者没有使用 AND 和 XOR 门,而是使用原始晶体管逻辑,它可以从电路中产生更加灵活的逻辑。

无论如何,现在有一个选择。我们的 XOR 将每个位之间的进位归零。第 8 位呢?好吧,我们也应该将其归零。否则,进位位将是符号位的与,这似乎会使汇编程序员感到困惑和烦恼,并且没有多大用处。但是,如果我们像对其他所有操作一样将携带位归零,那么我们就有一个很好的对称电路,结果是清晰明确的。而且,我怀疑,将值归零比忽略它更容易。

因此,让零进位通过为我们节省了一些晶体管。这种副作用在诸如“OR A,A”或“AND A,A”之类的操作中派上用场,否则不会做很多事情。现在,Z-80 继承了 8080 的这种行为,所以它确实是 8080 设计师的选择,而不是 Z-80。您可以看到他们在指令集中考虑了这一点,因为他们只给了我们两个直接影响进位的操作:SCF - 将进位标志设置为 1 和 CCF - 补充进位标志。他们明确避免给我们一个“明确的进位标志”,因为“OR A,A”已经免费做到了。因此,整个业务节省了整个指令。而且,我们只能假设,他们推断将逻辑操作上的进位标志归零对编程没有太大的阻碍。在大多数情况下,你' 重新进行逻辑计算或算术计算,因此逻辑运算切换进位并不是什么大问题。显然其他 CPU 设计者不同意,但这是一个公平的选择。

底线:清除进位是电路的自然结果,8080 设计人员认为这是一个有用的副作用,并选择让它保留而不是添加电路来抑制它。

有关具体细节,请参阅Z-80 ALU 如何在内部运行以及8085 ALU 内部结构。

于 2016-09-27T20:14:55.500 回答
2

当or指令(或类似指令,并且属于同一类别)将借用或转移到寄存器“上方”的下一个更高位时,每个定义的进位位都会受到影响。addsubtractincdec

影响标志的基于 ALU 的命令(即除了 LD x,y 和分支指令之外的大多数命令)根据此“借用”行为设置或清除 C 位。纯逻辑(AND、OR、XOR)指令没有借位或进位行为,因为它们只影响寄存器中的 8 位,从而清除进位标志。

编辑:如果您想知道“这是如何完成的” - 因为 CPU 是这样构建的,并且内部“接线”迫使 C 位成为 ALU 在操作后逻辑上溢/下溢的结果。这不是您似乎理解的“副作用”,而是非常重要的一个,因为标志是在 Z80 程序集中基于逻辑决策(即“IF”子句)的唯一方法。

于 2016-09-27T15:57:22.457 回答
2

应用于A寄存器本身的这 3 个逻辑操作不会修改 A(除了将其清零的 XOR)。

但是,作为副作用,所有这些指令都保证清除进位位,如 Z80 参考手册中所述。

这种副作用就是这里想要的效果。OR A不会做任何其他清除 C 的操作,并且还会影响其他标志(取决于 A 的初始值是否为零,寄存器 Z 也被设置/清除)

来自OR 指令描述

效果:C 和 N 标志清除,P/V 检测奇偶校验,...

当加法或减法溢出/下溢(ADD、SUB、ADC、SBC)时,进位位被置位。例如,您可以通过执行零 + 零的加法来清除 C 标志,但这需要比 更多的指令OR AAND A或者XOR A使后者更有效。

其他一些 8 位处理器(如 6502)具有特定的 CLC/SEC 指令来清除进位,并且不需要这种副作用来执行此操作。

于 2016-09-27T15:52:21.263 回答
1

大多数处理器都是使用我们所谓的微码创建的。一条微码指令只做一件非常小的事情。

所以我们可以证明OR A指令做了这样的事情:

OR A     tmp ← A              modify register "tmp"
         tmp ← tmp | A        apply OR and save result in "tmp"
         A ← tmp              copy "tmp" back to A
         F[C] ← 0             clear C flag
         F[Z] ← A == 0        set Z to 1 if A == 0, zero otherwise
         F[N] ← A[7]          set N to sign bit of A

请注意,由于这对 A 没有影响,因此他们可以重命名指令CLC(清除进位)。

正如其他人所提到的,清除 C 标志是 z80 设计人员决定的选择。大多数处理器不会影响逻辑操作上的 C 标志(AND、OR、XOR、NAND...)

于 2016-09-27T17:58:58.610 回答