对A寄存器进行XOR运算如何清除Z80中F寄存器上的进位位?

阿卜杜拉曼·开斋节

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

XOR A
AND A
OR  A

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

乔治·菲利普斯

我想我了解您的担心。标志寄存器获取操作的结果,因此“与”,“或”,“异或”都影响零标志,符号标志和奇偶校验标志是有意义的。这些都是结果的直接属性。但是运算不是算术运算,因此Carry不是自然属性。

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

实际上,它更像是每个位的多功能功能,可以对其进行修改以执行所需的操作。在较高的层次上,我们可以看到带有加号和带有进位的加法。在内部,这些指令的唯一区别是在执行加法时是否使用了进位标志。同样,减法就是将数字的二进制补码相加。因此,减法仅对操作数进行一些前端更改,并使用相同的加法电路。

现在考虑我们如何一次加法。忽略进位,请注意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门,而是使用了原始晶体管逻辑,该逻辑在从电路产生的结果上更加灵活。

无论如何,现在有一个选择。我们的异或运算将每个位之间的进位调零。那第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在内部的运行方式

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Z80状态标志寄存器

来自分类Dev

Z80寄存器字节序

来自分类Dev

如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量

来自分类Dev

如何交换寄存器的某些位

来自分类Dev

汇编:与32位寄存器进行64位乘法

来自分类Dev

可以在CPU内进行寄存器运算吗

来自分类Dev

可以在CPU内进行寄存器运算吗

来自分类Dev

统计寄存器

来自分类Dev

MSP430寄存器上的按位运算符,无需取消引用

来自分类Dev

实模式32位寄存器

来自分类Dev

SSE 64位寄存器

来自分类Dev

C位屏蔽寄存器

来自分类Dev

从16位寄存器获取值

来自分类Dev

如何将位范围读入寄存器?

来自分类Dev

如何清除BCM2835中断清除寄存器?

来自分类Dev

反转寄存器Thumb-2中的位

来自分类Dev

在ASM中显示64位寄存器

来自分类Dev

寄存器中的PIC24设置位

来自分类Dev

python中modbus寄存器的64位移位

来自分类Dev

PIC上的奇怪PWM寄存器

来自分类Dev

PIC上的奇怪PWM寄存器

来自分类Dev

在Linux上读取调试寄存器

来自分类Dev

32位寄存器充当8位寄存器

来自分类Dev

蒙哥马利乘法 - 32 位寄存器与 64 位寄存器

来自分类Dev

将 32 位寄存器移入 8 位寄存器

来自分类Dev

EFLAGS寄存器中的进位标志和溢出标志有什么用?

来自分类Dev

如何在 Cortex M4 上设置辅助控制寄存器位

来自分类Dev

功能参数在64位OS上的寄存器中传输?

来自分类Dev

如何在ZMM寄存器上实现vpmovmskb的效果?