Битовые операции
При программировании операций управления или контроля часто возникает необходимость проверять или изменять состояние отдельных битов многозарядных кодов. Для проведения битовых операций в систему команд микропроцессора КР580 введены логические команды, команды сдвигов и команды с флагом переноса С.
Изменение состояния отдельных разрядов кода в аккумуляторе производится логической командой, вторым операндом которой является специально сформированный код маски:
очистка разряда – логическое умножение (или конъюнкция) – очищает разряд кода, если в соответствующем разряде маски записан нуль, и не изменяет его, если в разряде маски записана 1;
установка разряда – логическое сложение (или дизъюнкция) устанавливает разряд кода в 1, если в соответствующем разряде маски записана 1, и не изменяет его, если в разряде маски записан нуль;
инверсия разряда – логическое «исключающее или» (неэквивалентность, сложение по модулю 2) инвертирует содержимое разряда кода, если в соответствующем разряде маски записана 1, и не изменяет его, если в этом разряде маски записан нуль.
При выполнении всех логических команд формируется разряды Z, S, P, A, C регистра признаков (в разряд С записывается нуль). Это позволяет проверять состояние любого разряда кода в аккумуляторе и выполнять условные переходы в программе.
Ход работы:
Проведем исследование программы 1. Сама программа представлена в таблице 1.
Таблица 1. Программа 1
Адрес |
Машинный код |
Мнемокод |
Комментарии |
8200 |
21 FF 83 |
LXI H, 83FF |
Подготовка клавиатуры и дисплея.
|
8203 |
3E E0 |
MVI A, E0 |
|
8205 |
D3 02 |
OUT 02 |
|
8207 |
DB 00 |
IN 00 |
Ввод с клавиатуры |
8209 |
2F |
CMA |
Инверсия аккумулятора. |
820A |
E6 F0 |
ANI F0 |
Логическое умножение с маской F0 |
820C |
77 |
MOV M, A |
Запись результата в ячейку по адресу М. |
820D |
C3 07 82 |
JMP 8207 |
Переход на ячейку 8207 |
План исследования программы 1:
Ввести программу 1, осуществить пуск и исследовать результат ее выполнения по светящимся сегментам дисплея.
Заменяя в программе 1 команду ANI на команды ORI(F6), XRI(EE), исследовать результат ее выполнения.
Заменяя в программе 1 команду ANI на команды AMT A(A7), ORA A(B7), XRA A (AF) совместно с командой NOP (код 00), исследовать результат ее выполнения.
Исследование:
Программа 1 должна принять код с клавиш 0 – 7 клавиатуры в аккумулятор, провести логическую операцию и результат выдать на крайний правый индикатор.
На рисунке 1 представлен результат работы программы 1.
Рисунок 1 – Результат работы программы 1.
На рисунке 1 видно, что после нажатия клавиши 4 (код 00010000) и выполнения программой всех логических операций (инверсия и конъюнкция с маской 11110000), на крайнем правом сегменте дисплея выводится код 11100000
2. При замене команды ANI на команды ORI (дизъюнкция) и XRI (сложение по модулю 2) и при нажатии клавиши 4 (код 00010000) получаем соответственно коды 11111111 (при ORI) и 00011111 (при XRI).
3. В случае замены команды ANI на ANA A (конъюнкция кода в аккумуляторе, код команды A7) и ORA А (дизъюнкция кода в аккумуляторе, код команды В7) и добавления команды NOP (команда не производит никаких действий, служит для резервирования места в коде, код команды 00) код в аккумуляторе не изменяется, поскольку содержимое аккумулятора совпадает с маской операции (содержимое аккумулятора и есть маска).
Например, при нажатии клавиши 4 (код 00010000, но после выполнения инверсии, командой CMA, код 11101111), результатом является код 11101111.
При замене команды ANI на XRI A (сложение по модулю 2, код команды AF), независимо от нажатой клавиши, результатом работы программы является код 00000000.
Проведем исследование программы 2. Сама программа представлена в таблице 2.
Таблица 2. Программа 2
Адрес |
Машинный код |
Мнемокод |
Комментарии |
8200 |
21 FF 83 |
LXI H, 83FF |
Подготовка клавиатуры и дисплея.
|
8203 |
3E E0 |
MVI A, E0 |
|
8205 |
D3 02 |
OUT 02 |
|
8207 |
DB 00 |
IN 00 |
Ввод с клавиатуры |
8209 |
2F |
CMA |
Инверсия аккумулятора. |
820A |
E6 10 |
ANI 10 |
Логическое умножение с маской F0 |
820C |
3E 06 |
MVI A, 06 |
Запись в аккумулятор кода 06 (код символа 1). |
820E |
C2 13 82 |
JMZ 8213 |
Если клавиша 4 не нажата, то переход на ячейку 8213 |
8211 |
F6 3F |
ORI 3F |
Иначе, формируем код символа 0 |
8213 |
77 |
MOV M, A |
Записываем содержимое аккумулятора по адресу в HL |
8214 |
C3 07 82 |
JMP 8207 |
Переход в начало |
План исследования программы 2:
Ввести в УОУ программу 2, осуществить пуск и убедиться, что при ее выполнении УОУ реагирует лишь на состояние клавиши 4.
Ввести программу 5, запустить ее и исследовать.
Исследование:
Программа 2 опрашивает клавиши 0 – 7 и передает на дисплей символ, соответствующий состоянию клавиши 4: 0 –отпущена, 1 – нажата.
1. После ввода и исследования программы 2 (рисунок 2), подтвердилось, что программа действительно реагирует только на нажатие клавиши 4, однако результат программы отличается от предполагаемого: программа должна была вывести на дисплей символ 0, в случае если клавиша 4 отпущена, и символ 1 если нажата. В действительности же результат противоположный: если клавиша 4 отпущена, на дисплей выводится символ 1, а если нажата то символ 0.
Рисунок 2 – Результат работы программы 2.
2. Введем в УОУ и проведем исследование программы 5, которая должна выдавать на дисплей 1, если численное значение принятого от клавиатуры кода превышало 9, и 0 – в противном случае. Сама программа 5 представлена в таблице 3, результат работы программы 5 представлен на рисунке 3.
Таблица 3. Программа 5
Адрес |
Машинный код |
Мнемокод |
Комментарии |
8200 |
21 FF 83 |
LXI H, 83FF |
Подготовка клавиатуры и дисплея. |
8203 |
3E E0 |
MVI A, E0 |
|
8205 |
06 3F |
MVI B, 3F |
Сохраняем в регистр B код 3F (код символа 0). |
8207 |
0E 06 |
MVI C, 06 |
Сохраняем в регистр C код 06 (код символа 1). |
8209 |
70 |
MOV M, B |
Вывод на дисплей символа 0 (поскольку условие вывода символа 1 еще не выполнено). |
820A |
DB 00 |
IN 00 |
Ввод с клавиатуры. |
820C |
57 |
MOV D, A |
Сохранение полученного кода в регистр D. |
820D |
E6 F0 |
ANI F0 |
Логическое умножение по маске F0. |
820F |
C2 1E 82 |
JNZ 821E |
Если результат не нулевой, значит, полученный код заведомо превышает 9, переходим на вывод символа 1, иначе продолжаем проверку. |
8213 |
7A |
MOV A, D |
Восстанавливаем содержимое аккумулятора из регистра D. |
8214 |
E6 06 |
ANI 08 |
Логическое умножение по маске 08. |
8216 |
CA 09 82 |
JZ 8209 |
Если результат нулевой, значит, полученный код не может превышать 9, переходим на вывод символа 0, иначе выводим символ 1. |
8218 |
7A |
MOV A, D |
Восстанавливаем содержимое аккумулятора из регистра D. |
8219 |
E6 06 |
ANI 06 |
Логическое умножение по маске 06. |
821B |
CA 09 82 |
JZ 8209 |
Если результат нулевой, значит, полученный код не может превышать 9, переходим на вывод символа 0, иначе выводим символ 1. |
821E |
71 |
MOV M, C |
Вывод символа 1. |
821F |
C3 0A 82 |
JMP 820A |
Переходим в начало. |
Рисунок 3 – Результат работы программы 5.
План исследования программы 5:
Ввести в УОУ программу 5, осуществить пуск и убедиться, что программа работает правильно.
Изучить алгоритм работы программы 5.
Исследование:
1. После проведения исследования подтвердилось, что программа работает правильно, в случае если полученный код превышает 9, на дисплей выводится символ 1, в противном случае – выводится символ 0.
2. Проверка полученного кода происходит по следующему алгоритму:
После получения аккумулятором кода нажатых клавиш клавиатуры (на рисунке 3 – это клавиши 4 и 6 – код 01010000) производится логическое умножение по маске F0 = (11110000). Этим проверяется содержимое последних четырех бит, если хотя бы один из них равен 1, то код не зависимо от значений остальных бит, превышает 9, дальнейшую проверку можно не проводить, выводим на дисплей символ 1.
В противном случае продолжаем проверку. Производим логическое умножение по маске 08 = (00001000). Этим проверяется содержимое четвертого бита, если он равен 0, то код не зависимо от содержания первых трех бит, не может превышать 9, дальнейшую проверку можно не проводить, выводим на дисплей символ 0.
Иначе продолжаем проверку. Производим логическое умножение по маске 06 = (00000110). Этим проверяется содержание второго и третьего бита кода, если хотя бы один из них равен 1, то полученный код превышает 9, выводим символ 1, в противном случае код меньше 9 и выводим символ 0.
Проведем исследование программы 3, которая должна опрашивать клавиши 0 – 7, и в случае если нажата хотя бы одна из клавиш 0, 2, 4, 6 то вывести на дисплей символ Ч. В противном случае вывести символ Н. Программа 3 представлена в таблице 4.
Таблица 4. Программа 3
Адрес |
Машинный код |
Мнемокод |
Комментарии |
8200 |
3E E0 |
MVI A, 0E |
Подготовка клавиатуры и дисплея. |
8202 |
D3 02 |
OUT 02 |
|
8204 |
3E 76 |
MVI A, 76 |
Выводим на дисплей символ Н, т.к. условие вывода символа Ч еще не выполнено. |
8206 |
32 F8 83 |
STA 83F8 |
|
8209 |
AF |
XRA A |
Очистка аккумулятора |
820A |
DB 00 |
IN 00 |
Ввод с клавиатуры. |
820C |
E6 FF |
ANI FF |
Логическое умножение по маске FF. |
820E |
CA 04 82 |
JZ 8204 |
Если результат равен нулю, то переходим в начало. |
8211 |
E6 55 |
ANI 55 |
В противном случае выполняем логическое умножение по маске 55. |
8213 |
CA 00 81 |
JZ 8204 |
Если результат равен нулю, то переходим в начало. |
8216 |
3E 66 |
MVI A, 66 |
Выводим на дисплей символ Ч, т.к. условие вывода выполнено. |
8218 |
32 F8 83 |
STA 83F8 |
|
821B |
C3 0A 82 |
JMP 820A |
Переход в начало. |
Результат работы программы 3 представлен на рисунке 4.
Рисунок 4 – Результат работы программы 3.
План исследования программы 3:
Ввести в УОУ программу 3, осуществить пуск и убедиться, что программа работает правильно.
Изучить алгоритм работы программы 3.
Исследование:
1. В ходе исследования подтвердилось, что программа работает правильно (рисунок 4). Действительно, если нажата хотя бы одна из клавиш 0, 2, 4, 6, то на дисплей выводится символ Ч, во всех остальных случаях – символ Н.
2. Программа 3 работает по следующему алгоритму:
Сначала идет логическое умножение по маске FF = (11111111), чтобы выявить было ли нажатие на клавиши. Если результат нулевой, то возвращаемся в начало и выводим символ Н. В противном случае, выполняем проверку дальше.
Затем, проверяем было ли нажатие клавиш 0, 2, 4, 6. Для этого производим логическое умножение по маске 55 = (01010101). Если результат операции нулевой, значит, нажатия не было, возвращаемся в начало и выводим символ Н, иначе – выводим символ Ч.
Проведем исследование программы 4, которая должна выдавать на дисплей символ F, если одновременно нажаты одна из клавиш 0 – 3 и одна из клавиш 4 – 7, либо символа 0 в противоположном случае. Программа 4 представлена в таблице 5.
Таблица 5. Программа 4
Адрес |
Машинный код |
Мнемокод |
Комментарии |
8200 |
3E E0 |
MVI A, 0E |
Подготовка клавиатуры и дисплея. |
8202 |
D3 02 |
OUT 02 |
|
8204 |
3E 76 |
MVI A, 3F |
Выводим на дисплей символ 0, т.к. условие вывода символа F еще не выполнено. |
8206 |
32 F8 83 |
STA 83F8 |
|
8209 |
AF |
XRA A |
Очистка аккумулятора |
820A |
DB 00 |
IN 00 |
Ввод с клавиатуры. |
820C |
57 |
MOV D, A |
Сохраняем полученный код в регистре D. |
820D |
E6 F0 |
ANI F0 |
Производим логическое умножение по маске F0. |
821F |
CA 04 82 |
JZ 8204 |
Если результат равен нулю, то переходим в начало. |
8212 |
7A |
MOV A, D |
Восстанавливаем значение аккумулятора из регистра D |
8213 |
E6 0F |
ANI 0F |
Производим логическое умножение по маске 0F. |
8215 |
CA 04 82 |
JZ 8204 |
Если результат равен нулю, то переходим в начало. |
8218 |
3E 71 |
MVI A, 71 |
Иначе, выводим символ F. |
821A |
32 F8 83 |
STA 83F8 |
|
821D |
C3 0A 82 |
JMP 820A |
Переход в начало. |
Результат работы программы 4 представлен на рисунке 5.
Рисунок 5 – Результат работы программы 4.
План исследования программы 4:
Ввести в УОУ программу 4, осуществить пуск и убедиться, что программа работает правильно.
Изучить алгоритм работы программы 4.
Исследование:
1. В ходе исследования подтвердилось, что программа работает правильно (рисунок 5). Действительно, если нажата хотя бы одна из клавиш 0 – 3 и одна из клавиш 4 – 7, то на дисплей выводится символ F, во всех остальных случаях – символ 0.
2. Программа 4 работает по следующему алгоритму:
Сначала идет логическое умножение по маске F0 = (11110000), чтобы выявить было ли нажатие на клавиши 0 - 3. Если результат нулевой, то возвращаемся в начало и выводим символ 0. В противном случае, выполняем проверку дальше.
Затем, проверяем было ли нажатие клавиш 4 - 7. Для этого производим логическое умножение по маске 0F = (00001111). Если результат операции нулевой, значит, нажатия не было, возвращаемся в начало и выводим символ 0, иначе – выводим символ F.
Вывод:
Выполнив данную лабораторную работу, мы изучили команды логических операций и передачи управления; изучили программные способы поразрядной обработки данных и организации условных переходов в УОУ.