为什么 XRA A 也清除其他寄存器?
Why XRA A also clears other registers too?
让我们假设累加器包含 0AH 并给出以下指令。
MOV D,A;
XRA A;
我发现这条指令清除了累加器和 D 寄存器。
我使用 'Virtual 8085' 模拟器确认了这一点。
为什么secon指令也清除了D寄存器?
好的,我查看了 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
现在指的是与 A.bits
.
相同的 BitArray
如果您随后执行按位逻辑运算,您将直接在 A.bits
上进行操作,这也会影响 D.bits
,因为它们引用相同的 BitArray
。如果你这样做,这个错误就不会发生,例如ADD
或 SUB
,因为它们以不同的方式实现并创建一个全新的 BitArray
而不是修改现有的。
在我看来,MOV
的实现方式有问题,应该使用 Clone
,或者可能 CopyTo
而不仅仅是 =
。如果您想修复它,请在 github 上提交有关此问题的错误。
TL;DR:XRA A
没有清除 D
。虚拟 8085 有问题。尝试联系其作者让他修复错误,或搜索不同的模拟器。
让我们假设累加器包含 0AH 并给出以下指令。 MOV D,A; XRA A; 我发现这条指令清除了累加器和 D 寄存器。 我使用 'Virtual 8085' 模拟器确认了这一点。 为什么secon指令也清除了D寄存器?
好的,我查看了 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
现在指的是与 A.bits
.
相同的 BitArray
如果您随后执行按位逻辑运算,您将直接在 A.bits
上进行操作,这也会影响 D.bits
,因为它们引用相同的 BitArray
。如果你这样做,这个错误就不会发生,例如ADD
或 SUB
,因为它们以不同的方式实现并创建一个全新的 BitArray
而不是修改现有的。
在我看来,MOV
的实现方式有问题,应该使用 Clone
,或者可能 CopyTo
而不仅仅是 =
。如果您想修复它,请在 github 上提交有关此问题的错误。
TL;DR:XRA A
没有清除 D
。虚拟 8085 有问题。尝试联系其作者让他修复错误,或搜索不同的模拟器。