- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой Model:
- •Этапы создания программы на ассемблере
- •2. Создание объектного модуля (трансляция программы)
- •3. Создание загрузочного модуля (компоновка программы)
- •4. Отладка программы
- •Определение простых типов данных:
- •Способы адресации Регистровая адресация
- •Непосредственная адресация
- •Способы адресации памяти
- •Переопределение сегмента
- •Особенности пересылки данных
- •Xch ax, bx ; команда двунаправленного обмена
- •Команды работы с адресами и указателями
- •Команды сдвига
- •Команды линейного сдвига
- •Команды циклического сдвига
- •Команды сдвига двойной точности
- •Примеры работы с битовыми полями
- •Команды преобразования данных
- •Xor ax, ax ; очистка регистра ax
- •Int 21h ;ожидание вода с клавиатуры
- •Команды обработки строк
- •Команды пересылки строк
- •Команды сравнения строк
- •Пример.
- •Сканирование строки
- •Загрузка элемента строки в аккумулятор
- •Перенос элемента из аккумулятора в строку
- •Ввод элемента цепочки из порта в строку
- •Вывод элемента цепочки в порт
- •Пример использования вложенных циклов
- •Массивы
- •Логические команды
- •Xor операнд1,операнд2
- •Логические команды поиска
- •Структуры
- •Описание шаблона структуры:
- •Заполнение шаблона:
- •Работа с полями структуры
- •Пример:
- •Шаблон записи:
- •Xor bl, mask i2 ; обнуление
- •Команды передачи управления
- •Безусловные переходы
- •Межсегментные переходы
- •Второй сегмент
- •Команды условного перехода
- •Команды условного перехода и флаги
- •Процедуры
- •Процедура в начале кодового сегмента
- •Процедура в конце кодового сегмента
- •Процедура в теле сегмента
- •Вызов процедуры
- •Ret [число]
- •Способы вызова процедуры
- •Прямой ближний вызов
- •Прямой дальний вызов
- •Косвенный ближний вызов
- •Косвенный дальний вызов процедуры
- •Организация интерфейса между процедурами, расположенными в разных модулях
- •Передачи параметров в процедуру через регистры
- •Фрагмент модуля 2
- •Возврат результата из процедуры
- •Макрокоманды и макроопределения
- •Особенности трансляции при получении объектного модуля
- •Где можно разместить макроопределение?
- •Связь Assembler с языками высокого уровня
- •Операторы типа inline
- •Ассемблерные вставки
- •Внешние процедуры Операторы типа inline
- •Ассемблерные вставки
- •Требования к программе на языке Assembler
- •Требования к программе на языке Pascal
- •Передача параметров из Pascal-программы в программу на ассемблере
- •Использование директивы model для организации взаимодействия программ
- •Int 10h; вывод символа
- •Возврат данных в вызывающую программу
- •Пример взаимодействия программ
- •Особенности com-программы
- •Пример программы типа .Com
- •Резидентные программы
- •Формат резидентной программы
- •Собственно программу.
- •Функцию записи в оп адреса точки входа программы для последующего вызова.
- •Функцию, которая оставляет программу резидентной.
- •Пример резидентной программы типа .Com
- •Iret ;возврат из процедуры
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы
- •Запись адреса резидентной программы в область межзадачных связей
- •Iret ;возврат из процедуры
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы через область межзадачных связей
- •Передача параметров в резидентную программу
- •Замена существующего вектора прерывания
- •Динамическое распределение памяти
- •Пример выделения и освобождения блока памяти
- •Int 21h ;блока памяти
- •Дочерние процессы
- •Особенности структуры материнской программы
- •Активизация дочернего процесса
- •Пример материнской программы
- •; Запуск дочернего процесса
- •Int 21h ; запуск дочернего процесса
- •Int 21h ; выход в ос (завершение программы)
- •Получение и анализ кода возврата в материнской программе
- •Int 21h ; код возврата передается через регистр al
- •Передача кода возврата из дочерней программы
- •Прерывания
- •Программируемый контроллер прерываний
- •Прохождение запроса на прерывание через контроллер
- •Программирование контроллера прерываний
- •Формат приказов icw
- •Формат приказов ocw
- •И f спользование таймера в программах на Assembler
- •Формирование задержки
- •Использование прерываний 8h для управления запуском программ
- •Программирование коммуникационного порта (com)
- •Микросхема uart 8250
- •Инициализация порта
- •Пример программы инициализации порта
- •Регистр статуса линии (порта)
- •Работа порта без использования механизма прерываний
- •Получение данных
- •Передача данных
- •Алгоритм работы программы приема /передачи без прерываний
- •Текст программы
- •Работа com – порта в режиме прерываний
- •Регистр разрешения прерываний
- •Регистр идентификации прерывания
- •Вызов обработчика прерывания
- •Управление модемом через порт
- •Пример установления связи через порт и модем
- •Защищенный режим микропроцессора
- •2. Регистры отладки
- •3. Регистры управления Регистры системных адресов
- •Структура дескрипторных таблиц
- •Локальная дескрипторная таблица (ldt)
- •Структура дескриптора:
- •Структура байта ar
- •Обработка прерываний в защищенном режиме
- •Особенности обработки ловушек
- •Шлюз задачи
- •Дескриптор tss
- •Структура шлюза вызова
-
Формат приказов ocw
OCW1 – приказ управления регистром масок. Передается в порт 21h
«0» - разрешение прерывания, «1» - запрет прерывания от соответствующего устройства.
OCW2 – управление приоритетом. Посылается в порт 20h
Биты 0, 1, 2 – код nnn уровня запроса прерывания для действий, определенных разрядами 5, 6, 7.
Биты 3, 4 – 0 0 - признак слова OCW2
Биты 5, 6, 7 – выбор режима работы контроллера прерываний:
000 – обычный режим приоритетов с автоматическим сбросом бита в ISR,
001 – сброс бита с максимальным приоритетом в ISR,
011 – сброс бита в ISR для уровня nnn,
100 – установка режима циклической смены приоритета (при автоматическом EOI),
101 - установка режима циклической смены приоритета (при неавтоматическом EOI),
111 – режим циклической смены приоритета, но относительно уровня nnn
OCW3 – общее управление контроллером. Отправляется в порт 20h
Биты 0, 1 – «1 0» прочитать содержимое IRR следующей командой из порта 20h
«1 1» прочитать содержимое ISR следующей командой из порта 20h
Бит 2 – «0» устанавливает режим опроса контроллера о поступивших запросах на прерывание, «1» не устанавливать данный режим
Биты 3, 4 – «0 1» признак слова OCW3
Биты 5, 6 – «1 1» установить режим специального маскирования
Бит 7 – не используется
Пример программирования 2-х контроллеров прерываний
20h: ICW1 0 0 0 1 0 0 0 1 – каскадное включение
21h: ICW2 0 0 0 0 1 0 0 0 – начальный вектор прерываний 08h
21h: ICW3 0 0 0 0 0 1 0 0 – подключение выхода ведомого к входу irq2 ведущего
21h: ICW4 0 0 0 0 0 1 0 1 – контроллер ведущий, 16-разрядный
Порты для ведомого контроллера: A0h и A1h
С помощью команд в порты A0h и A1h производится инициализация 2-го ведомого микроконтроллера.
Зададим маски
21h: OCW1 1 0 1 1 1 0 0 0
A1h: OCW1 1 0 1 1 1 1 0 0
f = 18.2 имп/с
-
И f спользование таймера в программах на Assembler
Системные часы
Таймер
КП
int8
f = 18.2 имп/с
Схема взаимодействия таймера и контроллера прерываний
Формирование задержки
В оперативной памяти имеется область счетчика времени, где записывается текущее время (0040:006Ch). К ней можно обратиться напрямую по данному адресу, либо через прерывание.
Рассмотрим случай, когда программе требуется выработать задержку. Программа должна подсчитать требуемое число импульсов, которое поступит на счетчик времени за выбранное время. Это число суммируется с текущим значением счетчика времени.
Программа постоянно следит за текущим временем и сравнивает его с полученной суммой. Когда значения совпадут, выполнение программы продолжится после тайм-аута.
Для чтения счетчика времени можно использовать функцию 00h прерывания 1Ah, которая возвращает содержимое счетчик времени в регистры dx (младшее слово) и cx (старшее слово).
Пример формирования задержки 5 секунд.
mov ah, 00h ; номер функции – 0
int 1Ah ; содержимое счетчика сохраняем в dx и cx
add dx, 91 ; добавляем время задержки (5*18.2=91)
mov bx,dx ;запоминаем сумму в регистре bx
REP:
int 1Ah ; читаем текущее содержимое счетчика в dx
cmp dx, bx ; сравниваем dx и bx
jne REP ; если не равно, то на REP
…