- •Конспект лекций по дисциплине «Программные средства аппаратно-программных комплексов»
- •Содержание
- •Архитектура пэвм
- •Пользовательские регистры
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой Model:
- •Этапы создания программы на ассемблере
- •2. Создание объектного модуля (трансляция программы)
- •1 ;Программа преобразования двузначного шестнадцатеричного числа
- •3. Создание загрузочного модуля (компоновка программы)
- •4. Отладка программы
- •Определение простых типов данных:
- •Способы адресации Регистровая адресация
- •Непосредственная адресация
- •Способы адресации памяти
- •Переопределение сегмента
- •Особенности пересылки данных
- •Xch ax, bx ; команда двунаправленного обмена
- •Команды работы с адресами и указателями
- •Команды сдвига
- •Команды линейного сдвига
- •Команды циклического сдвига
- •Команды сдвига двойной точности
- •Примеры работы с битовыми полями
- •Команды преобразования данных
- •Xor ax, ax ; очистка регистра ax
- •Int 21h ;ожидание вода с клавиатуры
- •Команды обработки строк
- •Команды пересылки строк
- •Команды сравнения строк
- •Пример.
- •Сканирование строки
- •Загрузка элемента строки в аккумулятор
- •Перенос элемента из аккумулятора в строку
- •Ввод элемента цепочки из порта в строку
- •Вывод элемента цепочки в порт
- •Пример использования вложенных циклов
- •Массивы
- •Логические команды
- •Xor операнд1,операнд2
- •Логические команды поиска
- •Структуры
- •Описание шаблона структуры:
- •Заполнение шаблона:
- •Работа с полями структуры
- •Пример:
- •Шаблон записи:
- •Xor bl, mask i2 ; обнуление
- •Команды передачи управления
- •Безусловные переходы
- •Межсегментные переходы
- •Второй сегмент
- •Команды условного перехода
- •Команды условного перехода и флаги
- •Процедуры
- •Вызов процедуры
- •Ret [число]
- •Способы вызова процедуры
- •Прямой ближний вызов
- •Прямой дальний вызов
- •Косвенный ближний вызов
- •Косвенный дальний вызов процедуры
- •Организация интерфейса между процедурами, расположенными в разных модулях
- •Передачи параметров в процедуру через регистры
- •Передача параметров в процедуру через общую память
- •Макрокоманды и макроопределения
- •Особенности трансляции при получении объектного модуля
- •Где можно разместить макроопределение?
- •СвязьAssemblerс языками высокого уровня
- •Использование директивыmodelдля организации взаимодействия программ
- •Int 10h; вывод символа
- •Возврат данных в вызывающую программу
- •Пример взаимодействия программ
- •Особенностиcom-программы
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы
- •Запись адреса резидентной программы в область межзадачных связей
- •Iret ;возврат из процедуры
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы через область межзадачных связей
- •Передача параметров в резидентную программу
- •Замена существующего вектора прерывания
- •Динамическое распределение памяти
- •Пример выделения и освобождения блока памяти
- •Int 21h ;блока памяти
- •Дочерние процессы
- •Особенности структуры материнской программы
- •Активизация дочернего процесса
- •Пример материнской программы
- •Программируемый контроллер прерываний
- •Прохождение запроса на прерывание через контроллер
- •Программирование контроллера прерываний
- •Формат приказов icw
- •Формат приказов ocw
- •И fспользование таймера в программах на Assembler
- •Формирование задержки
- •Использование прерываний 8h для управления запуском программ
- •Программирование коммуникационного порта (com)
- •Микросхема uart 8250
- •Инициализация порта
- •Пример программы инициализации порта
- •Регистр статуса линии (порта)
- •Работа порта без использования механизма прерываний
- •Получение данных
- •Передача данных
- •Алгоритм работы программы приема /передачи без прерываний
- •Текст программы
- •РаботаCom– порта в режиме прерываний
- •Регистр разрешения прерываний
- •Регистр идентификации прерывания
- •Вызов обработчика прерывания
- •; Инициализация регистра разрешения прерывания (прием/передача)
- •Пример установления связи через порт и модем
- •Защищенный режим микропроцессора
- •Структура дескрипторных таблиц
- •Локальная дескрипторная таблица (ldt)
- •Структура дескриптора:
- •Структура байта ar
- •Обработкапрерываний в защищенном режиме
- •Особенности обработки ловушек
- •Шлюз задачи
- •Дескриптор tss
- •Структура шлюза вызова
Вызов процедуры
CALL [модификатор] имя
Здесь имя условно, чаще всего это адрес, точка входа в процедуру
Модификатор: near, far, ptr
По этой команде содержимое регистров cs, eip/ip загружается в стек (при дальнем переходе). Далее в регистры cs, eip/ip загружается сегментный адрес и смещение адреса точки входа в процедуру (при ближней адресации загружается только eip/ip).
Команда возврата из процедуры может содержать параметр – число.
Ret [число]
Число – это величина обхода стека при выходе из процедуры

чтение
запись
ip [cs] dat1 dat2
По команде ret из стека читаются 2 слова (адрес возврата) и загружаются в соответствующие регистры. Если стоит команда ret 4, то указатель стека спускается вниз на 4 байта, чтобы обойти данные dat1 и dat2 (если стоит директива USE16 ) .
Если указано Use 32, то из указателя вершины стека вычитается 8 байт .
Способы вызова процедуры
Начало процедуры может быть обозначено меткой, а в случае косвенного вызова, когда адрес вычисляется и заносится в выделенную ячейку, наличие метки в точке входа в подпрограмму необязательно.
Прямой ближний вызов
Команда CALL помещает в стек содержимое IP и загружает в этот регистр адрес точки входа. В стеке будет задействовано только 2 байта.
Пример:
.code
start proc far
…
…
c
all
sub
…

…
mov ax, 4c00h
int 21h
start endp
sub proc near
…
…

ret
sub endp
end start
Прямой дальний вызов
По команде CALL в стек заносится содержимое регистров cs и ip (4 байта).
Пример:
В программе объявлены 2 кодовых сегмента.
seg1 segment 'code'
start proc far
…
call far ptr sub
…
mov ax, 4c00h
int 21h
start endp
seg1 ends
seg2 segment 'code'

sub
proc far
…
ret
sub endp
seg2 ends
Косвенный ближний вызов
Подразумевает запись адреса точки входа (смещения) в ячейку памяти либо регистр и обращение при запуске процедуры к памяти или к регистру, где хранится адрес.
Пример
.data
subadr dw subr ; по адресу subadr записан адрес метки sub
.code
start proc
… mov ax,@data
mov ds,ax
call word ptr subadr ; из памяти взять слово
…
mov ax, 4c00h ; выход
int 21h
start endp
…
subr proc near
…
ret
subr endp
end start
При косвенном запуске программы возможны другие варианты,
например:
mov bx, offset subr
call word ptr bx ; адрес процедуры в регистре bx
Косвенный дальний вызов процедуры
dseg segment ‘data’
subadr dd subr
dseg ends
cseg1 segment ‘code’
start proc far
……
call dword ptr subadr
……….
ret
start endp
cseg1 ends
cseg2 segment ‘code’
subr proc far
…
…
ret
subr endp
cseg2 ends
Организация интерфейса между процедурами, расположенными в разных модулях
Используются директивы: EXTRN, PUBLIC, GLOBAL
Директива EXTRN объявляет некоторое имя внешним по отношению к данному модулю.
Это имя должно быть объявлено в другом модуле директивой PUBLIC.
EXTRN имя:тип [, имя:тип] ,[имя:тип] ….
Имя – идентификатор, определенный в другом модуле.
В качестве идентификаторов используются:
имена переменных, определенные директивами db, dw, dd и т.д. ,
имена процедур,
имена констант.
Для переменных тип может быть: byte, word, dword, pword, fword, qword, tbyte.
Тип процедуры far (дальняя) или near (ближняя).
Если имя – константа, то тип в директиве – abs.
Директива PUBLIC объявляет имена, определенные в этом модуле, видимыми из других модулей.
PUBLIC имя [,имя] [,имя]…
Директива GLOBAL, используемая применительно к передаваемому объекту, интерпретируется как директива PUBLIC, а используемая применительно к принимаемому объекту – как EXTRN
Директива GLOBAL имеет формат директивы EXTRN
GLOBAL имя:тип [, имя:тип]
Пример программы, использующей данные директивы:
;модуль1
GLOBAL res : byte, add : far
PUBLIC fix
data segment 'data' ; сегмент данных
fix db 12
data ends
code segment 'code'
start:
…….
……..
m
ov
al, res ; resв
другом
модуле
call far ptr add ; запускается программа add
code ends
end start
;модуль2
GLOBAL res:byte , add:far
EXTRN fix:byte
dseg2 segment 'data'
res db ?
dseg2 ends
seg2 segment 'сode'
…….
add proc far
mov al, fix ; fix в другом модуле
mov res, al
…
add endp
ret
seg2 ends
