2016-10-26 8 views
0

Допустим, что аккумулятор содержит 0AH и даны следующие инструкторы. MOV D, A; XRA A; Я узнал, что эта инструкция очищает аккумулятор, а также регистр D. Я подтвердил это с помощью симулятора «Virtual 8085». Почему команда secon также очищает регистр D?Почему XRA A также очищает и другие регистры?

+0

Извините, это не имеет никакого смысла. 'MOV D, A' установит' D' '0AH'. Тогда «XRA A» установит «A» в ноль, а чистый эффект будет «D = 0AH, A = 0'. –

+0

Виртуальный 8085 оказывается ошибкой. Если вы «MOV''A» в один или несколько других регистров, а затем выполняете побитовую логическую (и/или xor) операцию на «A», вы также модифицируете эти другие регистры. – Michael

ответ

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 неисправен. Попытайтесь связаться со своим автором, чтобы он исправил ошибку или искал другой симулятор.