为什么XRA A也会清除其他寄存器?

时间:2016-10-26 04:30:53

标签: assembly 8085

让我们假设累加器包含0AH并给出以下指令。 MOV D,A; XRA A; 我发现这条指令清除累加器和D寄存器。 我通过使用'Virtual 8085'模拟器证实了这一点。 为什么secon指令也会清除D寄存器?

1 个答案:

答案 0 :(得分:4)

好的,我看了Virtual 8085's source code,而且确实看起来像我在评论中提到的那样。

它将寄存器表示为BitArray个实例。或者更确切地说,每个寄存器都表示为一个bits成员的对象,该成员是对BitArray的引用。

现在,作者模拟MOV的做法是simply point one register's bits to another register's bits。假设你做MOV D,A;在MOV之后,D.bits现在指的是与BitArray相同的A.bits
如果您随后执行按位逻辑运算,则直接在A.bits上运行,这也会影响D.bits,因为它们引用相同的BitArray。如果您执行此操作,则不会发生此错误。 ADDSUB,因为它们以不同的方式实施,并创建全新的BitArray,而不是修改现有的{。}}。

在我看来,MOV以一种破碎的方式实施,应该使用Clone,或者可能CopyTo而不仅仅是=。如果你想看到它固定,请在github上提交一个关于此的错误。

TL; DR:XRA A无法清除D。虚拟8085是错误的。尝试联系其作者让他修复错误,或搜索不同的模拟器。