- •Машинное исполнение
- •1. Просмотр памяти.
- •2. Пример машинных кодов: непосредственные данные.
- •3. Пример машинных кодов: определение данных.
- •4. Пример машинных кодов: определение размера памяти.
- •5. Специальные средства отладчика.
- •6. Сохранение программы из отладчика.
- •Ассемблирование и выполнение программы
- •1. Ввод программы
- •2. Ассемблирование программы.
- •3. Компоновка программы.
- •4. Выполнение программы.
- •5. Ввод, ассемблирование, компоновка, выполнение и анализ листинга исходной программы.
- •Определение данных
- •1. Директивы определения данных.
- •2. Определение данных с числом повторений.
- •3. Директива определения байта (dв).
- •4. Директива определения слова (dw).
- •5. Директива определения двойного слова (dd).
- •6. Директива определения поля из четырех слов (dq).
- •7. Директива определения десяти байт (dt), директива equ.
- •Программы в com-файлах
- •1. Создание exe-файла.
- •2. Получение com-файла.
- •Логика и организация программы
- •1. Команда jmp.
- •2. Команда loop.
- •3. Сегмент стека.
- •4. Программа: расширение операции пересылки.
- •5. Программа: замена строчных букв на заглавные.
- •6. Команды сдвига и циклического сдвига.
- •7. Команды логических операций: and, or, xor, test, not.
- •Xor al,bl ;Логическое сравнение
- •Команды обработки строк
- •1. Rep: префикс повторения команды.
- •2. Программа: строковые операции.
- •3. Сканирование и замена.
- •4. Дублирование образца.
- •5. Программа: выравнивание справа при выводе на экран.
- •Арифметические операции 1: обработка двоичных данных
- •1. Сложение и вычитание.
- •2. Многословное сложение.
- •3. Умножение.
- •4. Повышение эффективности умножения.
- •5. Многословное умножение.
- •6. Сдвиг регистровой пары dx:ax.
- •7. Деление.
- •8. Деление вычитанием.
- •9. Преобразование знака.
- •Арифметические операции 2: обработка данных в форматах ascii и
- •1. Сложение в ascii-формате.
- •2. Вычитание в ascii-формате.
- •3. Умножение в ascii-формате.
- •4. Деление в ascii-формате.
- •5. Двоично-десятичный формат (bcd).
- •6. Преобразование ascii-формата в двоичный формат и наоборот.
- •Обработка таблиц
- •1. Прямой табличный доступ
- •2. Табличный поиск.
- •3. Табличный поиск с использованием сравнения строк.
- •4. Транслирующая команда xlat.
- •5. Программа: вывод шестнадцатиричных и ascii-кодов.
- •6. Программа: сортировка элементов таблицы.
- •Макрокоманды
- •If (условие)
- •If (условие)
- •1. Простое макроопределение.
- •2. Использование параметров в макрокомандах.
- •3. Комментарии в макрокомандах.
- •4. Использование макрокоманд внутри макроопределения.
- •5. Директива local.
- •6. Использование библиотек макроопределений.
- •7. Конкатенация (&).
- •8. Директивы повторения: rept, irp, irpc.
- •Inc ctr ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •9. Макрокоманды, использующие директивы if и ifndef.
- •10. Макрокоманды, использующие директиву ifidn.
- •Связь между подпрограммами
- •1. Программа: использование директив extrn и public для меток.
- •2. Программа: использование директивы public в кодовом сегменте.
- •3. Программа: общие данные в подпрограмме.
- •4. Передача параметров.
Связь между подпрограммами
МЕТОДИЧЕСКИЕ УКАЗАНИЯ:
1. Для выполнения лабораторной работы вы должны войти в каталог группы из панели NORTON. Каждый студент должен иметь в каталоге группы свой личный каталог. Все программы должны создаваться и записываться в личном каталоге студента.
2. В общем случае программы строятся из основной программы и одной или более подпрограмм. Причины такой организации программ состоят в следующем:
- бывает необходимо скомпоновать программы, написанные на разных языках, например для объединения мощности языка высокого уровня и эффективности ассемблера;
- программа, написанная в виде одного модуля, может оказаться слишком большой для ассемблирования;
- отдельные части программы могут быть написаны разными группами программистов, ассемблирующих свои модули раздельно;
Каждая программа ассемблируется (tasm.exe) отдельно и генерирует собственный уникальный объектный (obj) модуль. Программа-компоновщик (tlink.exe) затем компонует объектные модули в один объектный выполняемый (exe или com) модуль.
3. Команды CALL могут осуществлять внутрисегментный (короткий) вызов подпрограммы или межсегментный (длинный) вызов подпрограммы.
Внутрисегментный вызов осуществляется в пределах от +127 до -128 байт. Команда CALL при этом может иметь, например, следующий объектный код Е82000. Где Е8 это код операции вызова подпрограммы, 2000 это относительный адрес 0020, который заносится в регистр IP. Микропроцессор объединяет адрес текущего сегмента в регистре CS и относительный адрес в регистре IP и получает фактический адрес по которому расположена первая команда вызываемой
подпрограммы. Старое значение регистра IP по команде CALL запоминается в стеке. При возврате из подпрограммы команда RET восстанавливает из стека старое значение в регистре IP и передает управление таким образом на следующую после команды CALL команду в основной программе.
Межсегментный вызов осуществляется в случае превышения пределов +127 ... -128 байт. Данная операция сначала записывает в стек содержимое регистра CS и заносит в этот регистр адрес другого сегмента, затем записывает в стек значение регистра IP и заносит новый относительный адрес в этот регистр. Таким образом, в стеке запоминаются и адрес кодового сегмента, и смещение для последующего возврата из подпрограммы.
Например, межсегментный вызов CALL может состоять из следующего объектного кода:
9А 0002 AF04
где 9А это код команды межсегментного вызова, 0002 это относительный адрес 0200, который записывается в регистр IP, AF04 это адрес нового кодового сегмента 04AF, который записывается в регистр CS. Сумма этих адресов определяет фактический адрес первой команды вызываемой подпрограммы:
Кодовый сегмент 04AF0
+
Смещение в IP 0200
-----
Фактический адрес 04CF0
При выходе из подпрограммы межсегментная команда RET восстанавливает оба адреса в регистрах CS и IP и таким образом передает управление на следующую после CALL команду основной программы.
4. Рассмотрим основную программу (MAINPROG), которая вызывает подпрограмму (SUBPROG) с помощью межсегментного вызова CALL:
EXTRN SUBPROG:FAR
MAINPROG: .
.
CALL SUBPROG
.
.
PUBLIC SUBPROG
SUBPROG .
.
.
RET
Команда CALL в MAINPROG должна "знать", что SUBPROG существует вне данного сегмента (иначе ассемблер выдаст сообщение о том, что идентификатор SUBPROG не определен). С помощью директивы EXTRN можно указать ассемблеру, что ссылка на SUBPROG имеет атрибут FAR, т.е. определена в другом ассемблерном модуле. Так как сам
ассемблер не имеет возможности точно определить такие ссылки, он генерирует "пустой" объектный код для последующего заполнения его при компоновке:
9А 0000 ---- Е
Подпрограмма SUBPROG содержит директиву PUBLIC, которая указывает ассемблеру и компоновщику, что другой модуль (MAINPROG) должен "знать" адрес SUBPROG.
Модули MAINPROG и SUBPROG ассемблируются отдельно, а компонуются совместно компоновщиком tlink.exe.
Компоновщик устанавливает соответствия между адресами EXTRN в одном объектном модуле с адресами PUBLIC в другом и заносит необходимые относительные адреса. Затем он объединяет два объектных модуля в один выполняемый. При невозможности разрешить ссылки компоновщик выдает сообщения об ошибках. Следите за этими сообщениями, прежде чем пытаться выполнить программу.
5. Директива EXTRN имеет следующий формат:
EXTRN имя:тип [,...]
Можно определить более одного имени (до конца строки) или закодировать дополнительные директивы EXTRN. В другом ассемблерном модуле соответствующее имя должно быть определено и идентифицировано как PUBLIC. Существуют следующие типы элементов: ABS, BYTE, DWORD, FAR, NEAR, WORD. Имя может быть определено через EQU и должно удовлетворять реальному определению имени.
6. Директива PUBLIC указывает ассемблеру и компоновщику, что адрес указанного идентификатора доступен из других программ. Директива имеет следующий формат:
PUBLIC идентификатор [,...]
Можно определить более одного идентификатора (до конца строки) или закодировать дополнительные директивы PUBLIC. Идентификаторы могут быть метками, переменными или числами. Неправильными идентификаторами являются имена регистров и EQU-идентификаторы, определяющие значения более двух байт.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ: