Abd*_*Eid 0 assembly z80 xor microprocessors
我正在读一本关于Zilog Z80处理器的书,在这本书中,只要作者想要清除进位,原因可能是他做了以下任何一种情况:
XOR A
AND A
OR A
Run Code Online (Sandbox Code Playgroud)
这对F寄存器中的C位有何影响?换句话说,如何对某个寄存器(A)执行操作会影响另一个寄存器(F)?
我想我理解你的担忧.标志寄存器获取操作的结果,因此有意义的是,AND,OR,XOR都会影响Zero标志,Sign标志和Parity标志.这些都是结果的直接属性.但操作不是算术运算所以Carry不是一个自然属性.
我认为答案在于ALU本身.作为程序员,我们将ALU视为一个多功能盒.您给它一个值和一个操作,它作为副产品在累加器设置标志上执行该操作.在内部,我们怀疑每个操作都有一个单独的电路:加,减,和,或者,xor.
实际上,它更像是每个位的多功能功能,可以对其进行修改以执行所需的操作.在较高的水平,我们可以看到这与添加与添加携带.在内部,这些指令的唯一区别在于进位标志是否用于执行添加.同样,减法只不过是加上数字的二进制补码.因此,减法仅对操作数进行一些前端更改并使用相同的添加电路.
现在考虑我们如何在单个位上进行添加.忽略进位,注意0 + 0 = 0,0 + 1 = 1 + 0 = 1和1 + 1 = 0.那么携带怎么样?进位(0 + 0)=进位(0 + 1)=进位(1 + 0)= 0并进位(1 + 1)= 1.
认识到那些功能?两位的进位是它们的AND.添加两位的结果是它们的XOR.如果你更多地扩展这个想法,你可以看到一个简单的电路如何将两个位与一个进位输入相加,并产生结果位和进位输出.它们中的8个链在一起,你正在添加数字.
如果您正在设计处理器,您可能还会注意到您几乎可以免费获得XOR.XOR只是将两个数字加在一起,但是从一个位到另一个位置停止进位.类似的快捷方式可以将您通常从进位计算得到的AND值拉出来,我确信还有其他一些技巧可以在那里找到OR.细节在这里变得非常重要,因为Z-80的设计者并没有使用AND和XOR门,而是使用原始晶体管逻辑,它在电路中可以产生更大的灵活性.
无论如何,现在有一个选择.我们的XOR将每个位之间的进位归零.第8位怎么样?好吧,我们也应该把它归零.否则进位位将是符号位的AND,这似乎会使汇编程序员感到困惑和烦恼,并没有多大用处.但是,如果我们把所有其他的零点带入零位,那么我们就会得到一个漂亮的对称电路,结果清晰明确.并且,我怀疑,将值归零比忽略它更容易.
因此,让零点进位可以节省一些晶体管.并且这种副作用在"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内部结构.