ВЫПОЛНЕНИЕ ПРОГРАММЫ ПОД УПРАВЛЕНИЕМ ДЕБАГГЕРА

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

   Команда GO  (g или  G) позволяет  дебаггеру контролировать выполнение
программ.  Мы  рассмотрим  работу  этой  команды  на  примере  маленькой
выполняемой программы (т.е. программы в машинном коде), которую  запишем
в память с помощью DEBUG. Итак, загрузимся с диска C и стартуем DEBUG:

         C>debug
 

 

    -e CS:0100 B0 01 BF 00 02 B9 1D 00 FC F2 AA B0 24
    -e CS:010D AA 06 1F BA 00 02 B4 09 CD 21 CD 20

    Мы загрузили в память последовательность машинных кодов, составляющих
программу. В процессе pаботы этой  пpогpаммы очищается экран, и на  него
выводится   последовательность    специальных   символов    (улыбающихся
физиономий). Затем программа завеpшает выполнение и передает  управление
дебаггеру.
   Пpежде чем пустить  программу на выполнение,  посмотрим ее листинг  в
мнемокоде Ассемблера. Введем команду UNASSEMBLER:
 

 

   -u CS:100  117

0966:0100     B002           MOV    AL,01
0966:0102     BF0002         MOV    DI,0200
0966:0105     B91D00         MOV    CX,001D
0966:0108     FC             CLD
0966:0109     F2             REPNZ
0966:010A     AA             STOSB
0966:010B     B024           MOV    AL,24
0966:010D     AA             STOSB
0966:010E     06             PUSH   ES
0966:010F     1F             POPG   DS
0966:0110     BA0002         MOV    DX,0200
0966:0113     B409           MOV    AH,09
0966:0115     CD21           INT    21
0966:0117     CD20           INT    20
   -

 
   Команду  GO  можно  вводить  без  дополнительных параметров. При этом
программа начинает выполняться с адреса CS:IP. Чтобы проверить состояние
регистров, воспользуемся командой REGISTER:
 

 


   -r

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0976  ES=0976  SS=0976  CS=0976  IP=0100    NV UP DI PL NZ NA PO NC
0976:0100  B001        MOV             AL,01
   -

   Так как в  регистрах CS и  IP хранится адрес  начала программы, можно
вводить команду GO:

   -g
   

   Перед вами ряд из 30 улыбающихся лиц. Дебаггер посылает сообщение:

   Program terminated normally

    Сообщение означает, что программа завершилась нормально и передала а
управление дебаггеру.
   Команда GO может служить для включения точек останова в  отлаживаемую
программу. Эти точки  отмечают места прерывания  нормально выполняющейся
программы. Чтобы обозначить точку останова внутри программы, в командной
строке указывается ее  адрес. Одной командой  GO можно ввести  до десяти
точек  останова.  Если  указывается  короткий  адрес,  то адрес сегмента
выбиpается из  регистра CS.  Адреса точек  останова разделяются пробелом
или запятой.
   При  нормальном  выполнении  программы  в  точке  останова происходит
прерывание и на экран выводится содержимое регистров и флагов состояния.
Введение  точек  останова  в  программу  особенно  оправдано при отладке
программ с разветвленной логикой, а также в случае, если какая-то  часть
машинного кода  не требует  обработки командой  TRACE (не трассируется).
(Команда TRACE pассматpивается в следующем pазделе).
   В  нашей  программе  по  адресу  0109  находится  команда,  котоpая в
процессе работы программы выполняется 30 pаз подpяд. Трассирование  этой
команды  (пошаговое  отслеживание  каждого  ее  выполнения)  -   процесс
монотонный и  не пpибавляющий  информации о  работе программы.  Введение
точек  останова  позволяет  избежать   трассирования  в  этом  месте   и
остановить выполнение программы, например, в точке 010В.
   Чтобы проследить  за ходом  выполнения первых  трех команд программы,
воспользуемся командой  TRACE. Чтобы  избежать трассирования  команды по
адресу 0109, воспользуемся командой GO и введем точку останова по адресу
010В.
 

 

   -t
AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0976  ES=0976  SS=0976  CS=0958  IP=0102    NV UP DI PL NZ NA PO NC
0976:0102  BF0002      MOV       DI,0200

   -t
AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0976  ES=0976  SS=0976  CS=0958  IP=0105    NV UP DI PL NZ NA PO NC
0976:0105  B91D00      MOV       CX,001D

   -t
AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0976  ES=0976  SS=0976  CS=0958  IP=0108    NV UP DI PL NZ NA PO NC
0976:0108  FC          CLD


   -t
AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0976  ES=0976  SS=0976  CS=0958  IP=0109    NV UP DI PL NZ NA PO NC
0976:0109  F2          REPNZ
0976:010A  AA          STOSB

   -g 010b

AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0976  ES=0976  SS=0976  CS=0958  IP=010B    NV UP DI PL NZ NA PO NC
0976:010B  B024        MOV       AL,24
   -


    Реально команды по адресу 0109 и 010A выполняются по 30 раз. Введение
точек останова позволяет произвести "быстрое" выполнение этих команд под
управлением дебаггера.
   Команда GO  позволяет задать  адрес команды,  с которой  можно начать
выполнение программы. Таким образом, программу можно запускать не только
с  ее  начального  адреса  (CS:IP).  В  этом  случае  после  символа "g"
набирается  знак  равенства  (=)  и  адрес команды. Если указан короткий
адрес, то адрес сегмента выбирается из регистра CS.
   Если после произведенных операций  ввести команду "g", то  выполнение
программы  возобновится  с  адреса  CS:IP (0958:010В). Включив начальный
адрес программы  в командную  стpоку GO,  можно перепустить  ее с самого
начала:
 

 


   -g=100
   

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

Вы находитесь в разделе: 

Добавить коментарий