- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой 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
- •Структура шлюза вызова
Пример:
Переслать поле name в область памяти
.data
sotr1 worker <'Иванов','инженер'>
mas db 6 dup('')
.code
assume ds:@data, es:@data
mov ax, @data
mov ds, ax
move es,ax
lea si, sotr1.name
lea di, mas
mov cx,6
rep movs b ;записать поле ‘Иванов” в память mas
-
Записи
Это структурный тип данных, состоящий из фиксированного числа элементов длиной от 1 до нескольких бит. При описании записи для каждого элемента указывается его длина в битах и значение этих бит(не обязательно).
Суммарный размер записи определяется суммой размеров её полей и не может быть более 8,16 или32 бит.
Если суммарный размер меньше указанного значения, то все поля записи смещаются к младшим разрядам.
При работе с записями используются 3 этапа:
-
Задание шаблона записи
-
Определение экземпляра записи
-
Организация обращения к записи (обращение к отдельным битам)
Шаблон записи:
имя записи RECORD <описание элементов>
IOTEST RECORD I1:1, I2:2=11, I3:1, I4:2=11, I5:2=00
После двоеточия указывается количество разрядов (бит) для каждого элемента записи.
Для получения экземпляра записи используются варианты:
-
FLAG IOTEST ? все элементы записи=0
-
FLAG1 IOTEST <> ; в качестве экземпляра выбирается шаблон
-
FLAG2 IOTEST <,10,>; вносится I2=10 вместо I2=11, остальные по шаблону
-
FLAG3 IOTEST {I2=10} ; выборочная инициализация
Для работы с записями Assembler поддерживает ряд операций.
Каждому имени элемента записи Assembler присваивает числовое значение, равное смещению (в битах) элемента от правой границы записи.
Assembler предлагает оператор width, который позволяет определить размер элемента записи в битах, либо полностью размер записи.
Пример:
mov al, width I2
mov ax, width IOTEST; в ax размер записи в битах
Оператор mask позволяет локализовать биты нужного элемента записи.
Размер маски совпадает с размером записи. В маске обнулены все разряды, кроме тех, которые выделяют элементы записи.
Используя возможности Assembler рекомендуется работать с записью в следующей последовательности:
-
Выделить элемент с помощью оператора mask
-
Сдвинуть при необходимости вправо или влево
-
Выполнить требуемые действия
-
Поместить элемент на свое место записи
Пример:
masm
model small
.stack 256
iotest record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00
.data ; сегмент данных
flag iotest <> ; экземпляр записи
.code
main:
mov ax, @data
mov ds, ax
mov al, mask i2 ; 01100000
shr al, i2 ; 00000011
and al, 11111100b ; обнуление младшего разряда
shl al, i2
mov bl, [flag] ; содержимое flag помещается в bl
Xor bl, mask i2 ; обнуление
or bl,al ; запись в bl содержимого al
mov ax, 4c00h; выход
int 21h
end main
-
Команды передачи управления
Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей.
Команды процессора, обеспечивающие организацию переходов в программе, можно разделить на три группы.
-
Команды безусловной передачи управления:
-
безусловного перехода;
-
вызова процедуры и возврата из процедуры;
-
вызова программных прерываний и возврата из программных прерываний.
Команды условной передачи управления:
-
переходы по результату команды сравнения;
-
переходу по состояния определенного флага;
-
переходу по содержимому регистра ecx/cx.
Команды управления циклом:
-
организация цикла со счетчиком ecx/cx;
-
организация цикла с возможностью досрочного выхода из цикла.
В языке ассемблера передача управления выполнятся с помощью меток.
Транслятор ассемблера присваивает метке три атрибута:
- имя сегмента кода;
- смещение от начального сегмента кода;
- тип или атрибут расстояния метки.
Последний атрибут может принимать два значения:
near - ближний тип метки:
при передаче управления изменяется содержимое регистра счетчика команд ip/eip. Метка находится в том же сегменте, что и команда передачи управления.
far – дальний тип метки:
метка располагается в другом сегменте (не там, где команда передачи управления). При передаче управления изменяется содержимое 2-х регистров: cs и eip/ip.
Метку можно определить двумя способами:
-
<имя>:
-
директивой label.
Оператор : (двоеточие) может определить только ближнюю метку,
а директива label - любой тип метки.
Одно и то же место в коде может быть отмечено как ближней, так и дальней меткой, но с различными именами. По умолчанию метка - ближняя.
Пример:
public mfar ;метка объявлена видимой для других сегментов
…………..
mfar label far ; метка определена как дальняя
mnear: ; метка определена как ближняя
mov ax,cx
…
На команду mov ax,cx можно передать управление как из данного сегмента команд, так и из других сегментов, принадлежащих другим модулям.