Главная /
Ассемблер /
Для чайников /
Быстрый старт /
Программа Debug
ПРИМЕЧАНИЕ
Рисунки на этой странице не отображаются, но вы можете найти их в книге.
Как уже говорилось (см. ВВЕДЕНИЕ),
программа Debug входит в состав Windows. Запустить программу Debug
можно из командной строки или непосредственно из папки, в которой она находится. Чтобы
запустить программу из командной строки, выберите команду из меню ПУСК – ВЫПОЛНИТЬ или
нажмите комбинацию клавиш WIN + R (если вы не знаете, что такое комбинация клавиш, см.
книгу Компьютер для чайников).
В открывшемся окне (рис. 1.5) напечатайте слово debug и нажмите клавишу ENTER или щёлкните кнопку ОК.
После этого откроется окно с пустым экраном и чёрточкой в левом верхнем углу,
которая приглашает вас ввести какую-либо команду. Например, чтобы выйти из программы Debug,
напечатайте букву q и нажмите ENTER.
Написать программу, используя Debug, можно не единственным способом, но мы пока
рассмотрим тот, который больше похож на написание программы для
Emu8086.
Чтобы написать уже известную нам программу, используя Debug, сделаем следующее
(подразумевается, что Debug вы уже запустили, и увидели черный экран с маленькой мигающей
черточкой в левом верхнем углу).
Введем букву «а» (напоминаю в последний раз - все команды вводятся на
английском языке) и нажмем ENTER.
Затем введем программу, нажимая ENTER в конце каждой строки:
0B72: 0100 MOV AH, 02
0B72: 0102 MOV DL, 41
0B72: 0104 INT 21
0B72: 0106 INT 20
0B72: 0108
Результат будет примерно таким, как показано на рис. 1.6.
ПРИМЕЧАНИЕ 1
Обратите внимание, что все числовые значения пишутся без буковки h в конце. Это потому,
что Debug работает только с шестнадцатеричными числами, и ему не надо объяснять,
в какой системе исчисления вводятся данные.
ПРИМЕЧАНИЕ 2
После ввода команды -а, появляются символы: 0B72: 0100. В вашем случае первые четыре
символа могут быть другими, но нас они пока не интересуют. А как вы думаете, что означает
число 0100? Помните директиву ORG 100h (см. раздел
Emu8086)?
Вот-вот – это адрес, с которого начинается выполнение программы. То есть в память с
этим адресом заносится первая команда программы (для файлов СОМ). Каждая команда занимает
2 байта, поэтому следующий адрес будет 0102 и т.д.
Сами команды мы уже знаем (см. раздел
Emu8086),
поэтому описывать их здесь не будем.
Программа написана – нужно проверить ее работу. Нажмём ENTER ещё раз, чтобы на экране
появилась чёрточка, которая говорит о том, что можно вводить команду для Debug. Затем
введем команду g (от английского «GO») и нажмем клавишу ENTER. На экране увидим следующее:
-g
A
Программа завершилась нормально
-
Здесь A – та самая буква, которая выводится на экран в результате работы программы.
Затем идёт сообщение о нормальном завершении программы (оно может отличаться в зависимости
от версии Debug).
А теперь, если интересно, можно проверить программу в пошаговом режиме, то есть
понаблюдать, как выполняются команды одна за другой. Для этого придется по новой
набрать текст программы (не забудьте сначала ввести команду а), затем:
Введем команду t и нажмем клавишу ENTER. Увидим нечто вроде этого:
AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B72 ES=0B72 SS=0B72 CS=0B72 IP=0102 NV UP EI PL NZ NA PO NC
0B72:0102 B241 MOV DL,41
Это есть ни что иное, как состояние регистров процессора после выполнения первой
строки программы. Как вы можете видеть, в регистр АН записалось число 02. В нижней
строке находится адрес команды и сама команда, которая будет выполняться следующей.
Снова введем команду t и нажмем клавишу ENTER. Увидим следующее:
AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B72 ES=0B72 SS=0B72 CS=0B72 IP=0104 NV UP EI PL NZ NA PO NC
0B72:0104 CD21 INT 21
Команда MOV DL, 41, как ей и полагается, записала в регистр DL число 41.
Снова введем команду t и нажмем клавишу ENTER. Увидим следующее:
AX=0200 BX=0000 CX=0000 DX=0041 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=0B72 ES=0B72 SS=0B72 CS=0347 IP=0225 NV UP EI PL NZ NA PO NC
0347:0225 80FC4B CMP AH,4B
Команды CMP AH,4B нет в нашей программе. Наша программа завершила свою работу.
Мы можем долго еще вводить команду t – нам будут выдаваться состояния регистров.
Почему это происходит, нам пока не интересно. Лучше введем команду g и нажмем клавишу ENTER,
таким образом окончательно выполним нашу программу, и увидим то, что мы уже видели.
Программа написана и проверена. Но как сделать ее самостоятельной, то есть как создать
файл СОМ? Ведь то, что мы сделали, работает только с помощью Debug. Чтобы создать
исполняемый файл, нужно ответить на несколько вопросов:
- Какого размера будет наш файл? Выполнение программы начинается с адреса 0100h,
а последняя строка в программе содержит адрес 0108h. Это значит, что размер файла
будет 8 байт (108h – 100h = 8).
- Как мы назовем наш файл? А хоть как. Однако, рекомендуется давать файлам английские
имена, в которых содержится не более 8 символов (DOSу так приятнее работать). Назовем,
например, debug_1.com
А теперь выполним следующие действия:
- Снова напишем нашу программу (тренируйтесь, тренируйтесь...).
- Запишем в регистр СХ размер файла. Для этого введем команду r cx и нажмем ENTER. Затем введем размер файла (8 байт) и нажмем ENTER.
- Введем команду n, затем один пробел и имя файла. Нажмем ENTER.
- И, наконец, введем команду w и нажмем ENTER.
В результате всех этих действий на экране появится следующая информация (см. также рис. 1.7):
-r cx
СХ 0000
:8
-n debug_1.com
-w
Запись: 00008 байт
-
Если вы работаете в режиме эмуляции DOS из под WINDOWS, то файл debug_1.com
сохранится на рабочий стол, либо в папку текущего пользователя. Это зависит от
версии и/или настроек WINDOWS. Теперь его можно запустить как обычную программу.
Если в указанных папках вы не нашли этот файл, то найдите его через поиск файлов.
Ну а если вы не знаете, как это сделать, см. книгу Компьютер для чайников.
Чувствую, что мы уже устали. Выход из Debug осуществляется командой q.
Набравшись сил и терпения, изучим еще одну опцию Debug – дизассемблер. С его помощью
можно дизассемблировать какой-нибудь СОМ-файл (то есть выполнить действие, обратное
ассемблированию – преобразовать исполняемый файл в исходный код на языке ассемблера).
Допустим, у вас есть программка, написанная не вами – ее исходный код вы не знаете,
а посмотреть очень хочется. Для этого и существует дизассемблер.
Итак, программа Debug у нас закрыта. Набираем в командной строке:
debug debug_1.com
(где debug_1.com – это имя файла, который мы хотим дизассемблировать) и нажимаем ENTER.
ПРИМЕЧАНИЕ
Если программа не запустилась, значит нужно указать полный путь к ней, например
C:\WINDOWS\COMMAND\debug debug_1.com
Если же программа запустилась, но выдала ошибку (например: Ошибка 1282 или «Файл не найден»),
то нужно указать полный путь к файлу, например:
C:\WINDOWS\COMMAND\debug C:\MYPROG\debug_1.com
Если и это не помогло, то, возможно, вы всё-таки где-то допустили ошибку в пути или
путь не соответствует требованиям DOS. В таком случае лучше поместить программу в
корень диска С, откуда она гарантированно загрузится по пути «C:\debug_1.com».
Если Debug запустилась без сообщений об ошибках, то вводим команду u и нажимаем ENTER.
Вот что мы увидим (примерно, см. также рис 1.8):
-u
0BC6:0100 B402 MOV AH, 02
0BC6:0102 B241 MOV DL, 41
0BC6:0104 CD21 INT 21
0BC6:0106 CD20 INT 20
0BC6:0108 56 PUSH SI
0BC6:0109 2E CS:
0BC6:010A 8A04 MOV AL, [SI]
0BC6:010C 0AC0 OR AL, AL
0BC6:010E 741A JZ 012A
0BC6:0110 3C3A CMP AL, 3A
0BC6:0112 750D JNZ 0121
0BC6:0114 2E CS:
0BC6:0115 807C0100 CMP BYTE PTR [SI+01], 00
0BC6:0119 7506 JNZ 0121
0BC6:011B 2E CS:
0BC6:011C C60400 MOV BYTE PTR [SI], 00
0BC6:011F EB09 JMP 012A
-
Посмотрите на первые четыре строки. Узнаете? Это наша программа. Остальные строки
нас не интересуют (это инструкции, оставшиеся от программ или данных, отработавших
до запуска Debug). Ну а если мы рассматриваем незнакомый файл, как узнать, где
кончается программа и начинается «мусор»? Ориентировочно это можно сделать по размеру
файла (для очень маленьких программ). Размер можно посмотреть в свойствах файла.
Только следует учитывать, что в свойствах файла размер дан в десятичной форме, а
Debug нам выдает шестнадцатеричные адреса. Поэтому придется перевести десятичное число
в шестнадцатеричное.
Есть еще вариант (который тоже не всегда приемлем) – найти в полученном списке строку,
содержащую команду выхода из программы (INT 20).
Если программа большая, то список ее команд не поместится на экран. Тогда снова вводим
команду u и нажимаем ENTER. И так до конца программы.
Возможно, вы не увидите на экране свою программу. Это может быть либо из-за того,
что программа почему-то не загрузилась, либо по причине несоответствия адресов.
Будьте внимательны: обращайте внимание на адреса памяти, которые указаны в левой колонке.
Наша программа начинается с адреса 0100. Если адрес другой, то это, соответственно,
не наша программа.