Скачиваний:
23
Добавлен:
11.05.2015
Размер:
998.91 Кб
Скачать

15D0:010c bfffff mov di,ffff

15D0:010f 57 push di

15D0:0110 B454 MOV AH,54

15D0:0112 CD21 INT 21

15D0:0114 8BEC MOV BP,SP

15D0:0116 804E1601 OR BYTE PTR [BP+16],01

15D0:011A 58 POP AX

15D0:011B 5B POP BX

15D0:011C 59 POP CX

15D0:011D 5A POP DX

15D0:011E 5E POP SI

15D0:011F 5F POP DI

-

Аргументы «u» аналогичны «d», кроме случая, когда не указано количество просматриваемых ячеек. В этом случае выводится около 15 строк текста.

Команда «a» используется для ввода команд МП 8086, 8088. Ее единственный необязательный аргумент — адрес начала ввода, так же, как и у команды «e». Пример использования команды «a» мы рассмотрим в следующей главе.

6.1.3. Команды запуска программы

Команда «t» DEBUG позволяет выполнить одну или несколько команд процессора:

t [=адрес] [число],

здесь адрес – адрес выполняемой команды; если не указан, берется текущее значение IP. Число — количество выполняемых команд. Если не указано, предполагается равным 1. После исполнения этого количества команд DEBUG вернется к диалогу с вами.

Например, выполнить две команды с адреса 100:

-t =100 2

AX=002C BX=0000 CX=0000 DX=162C SP=4008 BP=0000 SI=0000 DI=0000

DS=0005 ES=15D0 SS=1656 CS=0000 IP=0101 NV UP DI PL NZ AC PO NC

0000:0101 EC IN AL,DX

AX=00FF BX=0000 CX=0000 DX=162C SP=4008 BP=0000 SI=0000 DI=0000

DS=0005 ES=15D0 SS=1656 CS=0000 IP=0102 NV UP DI PL NZ AC PO NC

0000:0102 00F0 ADD AL,DH

-

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

Обратите внимание: попытка исполнить неизвестную DEBUG команду возможна и может иметь три различных финала:

  • корректная команда (для данного ЦП), не запрещенная в данной ОС, будет выполнена;

  • некорректная команда в ОС защищенного режима приведет к сообщению об ошибке в пользовательской программе;

  • некорректная команда в ОС реального режима без корректных обработчиков исключений приведет к неопределенному состоянию машины.

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

смещение код операции мнемоника команды

00000000: 66B804000000 mov eax,00000004

00000006: 66BB08000000 mov ebx,00000008

0000000C: 6601D8 add eax,ebx

Эта программа заносит в регистры EAX и EBX числа 00000004 и 00000008, после чего складывает их. Результат — 0000000C — будет помещен в регистр EAX.

Так как ввести эту программа в мнемонической записи в DEBUG невозможно, введем ее цифровое представление:

-e 100

159C:0100 B8.66 03.b8 00.4 00.0 00.0 BB.0 05.66 00.bb

159C:0108 00.8 00.0 01.0 D8.0 BB.66 22.1 00.d8 BA.

Попробуем просмотреть дамп в виде команд:

-u 100

159C:0100 66 DB 66

159C:0101 B80400 MOV AX,0004

159C:0104 0000 ADD [BX+SI],AL

159C:0106 66 DB 66

159C:0107 BB0800 MOV BX,0008

159C:010A 0000 ADD [BX+SI],AL

159C:010C 66 DB 66

159C:010D 01D8 ADD AX,BX

159C:010F BA0100 MOV DX,0001

159C:0112 BF0100 MOV DI,0001

159C:0115 CD21 INT 21

159C:0117 7250 JB 0169

159C:0119 8BD8 MOV BX,AX

159C:011B B83400 MOV AX,0034

159C:011E 8B15 MOV DX,[DI]

Как видно, DEBUG не смог расшифровать (дизассемблировать) команды 32-битной арифметики. Но выполнить их, тем не менее, возможно:

-t =100 3

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

DS=159C ES=159C SS=159C CS=159C IP=0106 NV UP EI PL NZ NA PO NC

159C:0106 66 DB 66

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

DS=159C ES=159C SS=159C CS=159C IP=010C NV UP EI PL NZ NA PO NC

159C:010C 66 DB 66

AX=000C BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=159C ES=159C SS=159C CS=159C IP=010F NV UP EI PL NZ NA PE NC

159C:010F BA0100 MOV DX,0001

-

DEBUG не умеет показывать значения регистров EAX и EBX, но регистры AX и BX являются их младшими частями, и на каждом шаге мы видели в них корректно изменяющиеся значения. Разумеется, этот пример может быть повторен на процессорах не ниже 80386.

Соседние файлы в папке Введение в вычислительную технику.