Допустим, что аккумулятор содержит 0AH и даны следующие инструкторы. MOV D, A; XRA A; Я узнал, что эта инструкция очищает аккумулятор, а также регистр D. Я подтвердил это с помощью симулятора «Virtual 8085». Почему команда secon также очищает регистр D?Почему XRA A также очищает и другие регистры?
ответ
Хорошо, я посмотрел на 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 неисправен. Попытайтесь связаться со своим автором, чтобы он исправил ошибку или искал другой симулятор.
Извините, это не имеет никакого смысла. 'MOV D, A' установит' D' '0AH'. Тогда «XRA A» установит «A» в ноль, а чистый эффект будет «D = 0AH, A = 0'. –
Виртуальный 8085 оказывается ошибкой. Если вы «MOV''A» в один или несколько других регистров, а затем выполняете побитовую логическую (и/или xor) операцию на «A», вы также модифицируете эти другие регистры. – Michael