如何对A寄存器进行异或,清除Z80中F寄存器的进位?

时间:2016-09-27 15:43:46

标签: assembly xor microprocessors z80

我正在读一本关于Zilog Z80处理器的书,在这本书中,只要作者想要清除进位,原因可能是他做了以下任何一种情况:

XOR A
AND A
OR  A

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

4 个答案:

答案 0 :(得分:6)

我想我理解你的担忧。标志寄存器获取操作的结果,因此有意义的是,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 operates internally8085 ALU internals

的说明

答案 1 :(得分:2)

A寄存器本身上应用的3个逻辑运算不会修改A(除了将它归零的XOR)。

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

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

来自OR instruction description

  

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

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

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

答案 2 :(得分:2)

try { } catch(Exception ex) { //this will save the exception details and mark exception as low priority ex.Save(); } try { } catch(Exception ex) { //this will save the exception details with priority you define: High, Medium,Low ex.Save(ImpactLevel.Medium); } try { } catch(Exception ex) { //this will save the exception details with priority you define: High, Medium,Low ex.Save(ImpactLevel.Medium, "You can enter an details you want here "); } add指令(或类似内容,subtractinc属于decSELECT DISTINCT u.client_id, DateDiff("yyyy",u.patient_dob,u.admit_date) AS [AGE at Admission], i.start_age_yrs, i.end_age_yrs, i.diag_code INTO tmp10407 FROM [UB-04s] AS u, invalid_diag_codes_by_age AS i WHERE (((u.client_id)=[Forms]![frmUB04s]![client_id]) AND ((i.diag_code) In ([u].[dx_P],[u].[dx_O],[u].[dx_N],[u].[dx_M],[u].[dx_L],[u].[dx_K],[u].[dx_J],[u].[dx_I],[u].[dx_H],[u].[dx_G],[u].[dx_F],[u].[dx_E],[u].[dx_D],[u].[dx_C],[u].[dx_B],[u].[dx_A]))) OR (((u.client_id)=[Forms]![frmUB04s]![client_id]) AND ((u.principal_dx) In ([i].[diag_code]))); 时,进位位每个定义会受到影响相同的类别)将借入或延续到寄存器“上方”的下一个更高位。

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

编辑:如果你想知道“怎么做” - 因为CPU是这样构建的,内部“布线”强制C位是操作后ALU逻辑上/下溢的结果。这不是你似乎理解的“副作用”,而是一个非常重要的副作用,因为标志是在Z80程序集中基于逻辑决策(即“IF” - 声明“)的唯一方法。

答案 3 :(得分:0)

大多数处理器都是使用我们称之为微码的方式创建的。一条微码指令做了一件非常小的事情。

所以我们可以证明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设计师决定的选择。大多数处理器不会影响逻辑运算(AND,OR,XOR,NAND ...)

上的C标志