- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой 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
- •Структура шлюза вызова
-
Элементы синтаксиса Ассемблера
Ассемблер уникален для каждого типа МП. Программа может состоять из одного или нескольких сегментов. Каждая строка программы содержит одно предложение. Предложения бывают 4-х типов:
-
Команды МП
-
Макрокоманды
-
Директивы транслятору
-
Строки комментариев
Допустимые символы при написании программ:
-
Латинские буквы (большие и маленькие)
-
Цифры (от 0 до 9)
-
Знаки ? @ $ _ &
-
Разделители : , . [ ] ( ) < > { } + / * % ! “ “ \ = ≠ ^ ‘ ‘
Предложение Ассемблера формируется из лексема (- это последовательность символов имеющих смысл для транслятора).
Примеры лексем:
-
Идентификаторы – это последовательность допустимых символов, которые используются для обозначения имен переменных и меток (первый не должен быть цифрой);
-
Цепочка символов, заключенные в одинарные или двойные кавычки
-
Целые числа в определенной системе исчисления (если 16-ричное число начинается с буквы, то слева надо ставить 0).
Операнды – это объекты (некоторые значения, регистры или ячейки памяти), на которые действуют инструкции или директивы, либо это объекты, которые определяют или уточняют действия инструкций или директив.
-
Постоянные или непосредственные операнды – это число, строка, имя или выражение имеющее некоторое фиксированное значение (например, константа)
num equ 5
imd = num -2
mov al, num ; пересылка const в регистр al
add [SI], imd ; сложение, результат - по адресу SI
mov al, 5
-
Адресные операнды – задают физическое расположение операнда в памяти.
mov ax, es : 0025h
mov ax , [bx]
-
Перемещаемые операнды – это любые символьные адреса представляющие адреса в памяти
lea ax, mas ; загрузить адрес массива mas в ax
mas – перемещаемый операнд
-
Счетчик адреса обозначается $ - вместо знака $ транслятор подставляет текущее значение счетчика адреса, которое может быть использовано в командах МП. Счетчик адреса – значение смещения текущей машинной команды относительно начала сегмента кода.
Например:
jmp $+3 – перейти на команду, адрес которой увеличивается на 3 относительно адреса текущей команды.
-
Регистровый операнд – это имя регистра
mov al, 4
al – регистровый операнд
-
Структурные операнды – используются для доступа к конкретному Элементу структуры (записи).
-
Базовый и индексный регистры, которые используются для базовой/индексной адресации
Трансляторы TASM и MASM допускают использование выражений.
Выражение – это комбинация операндов и операторов, рассматриваемых как единое целое.
-
Операторы
Операнд команды Ассемблера может быть выражением, представляющим комбинацию операндов и операторов Ассемблера
Во время трансляции программы значения выражения вычисляются по стандартным правилам, а результат в виде константы подставляется в объектный код программы.
Операторы, которые поддерживают транслятор:
-
Арифметические операторы:
унарные: + , - ;
бинарные: +, -, * , / , mod.
Пример
tab equ 50 ; имени tab присваивается константа 50
size equ 2
…….
mov cx,tab/size ; записать в регистр cx результат деления констант нацело.
-
Операторы сдвига – сдвиг выражения на указанное количество разрядов:
shl – влево,
shr – вправо.
Формат оператора:
<Выражение> <Оператор> <Число сдвигаемых разрядов>
Пример:
mask equ 10111011b
mov al, mask shr 3 ; Результат в регистре al = 00010111
-
Операторы сравнения – предназначены для формирования логических выражений.
Формат оператора:
<Выражение 1> <Оператор> <Выражение 2>
Операторы сравнения:
eq – равно
ne – не равно
le <=
gt > для операндов со знаками
ge >=
lt <
Результат сравнения «истина» соответствует логической единице, а «лож» - логическому нулю. Логическая единица отображается значением, все биты которого равны 1 (0FFh), логический ноль – значением, все биты которого равны нулю (00h).
Пример:
tab equ 30
mov al, tab ge 50 ; al = 00h – ложь
cmp al,0
je m1
….
m1:
В примере оператор проверяет константу tab (больше или равна числу 50). Т.к. результат сравнения – «лож», то управление с помощью команды условного перехода передается на метку m1.
-
Логические операторы not, and, or, xor выполняют над выражениями поразрядные операции.
Формат операторов:
not <Выражение>
and notxor
[not] <Выражение > < > [not] <Выражение >
Пример:
Flag equ 10010011b
mov al, Flag xor 01b ;Результат в al = 10010010b
-
Индексный оператор – используется при индексной адресации. Транслятор выполняет сложение операнда, указанного в скобках с операндом вне скобок (происходит обращение по вычисленному адресу).
Пример
mas dw 48, 56, 67
……………………
mov si,2
mov ax, mas[SI] ;Пересылка слова 56 по адресу mas+(si) в регистр ax
-
Оператор переопределения типа, ptr.
Тип может принимать значения:
байт (byte), word (слово), dword (двойное слово), qword (8 байт), tbyte (10 байт).
near и far – определяет близкий или дальний переход.
Форат оператора
<Тип> ptr <Выражение>
Пример.
var dd 0abcd1234h ; двойное слово в сегменте данных
mov al, byte ptr var+1 ;в регистр al загрузить байт (число cdh)
-
Оператор переопределения сегмента (двоеточие).
Когда в команде адресации используется сегмент не по умолчанию, требуется записать в явном виде имя сегмента, в котором загружен сегментный адрес.
Фрагмент программы:
.code
…….
jmp m1
ind db 5 ; поле данных в сегменте команд
m1:
mov al, cs:ind ;адрес начала сегмента кода в регистре cs
;в регистр al загрузить число 5.
-
Оператор получения сегментной составляющей адреса - seg.
Оператор возвращает сегментный адрес для выражения в качестве которого может выступать: метка, переменная, имя сегмента, имя группы сегментов, некоторое символическое имя.
Пример:
dataseg segment
mas dw 0
dataseg end
codeseg segment
mov ax, seg mas
mov ds, ax ; в ds загружается адрес начала сегмента данных
-
Оператор получения смещения в сегменте памяти некоторого выражения – offset.
Смещение – это адрес операнда относительно начала сегмента.
Пример
.data ; начало сегмента данных
mas dw 5 ; в сегменте данных число 5
.code ; начало сегмента кода
mov ax, seg mas ; запись в ax начало сегмента данных
mov es, ax
mov dx, offset mas ; в dx загружаем смещение
mov bx, es:[dx] ; загрузили в bx число 5
Типы данных, которые поддерживает ассемблер:
-
Байт (byte) – 8 разрядов, младший разряд справа
-
Слово (word) – 2 байта, 16 разрядов. Делится на 2 части: справа младший байт, слева – старший байт. Адресом слова в памяти является адрес младшего байта.
-
Двойное слово (dword). Состоит из младшего и старшего слов. Адресом является адрес младшего слова.
МП кроме разрядности поддерживает логическую интерпретацию типов:
-
Целый тип без знака
Байт: 0….255
-
Целый тип со знаком
Байт: -128….+127
Слово: -32768…+32768
-
Цепочка – непрерывный набор байтов, слов или двойных слов (максимальная длина до 4 Гбайт).
-
Битовое поле – непрерывная последовательность бит, в которой каждый бит является независимым и может рассматриваться как независимая переменная (максимальная длина 32 бита).
Ввод информации с клавиатуры и вывод ее на экран осуществляется в символьном виде. Кодирование этой информации производят согласно таблице. Каждый символ кодируется байтом.
При вводе чисел в программу необходимо преобразование кода символа в двоичный формат. При выводе результатов необходимо выполнить обратное преобразование (чисел в символьные коды).
Символ Код ASCII Двоичное представление Разность
0 30h 0000 30h
: : : :
9 39h 1001 30h
Для преобразования в двоичный код достаточно вычесть из кода ASCII 30h (для чисел от 0 до 9)
А(а) 41h(61h) 1010 37h(57h)
: : : :
F(f) 46h(66h) 1111 37h(57h)
Программа должна опознать, в каких границах находится код ASCII данного числа и в зависимости от принятого решения, вычесть из кода ASCII либо 37h, либо 57h.