Сборка lang 8085 .. как найти четное / нечетное соотношение

У меня есть следующий код для подсчета числа 1 и сохранения его в reg B. Мне нужно изменить его, чтобы найти четность или нечетность...

LXI H, var1
MVI B, 00H
MVI D, 00H
MVI C, 08H
MOV A, M

LOOP: RAR
JNC SKIP
INR B
SKIP: DCR C
JNZ LOOP

HLT

var1: db 72

2 ответа

Решение

Четная четность означает, что в октете установлено четное число битов. Согласно этому краткому введению в архитектуру Intel 8085:

Flag - это 8-битный регистр, содержащий 5 1-битных флагов:
- Знак - установите, если установлен самый старший бит результата.
- Ноль - установить, если результат равен нулю.
- Дополнительный перенос - установите, если был результат от бита 3 до бита 4 результата.
- Четность - устанавливается, если четность (количество установленных битов в результате) четна.
- Carry - установить, был ли перенос во время сложения, или брать во время вычитания / сравнения.

Флаг четности легче всего проверить с помощью условных веток ( ссылка на источник)

JPE label;   // Jump if parity is Even 
JPO label;   // or jump if parity is Odd

Флаг устанавливается большинством арифметических и логических инструкций, которые имеют дело с единичными выходными регистрами. Контрпримеры - MOV и CMP, которые не хранят результат. Арифметические операции (INX, DEX и т. Д.), Которые в свою очередь изменяют пару регистров, не дают однозначного результата.

Просто поразрядно AND регистр B со значением 1, Если результат 1Странное соотношение. Если результат 0Тут даже паритет. Это потому, что четные числа всегда 0 в младшем бите нечетные числа всегда имеют 1,

Доступ к очень смутным воспоминаниям о сборке класса 8080, но я думаю, что это будет что-то вроде:

          MOV      A, B
          ANI      01H
          JZ       par_even
par_odd   ; parity is odd here, work your magic
          JMP      over

par_even  ; parity is even here, work other magic

par_done  ; carry on processing here

Например, значение 72 что вы используете, это 64 + 8 или двоичный 01001000,

Итак, если ваш код подсчета битов работает правильно, зарегистрируйтесь B будет установлен на два, или 00000010, И, что с 00000001 дает вам 0, следовательно, даже четность.

В качестве альтернативы, значение 254, или же 11111110 установил бы регистр B в 7, или же 00000111, И, что с 00000001 дает 1отсюда и странное соотношение.

Вы также можете использовать что-то вроде:

ANA    A
JPE    par_even

где A - это значение, а не количество 1-бит.

Причина, по которой вам может понадобиться ANA, заключается в том, чтобы убедиться, что флаг четности установлен на основе содержимого аккумулятора. Только определенные операции устанавливают флаги, и, когда аккумулятор сам с собой, оставит его нетронутым, но установит флаги P, S и Z на его основе.

Другие вопросы по тегам