1. Запуск ассемблера а86.
Программа на языке ассемблера а86 транслируется запуском командной строки:
a86.com <prog>.8 [опции]
где <prog>.8 — имя файла с исходным текстом программы (вместо <prog> подставляется конкретное имя файла).
Если трансляция успешна, создаются одноименный файл с расширением com (com-программа) и одноименный файл с расширением sym, содержащий таблицу имен для отладчика d86.
Если обнаружены ошибки, исходный файл копируется в одноименный файл с расширением old, затем в исходный файл вставляются сообщения об ошибках. Каждое сообщение состоит из двух строк: в первой содержится указатель ошибки, во второй — пояснение.
2. Программирование данных.
Практическое программирование начнем с простейших программ, которые содержат только данные. Подобные программы в будущем могут пригодиться в качестве компонентов более сложных и объемных программ.
Рассмотрим пример.
Допустим, нужно задать в программном коде периодическую последовательность байтов со значениями 0, 1, –2 и –1; Длина последовательности — 2,5 Кбайт. Решение показано в листинге.
Листинг 1. Решение задачи.
start:
dw offset end — start
size equ 5k / 2 ; длина последовательности
r cnt equ size / 4 ; число повторов
dw r cnt
seq db r cnt dup (0, 1, -2, -1)
size equ $ — seq ; длина получившейся последовательности
Повторное определение имени size введено для контроля совпадения ожидаемой (расчетной) длины
последовательности с ее фактическим размером. Проверьте, что произойдет при трансляции, если в var_0.8 между seq и повторным определением size вставить еще один байт.
После трансляции выбранного варианта задания проверьте совпадение результата с готовым решением в файле var_<n>.dat (<n> — номер варианта) при помощи утилиты сотр или fc (с ключом /b). Для рассмотренного варианта номер ноль:
comp var_0.com var_0.dat
ИЛИ
fс /b var_0.com var_0.dat
Примечание.
Полученный com-файл не следует пытаться вызвать на выполнение; с таким же успехом можно переименовать любой текстовый файл (размером не больше 64 Кбайт) в файл с расширением com и запустить его как программу.
Теперь рассмотрим средства отладчика d86, предназначенные для отображения данных, определенных в программе на а86.
Отладчик d86 представляет собой полноэкранную программу для исследования исполняемых com- и ехе-программ для i80x86. При отображении программы отладчик пользуется таблицей имен, которая была сохранена при трансляции в sym-файле. В результате, d86 не только отображает программу в символическом виде, но также позволяет использовать при отладке символические имена, определенные в исходной программе.
3. Запуск и завершение сеанса отладки.
Отладчик запускается командной строкой:
d86 [<file> [<cmd_tail>] ]
где <file> — отлаживаемая программа с расширением com или ехе, <cmd_tail> — параметры командной строки для отлаживаемой программы. Информация о символах, определенных пользователем в отлаживаемой программе, автоматически считывается из одноименного файла с расширением sym.
Выполним трансляцию программы damn.8 и запустим отладку damn.com:
d86 damn.com
Обратите внимание на воспроизведение данных, определенных между инструкцией jmp start и меткой «start:». Отладчик не пользуется исходным текстом программы и поэтому не знает, где были определены данные, а где инструкции. В результате, он пытается все содержимое com-программы расшифровать как набор инструкций и при этом не показывает имен переменных (переменная — это символический адрес данных) — только метки (метка — это адрес инструкции в символическом виде).
Для выхода из отладчика введите команду q и нажмите клавишу < Enter>.
Удалите файл damn.sym и вновь запустите отладку damn.com. Таблицы имен теперь нет, и вместо имени start отладчик ставит адрес в числовом виде.
Теперь продемонстрируем ошибочный запуск. Выйдите из отладчика и войдите вновь следующим образом:
d86 damn.8
Ошибка в том, что отладчику в качестве исполняемой программы передан исходный текст. Отладчик
воспринял файл damn.8 как загрузочный модуль в формате com, поэтому содержимое экрана отличается от того, что отображалось при задании damn.com.
Примечание.
Независимо от расширения (8, asm, com, exe и т. д.), отладчик считает, что файл всегда содержит исполняемый код. Различие между форматами com и ехе устанавливается им по характерной структуре заголовка ехе-файла.
Если признаки такой структуры не выявлены, предполагается формат com.
4. Экран отладчика.
В начале работы d86 генерирует полноэкранное изображение и ожидает ввода команд.
В верхнем левом углу — результат расшифровки машинного кода отлаживаемой программы. В первой колонке выводится адрес первого байта машинной инструкции, во второй — сама инструкция. Красным курсором # отмечена текущая инструкция для выполнения, адрес которой определяется регистром ip (указатель инструкции).
В нижнем левом углу отображается содержимое регистров процессора в формате шестнадцатеричных слов. Над второй колонкой регистров в восьми позициях выводятся символы, обозначающие состояние восьми флагов процессора.
В нижнем правом углу находится область отображения данных — шесть строк, пронумерованных от единицы. В строке с номером 0 всегда выводится содержимое системного стека в формате шестнадцатеричных слов (изначально стек пуст).
В верхнем правом углу в начале работы выводятся сведения об авторе a86/d86. При нажатии клавиши <F10>, на этом месте последовательно выводятся:
— текущий статус отладчика;
— продолжение выделенной строки ассемблерного кода;
— статус математического сопроцессора.
Сочетание клавиш <Alt>+<F10>включает режим подсказки. В таком режиме ввод команд сопровождается пояснениями. В исходном состоянии, пока не начат ввод очередной команды, нажатия клавиши <F10> позволяют пролистать перечень команд. Включить/выключить режим подсказки можно в любой момент нажатием комбинации клавиш <Alt>+<F10>.