Общие сведения. В МП К580ВМ80А используется 5 способов адресации: прямая, непосредственная, неявная, регистровая и косвенная

В МП К580ВМ80А используется 5 способов адресации: прямая, непосредственная, неявная, регистровая и косвенная.

Прямая адресация - команды прямой адресации занимают три байта: первый байт - код операции, второй байт - младший байт адреса, третий байт - старший байт адреса. Например, STA 0800 пересылает данные из аккумулятора (регистра А) в ячейку памяти с адресом 0800. В ОЗУ эта команда занимает три байта – 32 00 08.

Непосредственная адресация - команды непосредственной адресации используют два байта: первый байт содержит код операции, второй байт – данных. Например, MVI A, 1D - записывает в регистр А шестнадцатеричное число 1D. В ОЗУ эта команда занимает два байта – ЗЕ 1D.

Неявная адресация - команды неявной адресации занимают один байт. в котором содержится только код операции. По этому коду МП обрабатывает данные находящиеся в одном из регистров общего назначения. Например, по команде DАА происходит десятич­ная коррекция числа в регистре А.

Регистровая адресация - команды регистровой адресации занимают один байт. в котором содержится код операции и коды одного или двух регистров, участвующих в операции.

Например, команда ОRА В выполняет поразрядную логическую операцию ИЛИ над содержимым регистра B, её код A0. Команда MOV А, В

выполняет пересылку содержимого регистра В в А. Ее код 78.

Косвенная регистровая адресация - команды косвенной регистровом адресации занимают один байт, в котором содержится код операции над данными, адрес которых содержится в одной из регистровых пар. Например, АDDМ - выполняется операция сложения аккумулятора с содержимым ячейки памяти, адрес которой указан в регистровой паре HL, код команды - 86.

При разработке программ для автоматизации технологических процессов часто встречается задача, когда выходная величина У связана с входными величинами Х1,Х2,ХЗ,.., какой-то формулой. В этом случае составляется программа, в которой используются различные способы адресации.

Например, нужно составить программу, которая бы реализовывала выполнение функции У = X1V ^X3

Входные данные Х1, Х2, Х3 (сигналы от датчиков) поступают на порт ввода с адресом 91Н, выходная величина У выводится в порт вывоза с адресом 90Н. Расположение величин Х и У приведено на рисунке 12.1.

D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0

  X1     X2     X3           Y        

порт 91Н порт 90Н

Рисунок 12.1 – Расположение переменных Х1 … Х3 и функции Y в портах

Составим программу на языке ассемблера и объясним действие каждой команды

    ORG    
  MI: MVI OUT IN MOV A,82 H 93H 91H B,A Настройка УВВ Настройка УВВ Чтение порта ввода Сохранение данных Х1, Х2, Х3
    CMA   инверсия Х2
    ANI   Маска
    MOV С,А Сохранение в С (в разряде D3)
    MOV А,В Данные в аккумулятор
      01H C C,A A,B C 90H M1 Маска Х3 Сдвиг Х3 влево Сдвиг Х3 влево Сдвиг Х3 влево У=Х2 ^ Х3 Сохранение Х2^Х3 (в разряде D3) Данные в аккумулятор Маска Х1 Сдвиг Х1 вправо Сдвиг Х1 вправо Сдвиг Х1 вправо У=Х1Ú Х2 ^ Х3 Сдвиг У влево (в разряд D4) Вывод данных Возврат на начало программы

Назначение каждой команды.

12..2.1. Составляется управляющее слово для настройки РУС, которое записывается в аккумулятор.

12.2.2. Записанное число выводится в РУС.

12.2.3. Производится чтение датчиков Х1.Х2,ХЗ.

12.2.4. После чтения содержимое аккумулятора пересылается в какой-либо регистр общего назначения для хранения. Это нужно для того, чтобы во время обработки программы пользоваться только теми входными величинами, которые были считаны первый раз. Если этого не сделать, то при обращении к порту ввода командой IN можно считать другие данные. Это произойдет потому, что за время выполнения программы входные сигналы могут измениться.

12.2.5. Так как нам нужно вычислить функцию У==Х1V ÙX3,то по приоритету на первом месте идет операция инверсии (отрицания), Команда СМА выполнит инверсию всего содержимого аккумулятора.

12.2.6. Для того, чтобы выделить сигнал производится так называемое маскирование. Это логическое умножение сигнала от датчиков на число, во всех разрядах которого (кроме одного) нули. Тот разряд, в котором находится нужный нам сигнал, содержит 1.

Сигнал находится в третьем разряде, поэтому нужно произвести логическое умножение на число 00001000. В шестнадцатеричной форме это запишется как 08Н. После выполнения команды АNI 08 в третьем разряде буде содержаться сигнал , а в остальных разря­дах - нули.

12.2.7. Так как аккумулятор нужен для обработки следующих сиг­налов, то сигнал пересылается для хранения в один из регистров общего назначения, в данном случае в С.

12.2.8. Считанные первый раз данные из промежуточного хранения (регистр В) пересылаются в аккумулятор.

12.2.9. Производится маскирование сигнала ХЗ, т.к. следующей по приоритету операцией будет логическое умножение У= /\ХЗ.

12.2.10. Так как сигнал находится в третьем разряде, а сигнал ХЗ - в нулевом, то для совмещения этих двух сигналов производим сдвиг влево Х3 три раза.

12.2.11. Вычисление функции У=Х2/\ХЗ

12.2.12. Сохранение полученного значения в одном из регистров общего назначения.

12.2.13. Считанные первый раз данные из промежуточного хране­ния (регистр В) пересылаются в аккумулятор.

12.2.14. Маскирование сигнала Х1. Так как он находится в шестом разряде, то двоичное число 01000000, шестнадцатеричное – 40Н.

12.2.15. Для совмещения XI и У= /\ХЗ производим сдвиг XI вправо три раза до третьего разряда.

12.2.16. Вычисляем значение функции У=Х1\/ ÙХЗ

11.2.17. Так как функция У в порту вывода должна находиться в четвертом разряде, а вычисленное значение У расположено в треть­ем, то производится сдвиг влево на один разряд.

11.2.18. Выводится полученное значение У в порт вывода.

11.2.19. Переход на начало программы для следующей обработки входных сигналов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: