让我们假设累加器包含0AH并给出以下指令。 MOV D,A; XRA A; 我发现这条指令清除累加器和D寄存器。 我通过使用'Virtual 8085'模拟器证实了这一点。 为什么secon指令也会清除D寄存器?
答案 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
。如果您执行此操作,则不会发生此错误。 ADD
或SUB
,因为它们以不同的方式实施,并创建全新的BitArray
,而不是修改现有的{。}}。
在我看来,MOV
以一种破碎的方式实施,应该使用Clone
,或者可能CopyTo
而不仅仅是=
。如果你想看到它固定,请在github上提交一个关于此的错误。
TL; DR:XRA A
无法清除D
。虚拟8085是错误的。尝试联系其作者让他修复错误,或搜索不同的模拟器。