- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой 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
- •Структура шлюза вызова
Алгоритм работы программы приема /передачи без прерываний
Программа непрерывно следит за состоянием регистра статуса линии и выполняет только функции по приему и передаче байт. Источником информации является клавиатура компьютера. Программа моделирует режим работы телеграфа.
Текст программы
mov ax, 40h
mov es, ax
ketry: mov dx, es:[0] ; базовый адрес порта COM в dx
add dx, 5 ; адрес регистра статуса в dx
in al,dx ; читаем в регистр al
test al, 00011110b ; проверка на ошибку порта
jnz error ;если есть ошибки, то на метку error
test al, 00000001b ; данные получены?
jnz prb ;если байт принят, то на метку prb
test al, 00100000b ; регистр хранения передатчика пуст?
jz ketry ;в начало
mov ah, 1 ;иначе
int 16h ; проверка клавиатуры
jz ketry ;если в буфере клавиатуры нет кода, то в начало
mov ah, 0
int 15h ; загрузка символа с клавиатуры в al
sub dx, 5 ;вычисляем адрес регистра хранения
out dx, al ; загрузка символа в регистр хранения порта
jmp short ketry
prb: mov dx, es:[0]
in al, dx
…
jmp short ketry
…
-
Работа com – порта в режиме прерываний
Сигнал прерываний от COM – порта поступает на вход контроллера прерываний. Если прерывания разрешены, то программа обработки прерываний в зависимости от состояния регистра статуса может принимать или передавать байт.
Для инициализации работы порта в данном режиме регистр разрешения прерываний должен быть загружен определенным образом.
Регистр разрешения прерываний
В указанные ниже разряды регистра необходимо записать единицы, которые разрешают прерывания по перечисленным причинам:
Бит 0 – прерывание при получении данных
Бит 1 – прерывание, когда регистр хранения передатчика пуст
Бит 2 – прерывания при ошибке приема данных
Бит 3 – прерывания при изменении регистра статуса модема
Регистр идентификации прерывания
Регистр используется программой для определения причины возникновения прерывания.
Бит 0 –есть прерывание по любой из причин
Биты 2, 1 – причины возникновения прерывания
«0 0» изменения в регистре статуса модема
«0 1» регистр передатчика пуст
«1 0» получены данные
«1 1» ошибка приема
Вызов обработчика прерывания
После возникновения прерывания программа-обработчик прерываний должна опознать причину прерываний в следующей последовательности:
-
ошибка?
-
получены данные?
-
регистр передатчика пуст?
-
проверка статуса модема (читать регистр статуса модема)
Ниже дал текст резидентной программы, которая содержит команды инициализации порт в режим работы с прерываниями, установочную часть и собственно программу обработки коммуникационного прерыванияПрограмма работки коммуникационного прерывания.
cseg segment
org 100h
assume cs:cseg, ds:cseg, ss:cseg
begin:
jmp setup
ioint proc far
nexin:
push ds
mov ax,40h
mov ds,ax
mov dx,ds:[0]
add dx,2
in al,dx
test al,100b ;проверка регистра идентификации прерывания (принят байт?)
jz pdb ;передать байт
prb:
;здесь прием байта
jmp short anot
pdb:
;здесь передача байта
anot:
mov ax, 40h ; проверка наличия прерываний
mov ds, ax
mov dx, ds:[0]
add dx, 2
in al, dx
test al, 1 ; есть прерывание на выходе порта?
jnz nexin ;в начало программы
mov al, 20h
out 20h, al ; очистка регистра ISR в i8259
pop ds
finish equ $
iret
ioint endp
setup:
; инициализация регистра разрешения прерывания (прием/передача)
mov ax, 40h
mov ds, ax
mov dx, ds:[0] ; базовый адрес
inc dx
mov al, 11b ; прерывание при передаче или приеме байта
out dx, al
;установка нового вектора прерывания
mov dx, offset ioint ; смещение
mov ax, seg ioint ; сегмент
mov ds, ax
mov al, 0bh ; записываем номер вектора прерываний
mov ah, 25h
int 21h
; оставляем программу резидентной
mov dx,finish
int 27h
cseg ends
end begin