Команды программы debug

Debug.exe ‑ программа отладчик,которую используют для проверки и отладки выполняемых файлов.

Использовалась при операционной системе MS-DOS . Под более поздние версии операционных систем

работает через эмулятор MS-DOS и имеет ограниченные возможности. Вызывается через командную сроку

DEBUG [[диск:][маршрут]имя_файла [параметры]].

Например: DEBUG C:\...\My.com

Данная программа является консольным приложением и предназначена для создания или изменения кода файлов. С помощью неё можно создавать простые приложение под MS-DOS и отслеживать их работу. Данный отладчик находится на самом низком уровне компиляторов assembler . Но обладает неплохими возможностями, такими как просмотр и изменение памяти, получение состояния регистров.

Команды debug.exe

Правила набора команд debug.exe:

· В debug.exe не различается регистр букв.

· Пробелы в командах используется только для разделения параметров.

· Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.

· Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение, например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого - 40h).

После загрузки отладчика на экране появится приглашение, выглядящее в виде дефиса. Регистры CS , DS , ES , SS в этот момент инициализированы адресом 256-байтного префикса сегмента программы, а рабочая область в памяти будет начинаться с адреса этого префикса + 100h. Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы.

Таблица 1. Краткая таблица всех команд debug.exe

Команда Описание Формат
A (Assemble) Транслирование команд ассемблера в машинный код; адрес по умолчанию - CS:0100h. A [<адрес_начала_кода>]
C (Compare) Сравнение содержимого двух областей памяти; по умолчанию используется DS. В команде указывается либо длина участков, либо диапазон адресов. C <начальный_адрес_1> L<длина> <начальный_адрес_2> C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2>
D (Display/Dump) Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон. D [<начальный_адрес> ] D [начальный_адрес конечный_адрес]
E (Enter) Ввод в память данные или инструкции машинного кода; по умолчанию используется DS. E [<адрес> [<инструкции/данные>]]
F (Fill) Заполнение области памяти данными из списка; по умолчанию используется DS. Использовать можно как длину, так и диапазон. F <начальный_адрес_1> L<длина> "<данные>" F <начальный_адрес> <конечный_адрес> "<данные>"
G (Go) Выполнение отлаженной программы на машинном языке до указанной точки останова; по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес. G [=<начальный_адрес>] <адрес_останова> [<адрес_останова> ...]
H (Hexadecimal) Вычисление суммы и разности двух шестнадцатеричных величин. H <величина_1> <величина_2>
I (Input) Считывание и вывод одного байта из порта. I <адрес_порта>
L (Load) Загрузка файла или данных из секторов диска в память; по умолчанию - CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe. L [<адрес_в_памяти_для_загрузки>] L [<адрес_в_памяти_для_загрузки> [<номер_диска> <начальный_сектор> <количество_секторов>]]
M (Move) Копирование содержимого ячеек памяти; по умолчанию используется DS. Можно указывать как длину, так и диапазон. M <начальный_адрес> L<длина> <адрес_назначения> M <начальный_адрес> <конечный_адрес> <адрес_назначения>
N (Name) Указание имени файла для команд L и W. N <имя_файла>
O (Output) Отсылка байта в порт. O <адрес_порта> <байт>
P (Proceed) Выполнение инструкций CALL, LOOP, INT или повторяемой строковой инструкции с префиксами REPnn, переходя к следующей инструкции. P [=<адрес_начала>] [<количество_инструкций>]
Q (Quit) Завершение работы debug.exe. Q
R (Register) Вывод содержимого регистров и следующей инструкции. R <имя_регистра>
S (Search) Поиск в памяти символов из списка; по умолчанию используется DS. Можно указывать как длину, так и диапазон. S <начальный_адрес> L<длина> "<данные>" S <начальный_адрес> <конечный_адрес> "<данные>"
T (Trace) Пошаговое выполнение программы. Как и в команде P, по умолчанию используется пара CS:IP. Замечу, что для выполнения прерываний лучше пользоваться командой P. T [=<адрес_начала>] [<количество_выполняемых_команд>]
U (Unassemble) Дизассемблирование машинного кода; по умолчанию используется пара CS:IP. К сожалению, debug.exe некорректно дизассемблирует специфические команды процессоров 80286+, хотя они все равно выполняются корректно. U [<начальный_адрес>] U [<начальный_адрес конечный_адрес>]
W (Write) Запись файла из debug.exe; необходимо обязательно задать имя файла командой N, если он не был загружен. А программы записываются только в виде файлов.COM! W [<адрес> [<номер_диска> <начальный_сектор> <количество_секторов>]]


Просмотр областей памяти

Рассмотрим подробно работу команды D , позволяющей просматривать содержимое отдельных областей памяти. Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240:

Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:

· Адрес первого слева показанного байта в формате сегмент:смещение .

· Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.

· Символы этого же параграфа в ASCII-формате.

Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегчая вычисление адресов байтов в параграфе.

Полезные приемы с командой D

Проверка параллельных и последовательных портов

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Поэтому с помощью следующей команды можно проверить эти порты:

Первые выведенные восемь байтов указывают на адреса последовательных портов COM1-COM4 . Следующие 8 байтов указывают на адреса параллельных портов LPT1-LPT4 . Например, если на вашем компьютере есть один параллельный порт, то первые два байта будут, скорее всего, такими: 7803. Адрес порта записывается в обращенной последовательности, т.е. 0378.

Проверка оборудования

Первые два байта, располагающиеся в BIOS по адресу 410h, содержат информацию об установленном в системе оборудовании. Находим эти байты командой:

Предположим, что первые два байта окажутся 23 44. Расшифруем эти байты для получения информации об установленных устройствах. Для этого обратим эти байты (44 23), затем переведем их в двоичную систему счисления. Получаем:

Значение бита
Позиция бита

Что означают эти биты? Продолжаем расшифровывать:

Проверка состояния регистра клавиатуры

В области данных BIOS по адресу 417h находится первый байт, который хранит состояние регистра клавиатуры. Выключаем Num Lock и Caps Lock , затем набираем команду:

Первый байт будет равен 00. Включив Num Lock и Caps Lock , снова выполняем команду. Теперь первый байт должен равняться 60. Опытным путем установлено, что при включенном Num Lock первый байт равен 20, а при Caps Lock - 40.

Проверка состояния видеосистемы

По адресу 449h в BIOS находится первая область видеоданных. Для проверки набираем:

Первый байт показывает текущий видеорежим (к примеру, 03 - цветной), а второй - число столбцов (например, 50 - режим с 80 столбцами). Число строк можно найти по адресу 484h (40:84).

Проверка копирайта BIOS и серийного номера

Сведения об авторских правах на BIOS встроены в ROM BIOS по адресу FE00:0 . Строку с копирайтом можно легко найти в ASCII-последовательности, а серийный номер ‑ в виде шестнадцатеричного числа. Хотя, строка с указанием авторских прав может быть длинной и не умещаться в выведенную область памяти. В таком случае следует просто ввести еще раз D .

Проверка даты произвоства BIOS

Эта дата также записана в ROM BIOS начиная с адреса FFFF:5 . После выполнения соответствующей команды в ASCII-последовательности будет находиться эта дата, записанная в формате мм/дд/гг .

Непосредственный ввод программы в память с помощью debug.exe

debug.exe позволяет вводить программу непосредственно в память машины, а затем следить и управлять е выполнением. Мы будем вводить программу в машинных кодах, используя команду E . При этом будьте бдительны ‑ ввод ошибочных данных по ошибочному адресу чреват непредсказуемыми последствиями! Хотя к серьезным проблемам в системе это вряд ли приведет, но потерять все данные, введенные в debug.exe , можно запросто. Программа, которую необходимо ввести, использует данные, заложенные непосредственно в теле инструкций. Далее показан листинг программы на Ассемблере, в комментариях указаны аналоги команд языка в машинных кодах, а также объяснение каждой команды. Заметьте, что в числах нет символа h , поскольку, как было сказано выше, debug.exe понимает только числа в шестнадцатеричной системе.

MOV AX, 0123 ; код B82301: заносим значение 0123h в AX

ADD AX, 0025 ; код 052500: прибавляем 0225h к значению AX

MOV BX, AX ; код 8BD8: заносим значение AX в BX

ADD BX, AX ; код 03D8: прибавляем значение AX к BX

MOV CX, BX ; код 8BCB: заносим значение BX в CX

SUB CX, AX ; код 2BC8: отнимаем значение AX из CX

SUB AX, AX ; код 2BC0: очищаем AX

JMP 100 ; код EBEE: переходим к началу программы

Как можно заметить, каждая машинная инструкция имеет длину от 1 до 3 байтов. Первый байт указывает операцию, последующие ‑ ее операнды. Исполнение программы начинается соответственно с первой инструкции и последовательно проходит через все инструкции одну за другой. Теперь можно ввести программу в память. Разделим машинный код на три части по шесть байт и введем каждую, используя команду E и начиная с адреса CS:100 .

Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R . Отладчик выведет содержимое регистров в шестнадцатеричной форме; на разных машинах содержимое регистров может различаться.

Итак, как можно видеть, debug.exe инициализировал сегменты DS , ES , SS , CS одним и тем же адресом. Регистр IP содержит 0100 , указывая на то, что инструкции выполняются со смещения 100h относительно CS (а мы, вводя инструкции в память, как раз указали этот адрес).

Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

После регистров и состояния флагов debug.exe выводит информацию о первой инструкции, которая будет выполняться:

· Адрес инструкции, в нашем случае это 0B12:0100, где 0B12 ‑ адрес сегмента кода.

· Машинный код, соответствующей этой инструкции (B82301).

· Собственно инструкция, записанная на ассемблере (MOV AX,0123).

Теперь, после анализа содержимого регистров и флагов, давайте перейдем к выполнению программы. Выполнять программу мы будем пошагово, используя команду T . Использовав в первый раз команду T , мы выполняем инструкцию MOV . Здесь машинный код операнда инструкции ‑ 2301 . Операция помещает 23 в AL (младшая половина AX ), а 01 ‑ в AH (старшая). После этого debug.exe снова выводит информацию о регистрах:

Теперь AX содержит 0123h , IP 0103h (следовательно, длина выполненной инструкции: 0103h - 0100h = 3 байта), а в качестве следующей инструкции указана операция ADD . Так, раз за разом выполняя команду T , мы дойдем до последней инструкции JMP 100 . Она установит регистр IP в 100h , и debug.exe вернется к началу программы. Возвращаясь к началу программы, следует заметить, что в DS , ES , SS и CS содержится один и тот же адрес. Дело в том, что debug.exe рассматривает введенные программы исключительно как программы .COM . А в программах .COM , в отличие от .EXE , стек, код и данные хранятся в одном сегменте.

Ассемблирование и дизассемблирование

В прошлом примере мы вводили программу в машинных кодах, однако, debug.exe вполне способен понимать инструкции, записанные на ассемблере. Для работы с такими программами в debug.exe используются команды A и U .

Команда A запрашивает инструкции на ассемблере и преобразовывает их в машинный код. Для начала инициализируем начальный адрес для ввода инструкций (100h):

Отладчик выведет адрес сегмента кода и смещения (например, 13F2:0100 ). Теперь мы должны ввести следующие инструкции на ассемблере в память, после каждой строки нажимая Enter :

После ввода последней инструкции нажимаем Enter дважды, чтобы указать отладчику, что мы закончили вводить текст программы. Теперь программу можно запускать, используя команды R для просмотра регистров и T для трассировки. Замечу, что в своих программах при наличии инструкций INT их следует обрабатывать не командой T , а командой P , которая обрабатывает все прерывание сразу.

Перейдем к процедуре дизассемблирования, а в качестве примера возьмем только что введенную программу. Используем адреса первой и последней инструкций для указания диапазона, который мы собираемся дизассемблировать, т.е. 100h и 107h .

После выполнения этой команды debug.exe выведет инструкции, находящиеся в указанном диапазоне, на ассемблере, в машинных кодах, а также адрес каждой инструкции:

Сохранение программы на диске

Сначала задается имя файла:

Затем в регистр СХ необходимо поместить размер программы в байтах. Он будет равен разности конечного и начального смещений. Теперь остается только осуществить запись на диск командой W и в результате увидеть записанное количество байтов. В итоге мы получаем программу, готовую к исполнению.

Выход осуществляется командой q . Пример:

0B3B:0100 mov ax,1234

0B3B:0103 mov ah, 4c

0B3B:0105 int 21

0B3B:0100 B83412 MOV AX,1234

0B3B:0103 B44C MOV AH,4C

0B3B:0105 CD21 INT 21

AX=0000 BX=0000 CX=0007 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0B3B ES=0B3B SS=0B3B CS=0B3B IP=0100 NV UP EI PL NZ NA PO NC

0B3B:0100 B83412 MOV AX,1234

Запись 00007 байт

Для выполнения этой лабораторной работы понадобится несколько команд ассемблера:

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.exe. Получение практических навыков работы с данной программой.

Оборудование:

Персональный компьютер под управлением операционной системы Windows.

Программное обеспечение:

Программа Debug.

Вопросы к допуску

1. Для чего предназначена программа Debug?

2. Как запустить эту программу?

3. Каким образом вводятся команды в Debug?

4. Что такое идентификатор?

5. Как производится ввод программы в Debug?

Задание

· Изучить теоретический материал.

· Проделать описанные по ходу текста команды.

· Найдите сумму и разность 2-х чисел: 1-е число - номер в группе (переведенное в шестнадцатиричную форму), 2-е - число, противоположное номеру первой буквы фамилии в алфавите (отрицательное число в дополнительном коде). Сумму и разность переведите в десятичную форму.

· Просмотрите содержимое регистров микропроцессора, а также флагов и выпишите их в протокол. Какую функцию выполняет каждый из регистров? .

· Запишите в регистр AX первое число (из задания 3), а в регистр BX - второе (из задания 3). Введите в оперативную память в сегмент кода (смещение 100) машинную команду сложения регистров AX и BX. Просмотрите на экране ее ассемблерную форму. Выполните эту команду, результат переведите в десятичную форму.

· Введите в оперативную память в сегмент кода (смещение 100) набор команд ассемблера для распечатки символа на экране - первой буквы вашей фамилии. Проверьте программу в DEBUG. Затем запишите ее на диск в виде.COM-файла. Чему равен размер программы? Запустите ее на выполнение из DOS.

· Все действия опишите в отчете.

1. Название работы.

2. Цель работы.

3. Приборы и оборудование.

4. Краткие теоретические сведения.

5. Описание проделанных действий.

6. Текст созданной программы.

7. Выводы.

Контрольные вопросы

1. Какая команда производит ввод в память данные или инструкции машинного кода?

2. Как сравнить содержимое двух областей памяти?

3. Каким образом заполнить область памяти данными из списка?

4. Какая команда производит выполнение отлаженной программы на машинном языке?

5. Какая команда записывает файл из Debug?

6. Как производится ассемблирование и дизассемблирование?

С помощью ярлыка, помещенного на рабочий стол, щелкните его правой кнопкой мыши и выберите пункт «Свойства» в выпавшем контекстном меню. На вкладке «Ярлык» в окне, которое откроется в результате этого действия, кликните поле «Объект». Затем нажмите клавишу End, чтобы переместить курсор в самый конец строки, введите пробел и наберите нужный ключ (-debug). После этого нажмите кнопку «OK» для сохранения ярлыка с внесенными изменениями и запускайте игру обычным способом - двойным щелчком по этой иконке.

Раскройте главное меню на кнопке «Пуск» и выберите пункт «Выполнить» - таким способом вы откроете стандартное окно запуска программ. Этому действию соответствует нажатие сочетания горячих клавиш Win+R - можно использовать и его. Затем введите в открывшемся окне полный путь к исполняемому файлу программы. Набирать его вручную не обязательно, можно нажать кнопку «Обзор» и найти исполняемый файл игры на диске вашего компьютера. После этого добавьте через пробел ключ -debug и нажмите кнопку «OK». При следующем запуске с помощью этого диалога набирать повторно путь и ключ не потребуется - введенная строка сохранится в выпадающем списке, откуда ее можно будет выбрать.

Создайте текстовый файл в любой папке вашего компьютера. Можно сделать это на рабочем столе - щелкните фоновое изображение правой кнопкой мыши, во всплывшем контекстном меню раскройте раздел «Создать» и выберите пункт «Текстовый документ». Введите в первой строке документа полный путь к исполняемому файлу игры - его можно скопировать в ярлыке программы или в адресной строке Проводника. Добавьте через пробел ключ -debug и сохраните документ с расширением bat. Запускать игру надо двойным щелчком по этому файлу.

Не все старые игры и программы могут работать в новых операционных системах и с высоким разрешением экрана. В Windows можно настроить параметры совместимости, и приложение будет запущено. О том, как это сделать, читайте ниже.

Инструкция

Щелкните правой кнопкой мыши по ярлыку игры. В выпавшем меню выберите пункт «Свойства».

В открывшемся окне перейдите на вкладку «Совместимость».

Нажмите «Ок».

Видео по теме

Читерские программы придуманы для того, чтобы упростить компьютерную игру. При помощи чит-кодов вы сможете получать дополнительные бонусы и способности для своего компьютерного героя.

Вам понадобится

  • - программа "CheMax";

Инструкция

Читы для игры Казаки
В стратегии «Казаки» меню для ввода чит-кодов открывается при нажатии клавиши «Enter»
supervizor - туман сражения вкл/выкл
money – пополнения
multitvar – доступ ко всем солдатам
Gods - помощь богов
AI - возможность контролировать врагов
resources - пополнить все ресурсы
shield – супер оружие

Читы для игры Sims 3
Чтобы ввести коды в игре Sims 3, нажмите комбинацию горячих клавиш CTRL + SHIFT + С. Если не открылась, то сверните игру и проверьте, не открылась ли при нажатии этих клавиш другая программа. Закройте ее и разверните игру. Повторно нажмите клавиши.
Для пользователей операционной системы Vista: используйте клавиши Ctrl+Windows+Shift+C.
Некоторые коды для Sims 3:
Kaching - добавляет §1.000 в семейную копилку
Motherlode - добавляет §50.000 симолеонов к семейному бюджету
Familyfunds - позволяет установить бюджет .

Читы для игры Counter-Strike 1.6
Это одна из самых популярных -игр . К данной компьютерной игре хакеры придумали множество чит-программ. Скачайте BadBoy v 5.2. Это универсальный чит, включающий в себя все предыдущие его версии. Установите программу в корневую папку cstrike. Запустите игру и нажмите клавишу “Insert”. Откроется меню данной программы. Клавишами “Page Up” и “Page down” выбирайте необходимые вам настройки и играйте. Данный чит позволяет видеть сквозь стены, быстро бегать, точно стрелять. Но за эту программу на онлайн-серверах блокируют.

Читы для игры Дальнобойщики 2
Во время игры нажмите на клавиатуре клавишу «Pause/Break» и введите необходимый вам чит-код.
SLFILLUP – вы получите полный бак топлива.
SLRECOVER – в службу спасения без затраты средств.
SLREPAIR – бесплатный ремонт автомобиля.

Видео по теме

Обратите внимание

За данные чит-коды, вы можете получить бан на онлайн-серверах

Текстовые игры – один из излюбленных способов проведения досуга у молодежи, увлекающейся ролевыми играми. Ведь для того, чтобы поиграть за любимого персонажа, не нужно готовить костюм и ехать в лес. Играть в форумную игру можно дома, на работе или в перерывах между парами, в общем, когда вам удобно.

Инструкция

Итак, вы решили создать свою текстовую игру и вскоре станете администратором своего ролевого мира. Для начала вам было бы неплохо найти себе одного – двух помощников, так как работы предстоит достаточно.

Если вы хотите сделать игру по своему оригинальному миру, вы должны тщательно продумать и расписать устройство мира, его правила, культуру и ценности. Если вы делаете тестовую ролевку , или – тщательно изучите выбранную вами . Как администратор, вы должны знать все – способности персонажей, которые будут играть, используемые заклинания.

Напишите сюжет игры. К примеру, можно выбрать одну из книги, или другое яркое событие, понравившееся вам. В сюжете вы должны помимо общей информации, содержащейся в первоисточнике, указать, что в это время делают , какие цели противоборствующие стороны, что герои планируют предпринять для того, чтобы разрешить конфликт.

Сочините правила форума и шаблон анкеты. Правила различных текстовых игр весьма похожи, вы можете посмотреть их на любом игровом форуме и, взяв их за основу, написать свои. В же необходимо создать перечень вопросов, на которые должны ответить игроки, подающие заявку на роль персонажа. Обычно в анкете–заявке пишут имя, расу и возраст персонажа, описывают внешность, характер и умения. Лучше всего, если вместе с анкетой вы вывесите заполнения.

Когда текстовая часть готова, можно создавать , на котором и будет проходить игра. В интернете существует несколько бесплатных серверов (к примеру, борда). Если вы умеете писать сайты, вы сможете создать уникальный дизайн со своим цветовым решением, логотипом и кнопками. Если нет – не расстраивайтесь, вы сможете подобрать стандартный шаблон. В конце концов, дизайн форума – это не главное.

Разбейте форум на разделы и выложите информацию. Не скидывайте все в кучу, оставьте один раздел для игротехнической информации – сюжет, правила, список необходимых персонажей. В другом разделе пускай рассматриваются анкеты. Ваш мир разбейте на несколько локаций и создайте для каждой из них отдельную тему. Не забудьте создать тему для разговоров, чтобы игроки не болтали о жизни во время игры. На этом ваша текстовая игра готова принимать посетителей.

Видео по теме

Полный к файлу нужен, как правило, чтобы передать его в качестве параметра какой-либо программе-обработчику. Чаще всего это задача возникает при программировании каких-то процессов, но иногда бывает нужно просто сверить место размещения объекта с путем, указанном в инструкциях. Этот параметр содержит перечисление всех каталогов, начиная с корневого, которые нужно последовательно открыть, чтобы добраться до нужного файла.

Вам понадобится

  • ОС Windows.

Инструкция

Воспользуйтесь «Проводником», если надо найти полный путь к файлу в операционной системе Windows. Откройте программу с помощью «горячих клавиш» Win + E или выбором пункта «Компьютер» в главном меню, вызываемом щелчком по кнопке «Пуск». Если вам известно что-либо о месте расположения нужного объекта, переместитесь по дереву каталогов как можно ближе к нему - это сузит диапазон поиска, а значит, и время на эту процедуру.

В поле, расположенном правее адресной строки менеджера файлов, введите название файла и дождитесь, пока программа просмотрит все вложенные каталоги и найдет объекты, в именах которых есть что-либо похожее. Полный путь будет помещен в колонку «Путь к папке» таблицы с результатами поиска. Переписывать его вручную нет необходимости - кликните эту строку правой кнопкой мыши, в выпавшем контекстном меню выберите строку «Свойства» и скопируйте содержимое поля «Расположение» открывшегося окна.

Если по какой-либо причине вы вынуждены пользоваться интерфейсом командной строки, задействуйте DOS-команду where. Ей нужно задать параметр R, чтобы сделать поиск файла рекурсивным, то есть, чтобы просматривались все вложенные папки. Кроме него обязательно укажите название нужного файла, а необязательным параметром может быть известная вам часть пути к нему. Эта команда тоже осуществляет поиск, поэтому указав хотя бы часть пути, вы сократите затраченное на нее время. Например, если необходимо получить полный путь к файлу с названием RM.csv, о котором известно лишь, что он находится на диске F, команда должна быть написана так:where /R f: RM.csv

Набрав команду и ее параметры, нажмите Enter и по окончании поиска найдете полный путь в следующей строке интерфейса. К сожалению, выделить и скопировать только эту строку здесь нельзя, поэтому кликните правой кнопкой в любом месте окна, выберите в меню команду «Выделить все», а затем нажмите Enter. Таким способом вы поместите в буфер обмена все содержимое интерфейса командной строки, которое в каком-либо текстовом редакторе можно очистить от лишних строк.

Одной из важных составляющих процесса разработки программного обеспечения является отладка. В отношении прикладных программ она осуществляется средствами, работающими в пользовательском режиме и зачастую встроенными в IDE. Но для того чтобы иметь возможность отлаживать, например, драйвера, нужно запустить отладчик ядра .

Вам понадобится

  • - права администратора на целевой машине.

Инструкция

Запустите командный процессор cmd. Кликните по кнопке «Пуск» в панели задач. Кликните по пункту «Выполнить...» появившегося меню. В текстовое поле диалога «Запуск программы» введите строку cmd и нажмите кнопку OK.

Создайте резервную копию файла boot.ini. Узнайте путь инсталляции текущей копии Windows при помощи команды:echo %SystemRoot%Перейдите на тот диск, куда установлена операционная система при помощи ввода литеры устройства с последующим двоеточием. Перейдите в его корневой каталог, используя команду cd. Снимите атрибуты «системный», «только для чтения» и «скрытый» с файла boot.ini при помощи команды attrib, создайте резервную копию командой copy и снова установите атрибуты:attrib -h -s -r boot.inicopy boot.ini boot.ini.oldattrib +h +s +r boot.ini

Выведите текущий список вариантов загрузки. Используйте команду:bootcfg /queryПросмотрите элементы списка и определите тот, на основе которого будет создана новая конфигурация с возможностью отладки в режиме ядра . Запомните идентификатор загрузочной записи.

Создайте новую загрузочную запись, исполнив команду bootcfg с параметром /copy. Используйте параметр /id для указания идентификатора записи, которая будет скопирована. При помощи параметра /d задайте отображаемое имя записи. Например:bootcfg /copy /id 1 /d "Win XP (Debug)"Снова выведите список вариантов загрузки командой bootcfg с параметром /query и узнайте идентификатор добавленной записи.

Включите опции для запуска отладчик а ядра в загрузочную запись, созданную на предыдущем шаге. Если отладка будет производиться на целевой машине, просто добавьте опцию /debug. Например:bootcfg /debug on /id 2Если планируется удаленная отладка с подключением целевого компьютера к хост-машине через com-порт, дополнительно используйте опции /port /baud для указания номера порта и скорости обмена соответственно:bootcfg /debug on /port COM2 /baud 9600 /id 2Если удаленная отладка будет осуществляться с подключением через интерфейс IEEE 1394 (кабель FireWire), воспользуйтесь опцией /dbg1394 для включения соответствующего режима и опцией /ch для указания номера канала, например:bootcfg /dbg1394 on /ch 42 /id 2Просмотрите загрузочные записи командой bootcfg с параметром /query и убедитесь в том, что изменения внесены. Закройте окно командного процессора, выполнив команду exit.

Использование стандартного отладчика debug.exe

Сегодня мы рассмотрим стандартный отладчик debug.exe , входящий в любую версию DOS/Windows. Должен заметить, что этот отладчик не такой мощный, как гиганты SoftICE или Turbo Debugger. Однако, в то же время debug.exe очень прост и доступен, и просто идеально подходит для начинающих программистов на языке Ассемблер.
Итак, запускаем debug.exe (для этого заходим в Пуск->Выполнить и выполняем команду debug ) и начинаем изучать этот замечательный отладчик

Команды debug.exe

Для начала разберемся с правилами набора команд debug.exe :

· В debug.exe не различается регистр букв.

· Пробелы в командах используется только для разделения параметров.

· Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h .

· Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение , например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого - 40h ).

Разобравшись с правилами, давайте перейдем к изучению команд debug.exe . Замечу, что работа с командами debug.exe в чем-то похожа на работу с командной строкой DOS. Поcле загрузки отладчика на экране появится приглашение, выглядещее в виде дефиса:

Регистры CS , DS , ES , SS в этот момент инициализированы адресом 256-байтного префикса сегмента програмы , а рабочая области в памяти будет начинаться с адреса этого префикса + 100h .
Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы.

Краткая таблица всех команд debug.exe

Команда Описание Формат
A (Assemble) Транслирование команд ассемблера в машинный код; адрес по умолчанию - CS:0100h. A [<адрес_начала_кода>]
C (Compare) Сравнение содержимого двух областей памяти; по умолчанию используется DS. В команде указывается либо длина участков, либо диапазон адресов. C <начальный_адрес_1> L<длина> <начальный_адрес_2> C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2>
D (Display/Dump) Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон. D [<начальный_адрес> ] D [начальный_адрес конечный_адрес]
E (Enter) Ввод в память данные или инструкции машинного кода; по умолчанию используется DS. E [<адрес> [<инструкции/данные>]]
F (Fill) Заполнение области памяти данными из списка; по умолчанию используется DS. Использовать можно как длину, так и диапазон. F <начальный_адрес_1> L<длина> "<данные>" F <начальный_адрес> <конечный_адрес> "<данные>"
G (Go) Выполнение отлаженной программы на машинном языке до указанной точки останова; по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес. G [=<начальный_адрес>] <адрес_останова> [<адрес_останова> ...]
H (Hexadecimal) Вычисление суммы и разности двух шестнадцатеричных величин. H <величина_1> <величина_2>
I (Input) Считывание и вывод одного байта из порта. I <адрес_порта>
L (Load) Загрузка файла или данных из секторов диска в память; по умолчанию - CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe. L [<адрес_в_памяти_для_загрузки>] L [<адрес_в_памяти_для_загрузки> [<номер_диска> <начальный_сектор> <количество_секторов>]]
M (Move) Копирование содержимого ячеек памяти; по умолчанию используется DS. Можно указывать как длину, так и диапазон. M <начальный_адрес> L<длина> <адрес_назначения> M <начальный_адрес> <конечный_адрес> <адрес_назначения>
N (Name) Указание имени файла для команд L и W. N <имя_файла>
O (Output) Отсылка байта в порт. O <адрес_порта> <байт>
P (Proceed) Выполнение инструкций CALL, LOOP, INT или повторяемой строковой инструкции с префиксами REPnn, переходя к следующей инструкции. P [=<адрес_начала>] [<количество_инструкций>]
Q (Quit) Завершение работы debug.exe. Q
R (Register) Вывод содержимого регистров и следующей инструкции. R <имя_регистра>
S (Search) Поиск в памяти символов из списка; по умолчанию используется DS. Можно указывать как длину, так и диапазон. S <начальный_адрес> L<длина> "<данные>" S <начальный_адрес> <конечный_адрес> "<данные>"
T (Trace) Пошаговое выполнение программы. Как и в команде P, по умолчанию используется пара CS:IP. Замечу, что для выполнения прерываний лучше пользоваться командой P. T [=<адрес_начала>] [<количество_выполняемых_команд>]
U (Unassemble) Дизассемблирование машинного кода; по умолчанию используется пара CS:IP. К сожалению, debug.exe некорректно дизассемблирует специфические команды процессоров 80286+, хотя они все равно выполняются корректно. U [<начальный_адрес>] U [<начальный_адрес конечный_адрес>]
W (Write) Запись файла из debug.exe; необходимо обязательно задать имя файла командой N, если он не был загружен. А программы записываются только в виде файлов.COM! W [<адрес> [<номер_диска> <начальный_сектор> <количество_секторов>]]

Примечание. Символами отмечены необязательные параметры.

Просмотр областей памяти

В этой части нашей статьи мы рассмотрим подробно работу команды D , позволяющей просматривать содержимое отдельных областей памяти.
Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240 :

0159:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........l.....

0159:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0159:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0159:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0159:0280 00 00 00 00 00 00 00 00-00 FF FF FF FF 00 00 00 ................

0159:0290 FF 00 00 00 00 00 00 00-00 00 4E 4F 20 4E 41 4D ..........NO NAM

0159:02A0 45 20 20 20 20 00 26 81-4F 03 00 01 CB 00 00 00 E .&.O.......

0159:02B0 00 00 00 00 00 00 00 00-00 00 00 01 07 04 FF 02 ................

Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:

· Адрес первого слева показанного байта в формате сегмент:смещение .

· Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.

· Символы этого же параграфа в ASCII-формате.

Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегяая вычисление адресов байтов в параграфе.

Итог

А теперь, после небольшого обзора возможностей стандартного отладчика debug.exe давайте подведем итоги. Итак:

· debug.exe можно применять для наблюдений и отладки программ на ассемблере и машинных кодах.

· debug.exe позволяет трассировать программу, устанавливать точки останова, просматривать области памяти, вводить программы непосредственно в память компьютера.

· debug.exe представляет загружаемые программы как программы .COM .

· debug.exe воспринимает только числа в шестнадцатеричной системе.

· debug.exe не различает регистр букв.

Лабораторная работа № 1

Тема : «Отладчик DEBUG ».

Краткая аннотация : данная работа посвящена знакомству с отладчиком DEBUG, который позволяет:

  • набирать небольшие фрагменты ассемблерного кода;
  • выполнять трассировку фрагментов кода;
  • отслеживать состояние регистров процессора и ячеек оперативной памяти в процессе трассировки;
  • тестировать, корректировать, отлаживать набранные в отладчике или загруженные в отладчик фрагменты кода;
  • сохранять на диске (в виде исполняемых файлов com-типа) и загружать в отладчик фрагменты кода.

Студент должен освоить макрокоманды отладчика DEBUG, научиться набирать, тестировать, трассировать небольшие фрагменты кода (в пределах 10-20 ассемблерных команд).

ЦЕЛЬ : Знакомство с макрокомандами отладчика, процедурами набора, выполнения и трассировки фрагментов ассемблерного кода.

Лабораторная работа № 2

Тема : «Микропроцессор i8086: способы адресации на примере простейших команд ».

Краткая аннотация : данная работа посвящена знакомству с важнейшими способами адречации микропроцессора на примере простейших команд. К числу этих важнейших способов адресации относятся:

  • прямая адресация;
  • косвенная адресация.

Студент должен освоить важнейшие способы адресации процессора, научиться применять их для простейших команд процессора.

Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в листингах ассемблерных модулей

ЦЕЛЬ : Знакомство со способами адресации микропроцессора i8086 на примере простейших команд.

Введение .

Лабораторная работа № 3

Тема : «Ассемблер i8086: типовые примеры ».

Краткая аннотация : данная работа посвящена знакомству с типовыми примерами, выполненными с использованием команд ассемблера i8086. Перечень тем рассматриваемых ниже примеров таков:

  • копирование ячеек указанного диапазона;
  • занесение в ячейки указанного диапазона заданного ряда чисел;
  • поиск и замена образцов указанного диапазона;
  • подсчёт количества образцов указанного диапазона;
  • суммирование содержимого ячеек заданного диапазона;
  • нахождение минимального значения в заданном диапазоне;
  • нахождение максимального значения в заданном диапазоне.
  • ;
  • .

ЦЕЛЬ : Знакомство с простейшими типовыми примерами ассемблерных программ.

Студент должен освоить типовые примеры. Последнее означает:

  • умение выполнять ручную трассировку ассемблерного кода для диапазона из 3-4 ячеек ;
  • умение составлять ассемблерный код для 2-х диапазонов .

Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в исходных кодах более сложных ассемблерных программ.

Типовые примеры ассемблерных программ.

В данной лабораторной работе собраны 7 простейших типовых программ-примеров:

  1. Копирование ячеек указанного диапазона.
  2. Занесение в ячейки указанного диапазона заданного ряда чисел.
  3. Поиск и замена образцов указанного диапазона.
  4. Подсчёт количества образцов указанного диапазона.
  5. Суммирование содержимого ячеек заданного диапазона.
  6. Нахождение минимального значения в заданном диапазоне.
  7. Нахождение максимального значения в заданном диапазоне.

К разряду простейших эти примеры отнесены по простой причине: ни в одном из них не требуется выводить символы на экран.
Во всех случаях действия осуществляются с числами, располагающимися в ячейках оперативной памяти.
Во всех случаях просмотр результатов предполагает использование отладчика DEBUG.
Все рассматриваемые программы-примеры собраны в рабочей папке, где хранятся файлы описания данной лабораторной работы.
Для загрузки этих файлов следует вспомнить раздел 1-ой лабораторной работы, в котором речь идёт о работе с файлами.

Команды, используемые в типовых примерах.

Типовой пример №1.

Копирование ячеек заданного диапазона:

УСЛОВИЕ ЗАДАНИЯ: Скопировать содержимое ячеек диапазона 130..13F в диапазон, начинающийся с адреса 150. (все данные в 16-ой системе) ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса диапазона-источника= 130, стартового адреса диапазона-приёмника= 150, числа шагов цикла= 10). (все данные в 16-ой системе) Примечание . Расчет значения счетчика цикла: CX= (13F - 130) + 1 = F + 1 = 10 (расчёты в 16-ой системе) 2. Организация цикла: AL <- <- AL (последовательное копирование содержимого ячеек 130,131,132,...,13F в ячейки 150,151,152,...,15F соответственно) 3. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV SI,0130 ; SI <- 130 (стартовый адрес диапазона-источника= 130) 103 MOV DI,0150 ; DI <- 150 (стартовый адрес диапазона-приёмника= 150) 106 MOV CX,0010 ; CX <- 10 (число шагов цикла = размеру дипазона = 10) ; цикл по перебору ячеек диапазона: 109 MOV AL, ; AL <- (копирование в регистр AL содержимого очередной ячейки диапазона) 10B MOV ,AL ; <- AL (размещение в очередной ячейке диапазона-приёмника содержимого AL) 10D INC SI ; SI <- SI + 1 (наращивание адреса диапазона-источника: +1) 10E INC DI ; DI <- DI + 1 (наращивание адреса диапазона-приёмника: +1) 10F LOOP 109 ; CX <- CX-1 После чего, если CX <> 0 - переход по адресу 109 111 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. Кроме того, будем считать, что изначально в ячейках 130..132 находятся следующие числа: = 10 = 11 = 12 100: SI = 130 103: DI = 150 106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 109: AL = = 10 10B: = AL= 10 (содержимое 1-ой ячейки скопировано) 10D: SI= 130+1= 131 10E: DI= 150+1= 151 10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109) 109: AL= = 11 10B: = AL = 11 (содержимое 2-ой ячейки скопировано) 10D: SI= 131+1= 132 10E: DI= 151+1= 152 10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109) 109: AL= = 12 10B: = AL = 12 (содержимое 3-ей ячейки скопировано) 10D: SI= 132+1= 133 10E: DI= 152+1= 153 10F: CX= 1-1= 0 (CX= 0, поэтому цикл заканчивается) 111: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : = 10 = 11 = 12

Типовой пример №2.

Заполнение ячеек заданного диапазона указанным рядом чисел:

УСЛОВИЕ ЗАДАНИЯ: Ввести в ячейки с адреса 120 числа 7,B,...,FF (все данные в 16-ой системе) ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (начального числа= 7, стартового адреса= 120, числа шагов цикла= 3F). Примечание . Расчет значения счетчика цикла: CX= (FF-7):4 + 1 = F8:4+1= 3E+1= 3F 2. Организация цикла: <- AL (последовательное заполнение ячеек 120,121,122,... числами 7,B,F,...,FF) 3. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV AL,07 ; AL<- 7 (начальное число = 7) 102 MOV DI,0120 ; DI<- 120 (стартовый адрес = 120) 105 MOV CX,003F ; CX<- 3F (число шагов цикла= 3F) ; цикл по перебору ячеек диапазона: 108 MOV ,AL ; <- AL (размещение в очередной ячейке памяти очередного числа) 10A ADD AL,04 ; AL<- AL+4 (наращивание числа: +4) 10C ADD DI,0001 ; DI<- DI+1 (наращивание адреса: +1) 10F LOOP 108 ; CX<- CX-1 После чего, если CX<>0, следует переход по адресу 108 111 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. 100: AL= 7 102: DI= 120 105: CX= 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 108: = 7 10A: AL= 7+4= B 10C: DI= 120+1= 121 10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108) 108: = B 10A: AL= B+4= F 10C: DI= 121+1= 122 10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108) 108: = F 10A: AL= F+4= 13 10C: DI= 122+1= 123 10F: CX= 1-1= 0 (CX= 0, цикл завершен) 111: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : = 7 = B = F

Типовой пример №3.

Поиск и замена образца в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Просмотреть ячейки 120..16F и заменить символ "9" символом "5". ПЛАН РЕШЕНИЯ : 1. Задание начальных значений до начала цикла (стартового адреса= 120, ASCII-кода символа "5"= 35, ASCII-кода символа "9"= 39, числа шагов цикла= 50). Примечание <->AH (последовательная проверка ячеек с целью поиска в них числа 39, заполнение очередной ячейки кодом 35, если найден символ "9", наращивание содержимого регистра DI) 3. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV DI,0120 ; DI<- 120 103 MOV AL,35 ; AL<- 35 105 MOV AH,39 ; AH<- 39 107 MOV CX,0050 ; CX<- 50 ; цикл по перебору ячеек диапазона: 10A CMP ,AH ;<->AH 10C JNZ 0110 ; переход, если "Not Zero" (не равное 0 значение) 10E MOV ,AL ; <- AL (AL= 35) 110 INC DI ; DI<- DI+1 111 LOOP 010A ; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А 113 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 120-122 разместим строку "193" 100: DI = 120 103: AL = 35 105: AH = 39 107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 10A: = 31<->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 120+1= 121 111: CX= 3-1= 2 (CX=2><->39 Равно, т.е. имеет место "Zero" 10C: переход на адрес 110 не следует, т.к. имеет место "Zero" 10E: = 35 110: DI= 121+1= 122 111: CX= 2-1= 1 (CX=1> <->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 122+1= 123 111: CX= 1-1= 0 (CX=0, цикл завершен) 113: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейках 120-122 находятся символы "153"

Типовой пример №4.

Подсчёт количества образцов в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Подсчитать количество символов «9» в диапазоне ячеек 120..16F. Результат сохранить в ячейке 170. ПЛАН РЕШЕНИЯ : 1. Задание начальных значений до начала цикла (стартового адреса= 120, ASCII-кода символа "5"= 35, счётчика образцов= 0, числа шагов цикла= 50). Примечание . Расчет значения счетчика цикла: CX= (16F-120)+ 1 = 4F+1= 50 2. Организация цикла: <->AH (последовательная проверка ячеек с целью поиска в них числа 39, наращивание значения счётчика образцов, если найден символ "9", наращивание содержимого регистра DI) 3. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV DI,0120 ; DI<- 120 103 MOV AL,0 ; AL<- 0 105 MOV AH,39 ; AH<- 39 107 MOV CX,0050 ; CX<- 50 ; цикл по перебору ячеек диапазона: 10A CMP ,AH ;<->AH 10C JNZ 0110 ; переход, если "Not Zero" (не равное 0 значение) 10E INC AL ; AL<- AL+1 110 INC DI ; DI<- DI+1 111 LOOP 010A ; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А 113 MOV ,AL; сохранение найденного количества образцов 116 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 120-122 разместим строку "193" 100: DI = 120 103: AL = 0 105: AH = 39 107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 10A: = 31<->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 120+1= 121 111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 10А) 10A: = 39<->39 Равно, т.е. имеет место "Zero" 10C: переход на адрес 110 не следует, т.к. имеет место "Zero" 10E: AL= 0+1= 1 (один образец найден) 110: DI= 121+1= 122 111: CX= 2-1= 1 (CX=1> 0, поэтому следует переход на адрес 10А) 10A: = 33<->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 122+1= 123 111: CX= 1-1= 0 (CX=0, цикл завершен) 113: = 1 (сохранение количества найденных образцов) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено число 1

Типовой пример №5.

Суммирование содержимого ячеек заданного диапазона:

УСЛОВИЕ ЗАДАНИЯ: Просуммировать содержимое ячеек 140..157. Результат сохранить в ячейках, начиная с ячейки 170 ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса= 140, числа шагов цикла= 18, начального значения суммы= 0). 2. Организация цикла: (ADD AL,)и(ADC AH,00) (последовательное добавление содержимого ячеек 140..157 к накапливаемой сумме) 3. Сохранение найденной суммы (в ячейках памяти 0170 и 0171: =AL =AH). 4. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV AX,0000 ; в регистре AX накапливаться сумма, поэтому AX = 0 103 MOV BP,0140 ; в регистр BP заносится стартовый адрес ячеек диапазона 106 MOV CX,0018 ; в регистр CX заносится количество ячеек диапазона; цикл по перебору ячеек диапазона: 109 ADD AL, ; добавление к содержимому AL содержимого ячейки 10C ADC AH,00 ; добавление 1, если регистр AL оказался переполненным 10F INC BP ; наращивание значения указателя адресов BP 110 LOOP 109 ; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А 112 MOV ,AX ; сохранение в ячейках 170 и 171 найденной суммы 115 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 140-142 разместим числа 7A, D9, E6. 100: AX = 0 103: BP = 140 106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 109: AL= AL+= 0+7A= 7A (кроме того, Carry Flag CF= 0) 10C: AH= AH+0+CF= 0+0+0= 0 10F: BP= 140+1= 141 110: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109) 109: AL= AL+= 7A+D9= 53 (кроме того, Carry Flag CF= 1) 10C: AH= AH+0+CF= 0+0+1= 1 10F: BP= 141+1= 142 110: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109) 109: AL= AL+= 53+E6= 39 (кроме того, Carry Flag CF= 1) 10C: AH= AH+0+CF= 1+0+1= 2 10F: BP= 142+1= 143 110: CX= 1-1= 0 (CX=0, цикл завершён) 112: = AL= 39 = AH= 2 (найденная сумма= 239) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено число 39, в ячейку 171 число 2.

Типовой пример №6.

Поиск минимального значения в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Определить минимальное число диапазона 140..16F. Результат сохранить в ячейке 170. ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса= 140, числа шагов цикла= 30, начального значения минимума= FF). 2. Организация цикла: (CMP DL,) (последовательное сопоставление содержимого ячеек 140..16F с текущим минимумом) 3. Сохранение найденного минимума (в ячейке памяти 0170: =DL). 4. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV BP,0140 ; загрузка в регистр BP начального адреса 103 MOV CX,0030 ; в регистр CX заносится количество ячеек диапазона 106 MOV DL,FF ; в регистр DL заносится FF (начальное значение min) ; цикл по нахождению минимального значения: 108 CMP DL, ; текущий min DL сравнивается с содержимым очередной яч-ки 10B JBE 0110 ; если текущий min DL ≤ имеет место переход на 110 10D MOV DL, ; обновление текущего min DL (знач-е оказалось меньше) 110 INC BP ; наращивание адреса текущей ячейки памяти 111 LOOP 0108 ; цикл по перебору ячеек памяти 113 MOV ,DL ; сохранение в ячейке 170 найденного минимума 117 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 140-142 разместим строку "391" 100: BP = 140 103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 106: DL = FF (начальное значение min) 108: DL<-> FF<->=33 Результат сравнения > (больше) 10B: переход на адрес 110 не следует, т.к. имеет место > (больше) 10D: DL= = 33 обновление текущего min DL 110: DI= 140+1= 141 111: CX= 3-1= 2 (CX=2><-> 33<->=39 Результат сравнения < (меньше) 10B: переход на адрес 110, т.к. условие переходы выполнено 110: DI= 141+1= 142 111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108) 108: DL<-> 33<->=31 Результат сравнения > (больше) 10B: переход на адрес 110 не следует, т.к. имеет место > (больше) 10D: DL= = 31 обновление текущего min DL 110: DI= 142+1= 143 111: CX= 1-1= 0 (CX=0, цикл завершён) 113: = DL= 31 (сохранение найденного min) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено значение минимума 31

Типовой пример №7.

Поиск максимального значения в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Определить максимальное число диапазона 140..16F. Результат сохранить в ячейке 170. ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса= 140, числа шагов цикла= 30, начального значения максимума= 0). 2. Организация цикла: (CMP DL,) (последовательное сопоставление содержимого ячеек 140..16F с текущим максимумом) 3. Сохранение найденного максимума (в ячейке памяти 0170: =DL). 4. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV BP,0140 ; загрузка в регистр BP начального адреса 103 MOV CX,0030 ; в регистр CX заносится количество ячеек диапазона 106 MOV DL,0 ; в регистр DL заносится 0 (начальное значение max) ; цикл по нахождению максимального значения: 108 CMP DL, ; текущий max DL сравнивается с содержимым очередной яч-ки 10B JAE 0110 ; если текущий max DL ≥ имеет место переход на 110 10D MOV DL, ; обновление текущего max DL (знач-е оказалось больше) 110 INC BP ; наращивание адреса текущей ячейки памяти 111 LOOP 0108 ; цикл по перебору ячеек памяти 113 MOV ,DL ; сохранение в ячейке 170 найденного максимума 117 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 140-142 разместим строку "319" 100: BP = 140 103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 106: DL = 0 (начальное значение max) 108: DL<-> 0<->=33 Результат сравнения < (меньше) 10B: переход на адрес 110 не следует, т.к. имеет место < (меньше) 10D: DL= = 33 обновление текущего max DL 110: DI= 140+1= 141 111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108) 108: DL<-> 33<->=31 Результат сравнения > (больше) 10B: переход на адрес 110, т.к. условие переходы выполнено 110: DI= 141+1= 142 111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108) 108: DL<-> 33<->=39 Результат сравнения < (меньше) 10B: переход на адрес 110 не следует, т.к. имеет место < (меньше) 10D: DL= = 39 обновление текущего max DL 110: DI= 142+1= 143 111: CX= 1-1= 0 (CX=0, цикл завершён) 113: = DL= 39 (сохранение найденного max) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено значение минимума 39

Задания к лабораторной работе:

Выполнить следующие задания :
  1. Изучить содержание лабораторной работы (в часы самоподготовки).
  2. Повторить выполнение разобранных в работе программ (в часы самоподготовки).
  3. Выполнить проверку решения типового задания "Подсчитать количество символов "7" в диапазоне ячеек 140..17E. Результат сохранить в ячейке 134". Проверку выполнить для первых 3-х ячеек диапазона (= 34;= 37;= 36).
  4. В диапазоне ячеек памяти 140-173 заменить все заглавные буквы "В", встречающиеся в этом диапазоне на строчные "в", а в диапазоне 174-183 определить максимальное значение, сохранив результат в ячейке 184.
  5. Выполнить проверку решения типового задания "Просуммировать содержимое ячеек 143..157. Результат сохранить в ячейках, начиная с ячейки 140". Проверку выполнить для первых 4-х ячеек диапазона (= AD;= BC;= FE;= ED).
  6. Скопировать содержимое ячеек диапазона 130-149 в диапазон, начинающийся адресом 150, а в диапазоне 16А-180 определить минимальное значение, сохранив результат в ячейке 181
  7. Выполнить проверку решения типового задания "Определить минимальное число диапазона 141..16F. Результат сохранить в ячейке 140". Проверку выполнить для первых 3-х ячеек диапазона (= 34;= 37;= 32).
  8. Занести в ячейки диапазона 140-149 числа 2, 6, A, …, а в диапазоне 15А-177 определить количество символов "6", сохранив результат в ячейке 181.
1. Абель П. Язык ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.- 447 с. 2. Лямин Л.В. Макроассемблер MASM. - М.: Радио и связь, 1994.- 320 с. 3. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. –352 с. 4. Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996. 5. Юров В. Assembler: учебный курс. – СПб: Питер, 1998. 6. Юров В., Хорошенко С. Assembler: учебный курс.-Санкт-Петербург: Питер, 1999. -672 7. Юров В. Assembler: Специальный справочник. – СПб: Питер, 2000. 8. Юров В. ASSEMBLER: практикум. (с дискетой).-Санкт-Петербург: Питер, 2002. -400 9. Юров В. Assembler: практикум – СПб: Питер, 2003.- 400 с. 10. Пирогов В.Ю. Ассемблер на примерах. - СПб.: БХВ-Петербург, 2005. - 416 с. 11. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с. 12. Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К.Масловского.-Москва: Мир, 1988. -405C. 13. Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. - 637 с. 14. Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. - 288 с.

Лабораторная работа № 4

Тема : «Функции ввода и вывода строк прерывания INT 21h ».

Краткая аннотация : данная работа посвящена знакомству с функциями ввода/вывода строк, что предполагает, в частности:

  • знакомство с 9-ой и 10-ой функциями прерывания INT 21h;
  • знакомство с форматом выводимой на экран строки;
  • знакомство со структурой буфера вводимой с клавиатуры строки;
  • знакомство с приёмами обработки введённой с клавиатуры строки.

Студент должен освоить приёмы использования функций ввода/вывода строк.

Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в листингах ассемблерных модулей.

ЦЕЛЬ : Знакомство с функциями ввода/вывода строк и приёмами использования возможностей этих функций.

Вывод строк.

Краткое описание функции вывода строк прерывания INT 21h:

Программная реализация вывода строки в отладчике DEBUG:

Ввод строк.

Краткое описание функции ввода строки с клавиатуры (прерывание INT 21h):

Программная реализация ввода строки в отладчике DEBUG:

Ввод и вывод строк.

Задача . Запросить имя. Ввести это имя. Вывести именное приветствие.

Программа, представляющая собою решение задачи, имеет вид: -u 100 135 0CE7:0100 BA 40 01 MOV DX,0140 0CE7:0103 B4 09 MOV AH,09 0CE7:0105 CD 21 INT 21 OCE7:0107 BA 60 01 MOV DX,0160 0CE7:010A B4 0A MOV AH,0A 0CE7:010C CD 21 INT 21 0CE7:010E BA 5C 01 MOV DX,015C 0CE7:0111 B4 09 MOV AH,09 0CE7:0113 CD 21 INT 21 0CE7:0115 BD 40 01 MOV BP,0140 0CE7:0118 8A 4E 21 MOV CL, 0CE7:011B B5 00 MOV CH,00 0CE7:011D 8A 66 22 MOV AH, 0CE7:0120 88 66 47 MOV ,AH 0CE7:0123 45 INC BP 0CE7:0124 E2 F7 LOOP 01ID 0CE7:0126 B8 21 24 MOV AX,2421 0CE7:0129 89 46 47 MOV ,AX 0CE7:012C B4 09 MOV AH,09 0CE7:012E BA 80 01 MOV DX.0180 0CE7:0131 CD 21 INT 21 0CE7:0133 CD 20 INT 20 Состояние ячеек оперативной памяти перед запуском программы на исполнение: -d 140 I5O 0CE7:0140 57 68 61 74 27 73 20 79-6F 75 72 20 6E 61 6D 65 What"s your name 0CE7:0150 3F 20 20 24 00 00 00 00-00 00 00 00 0D 0A 24 00 ? $..........$. 0CE7:0160 1D 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0CE7:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0CE7:0180 48 65 6C 6C 6F 2C 20 00-00 00 00 00 00 00 00 00 Hello, ......... Результат запуска программы на исполнение: -G=100 What"s your name? Without Hello, Without! Программа завершилась нормально Состояние ячеек оперативной памяти по завершении работы программы: 0CE7:0140 57 68 61 74 27 73 20 79-6F 75 72 20 6E 61 6D 65 What"s your name 0CE7:0150 3F 20 20 24 00 00 00 00-00 00 00 00 0D 0A 24 00 ? $..........$. 0CE7:0160 1D 07 57 69 74 68 6F 75-74 0D 00 00 00 00 00 00 ..Without....... 0CE7:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0CE7:0180 48 65 6C 6C 6F 2C 20 57-69 74 68 6F 75 74 21 24 Hello, Without!$

    Основной режим работы отладчика Debug (характерная особенность - присутствие чёрточки и мигающего справа от неё курсора). Основной режим работы устанавливается автоматически после загрузки отладчика.


В этом режиме можно набирать любые макрокоманды отладчика от A до W . Выход из этого режима означает завершение работы отладчика.

    Режим ассемблирования . Вход в режим ассемблирования из основного режима работы отладчика осуществляется набором команды A . Признак нахождения в этом режиме - наличие адреса (например, 0CC0:0100 ) перед знаком курсора:


После набора команды необходимо нажатием клавиши Enter ввести её в память (пока не нажата клавиша Enter команда в память не введена ).

Если команда набрана с ошибкой и нажата клавиша Enter , эта команда в память не вводится. Вместо этого отладчик предлагает ввести её повторно, по тому же самому адресу :


Возвращение из режима ассемблирования в основной режим работы отладчика - нажатие клавиши Enter в пустой строке (когда не набрано ни одного символа ), например, в строке 0CFC:0103 .

    Режим ввода данных . Данный режим может быть реализован во время выполнения макрокоманд E и R . В этом режиме вводятся данные в ячейки оперативной памяти или в регистры процессора:


Возвращение из этого режима в основной режим работы отладчика - нажатие клавиши Enter. Продолжение работы в режиме ввода данных - нажатие клавиши пробел. Нажимая клавишу пробел, можно попасть на любую ячейку памяти и ввести в неё нужное число. Ввод значений завершается нажатием клавиши Enter.

    Режим выполнения кода . Вход в режим выполнения кода из основного режима работы отладчика осуществляется набором команды G . Как правило, время нахождения в данном режиме - считанные мгновенья. Исключение - зависание программы или выполнение огромных циклов.

Возвращение в основной режим работы отладчика осуществляется автоматически, без участия работающего с этим отладчиком человека.

    Режим ввода информации с клавиатуры во время работы в режиме выполнения кода. Завершение этого режима и продолжение выполнения кода осуществляется нажатием клавиши Enter.

    Режим трассировки выполняемого кода . В данном режиме процессор выполняет заранее заданное ограниченное количество команд. Вход в режим трассировки осуществляется набором команды T . Возвращение в основной режим работы осуществляется автоматически, без участия работающего с отладчиком человека.

    Аварийное прекращение работы отладчика . Имеет место в случае, когда процессор пытается исполнить запрещённый в режиме эмуляции работы микропроцессора i8086 программный код. Например, пытается выполнить команды работы с портами ввода-вывода данных.


ПРИМЕЧАНИЕ
Рисунки на этой странице не отображаются, но вы можете найти их в книге.


Чтобы написать уже известную нам программу, используя 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 (см. раздел )? Вот-вот – это адрес, с которого начинается выполнение программы. То есть в память с этим адресом заносится первая команда программы (для файлов СОМ). Каждая команда занимает 2 байта, поэтому следующий адрес будет 0102 и т.д.

Сами команды мы уже знаем (см. раздел ), поэтому описывать их здесь не будем.

Программа написана – нужно проверить ее работу. Нажмём 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. В нижней строке находится адрес команды и сама команда, которая будет выполняться следующей.

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. Чтобы создать исполняемый файл, нужно ответить на несколько вопросов:

  1. Какого размера будет наш файл? Выполнение программы начинается с адреса 0100h, а последняя строка в программе содержит адрес 0108h. Это значит, что размер файла будет 8 байт (108h – 100h = 8).
  2. Как мы назовем наш файл? А хоть как. Однако, рекомендуется давать файлам английские имена, в которых содержится не более 8 символов (DOSу так приятнее работать). Назовем, например, debug_1.com
А теперь выполним следующие действия:
  1. Снова напишем нашу программу (тренируйтесь, тренируйтесь...).
  2. Запишем в регистр СХ размер файла. Для этого введем команду r cx и нажмем ENTER. Затем введем размер файла (8 байт) и нажмем ENTER.
  3. Введем команду n, затем один пробел и имя файла. Нажмем ENTER.
  4. И, наконец, введем команду 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, 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 , 00 0BC6:0119 7506 JNZ 0121 0BC6:011B 2E CS: 0BC6:011C C60400 MOV BYTE PTR , 00 0BC6:011F EB09 JMP 012A - Посмотрите на первые четыре строки. Узнаете? Это наша программа. Остальные строки нас не интересуют (это инструкции, оставшиеся от программ или данных, отработавших до запуска Debug). Ну а если мы рассматриваем незнакомый файл, как узнать, где кончается программа и начинается «мусор»? Ориентировочно это можно сделать по размеру файла (для очень маленьких программ). Размер можно посмотреть в свойствах файла. Только следует учитывать, что в свойствах файла размер дан в десятичной форме, а Debug нам выдает шестнадцатеричные адреса. Поэтому придется перевести десятичное число в шестнадцатеричное.

Есть еще вариант (который тоже не всегда приемлем) – найти в полученном списке строку, содержащую команду выхода из программы (INT 20).

Если программа большая, то список ее команд не поместится на экран. Тогда снова вводим команду u и нажимаем ENTER. И так до конца программы.

Возможно, вы не увидите на экране свою программу. Это может быть либо из-за того, что программа почему-то не загрузилась, либо по причине несоответствия адресов. Будьте внимательны: обращайте внимание на адреса памяти, которые указаны в левой колонке. Наша программа начинается с адреса 0100. Если адрес другой, то это, соответственно, не наша программа.