Организация сегментов: сегменты и их значения, порядок следования и синтаксис
Сегмент – кусок кода программы. Виды сегментов:
1. Сегмент кода – содержит машинные команды для выполнения.
2. Сегмент данных – содержит данные, константы и рабочие области, необходимые программе.
3. Сегмент стека - содержит адреса возврата как для программы , так и для вызовов подпрограмм, а также используется для передачи параметров в процедуры.
Сегмент программы описывается директивами SEGMENT и ENDS.
Базовый синтаксис:
имя_сегмента segment readonly выравн. тип разряд 'класс'
...
имя_сегмента ends
Имя сегмента — метка для получения сегментного адреса, а также для комбинирования сегментов в группы.
Выравнивание. Указывает ассемблеру, с какого адреса может начинаться сегмент. Значения этого операнда:
BYTE — с любого адреса;
WORD — с четного адреса;
DWORD — с адреса, кратного 4;
PARA — с адреса, кратного 16 (граница параграфа);
PAGE — с адреса, кратного 256.
Типы комбинирования сегментов:
· тип PUBLIC (одинаковые имена - разные классы );
· тип STACK — загоняет все сегменты в стек
· PRIVATE ( по умолч.) — сегмент такого типа не объединяется с другими сегментами.
Разрядность определяет максимальный разряд сегмента.
• USE16 ( до 64 Кб)
• USE32. (до 4 Гб)
Класс сегмента — это любая метка, взятая в одинарные кавычки.
Для обращения к любому сегменту следует сначала загрузить его сегментный адрес в какой-нибудь сегментный регистр.
assume регистр:связь...
Директива ASSUME указывает ассемблеру, с каким сегментом или группой сегментов связан тот или иной сегментный регистр.
21. Выражения, операторы <>,(), арифметические операторы
Выражение— это набор чисел, меток или строк, связанных друг с другом операторами. Все выражения вычисляются в ходе ассемблирования программы, в полученном коде используются только значения.
Оператор <>(угловые скобки). Часть выражения, заключенная в угловые скобки, не вычисляется, а применяется как строка символов.
Оператор () (круглые скобки). Часть выражения, заключенная в круглые скобки, вычисляется в первую очередь.
mov al, 2*(3+4) ;
mov al,14
Арифметические операторы: + (плюс), – (минус), * (умножение), / (целочисленное деление), MOD (остаток от деления). Они выполняют соответствующие арифметические действия.
Кроме того, к арифметическим операторам относится унарный минус — минус, который ставят перед отрицательным числом.
Операторы сравнения: EQ (равно), GE (больше или равно), GT (больше), LE (меньше или равно), LT (меньше), NE (не равно). Результат действия каждого из этих операторов — 1, если условие выполняется, и 0 — если не выполняется.
Оператор, операнд. Операторы адресации
Операнд–объект, над которым выполняется машинная команда или оператор языка программирования.
Команда может иметь один или два операнда, или вообще не иметь операндов. Число операндов неявно задается кодом команды.
В качестве операндов могут выступать
· идентификаторы;
· цепочки символов, заключенных в одинарные или двойные кавычки;
· целые числа в двоичной, восьмеричной, десятичной или шестнадцатеричной системе счисления.
Операторы адресации:
SEG выражение — сегментный адрес;
OFFSET выражение — смещение;
THIS тип — текущий адрес (MASM и TASM);
Тип PTR выражение — переопределение типа;
LARGE выражение — 32-битное смещение (TASM и WASM);
SMALL выражение — 16-битное смещение (TASM и WASM);
SHORT выражение — 8-битное смещение.
SEG и OFFSET возвращают соответствующую часть адреса своего аргумента:
THIS создает операнд, адресом которого является текущее значение счетчика:
PTR создает аргумент, адресом которого является значение выражения, а тип указан явно:
LARGE, SMALL и SHORT используются с командами передачи управления, если возникают двусмысленности при косвенных переходах.
Дополнительные операторы и их описание
. (точка) — ссылка на элемент структуры;
: (двоеточие) — переопределение сегмента;
[] (прямые скобки) — косвенная адресация;
? — неинициализированное значение;
DUP (значение) — повторяющееся значение.
Макроопределение (макрос)
Макрос - участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы. Макрос начинается директивой и заканчивается.
Синтаксис:
Имя макроса MACRO
Код
ENDM
Прерывание DOS
Прерывание – прекращение выполнения программы при возникновении события, требующего реакции ЭВМ.
Каждое прерывание имеет тип:
1. Аппаратное – обрабатываются устройством ввода-вывода ЭВМ для переключения внимания процессора на обработку внешнего события.
2. Логическое – обрабатывается внутри процессора при возникновении нестандартных ситуаций( деление на 0).
3. Программное – предназначено для обращения.
Последовательность действий при поступлении запроса на прерывание:
1) Определение наиболее приоритетного запроса
2) Определение типа
3) Сохранение текущего значения счетчиков команд и регистров флагов.
4) Определение адресов прерывания по типу и передача управления этой команде.
5) Выполнение программы обработчика прерывания
6) Восстановление текущего значения счетчиков команд и регистров флагов и продолжение ее выполнения
Глубина прерывания – максимальное число программ, которые могут прервать друг друга.
Варианты:
1) Только 1запрос воспроизводится системой.
2) Глубина прерывания фиксированная
3) Программы могут сколько угодно раз прерывать друг друга.
Все основные функции DOS вызываются с помощью прерывания INT 21h, однако DOS использует и другие прерывания:
INT 20h - завершение работы программы;
INT 25h/26h - чтение/запись на диск с абсолютной адресацией секторов;
INT 27h - завершение работы программы с оставлением ее резидентной в памяти;
INT 28h - может быть использовано для составления резидентных программ;
INT 2Eh - выполнение команды DOS;
INT 2Fh - прерывание мультиплексора, используется для спеллера печати PRINT.COM.