Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава14.DOC
Скачиваний:
14
Добавлен:
14.04.2019
Размер:
565.76 Кб
Скачать

Краткие сведения об отладчике программ debug

Программа DEBUG обеспечивает интерактивную отладку программ в формате EXE- и COM-файлов. Обычно он используется для отладки исполняемых программ, полученных с языка уровня ассемблера. Он позволяет отлаживать и исполняемые файлы .EXE и .COM, скомпилированные с языков более высокого уровня.

Отладчик DEBUG умеет:

  • прослеживать выполнение и управлять выполнением программ;

  • вносить изменения в ход выполнения и данные отлаживаемой программы;

  • вводить небольшие программы на языке ассемблера, выполнять ассемблирование этих программ и создавать исполняемые программы с расширением COM;

  • выполнять преобразование машинных шестнадцатеричных кодов команд в формат языка ассемблера (деассемблирование);

  • отображать текстовые файлы в ASCII и шестнадцатеричном формате;

  • просматривать и изменять содержимое регистров памяти МП и ячеек основной памяти;

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

  • осуществлять поиск конкретных данных в текстах сообщений и программ (с выдачей адреса их хранения);

  • просматривать регистр флагов с отображением мнемокодов значений этих флагов (см. табл. 9.2).

Таблица 9.2. Используемые отладчиком DEBUG мнемокоды значений флагов

Флаг

Назначение флага

Установлен

Сброшен

OF

Переполнение (да/нет)

OV

NV

DF

Направление (уменш/увел)

DN

UP

IF

Прерывания (вкл/откл)

EI

DI

SF

Знак (отриц/полож)

NG

PL

ZF

Нуль (да/нет)

ZR

NZ

AF

Вспомогательный перенос( да/нет)

AC

NA

PF

Четность (чет/нечет)

PE

PO

CF

Перенос (да/нет)

SY

NC

Для вызова отладчика DEBUG следует набрать в командной строке DOS слово debug и, если необходимо, имена файлов, с которыми мы будем работать, например: debug prog.exe. Приглашение к вводу команд — «–» .После завершения работы с DEBUG для выхода из него следует набрать q. После набора каждой команды следует нажимать Enter.

Основные команды отладчика debug

  • N (name) — объявление имени файла.

  • R m (register) — отображение на экране дисплея содержимого регистра памяти МП с именем m. Если m не указано, показывается содержимое всех регистров памяти МП, вектор-адрес следующей команды (CS:IP), машинный и мнемокод этой команды; например:

-R

AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC

1A8E:010A B81500 MOV AX,0015 ;

Если отображается содержимое одного регистра, то команда R позволяет изменить его содержимое:

-R ax

AX 0005

:45

-R ax

AX 0045

  • A n (assembler) — прием команд ассемблера с клавиатуры и преобразование их в машинные коды, n — начальный вектор-адрес машинных команд.

Пример ввода программы:

-A 100

1A8E:0100 mov ax,15

1A8E:0103 mov bx,5

1A8E:0106 add ax,bx

1A8E:0108 div bx

1A8E:010A

  • U n1, n2 Lk (unassembler) — преобразование машинных кодов команд в команды на языке ассемблера и отображение их на экране дисплея, n1 — вектор-адрес 1-ой, а n2 — смещение последней из машинных команд, подлежащих деассемблированию, k — длина программы (может указываться либо n2, либо Lk). Пример деассемблирования программы:

-U100 La

1A8E:0100 B81500 MOV AX,0015

1A8E:0103 BB0500 MOV BX,0005

1A8E:0106 01D8 ADD AX,BX

1A8E:0108 F7F3 DIV BX

  • T k (tracing) — выполнение очередных k команд программы: Ели k не указано, то выполняется одна команда (пошаговая трассировка программы). Команды обращения к процедурам и внутренние прерывания командой Т не выполняются, так как по Т будут последовательно выполняться команды процедуры и команды обработки прерывания соответственно. В этих случаях следует использовать команду процедурной трассировки P (procedure), почти аналогичную команде T, но позволяющую автоматически полностью выполнять встречающиеся при трассировке процедуры, или команду G n. После выполнения команд (команды) на дисплей выводится:

  • содержимое всех регистров памяти МП в шестнадцатеричном коде (значения флагов регистра FL показываются в мнемокоде (см. табл. 9.2);

  • вектор-адрес (CS:IP);

  • машинный и мнемокоды текущей команды.

Пример трассировки программы:

R

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

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0100 NV UP EI PL NZ NA PO NC

1A8E:0100 B81500 MOV AX,0015

-t

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

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0103 NV UP EI PL NZ NA PO NC

1A8E:0103 BB0500 MOV BX,0005

-t

AX=0015 BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0106 NV UP EI PL NZ NA PO NC

1A8E:0106 01D8 ADD AX,BX

-t

AX=001A BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0108 NV UP EI PL NZ NA PO NC

1A8E:0108 F7F3 DIV BX

-t

AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC

1A8E:010A 48 DEC AX

  • G n (go) — выполнение EXE- или COM-программы до команды с вектор-адресом n, при отсутствии n программа отрабатывает до конца.

После выполнения команд (команды) на дисплей выводятся:

  • содержимое всех регистров памяти МП в шестнадцатеричном коде (значения);

  • флаги регистра FL выводятся в мнемокоде (см. табл. 9.2);

  • вектор-адрес (CS:IP), машинный и мнемокод текущей команды.

После выполнения программы получим:

-g 10a

AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC

1A8E:010A 48 DEC AX

  • D n, s Lk (dump) — отобразить на экране дисплея содержимое k ячеек памяти, начиная с ячейки по вектор-адресу n (по умолчанию –ни n, ни Lk не указаны: n — текущий вектор-адрес + 1 и k = 128), то есть, нажав клавиши D и Enter, можно посмотреть следующие 128 ячеек:

(Редактору. Все строчки поместить без переносов, уплотнить шрифт)

-D

1D20:0C00 F7 07 01 00 75 12 2E C7-06 CB 98 02 00 EB 09 E8 ....u...........

1D20:0C10 96 00 F8 EB 0D F9 EB 0A-50 B0 03 B4 FF E8 03 00 ........P.......

1D20:0C20 58 F8 C3 57 26 8B 7F 04-2E 89 3E CF 98 26 88 05 X..W&.....>..&..

1D20:0C30 26 88 65 01 50 2E A1 DE-98 26 89 45 02 58 3C 01 &.e.P....&.E.X<.

1D20:0C40 75 0A 26 89 55 04 26 89-4D 06 EB 5A 3C 02 75 06 u.&.U.&.M..Z<.u.

1D20:0C50 26 89 55 04 EB 50 3C 07-74 E8 3C 08 74 E4 3C 06 &.U..P<.t.<.t.<.

1D20:0C60 75 06 26 88 55 04 EB 3E-3C 04 75 0F 2E A1 D8 98 u.&.U..><.u.....

1D20:0C70 40 26 89 45 04 26 8C 5D-06 EB 2B 26 89 75 04 26 @&.E.&.]..+&.u.&

Частные случаи:

  • если L и k не указаны, то до ячейки, имеющей в том же сегменте, смещение равно S;

  • если S не указано, то показываются k ячеек памяти (в частности: D n L1 — одна ячейка памяти с вектор-адресом n);

Примеры:

-D 3b43 L3

1A8E:3B40 6C 6C 65 lle

-D 3b43 L1

1A8E:3B40 6C l

  • если S и Lk не указаны (есть только D n), то отображаются 128 ячеек памяти, например:

-D 405

1A8E:0400 69 6C 65-66 69 6C 65 66 69 6C 65 ilefilefile

1A8E:0410 66 69 6C 65 66 69 6C 65-66 69 6C 65 66 69 6C 65 filefilefilefile

1A8E:0420 00 44 CD 21 F6 C2 80 74-05 F6 C2 10 75 05 E8 52 .D.!...t....u..R

1A8E:0430 FD 8C DB 53 81 C3 2D 00-03 DA 8C CD 8B C2 80 E4 ...S..-.........

1A8E:0440 0F B1 04 8B F2 D3 E6 8B-CE D1 E9 4E 4E 8B FE 2B ...........NN..+

1A8E:0450 E8 2B D8 8E C5 8E DB F3-A5 FC 8E DD 07 06 BF 00 .+..............

1A8E:0460 01 33 F6 AD 95 BA 10 00-EB 2B AD 95 B2 10 EB 35 .3.......+.....5

1A8E:0470 AD 95 B2 10 EB 36 AD 95-B2 10 EB 3B AD 95 B2 10 .....6.....;....

1A8E:0480 EB 5D AD 95 B2 .]...

Содержимое выводится в шестнадцатеричном коде и в соответствующих символах ASCII (символы расширенного набора ASCII замещаются точкой (.)).

  • E n “текст1“, “ текст2“... (enter) — изменение содержимого ячеек памяти, начиная с вектор адреса n; количество ячеек определяется размером и количеством указанных в команде текстов, так, по команде –e 200 'pole', 'файл', 'file' выводится следующая информация:

-d Lc

1A8E:0200 70 6F 6C 65 E4 A0 A9 AB-66 69 6C 65 pole...file;

При вводе числовой информации (машинных кодов команд) следует набрать E n, нажать клавишу Enter, и после отображенного байта информации и точки ввести новое значение (1 байт), например:

-e 300

1A8E:0300 73.20

Для ввода последующих байтов нужно нажать клавишу Space и выполнить ввод очередного байта.

  • F n Lk “текст1“ (fill) — заполнение блока памяти длиной k байт, начиная с вектор-адреса n, однобайтовыми фрагментами «текст1»: например, –f 400 L20 'file'.

Результат выполнения команды:

-d 400 L30

(Редактору. Все строчки без переносов).

1A8E:0400 66 69 6C 65 66 69 6C 65-66 69 6C 65 66 69 6C 65 filefilefilefile

1A8E:0410 66 69 6C 65 66 69 6C 65-66 69 6C 65 66 69 6C 65 filefilefilefile

1A8E:0420 00 44 CD 21 F6 C2 80 74-05 F6 C2 10 75 05 E8 52 .D.!...t....u..R

  • S n Lk“текст“ (search) — поиск фрагмента «текст» в поле памяти длиной k ячеек с выдачей вектор-адреса ячейки, хранящей искомый текст: –s 200 l10 'fi'.

Результат работы команды: 1A8E:0208.

  • W (write) — запись программы на диск; в регистр СХ должна быть предварительно указана длина программы в байтах, в регистр BX занесен нуль, а командой N задано имя файла (N имя_файла);

  • L (load) — загрузка файла с диска в ОП; предварительно следует в BX записать нуль, в регистр СХ записать длину файла в байтах и объявить его имя N; для стандартно оформленных COM- и EXE-программ это же можно выполнить, набрав debug имя_файла.

Заметим, что:

  • ввод всех числовых данных осуществляется в шестнадцатеричной системе счисления, текстов — в символах ASCII, помещенных в кавычки;

  • вектор-адрес имеет форму адрес сегмента:адрес смещения; адрес сегмента может быть определен в явном виде шестнадцатеричным кодом или указанием соответствующего сегментного регистра; сегмент команд может быть задан по умолчанию; адрес смещения описывается в явном виде шестнадцатеричным кодом. Примеры задания вектор-адреса: 4FC5:10B, 13C6:1ABB, DS:0, CS:100;

  • при вводе и отображении двухбайтовых слов старший байт размещается правее младшего. Пример: при отображении машинного кода команды mov AX, 0123 на экране получим: B82301 (B8 — код 'mov ax').

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]