Сборка 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 на его основе.