Помощь в написании студенческих работ
Антистрессовый сервис

Команды ввода-вывода. 
Основы электроники

РефератПомощь в написанииУзнать стоимостьмоей работы

Программа должна реализовать алгоритм управления, представленный на рис. 4.18. Решение. Обращение к внешним регистрам будем выполнять с помощью команд IN и OUT. Регистр DX будем использовать для адресации внешних регистров, регистр SI — для адресации ячеек памяти. Занесение единицы в разряд, соответствующей включению, выполним командой OR с маской, занесение нуля, соответствующего отключению… Читать ещё >

Команды ввода-вывода. Основы электроники (реферат, курсовая, диплом, контрольная)

Все внешние устройства рассматриваются микропроцессором как внешние регистры или порты ввода-вывода. Для передачи данных между МП и ВУ имеются две команды: IN — ввод и OUT- вывод. Весь процесс обмена ведется через регистр АХ или его отдельные половины. Он является как бы «почтовым ящиком». Через него осуществляются пересылки данных из МП в ВУ и в него же данные принимаются. Обобщенный вид команд можно представить в следующем виде:

Мнемоника Приемник, Источник.

В команде IN в качестве приемника может выступать регистр АХ (АН, AL). В качестве источника должен выступать адрес регистра ВУ, который может быть задан либо однобайтной константой (от 0 до 255), либо косвенно, путем указания регистра DX. В этом случае в этот регистр должен быть занесен двухбайтный адрес регистра ВУ. В команде OUT регистр АХ теперь выступает уже в качестве источника, а адрес регистра В У должен быть помещен на место приемника. Он может быть задан так же, как и в команде IN.

В команде IN АХ, 40 приемником является АХ, а источником — регистр с адресом 40.

В команде OUT DX, AL приемником является регистр с адресом, содержащимся в DX, а источником — регистр AL.

Кроме рассмотренных команд в МП Intel 8086 имеются команды для работы со стеком — записи в стек и извлечения из стека; команды для установки и сброса отдельных признаков результата — флажков; команды, обеспечивающие управление микропроцессором.

Рассмотрим примеры реализации простейших программ на языке Ассемблер.

Пример 4.2

Составить последовательность команд, выполняющих сложение двух чисел, находящихся в двухбайтных ячейках памяти ALPHA и BETA. Результат поместить в ячейку GAMMA.

Решение. Для пересылки данных между памятью и микропроцессором воспользуемся универсальной командой MOV. Поскольку адреса ячеек заданы непосредственно, будем использовать прямой режим адресации. Для сложения воспользуемся командой ADD

МО V АХ, ALPHA (АХ) (ALPHA)

ADD АХ, BETA (АХ) + (BETA)

МО V GAMMA, АХ (GAMMA) <- (АХ)

Пример 4.3

Составить последовательность команд, выполняющих вычитание двух чисел, находящихся в двухбайтных ячейках памяти. Адрес уменьшаемого хранится в регистре 57, адрес вычитаемого задай смещением относительно адреса уменьшаемого, хранящимся в регистре ВХ. Результат поместить по месту хранения уменьшаемого.

Решение. Для адресации необходимо воспользоваться косвенными режимами адресации. Адресации уменьшаемого соответствует регистровый косвенный режим (см. рис. 4.16, г), а адресации вычитаемого — базовый индексный (см. рис. 4.16, е).

МО V АХ, [5/] (АХ) <- ([57]).

SUB АХ, IBX]ISI] (АХ) <�г- (АХ) — ([ВХ] + [57]).

МО V [57], АХ ([57]) <- (АХ)

Пример 4.4

Содержимое ячеек с адресами 1500, 1501, 1502, …1509 скопировать и поместить в ячейки с адресами 1600, 1601, 1602, 1609 за минимально возможное время без использования цикла.

Решение. Наиболее эффективно микропроцессор выполняет программы, если количество обращений к памяти минимально, а данные для работы хранятся во внутренних регистрах. Поэтому для формирования адресов ячеек памяти не будем каждый раз указывать в команде MOV непосредственный адрес ячейки, а воспользуемся регистровым косвенным режимом адресации. Отведем для хранения адресов ячеек регистры 57 и DI. Для подготовки адресов воспользуемся командой INC. Команды ввода-вывода. Основы электроники.

Пример 4.5

Выполнить задание примера 4.4 с организацией цикла на основе команды условного перехода.

Решение. Организуем цикл па основе анализа очередного адреса ячейки, подлежащей копированию. Адрес ячеек будем формировать с помощью базовой индексной адресации (см. рис. 4.16, е), при этом базовый адрес копируемой группы занесем в регистр ВХ, а группы ячеек, куда данные должны быть скопированы, — в регистр ВР. Текущий адрес ячейки внутри группы (индекс) занесем в регистр SI. При превышении содержимого регистра SI числа 9 выполним выход из цикла. Обнуление регистра SI выполним с помощью команды XOR.

MOV ВХ, 1500Н (ВХ) <�н- 1500Н

MOV BP, 160 014 (BP) с- 1600II

XOR SI, SI (SI) <- (SI) (c) (57)

MOV[DX, 9 ([ШГ])<-9.

NEXT MOV AL, [ВХ [57] (AL) <- (ВХ + [5/])

MOV ВР [57], AL (ВР + [57]) <- (AL)

INC SI (SI) <�— (SI) + 1

CMP SI, DX сформировать признаки результата (57) — (OX)

JNZ NEXT перейти на команду NEXT,

если результат не равен нулю

Пример 4.6

Выполнить задание примера 4.5 с организацией цикла на основе команды LOOP. Решение. Во фрагменте программы примера 4.5 введем количество копируемых ячеек в регистр СХ вместо регистра DX. Команды СМР и JNZ заменим одной командой. MOV ВХ, 1500Н (ВХ) <- 1500Н

MOVBP, 1600II (BP) <�— 1600Н

XOR SI, 5/ (57) <- (57) 0 (57)

MOV[CX, 9 ([C'Al) <�— 9.

NEXT MOV AL, [BX] [57] (AL) <- ([BX] + [571)

MOV [BP] [57], AL (BP + [57]) <- (AL)

INC SI (ST) <�— (57) + 1

LOOP NEXT перейти на команду NEXT, пока (СХ) > 0

Вычислить сумму содержимого массива из 10 ячеек. Адрес первой ячейки массива — ADR. Все ячейки однобайтные.

Решение. Очевидно, что данная программа должна быть циклической, в которой выборку содержимого ячеек памяти можно выполнять с помощью косвенной адресации с инкрементом на каждом шаге содержимого адресного регистра. Но для этого нужен эффективный адрес первой ячейки, а нс се метка. Для загрузки эффективного адреса в регистр 57 на основании метки ячейки воспользуемся командой LEA. Поскольку ячейки однобайтные, а сумма содержимого 10 ячеек может оказаться большей разрядности, необходимо из содержимого однобайтной ячейки формировать двухбайтные данные, чтобы операнды в команде сложения были двухбайтными. Будем формировать эти данные в регистре ВХ. обнуляя его старший байт, являющийся регистром ВН, с помощью команды XOR, а в младший байт, являющийся регистром BL, занося содержимое ячейки памяти командой MOV. Накапливаемую сумму будем формировать в регистре АХ. Циклическую программу сформируем с помощью команды LOOP. поместив в регистр СХ количество ячеек.

XOR АХ, АХ обнуление регистра АХ

MOV СХ, 10 (СХ)<-10

LEA SI, ADR (57) <�— эффективный адрес ячейки ADR

NEXT XOR ВН, ВН обнуление регистра ВН

МО V BL, [57] (BL) <- ([57])

ADD АХ, ВХ (АХ) <- (АХ) + (ВХ)

INCSI (57) <�— (57) + 1

LOOP NEXT перейти на команду NEXT, пока (СХ) > 0

Пример 4.8

Найти максимальное число, хранящееся в массиве ячеек с адресами 1000… 10FE. Все ячейки двухбайтные.

Решение. Будем выполнять последовательное попарное сравнение содержимого ячеек с помощью команды СМР, выявляя в каждом сравнении большее число и сохраняя его в регистре АХ. Если очередная ячейка содержит число, большее чем содержимое регистра АХ, заменяем содержимое регистра АХ на это число. Если очередное число меньше или равно содержимому регистра АХ, выполняем переход к концу цикла — команде LOOP. Так как адрес первой двухбайтной ячейки — 1000Н, а последней — 10FEH, то общее количество двухбайтных ячеек составит 100Н / 2 = 256 / 2 = = 128. При этом число попарных сравнений будет на 1 меньше, т. е. 127. Это число запишем в регистр СХ. В регистр ВХ занесем шаг, с которым идет адресация двухбайтных ячеек — 2, чтобы модифицировать адрес одной командой ADD. (Иначе пришлось бы дважды повторить команду INC.)

МО V СХ, 127 ( СХ) <�г- 127

МО V SI, 1 000Н (57) <- 1000Н

МО V ВХ, 2 (ВХ)<�г- 2

МО V АХ, [5/] (АХ) <�г- ([57])

NEXT ADD SI, ВХ (SI) <- (SI)+(BX)

CMP AX, [57] сформировать признаки результата (AX) — ([57])

JNL BETA перейти на команду BETA, если больше.

МО V АХ, [57] (АХ) <- ([57])

BETA LOOP NEXT перейти на команду NEXT, пока (СХ) > 0

Обнулить в ячейках памяти с адресами 1000… 1007 следующие разряды (табл. 4.1).

Адрес ячейки.

Обнуляемый разряд.

0 разряд.

1 разряд.

2 разряд.

3 разряд.

4 разряд.

5 разряд.

6 разряд.

7 разряд.

Решение. Обнуление разрядов будем выполнять с помощью команды AND с маской, в которой все разряды, кроме обнуляемого, равны 1. На каждом шаге маска формируется путем циклического сдвига влево без учета переноса ROL. Цикл организуем с помощью команды LOOP, занеся в регистр СХ количество шагов, равное количеству разрядов — 8. Для выборки ячеек из памяти будем использовать регистровую косвенную адресацию через регистр SI.

MOV СХ, 8 (СХ) <�— 8

МО V 5/, 1000Н (S7) <�— 1000Н

MOVDH, 11 111 110В (DH) <- 11 111 110В

NEXT МО V АН, [Si] (АП) <- ([Si])

AND АН, DH (АН) <- (АН) л (Dtf)

МОГ [S7], АН ([5/]) <- (ЛЯ)

INC SI (S/)<-(S/) + 1

/?OL Dtf, 1 сдвиг (ОЯ) на 1 разряд влево

BETA LOOP NEXT перейти на команду NEXT, пока (СХ) > 0

Пример 4.10.

Установить в единицу разряды внешних регистров со следующими адресами (табл. 4.2).

Таблица 4.2

Адрес регистра.

F0.

F1.

F2.

F3.

F4.

F5.

F6.

F7.

Разряд, устанавливаемый в 1.

7 разряд.

6 разряд.

5 разряд.

4 разряд.

3 разряд.

2 разряд.

1 разряд.

0 разряд.

Решение. Для чтения внешних регистров используется команда IN, а для записи — OUT. Адресация выполняется через регистр DX. Для установки определенного разряда в единицу будем использовать команду OR с маской, в которой все разряды, кроме устанавливаемого в единицу, равны нулю. На каждом шаге маска сдвигается вправо на 1 разряд, для чего можно использовать команду логического сдвига вправо SLR (слева «вдвигаются» нули). Цикл программы организуем аналогично примеру 4.9.

MOVDXy FOII (DX) FOII.

MOV BH, 1 000 0000B (BH) 1 000 0000B.

MOVCXy 8 (CX).

NEXT IN AH, DX (AH) [DX]).

OR AHy BH (AH) (AH) v (BH).

OUT DXy AH (DX)) (AH).

INC DX (DX) + 1.

SLR BHy 1 сдвиг (BH) на 1 разряд вправо.

LOOP NEXT перейти на команду NEXTy пока (СХ) > 0.

Прочитать внешний регистр с адресом 60, и если его 4-й разряд равен 1, обнулить разряды 0, 1 и 2 внешнего регистра с адресом 61.

Решение. Обнуление разрядов будем выполнять с помощью команды AND с маской «11 111 000». Проверку разряда на его равенство единице выполним путем обнуления командой AND всех остальных разрядов, в результате чего признак результата — флажок нуля будет однозначно указывать на состояние проверяемого бита. С помощью команды условного перехода JZ будем обходить выполнение фрагмента, обнуляющего разряды в регистре с адресом 61.

MOVDX, 60Н (DX) 6011

MOVBH, 10 000 В (ВII) <- 10 000В

MOVBL, 11 111 000 В (BL) <- 11 111 000 В IN АН, DX (АН) <- ([DX])

AND АН, ВН (АН) <- (АН) д (ВН)

JZ NEXT перейти на команду NEXT, если 0.

INC DX (DX) + 1.

IN AH, DX (AH)<^([DX])

AND AH, BL (AH) <- (AH) a (BL)

OUTDX, AH (IDX]) <- (AH)

NEXT следующая команда программы Пример 4.12.

Умножить элементы массива А на элементы массива В. Результат поместить в массив С. Начальный адрес массива А — 1000, массива В — 2000, массива С — 3000. Количество элементов массивов — 50Н. Элементы массивов А и В — однобайтные.

Решение. При умножении однобайтных чисел получаются двухбайтные произведения, поэтому элементы массива С — двухбайтные и их адресация выполняется с шагом 2. Для выборки операндов и загрузки результата в память воспользуемся регистровой косвенной адресацией через регистры $/, DI и ВР. По умолчанию при умножении однобайтных чисел первый операнд должен находиться в регистре AL, куда будем помещать элемент массива А. Цикл организуем с помощью команды LOOP, а в регистр СХзанесем количество умножений — элементов массивов, т. е. ЗОН. МО V СХ, ЗОН (СХ) <�г- ЗОН.

MOV SI, 1000Н (SI) <- 1000H.

MOV DI, 2000H (DI) <- 2000H.

MOV BP, 3000H (BP) <- 3000H.

MOVDX, 2 (DX) 2

NEXT MOV AL, [5/] (AL) <-([?/])

MUL [DI (AX) <- (AL) x ([DI])

МО V [BP], AX ([BP]) <- AX

INC SI (SI) <�— (SI) + 1.

INCDI (DI) <�— (DI) + 1.

ADD BP, DX (BP) <- (BP) + 2.

LOOP NEXT перейти на команду NEXT, пока (СХ) > 0.

Пример 4.13.

Пусть микропроцессор управляет технологическим процессом термообработки в четырех печах. Управление заключается в поддерживании в печах заданной температуры путем включения или отключения нагрева: если температура опускается ниже значения tH0M — Atl0I|J нагрев включается, если же температура превышает значение ?ном + Д?доп, нагрев отключается. Управление осуществляется с помощью внешних регистров. В четырех двухбайтных регистрах с адресами 10, 12, 14 и 16 хранятся значения текущей температуры в печах ?ТСК| с номерами i = 1, 2,3 и 4 соответственно.

Обновление данных в этих регистрах происходит автоматически без участия микропроцессора.

Однобайтный регистр с адресом 20 — регистр управления включением/отключенисм нагревательных элементов печей. Единице соответствует включение нагрева, нулю — отключение. Каждому разряду соответствует нагревательный элемент определенной печи (табл. 4.3).

Таблица 4.3

Номер печи.

Управляющий разряд.

0 разряд.

1 разряд.

2 разряд.

3 разряд.

Информация об управляемых параметрах — номинальной температуре в печи ?иом|— и допустимом отклонении Д?дош— — хранится в ячейках памяти с адресами (табл. 4.4).

Таблица 4.4

Номер печи Параметр

Номинальная температура.

Допустимое отклонение.

Программа должна реализовать алгоритм управления, представленный на рис. 4.18. Решение. Обращение к внешним регистрам будем выполнять с помощью команд IN и OUT. Регистр DX будем использовать для адресации внешних регистров, регистр SI — для адресации ячеек памяти. Занесение единицы в разряд, соответствующей включению, выполним командой OR с маской, занесение нуля, соответствующего отключению, — командой AND. Маски занесем в регистры BL и ВН. Адресацию ячеек, содержащих значения ?ном/, выполним регистровой косвенной адресацией через регистр SI. Так как адреса ячеек, содержащих значения Д?Д0П1-, смещены относительно соответствующих ячеек tHOui на одно и тоже смещение 100Н, для их адресации воспользуемся регистровой относительной адресацией (см. рис. 4.16, д).

Анализ текущей температуры выполним следующим образом. Первое вычитание командой SUB но признаку результата позволит определить, больше ?теК| чем ?ном или нет. Если результат положителен, из него вычитается значение Д?доп. Теперь положительный результат будет свидетельствовать о том, что температура в печи вышла за допустимые пределы и необходимо отключение нагрева. В случае отрицательного или нулевого результата нагрев продолжается. Если же результат первого вычитания tilOM из ^К|— отрицателен, выполняется сложение полученного результата с Д?доп. Если очередной результат остался отрицательным, значит печь остыла ниже допустимой границы и необходимо включить нагрев. В противном случае нагрев остается отключенным.

Все вышеописанные действия выполняем циклически для каждой печи. Цикл организуем с помощью команды LOOP, занеся в регистр СХ число печей.

MOVCX, 4 (СХ)<�г- 4.

МО V SI, 1000Н (SI) <- 1000Н.

MOVDX, ЮН (DX) <- ЮН.

MOVBL, 1 В (BL) 1 В.

MOV ВН, 11 111 110 В (ВН) <- ШИПОВ.

CYCLE IN АХ, DX (АХ) <- ([DX)

SUB АХ, [5/] (АХ) <�г- (АХ) — ([57]).

JL ALPHA переход на команду ALPHA, если меньше

SUB АХ, [57] + Ю0Н (АХ) <- (АХ) — ([57] + Ю0Н).

JL NEXT переход на команду NEXT, если меньше

INAL, 20Н (AL) <�— (20Н).

AND AL, BH (AL) <- (AL) л (BH)

OUT20H, AL (20H) <- (AL)

NEXT ADD DX, 2 (DX) <- (DX) + 2

ROL BL, 1 сдвиг влево (BL) на 1 разряд.

ROL BH, 1 сдвиг влево (BH) на 1 разряд.

LOOP CYCLE перейти на команду CYCLE, пока (СХ) > О.

ENDP конец процедуры.

ALPHA ADD АХ, [5/] + 100Н (АХ) <- (АХ) + (|S/] + 100Н)

JNL NEXT переход на команду NEXT, если больше.

INAL, 20Н (AL) <- (20Н)

OR AL, BL (AL) <- (AL) v (BL)

OUTim, AL (20H) <- (AL)

JMP NEXT безусловный переход на NEXT

Алгоритм управления печами.
Рис. 4.18. Алгоритм управления печами.

Рис. 4.18. Алгоритм управления печами.

Показать весь текст
Заполнить форму текущей работой