- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой 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
- •Структура шлюза вызова
Косвенный дальний вызов процедуры
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:
…….
……..
mov 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
Передачи параметров в процедуру через регистры
Через регистры целесообразно передавать в ближнюю процедуру. Необходимо заботиться о том, чтобы применять те регистры, которые не используются при передаче управления.
Процедура должна записать в стек содержимое регистров, которые будут использованы для передачи параметров, и в конце - восстановить их содержимое.
Пример.
.data
string db 'строка, $'
.code
main proc
mov ax,@data
mov ds,ax
…
lea si, string ;загрузка регистра
call count
mov ax, 4c00h
int 21h…
main endp
count proc near
push ax
push cx
mov ah, 9h
mov dx, si
int 21h
…
pop cx
pop ax
ret
count endp
end main
Передача параметров в процедуру через общую память
Модуль 1
EXTRN put: far
comdata segment common 'data'
buf db ‘ $’ ; в буфере пробелы
comdata ends
code segment
assume cs:code, ds:comdata
main
mov ax, comdata
mov ds, ax
call put
mov ah,9
mov dx, offset buf
int 21h
mov ax,4c00h ;выход
int21h
code ends
end main
Модуль 2
PUBLIC put
comdata segment common 'data'
buf db ‘ $’
comdata ends
code segment
assume cs:code, ds:comdata
put proc far
mov buf,’a’
mov buf+1,’s’
mov buf+2,’u’
ret
put endp
code ends
end
Передача параметров в дальнюю процедуру через стек
Пример
Модуль 1
extrn submul far
stk segment para stack
dw 64 dup(?)
stk ends
datasg segment para ‘data’
dat1 dw 10h
dat2 dw 2h
dat3 dw 5h
datasg ends
codesg segment para public
assume cs:codesg, ds:datasg, ss:stk
main proc far
mov ax, datasg
mov ds, ax
push dat1
push dat2
push dat3
call far ptr submul
mov ax,4c00h
int 21h
main endp
codesg ends
end main