我正在读一本有关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] 删除。
我来说两句