DEBUG.EXE - специальная программа, входящая в состав утилит MS-DOS, для ввода и пошагового выполнения программ, написанных на машинном языке или с помощью команд ассемблера. Почему программа называется DEBUG? "Bugs" (дословно "насекомые") в переводе со слэнга программистов означает "ошибки в программе". В соответствии с компьютерным фольклором термин "debugging" (дословно "обезжучивание", "обезнасекомливание") появился в то время, когда перестал работать компьютер Гарвардского университета "Марк I". После долгих поисков техники обнаружили источник своих бед - небольшую моль, попавшую между контактами реле. Они удалили моль и внесли запись в сменный журнал о процессе под названием "debugging", произведенным над "Марком I"
Программа DEBUG позволяет:
1) производить пошаговую отладку программы с просмотром регистров и содержимого оперативной памяти;
2) производить арифметические действия над шестнадцатиричными числами;
3) вводить данные в регистры и в ячейки оперативной памяти;
4) вводить программу в виде машинных кодов, а также в ассемблерном виде в ячейки оперативной памяти и выполнять ее;
5) записать введенную программу из оперативной памяти на диск, т.е. получить исполнимый файл (.COM-файл).
Отладчик DEBUG имеет командный интерфейс. Это значит, что при запуске и после выполнения очередной инструкции появляется символ "-", означающий, что программа ждет ввода очередной инструкции. После ввода инструкции нужно нажать символ Enter. Рассмотрим далее некоторые наиболее часто используемые инструкции DEBUG и их упрощенные форматы:
1. Q - выход из программы.
2.? - получение справки.
3. H (Hexarithmetic) - шестнадцатиричная арифметика. Если после символа H набрать 2 числа (размером не более 4 цифр каждое) через пробел, то получим сумму и разность набранных чисел.
4. R [<имя регистра>] - работа с регистрами. Инструкция "R" без параметра позволяет просмотреть содержимое всех регистров, а также значение флагов и команду, расположенную по смещению 100 в сегменте кода. Обычно по смещению 0100 находится первая команда программы. С помощью инструкции "R <имя регистра>" можно ввести новое значение в один регистр.
5. U [<сегментный регистр>:]<смещение> - просмотр ячеек оперативной памяти, начиная с указанного смещения в сегменте, заданном сегментным регистром.
6. E [<сегментный регистр>:]<смещение> - запись информации в ячейки оперативной памяти.
DEBUG может быть использован как интерпретатор, чтобы работать непосредственно с микропроцессором. Можно задавать машинные команды, записывать их в определенное место оперативной памяти, обычно, начиная с 0100 смещения относительно начала кодового сегмента. Затем выполнять пошагово (т.е. по одной команде) либо сразу всю программу. Так как микропроцессор понимает только двоичные числа (сокращенно можно их записать шестнадцатиричными), то и коды машинных команд записываются в виде шестнадцатиричных чисел, причем команды бывают однобайтовые, двубайтовые, трехбайтовые и т.д. Например, команда для сложения значений из регистров AX и BX двубайтовая и имеет машинный код 01D8. А машинная команда записи слова из регистра AX в стек - однобайтовая и имеет код 50. Инструкция "E <смещение>" при работе распечатывает в следующей после ее ввода строке адрес, состоящий из двух чисел, и старое значение байта по этому адресу:
<содержимое CS>:<смещение> <значение байта>,
далее компьютер ожидает ввода нового значения байта. Для ввода, например двубайтовой машинной команды 01D8 нужно записать 01 в сегмент кода по смещению 100, и D8 - по смещению 101.
7. T - запуск программы, находящейся в оперативной памяти по адресу 0100, в пошаговом режиме. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100.
8. А <смещение> - ввод машинных команд в ассемблерном виде в сегмент кода. Первую команду программы следует начинать вводить со смещения 0100. Далее система ждет поочередного ввода команд Ассемблера. Для окончания ввода нужно нажать Enter после пустой строки.
9. G - запуск программы, находящейся в оперативной памяти по адресу 0100. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100.
10. N <имя.сom-файла> - задает имя программы для последующей записи ее на диск либо считывания с диска. Перед записью предварительно нужно записать 0 в регистр BX, а размер программы (в байтах) - в регистр CX.
11. W - запись программы на диск. После выполнения инструкции "W" на диске в текущей директории появится файл с расширением.COM - точная копия введенной Вами в оперативную память программы. Эту программу можно запустить непосредственно из DOS.
12. L - загрузка программы с диска в оперативную память. Предварительно имя программы задается с помощью инструкции "N". Для выполнения этой лабораторной работы понадобится несколько команд ассемблера:
MOV AH,<шестнадцатиричное число> - запись в регистр AH числа 02 для указания системной функции - вывод символа на экран;
MOV DL,<шестнадцатиричное число> - запись в регистр DL кода символа;
INT 21 - основное прерывание DOS (процедура), реализующее много различных функций; номер функции записывается предварительно в регистр AH; для распечатки символа на экране - в регистре AH функция 02, при этом в DL записывают предварительно код символа.
INT 20 - прерывание DOS, осуществляющее выход из программы
(из.COM-программы).
Пример.
Вывести символ "*" на экран.
mov AH, 02; системная функция 02 - вывод символа на экран
mov DL, 2A; ASCII-код звездочки
int 21h; прерывание для вывода "*"
int 20h; выход из программы
Замечание.
Обратите внимание, что при вводе ассемблерных программ в DEBUG числа воспринимаются как шестнадцатиричные (команда 2 в примере). В дальнейшем при работе в Turbo Assembler для указания, что число шестнадцатиричное, после него записывается буква "h".
Задание к лабораторной работе.
Запустите отладчик Debug.
Выведите на экран символ - первую букву вашей фамилии. Чему равен размер программы?