为什么 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;在那之后 MOVD.bits 现在指的是与 A.bits.
相同的 BitArray 如果您随后执行按位逻辑运算,您将直接在 A.bits 上进行操作,这也会影响 D.bits,因为它们引用相同的 BitArray。如果你这样做,这个错误就不会发生,例如ADDSUB,因为它们以不同的方式实现并创建一个全新的 BitArray 而不是修改现有的。

在我看来,MOV 的实现方式有问题,应该使用 Clone,或者可能 CopyTo 而不仅仅是 =。如果您想修复它,请在 github 上提交有关此问题的错误。


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