Турбо отладчик (Turbo Debugger) 3.0

         

Вы можете  вводить такие уточненные


                                                   пен       в      типе
                                                   AnObjectType, который
                                                   доступен   в   модуле
                                                   AUnit.
        AUnit.AnObjectType.AMetod.ANestedProc.AVar Локальная  переменная
                                                   AVar  доступна в про-
                                                   цедуре   ANestedProc,
                                                   которая   доступна  в
                                                   методе AMethod, кото-
                                                   рый  доступен  в типе
                                                   AnObjectType,   кото-
                                                   рый,  в свою очередь,
                                                   доступен   в   модуле
                                                   AUnit.
            Вы можете  вводить такие уточненные идентификаторы выражений
       в любом месте,  где выражение допустимо (в том числе  и  в  окнах
       просмотра и вычисления (Watch и Evaluate)), например, если вы из-
       меняете выражение в окне проверки (Inspector) или используете ло-
       кальное меню в окне Module (Модуль) для перехода (Goto) по адресу
       метода или процедуры в исходном коде.


           Некоторые замечания по переопределению области действия
       -----------------------------------------------------------------
            При переопределении  области  действия в программах на языке
       Паскаль вам могут помочь следующие замечания:
            1. Любая переменная,  к которой вы обращаетесь с помощью пе-
               реопределения  области  действия, уже должна быть инициа-
               лизирована.
            2. Если вы пытаетесь обратиться к локальной переменной,  ко-
               торой нет в текущей области действия, вы должны в качест-

ве части оператора переопределения области 


               ве части оператора переопределения области  действия  ис-
               пользовать имя процедуры или функции.
            3. В  Паскале в качестве части оператора переопределения об-
               ласти действия вы не можете использовать имя файла. Одна-
               ко, для изменения языка на Си, в котором это допускается,
               можно использовать команду  Options¦Language  (Параметры¦
               Язык).

       TDeb 3.0 #2-3                = 15 =
                           Область действия и DLL
       -----------------------------------------------------------------
            Поскольку TDW одновременно загружает таблицы идентификаторов
       файла .EXE текущего модуля и его библиотек DLL (к которым он  об-
       ращается и для которых имеется исходный код и таблица идентифика-
       торов), вы можете не иметь возможности  немедленно  обратиться  к
       переменным DLL (или к переменным файла .EXE,  когда вы находитесь
       в DLL).
            TDW сначала ищет переменную в таблице идентификаторов  теку-
       щего модуля или DLL, а затем во всех других таблицах в порядке их
       загрузки. Если переменная имеет одно и то же имя в нескольких DLL
       или в файле .EXE и в DLL,  то отладчик TDW видит только первый ее
       экземпляр. Для доступа к таким переменным вы не можете  использо-
       вать синтаксис переопределения области действия. Вместо этого для
       загрузки соответствующего модуля или DLL нужно использовать  кла-
       вишу F3 или диалоговое окно Load Modules and DLLs (Загрузка моду-
       лей и библиотек DLL).
            Отладчик TDW загружает таблицу идентификаторов для:
            1. Текущего модуля файла .EXE.
            2. Любой  явно  загружаемой  с  помощью  команды Symbol Load
               (Загрузка идентификаторов) диалогового окна  Load Modules
               and DLLs (Загрузка модулей и DLL) DLL.
            3. Любой DLL, в которую вы вошли из вашей программы.

Неявная область действия при вычислении



       TDeb 3.0 #2-3                = 16 =
              Неявная область действия при вычислении выражений
       -----------------------------------------------------------------
            Всякий раз,  когда Турбо отладчик  вычисляет  выражение,  он
       должен определить без явного указания,  где в программе находится
       область действия каждого идентификатора.  Во  многих  языках  это
       имеет существенное значение,  так как в процедурах и функциях мо-
       гут использоваться идентификаторы с теми же именами,  что и  гло-
       бальные идентификаторы. Турбо отладчик должен знать, какой именно
       идентификатор вы имеете в виду.
            В качестве основы при принятии решения об  области  действия
       Турбо отладчик обычно использует текущую позицию курсора.  Напри-
       мер,  вы можете задать область действия,  которая будет использо-
       ваться при вычислении выражения, переместив курсор на ту или иную
       строку в окне Module (Модуль).
            Это означает, что при смещении курсора с текущей строки, где
       остановилась  ваша программа,  вы можете при вычислении выражения
       получить непредвиденные результаты. Если вы хотите убедиться, что
       выражения вычисляются в текущей области действия вашей программы,
       используйте команду локального меню окна Module  Origin (Начало),
       чтобы вернуться к текущему адресу исходного кода.  Задать область
       действия выражения можно также,  перемещаясь в области Code (Код)
       окна CPU (Центральный процессор), устанавливая курсор на подпрог-
       рамму в  окне  Stack  (Стек)  или  на  имя  подпрограммы  в  окне
       Variables (Переменные).
                                 Списки байт
       -----------------------------------------------------------------
            В некоторых командах от вас требуется  ввести  список  байт.
       Это команды локального меню области Data (Данные) окна CPU (Цент-
       ральный процессор) Search (Поиск) и Change (Изменение)  или такие

же команды локального меню окна


       же команды локального меню окна File (Файл), в котором файл выво-
       дится в шестнадцатиричном виде.
            Список байт может представлять собой произвольную смесь ска-
       лярных (без плавающей точки) чисел и строк, в которых использует-
       ся  синтаксис  текущего  языка   (его   можно   задать   командой
       Options¦Language (Опции¦Язык)). И в строках, и в скалярных значе-
       ниях используется тот же синтаксис, что и в выражениях. Скалярные
       значения преобразуются в соответствующую последовательность байт.
       Например,  длинное целое (longint) значение Паскаля 123456 преоб-
       разуется в 4-байтовый шестнадцатиричный эквивалент 56 34 12 00.
                ------------T---------------T-------------------------¬
                ¦ Язык      ¦ Список байт   ¦Шестнадцатиричные данные ¦
                +-----------+---------------+-------------------------+
                ¦ Си        ¦ "ab"0x04"c"   ¦            61 62 04 63  ¦
                ¦ Паскаль   ¦ 'ab'#4'c'     ¦            61 62 04 63  ¦
                ¦ Ассемблер ¦ 1234"AB"      ¦            34 12 41 42  ¦
                L-----------+---------------+--------------------------

       TDeb 3.0 #2-3                = 17 =
                             Выражения языка Си
       -----------------------------------------------------------------
            Турбо отладчик  полностью  поддерживает  синтаксис выражений
       языка Си.  Выражение состоит из смеси операций, строк, переменных
       и констант.  Каждый из этих компонентов описан в одном из следую-
       щих разделов.
                           Идентификаторы языка Си
       -----------------------------------------------------------------
            Идентификатор языка  Си представляет собой имя элемента дан-
       ных или подпрограммы в программе. Имя идентификатора должно начи-
       наться с буквы (a-z или A-Z) или символа подчеркивания (_).  Пос-

в идентификаторе могут содержать цифры


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

       TDeb 3.0 #2-3                = 18 =
                    Регистровые псевдопеременные языка Си
       -----------------------------------------------------------------
            Турбо отладчик  позволяет  вам  получить доступ к сегментным
       регистрам с помощью того же метода,  что  и  метод,  используемый
       компилятором  языка  Си,  а  именно - с помощью псевдопеременных.
       Псевдопеременная представляет собой имя переменной, соответствую-
       щее данному регистру процессора:
          --------------------T----------------------T---------------¬
          ¦ Псевдопеременная  ¦       Тип            ¦    Регистр    ¦
          +-------------------+----------------------+---------------+
          ¦     _AX           ¦  unsigned int        ¦          AX   ¦
          ¦     _AL           ¦  unsigned char       ¦          AL   ¦
          ¦     _AH           ¦  unsigned char       ¦          AH   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _BX           ¦  unsigned int        ¦          BX   ¦
          ¦     _BL           ¦  unsigned char       ¦          BL   ¦
          ¦     _BH           ¦  unsigned char       ¦          BH   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _CX           ¦  unsigned int        ¦          CX   ¦
          ¦     _CL           ¦  unsigned char       ¦          CL   ¦
          ¦     _CH           ¦  unsigned char       ¦          CH   ¦

к регистрам процессора 80386 позволяют


          ¦                   ¦                      ¦               ¦
          ¦     _DX           ¦  unsigned int        ¦          DX   ¦
          ¦     _DL           ¦  unsigned char       ¦          DL   ¦
          ¦     _DH           ¦  unsigned char       ¦          DH   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _CS           ¦  unsigned int        ¦          CS   ¦
          ¦     _DS           ¦  unsigned char       ¦          DS   ¦
          ¦     _SS           ¦  unsigned char       ¦          SS   ¦
          ¦     _ES           ¦  unsigned char       ¦          ES   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _SP           ¦  unsigned int        ¦          SP   ¦
          ¦     _BP           ¦  unsigned char       ¦          BP   ¦
          ¦     _DI           ¦  unsigned char       ¦          DI   ¦
          ¦     _SI           ¦  unsigned char       ¦          SI   ¦
          ¦                   ¦                      ¦     указатель ¦
          ¦     _IP           ¦  unsigned int        ¦     инструкций¦
          L-------------------+----------------------+----------------

       TDeb 3.0 #2-3                = 19 =
            Получить доступ  к регистрам процессора 80386 позволяют сле-
       дующие псевдопеременные:
           -------------------T-----------------------T---------------¬
           ¦ Псевдопеременная ¦      Тип              ¦       Регистр ¦
           +------------------+-----------------------+---------------+
           ¦    _EAX          ¦  unsigned long        ¦         EAX   ¦
           ¦    _EBX          ¦  unsigned long        ¦         EBX   ¦
           ¦    _ECX          ¦  unsigned long        ¦         ECX   ¦
           ¦    _EDX          ¦  unsigned long        ¦         EDX   ¦
           ¦                  ¦                       ¦               ¦
           ¦    _ESP          ¦  unsigned long        ¦         ESP   ¦

с плавающей точкой или представлять


           ¦    _EBP          ¦  unsigned long        ¦         EBP   ¦
           ¦    _EDI          ¦  unsigned long        ¦         EDI   ¦
           ¦    _ESI          ¦  unsigned long        ¦         ESI   ¦
           ¦                  ¦                       ¦               ¦
           ¦    _FS           ¦  unsigned int         ¦         FS    ¦
           ¦    _GS           ¦  unsigned int         ¦         GS    ¦
           L------------------+-----------------------+----------------
                      Форматы констант и чисел языка Си
       -----------------------------------------------------------------
            Константы могут быть с плавающей точкой или представлять со-
       бой целые константы.
            Если не  используется одно из переопределений в соответствии
       с соглашениями языка Си, то целая константа задается в десятичном
       виде.
                     ----------------T-----------------------¬
                     ¦   Формат      ¦   Основание           ¦
                     +---------------+-----------------------+
                     ¦   цифры       ¦   Десятичное          ¦
                     ¦   Oцифры      ¦   Восьмеричное        ¦
                     ¦   OXцифры     ¦   Шестнадцатиричное   ¦
                     ¦   Oхцифры     ¦   Шестнадцатиричное   ¦
                     L---------------+------------------------
            Константы имеют обычно тип int (16 бит).  Если вы хотите оп-
       ределить длинную константу (32 бита),  то конце числа нужно доба-
       вить l или L. Например, 123456L.
            Константа с плавающей точкой содержит десятичную точку и мо-
       жет использоваться для научного представления, например:
               1.234  4.5e+11

       TDeb 3.0 #2-3                = 20 =
             Символьные строки и ESC-последовательности языка Си
       -----------------------------------------------------------------
            Строки представляют собой последовательность символов,  зак-

в соответствии  со стандартными соглашениями


       люченную  в  кавычки ("").  В качестве управляющего символа можно
       также в соответствии  со стандартными соглашениями языка  Си  ис-
       пользовать также обратную косую черту (\).
        ---------------------T--------------T--------------------------¬
        ¦ Последовательность ¦ Значение     ¦           Символ         ¦
        +--------------------+--------------+--------------------------+
        ¦ \\                 ¦              ¦ Обратная косая черта     ¦
        ¦ \a                 ¦ OX07         ¦ "Звонок"                 ¦
        ¦ \b                 ¦ OX08         ¦ Обратный пробел          ¦
        ¦ \f                 ¦ OX0C         ¦ Перевод формата          ¦
        ¦ \n                 ¦ OX0A         ¦ Новая строка             ¦
        ¦ \r                 ¦ OX0D         ¦ Возврат каретки          ¦
        ¦ \t                 ¦ OX09         ¦ Горизонтальная табуляция ¦
        ¦ \v                 ¦ OX0B         ¦ Вертикальная табуляция   ¦
        ¦ \xnn               ¦ nn           ¦ Шестнадцатиричное        ¦
        ¦                    ¦              ¦ значение байта           ¦
        ¦ \nnn               ¦ nnn          ¦ Восьмеричное значение    ¦
        ¦                    ¦              ¦ байта                    ¦
        L--------------------+--------------+---------------------------
            Если за обратной косой чертой следует один  из перечисленных
       здесь символов, то этот символ включается в строку без изменения.
                  Операции языка Си и старшинство операций
       -----------------------------------------------------------------
            В Турбо отладчике используются те же операции, что и в языке
       Си, и выполняются они в том же порядке. Однако в отладчике имеет-
       ся  одна  новая  операция,  которая не входит в стандартный набор
       операция языка Си. Это операция ::. Она имеет более высокий прио-
       ритет,  чем любая из операций языка Си, и используется для форма-

тирования постоянного дальнего адреса из 


       тирования постоянного дальнего адреса из  выражения,  которое  ей
       предшествует, и выражения, которое за ней следует.
            Основные операции выражений:
               () [] . -> sizeof
       имеют наивысший приоритет (слева-направо). Унарные операции:
               * & - ! ~ ++ --
       имеют приоритет более низкий, чем основные операции, но более вы-
       сокий,  чем  бинарные операции (при группировании справа-налево).
       Приоритет бинарных операций убывает в соответствии  со  следующим
       списком  (операции с равным приоритетом содержатся на одной стро-
       ке):

       TDeb 3.0 #2-3                = 21 =
             высший  * / %
                     + -
                     >> <<
                     < > <= >=
                     == !=
                     &
                     ^
                     ¦
                     &&
             низший  ¦¦
            Единственная тернарная операция ? имеет более низкий приори-
       тет, чем любая из двоичных операций.
            Операторы присваивания имеют  более  низкий,  чем  тернарная
       операция и одинаковый приоритет и группируются справа-налево:
               =   +=   -=   /=   %=   >>=   <<=   &=   ^=   ¦=
                    Выполнение в программе функций на Си
       -----------------------------------------------------------------
            Функции в выражениях Си можно вызывать точно также,  как это
       делается  в  исходном  коде.  Турбо  отладчик выполняет код вашей
       программы с теми аргументами функции, которые вы задаете. Это мо-
       жет оказаться очень полезным для быстрой проверки поведения напи-
       санной функции.  Ее можно повторно вызывать с различными аргумен-
       тами и проверять, возвращает ли она корректное значение.
            Если ваша программа содержит следующую функцию, которая воз-
       водит число в степень (x в степени y):

то в  следующей таблице показаны


               long power(int x, int y) {
                       long temp = 1;
                       while (y--)
                           temp *= x;
                       return(temp);
               }

       TDeb 3.0 #2-3                = 22 =
       то в  следующей таблице показаны результаты вызова данной функции
       с различными аргументами:
               --------------------------T---------------------------¬
               ¦  Выражение Си           ¦           Результат       ¦
               +-------------------------+---------------------------+
               ¦  power(3,2)*2           ¦           18              ¦
               ¦  25 + power(5,8)        ¦           390650          ¦
               ¦  power(2)               ¦           Ошибка (пропу-  ¦
               ¦                         ¦           щен аргумент)   ¦
               L-------------------------+----------------------------
                  Выражения языка Си с побочными эффектами
       -----------------------------------------------------------------
            Побочные эффекты имеют место,  когда вы вычисляете выражение
       языка Си, которое в процессе вычисления изменяет значение элемен-
       та данных.  В некоторых случаях побочные эффекты  являются  жела-
       тельными  и  используются  преднамеренно для модификации значения
       переменной программы. В других случаях желательно соблюдать осто-
       рожность и избегать их,  поэтому важно понимать, когда может воз-
       никнуть побочный эффект.
            Операция присваивания (=,  += и т.д.) изменяет значение эле-
       мента данных, расположенного слева от операции. Операции увеличе-
       ния и уменьшения (++ и --) изменяют  значения  элементов  данных,
       которые им предшествуют или следуют за ними, в зависимости от то-
       го,  используются они как префиксные,  или как постфиксные опера-
       ции.
            Менее очевидный  тип  побочных  эффектов  может иметь место,

если функция myfunc изменила  значение 


       когда вы выполняете функцию,  являющуюся частью программы. Напри-
       мер, если вы вычисляет выражение Си:
               myfunc(1, 2, 3) + 7
       то, если функция myfunc изменила  значение  одной  из  переменных
       программы,  ваша программа может в дальнейшем вести себя неверно.
               Ключевые слова языка Си и преобразование типов
       -----------------------------------------------------------------
            Турбо отладчик позволяет вам выполнять приведение указателей
       также,  как это делалось бы в программе на языке  Си.  Приведение
       типа  состоит  из объявления типа данных языка Си в круглых скоб-
       ках.  Оно должно следовать перед выражением, при вычислении кото-
       рого получается указатель на память.
            Преобразование типа полезно  использовать,  если  вы  хотите
       проверить содержимое ячейки памяти,  на которую ссылается дальний
       адрес, сгенерированный с использованием операции ::. Например:

       TDeb 3.0 #2-3                = 23 =
               (long far *)Ox3456::0
               (char far *)_ES::_BX
            Преобразование типа  можно  использовать для доступа к пере-
       менной программы,  для которой информация о типе отсутствует (что
       может  произойти  при  компиляции модуля без включения информации
       для отладки). Вместо того, чтобы выполнять перекомпиляцию и пере-
       компоновку, можно просто перед именем переменной указать приведе-
       ние типа (то есть присвоить тип явным образом).
            Например, если  ваша переменная iptr представляет собой ука-
       затель на целое,  вы можете проверить целое значение,  на которое
       она указывает, вычислив выражение Си:
               *(int *)iptr
            При формировании преобразования типов в Турбо отладчике мож-
       но использовать следующие ключевые слова:
               char            float              far
               int             double             huge

Турбо отладчик, за исключением конкатенации


               short           unsigned           struct
               long            near               union
                                                  enum
                           Выражения языка Паскаль
       -----------------------------------------------------------------
            Турбо отладчик, за исключением конкатенации строк и операций
       над множествами,  поддерживает синтаксис выражений Паскаля. Выра-
       жение представляет собой  смесь  операций,  строк,  переменных  и
       констант.  В  следующих разделах описывается каждый из образующих
       выражение компонентов.
                           Идентификаторы Паскаля
       -----------------------------------------------------------------
            Идентификаторы в  Паскале  представляют  собой  определенные
       пользователем  имена элементов данных или подпрограмм вашей прог-
       раммы.  Имя идентификатора Паскаля может начинаться с буквы (a  -
       z,  A - Z) или символа подчеркивания. Последующие символы в имени
       могут содержать цифры (от 0 до 9) и подчеркивания, а также буквы.
            Обычно идентификаторы подчиняются правилам  области действия
       Паскаля,  при этом "вложенные" локальные идентификаторы переопре-
       деляют другие идентификаторы в том же имени.  Вы можете переопре-
       делить данную область действия,  если хотите  получить  доступ  к
       идентификаторам в других областях. Более подробно это описывается
       в разделе "Доступ к идентификаторам  вне  текущей  области  дейс-
       твия".
                      Константы Паскаля и формат чисел
       -----------------------------------------------------------------
            Константы могут быть либо вещественными  (с  плавающей  точ-

       TDeb 3.0 #2-3                = 24 =
       кой),  либо  целыми.  Отрицательные константы начинаются со знака
       минуса (-).  Если число содержит десятичную точку или  символ  e,
       что обозначает экспоненту, то это вещественное число.

Десятичные целые константы могут принимать


Например:
               123.4   456e34  123.45e-5
            Константы целого типа являются десятичными,  если они не на-
       чинаются со знака доллара  ($),  что  означает  шестнадцатиричную
       константу.  Десятичные целые константы могут принимать значения в
       диапазоне от 2137483648 и 2147483647. Шестнадцатиричные константы
       должны лежать в диапазоне от $00000000 до $FFFFFFFF.
                               Строки Паскаля
       -----------------------------------------------------------------
            Строка представляет собой просто группу символов,  заключен-
       ных в одиночные кавычки, например:
               'abc'
            Указав перед десятичным управляющим символом символ #, можно
       включить в строку управляющие символы, например:
               'def'#7'xyz'

       TDeb 3.0 #2-3                = 25 =
                              Операции Паскаля
       -----------------------------------------------------------------
            Турбо отладчик  поддерживает все операции,  использующиеся в
       выражениях Паскаля.
            Унарные операции имеют старший и одинаковый приоритет.
               @       Получает адрес идентификатора.
               ^       Содержимое указателя.
               not     Поразрядное дополнение.
               typeid  Приведение типа.
               +       Унарный плюс (положительное значение).
               -       Унарный минут (отрицательное значение).
            Бинарные операции имеют более низкий приоритет,  чем унарные
       операции. Перечислим их в порядке убывания приоритета:
               *       \       div     mod     and     shl     shr
               in      +       -       or      xor
               <       <=      >       >=      =       <>
            Операция присваивания := имеет низший приоритет.  Для вашего
       удобства она возвращает значение (как в языке Си).
              Соглашения Паскаля по вызовам процедур и функций

В выражениях Турбо Паскаля можно


       -----------------------------------------------------------------
            В выражениях Турбо Паскаля можно ссылаться  на  процедуры  и
       функции.  Например,  предположим, что вы описали функцию с именем
       HalfFunc, которая делит целое значение на 2:
               function HalfFunc(i: integer) real);
            Затем вы можете выбрать команду Data¦Evaluate/Modify (Данные
       ¦Вычисление/Модификация) и вызвать функцию HalfFunc следующим об-
       разом:
               HalfFunc(3)
               HalfFunc(10) = HalfFunc(10 div 3)
            Можно также вызывать процедуры (но,  конечно, не в выражени-
       ях). Когда вы вводите просто имя процедуры или функции, Турбо от-
       ладчик выводит ее адрес и описание.  Чтобы вызвать процедуру  или
       функцию, которая не имеет параметров, укажите после имени функции
       скобки, например:
               MyProc()        Вызывает MyProc.
               MyProc          Сообщает адрес MyProc и т.д.
               MyFunc=5        Сравнивает адрес MuFunc c 5.
               MyFunc()=5      Вызывает MyFunc и сравнивает возвращаемое
                               значение с 5.

       TDeb 3.0 #2-3                = 26 =
                            Выражения Ассемблера
       -----------------------------------------------------------------
            Турбо отладчик  поддерживает  полный синтаксис выражений Ас-
       семблера.  Выражение состоит из смеси операций, строк, переменных
       и  констант.  Каждый  из этих компонентов описывается в следующем
       разделе.
                          Идентификаторы Ассемблера
       -----------------------------------------------------------------
            Идентификаторы представляют собой определенные пользователем
       имена элементов данных и подпрограмм в вашей программе. Имя иден-
       тификатора Ассемблера начинается с буквы (a - z, A - Z) или одно-
       го из следующий символов: @, ?, _, $. Последующие символы в иден-

В качестве первого символа имени


       тификаторе  могут  содержать цифры (0 - 9) или любой из указанных
       символов.  В качестве первого символа имени идентификатора (но не
       внутри имени) можно также использовать точку.
            Специальный идентификатор $ ссылается на текущий адрес прог-
       раммы, определяемый парой регистров CS:IP.
                            Константы Ассемблера
       -----------------------------------------------------------------
            Турбо отладчик обеспечивает работу с константами всех типов,
       которые используются в Ассемблере (byte,  word,  длинные, состав-
       ные,  с плавающей точкой,  вещественные,  с двойной и расширенной
       точностью). Константа  с  плавающей  точкой  содержит  десятичную
       точку и может использовать научное десятичное представление.
                      1.234        4.5e+11
            Если не  используется одно из соглашений Ассемблера по пере-
       определению основания,  то целочисленные константы являются шест-
       надцатиричными.
            -------------------------T---------------------------------¬
            ¦  Формат                ¦                 Основание       ¦
            +------------------------+---------------------------------+
            ¦  цифрыH                ¦              Шестнадцатиричное  ¦
            ¦  цифрыO                ¦              Восьмеричное       ¦
            ¦  цифрыQ                ¦              Восьмеричное       ¦
            ¦  цифрыD                ¦              Десятичное         ¦
            ¦  цифрыB                ¦              Двоичное           ¦
            L------------------------+----------------------------------
            Шестнадцатиричное число  всегда должно начинаться с цифры (0
       - 9). Если вы ходите начать число с одной из букв (A - F), то пе-
       ред ним должен следовать 0.
                 Примечание: Если вы хотите  закончить шестнадцатиричное

       TDeb 3.0 #2-3                = 27 =

Турбо отладчик поддерживает большинство операций,


            число символом D или B,  то, чтобы избежать неоднозначности,
            нужно добавить H.

       TDeb 3.0 #2-3                = 28 =
                             Операции Ассемблера
       -----------------------------------------------------------------
            Турбо отладчик поддерживает большинство операций, использую-
       щиеся в Ассемблере. Старшинство этих операций соответствует стар-
       шинству операций, принятому в Ассемблере:
            xxx PTR (BYTE PTR...)
            .(селектор элемента структуры)
            :(переопределение сегмента)
            OR XOR
            AND
            NOT
            EQ NE LT LE GT GE
            + -
            * / MOD SHR SHL
            Унарный -, Унарный +
            OFFSET SEG
            () []
            Переменные можно изменять с помощью операции присваивания =.
       Например:
               a = [BYTE PTR DS:4]
                             Управление форматом
       -----------------------------------------------------------------
            Когда вы указываете выражение,  которое должно выводиться на
       экран, Турбо  отладчик  выводит его в формате,  основывающемся на
       типе данных, которые в нем используются. Турбо отладчик игнориру-
       ет управление форматом, неверное для данного типа данных.
            Если вы хотите изменить используемый по умолчанию формат вы-
       вода данных на экран, поместите в конце выражения запятую и  нео-
       бязательный счетчик повторения, за которым указывается необязате-
       льная буква формата. Счетчик повторения нужно задавать только для
       массивов.

       TDeb 3.0 #2-3                = 29 =
            Символы, управляющие форматом вывода Ассемблера, описываются
       с следующей таблице:
       -----------------------------------------------------------------
       Идентификатор           Формат
       -----------------------------------------------------------------
        c              Символ или строка выводятся на экран в виде необ-

в виде управляющих символов или


                       работанных символов. Обычно непечатаемые  символы
                       выводятся в виде управляющих символов или в  чис-
                       ловом формате. Этот параметр приводит к тому, что
                       при выводе символов будет  использоваться  полный
                       набор символов дисплея IBM.
        d              Целое число выводится в виде  десятичного  значе-
                       ния.
        f[#]           Формат с плавающей точкой с заданным числом цифр.
                       Если вы  не  задаете число цифр,  то используется
                       столько цифр, сколько необходимо.
        m              Выражение со ссылкой на память выводится  в  виде
                       шестнадцатиричных байт.
        md             Выражение со ссылкой на память выводится  в  виде
                       десятичных байт.
        P              Выводится необработанное значение указателя,  по-
                       казывающее сегмент, как имя  регистра  (если  это
                       возможно). Показывается также объект, на  который
                       указатель ссылается. Если управление форматом  не
                       задано, то это используется по умолчанию.
        s              Выводится массив или указатель на массив символов
                       (строка, заключенная в кавычки).  Строка заверша-
                       ется нулевым символом.
        x или h        Целое выводится в виде шестнадцатиричного  значе-
                       ния.
       -----------------------------------------------------------------

       TDeb 3.0 #2-3                = 30 =
       Глава 10. Объектно-ориентированная отладка для Паскаля и C++
       -----------------------------------------------------------------
            Чтобы удовлетворить  потребности  развития  методов  объект-
       но-ориентированного программирования,  принципы которого реализо-
       ваны в последних версиях таких языков высокого уровня,  как Турбо

Турбо отладчик был также модифицирован


       C++ и  Турбо Паскаль,  Турбо отладчик был также модифицирован для
       поддержки объектно-ориентированного программирования.  Кроме  тех
       расширений,  которые  позволяют вам выполнять трассировку методов
       объектов или функций-элементов классов в диалоговом окне Evaluate
       /Modify  (Вычисление/Модификация) и окне Watch (Просмотр),  Турбо
       отладчик версии 3.0 оснащен специальным набором окон  и локальных
       меню, созданных специально для работы с объектными типами и клас-
       сами.
           Отладка объектно-ориентированных программ Турбо Паскаля
       -----------------------------------------------------------------
              Пошаговое выполнение и трассировка вызовов методов
       -----------------------------------------------------------------
            Во время  трассировки  (клавиша  F7) и пошагового выполнения
       (клавиша F8) Турбо отладчик рассматривает методы в  точности так,
       как  если бы они были процедурами или функциями.  Клавиша F7 осу-
       ществляет трассировку исходного кода метода (если этот код досту-
       пен),  тогда как F8 рассматривает вызов метода,  словно это  один
       оператор, и "перешагивает" через него.
            Турбо отладчик  правильно управляет поздним связыванием вир-
       туальных методов: он всегда выполняет и выводит на экран коррект-
       ный  код.  В окне стека Турбо отладчика (окно Stack) выводятся на
       экран имена методов,  перед которыми указывается тип объекта, оп-
       ределяющего метод.

       TDeb 3.0 #2-3                = 31 =
                               Окно Hierarchy
       -----------------------------------------------------------------
            В Турбо отладчике предусмотрено специальное  окно  Hierarchy
       (Иерархия) для  проверки  иерархии объектов или классов.  Вывести
       это окно можно по команде меню View¦Hierarchy (Обзор¦Иерархия).
              г[*]====Class Hierarchy====================3=====[ ][ ]¬

иерархия всех объектов или классов


              ¦Device      ¦ L--------Point                          ¦
              ¦GlowGauge   ¦           L----------Rectangle          ¦
              ¦HorzArrow   ¦                       +-------Device    ¦
              ¦HorzBar     ¦                       L-------TextWindow¦
              ¦LinearGauge ¦Range                                    ¦
              ¦Point       ¦ L------Device                           ¦
              ¦Range       ¦          +------GlowGauge               ¦
              ¦Rectangle   +-----------------------------------------¦
              ¦Screen      ¦Parents of Device                        ¦
              ¦TextWindow  ¦ ¦----------Range                        ¦
              ¦VertArrow   ¦ L----------Rectangle                    ¦
              ¦VertBar     ¦            L----------Point             ¦
              ¦            ¦                       L-------Screen    ¦
              L=============<--------------------------------------->-
            Рис. 10.1 Окно Hierarchy
            В окне Hierarchy (Иерархия) выводится информация об  объект-
       ных  типах или классах,  а не об их экземплярах.  В левой области
       выводится список в алфавитном порядке всех типов,  используемых в
       отлаживаемом модуле. В правой области (двух областях, если вы от-
       лаживаете программу на C++ с множественным наследованием) показа-
       на  иерархия всех объектов или классов (с помощью линейной графи-
       ки).  При этом по левой границе области выводится базовый  тип  и
       показываются порожденные им типы ("потомки"). Кроме того показаны
       все "предки" классов с множественным наследованием.  При этом ли-
       нии показывают отношения между "предками" и "потомками".
                 Примечание: Для  перемещения  между двумя областями ис-
            пользуйте клавишу Tab.
                   Области списка типов объектов и классов
       -----------------------------------------------------------------

В левой области окна иерархии


            В левой области окна иерархии объектов/классов  выводится (в
       алфавитном порядке)  список всех типов классов или объектов в те-
       кущем модуле.  Она поддерживает средство инкрементального поиска,
       что исключает необходимость перемещать курсор по  большим спискам
       типов.  Когда  полоса подсветки находится в левой области,  можно
       просто начать набирать новое имя искомого типа объекта или  клас-
       са. При каждом нажатии клавиши Турбо отладчик подсвечивает первый
       тип, соответствующий всем нажатым к этому моменту клавишам.
            Для того,  чтобы открыть окно Inspector (Проверка) для подс-
       веченного типа  объекта или класса,  нажмите клавишу Enter.  Окна

       TDeb 3.0 #2-3                = 32 =
       проверки описаны далее.
       Локальное меню области области списка типов объектов и классов
       -----------------------------------------------------------------
            Для вывода  локального  меню  данной области нажмите клавиши
       Alt-F10. Вы можете  также  использовать  сокращения  (оперативные
       клавиши), если это разрешено с помощью утилиты TDINST. Данное ло-
       кальное меню содержит два элемента: Inspect и Tree.
                            ------------------¬
            Проверка        ¦ Inspect         ¦
            Дерево          ¦ Tree            ¦
                            L------------------
                               Команда Inspect
       -----------------------------------------------------------------
            Данная команда выводит для подсвеченного типа объекта/класса
       окно Inspector (Проверка).
                                Команда Tree
       -----------------------------------------------------------------
            Данная команда перемещает вас в правую область окна, в кото-
       рой выведено дерево иерархии объектов, и помещает полосу подсвет-
       ки на тип, который подсвечен в левой области.

       TDeb 3.0 #2-3                = 33 =

В правой области окна Hierarchy 


                           Область дерева иерархии
       -----------------------------------------------------------------
            В правой области окна Hierarchy  выводится  дерево  иерархии
       для всех  объектов или классов,  использующихся в текущем модуле.
       Отношения "предков" и "потомков" показаны линиями, при этом  "по-
       томки" расположены слева и ниже своих "предков".
            Чтобы найти  объект или класс конкретного типа в сложном де-
       реве иерархии,  перейдите обратно в левую область  и  используйте
       средство инкрементального поиска (или поиска по возрастанию). За-
       тем выберите в локальном меню элемент Tree (Дерево), чтобы перей-
       ти обратно к дереву иерархии. Соответствующий тип выводится в по-
       лосе подсветки.
            При нажатии  клавиши  Enter  для  подсвеченного  типа объек-
       та/класса выводится окно Inspector (Проверка).
            Если вы загрузили программу на языке C++,  в которой исполь-
       зуются классы с множественным наследованием,  то выводится третья
       область - дерево порождающих классов,  которая расположена в окне
       Hierarchy (Иерархия) ниже дерева иерархии.  Если исследуемый вами
       класс имеет нескольких "предков",  то,  если в локальном меню об-
       ласти дерева иерархии выбрана команда Parent (Порождающий класс),
       и для нее установлено значение Yes (Да), то области дерева порож-
       дающих  классов  выводится обратное дерево (с сообщением "Parents
       of Class" - "Порождающие классы для данного класса" в левой  гра-
       нице  области).  Ниже  и правее левой границы выводятся "предки".
       При этом линиями показаны отношения "предков" и "потомков".
            Также, как и в области дерева иерархии,  для любого  класса,
       выводимого  в  области дерева порождающих классов,  можно открыть
       окно Inspector (Проверка).

Локальное меню  области дерева иерархии


                   Локальные меню области дерева иерархии
       -----------------------------------------------------------------
            Локальное меню  области дерева иерархии содержит только один
       элемент - Inspect (Проверка). Когда вы его выбираете, для подсве-
       ченного типа выводится окно проверки типа класса/объекта. Однако,
       если вы хотите проверить подсвеченный тип,  быстрее и проще будет
       просто нажать клавишу Enter.
                            ------------¬
                 Проверка   ¦ Inspect   ¦
                            L------------
            Если вы загрузили программу на языке C++,  в которой исполь-
       зуются классы с множественным наследованием,  то  локальное  меню
       области дерева иерархии содержит два элемента: Inspect и Parents.
                             ---------------------¬
                 Проверка    ¦ Inspect            ¦
                 Предки      ¦ Parents        Yes ¦
                             L---------------------

       TDeb 3.0 #2-3                = 34 =
            Parents - это переключатель,  с помощью которого  вы  можете
       управлять выводом  "предков"  класса в области дерева порождающих
       классов. Его полезно использовать,  если проверяемый  вами  класс
       имеет множественное наследование.  По умолчанию данный переключа-
       тель имеет значение Yes (Да).
              Локальное меню области дерева порождающих классов
       -----------------------------------------------------------------
            Область дерева порождающих (родительских) классов,  если она
       присутствует,  содержит локальное меню  с  единственной  командой
       Inspect (Проверка).
                            -------------¬
                 Проверка   ¦ Inspect    ¦
                            L-------------
            Работает данная  команда аналогично команде Inspect (Провер-
       ка) локального меню области дерева иерархии,  то  есть  открывает

окно Inspector для подсвеченного типа


       окно Inspector для подсвеченного типа объекта или класса.

       TDeb 3.0 #2-3                = 35 =
                      Окно Object Type/Class Inspector
       -----------------------------------------------------------------
            Турбо отладчик предоставляет новый тип окна Inspector  (Про-
       верка) с  целью  позволить  вам проверять детали объектного типа.
       Это  окно  проверки  типов  объектов/классов  (Object  Type/Class
       Inspector).  В данном окне сведена информация о типе объекта,  но
       оно не относится к какому-либо отдельному экземпляру этого типа.
                    г==[*]==Class LinearGauge==4===[ ][ ]¬
                    ¦int-Range::Low----------------------^
                    ¦int Range::High                     -
                    ¦int Screen::MaxX                    v
                    ¦<---------------------------------->¦
                    ¦class Range *Range::ctr()           ¦
                    ¦int Range::GetValue()               ¦
                    ¦int Range::GetLow()                 ¦
                    ¦int Range::GetHigh()                ¦
                    L====================================-
            Рис. 10.2 Окно Object Type/Class Inspector
            Окно делится по горизонтали на две области, в верхней из ко-
       торых  выводится  список полей данных типа объекта,  а в нижней -
       список имен методов и (если выбранный  метод  является  функцией)
       возвращаемый функцией тип. Используйте клавишу горизонтальной та-
       буляции для   переключения  между  двумя  областями  окна  Object
       Type/Class Inspector (Проверка типов объектов/классов).
            Если подсвеченное поле данных является объектным  типом  или
       указателем  на объектный тип,  то нажатие клавиши Enter открывает
       другое окно проверки типов  объектов/классов  (Object  Type/Class
       Inspector) для подсвеченного типа. (Это действие идентично выбору

сложная вложенная структура объектов может


       элемента Inspect в локальном меню  этого  окна.)  Таким  образом,
       сложная вложенная структура объектов может быстро просматриваться
       при минимальном количестве нажатий клавиш.
            Для краткости  параметры  методов  не  показываются  в  окне
       проверки типов объектов.  Для проверки параметров метода перемес-
       тите подсветку на метод и нажмите клавишу  Enter.  Появится  окно
       проверки метода/функции (Inspector). Верхняя область окна выводит
       на экран адрес кода экземпляра типа объекта/класса для выбранного
       метода и имена и типы всех параметров метода.  Если ваша исходная
       программа написана на объектно-ориентированном Паскале, то нижняя
       область окна показывает, является ли метод процедурой или функци-
       ей.
            Нажатие клавиши Enter в любом месте окна проверки метода или
       функций-элементов классов (Inspector) выводит  на  передний  план
       окно Module (Модуль) и помещает курсор на код,  который реализует
       проверяемый метод.
            Как и в стандартном окне проверки,  нажатие клавиши Esc зак-

       TDeb 3.0 #2-3                = 36 =
       рывает текущее окно Inspector (Проверка), а нажатие клавиш Alt-F3
       закрывает их все.
               Локальное меню окна Object Type/Class Inspector
       -----------------------------------------------------------------
            Нажатие клавиш Alt-F10 выводит локальное меню любой области.
       Если  разрешено  использование  сокращений с клавишей Ctrl (с по-
       мощью утилиты TDINST),  то вы можете получить элемент  локального
       меню  путем нажатия клавиши Ctrl и первой буквы элемента. Верхняя
       область (область полей данных объектов) содержит  следующие  эле-
       менты меню:
                                       -----------------------¬
            Проверка                   ¦ Inspect              ¦
            Иерархия                   ¦ Hierarchy            ¦
            Вывод наследования         ¦ Show inherited   Yes ¦

Локальное меню области полей данных


                                       L-----------------------
                   Область полей данных объекта (верхняя)
       -----------------------------------------------------------------
            Локальное меню области полей данных объекта содержит следую-
       щите элементы:
                          Команда Inspect (Проверка)
       -----------------------------------------------------------------
            Если подсвеченное поле является объектным типом или указате-
       лем на него,  то для подсвеченного поля  открывается  новое  окно
       проверки типов объектов/классов (Object Type/Class Inspector).
                         Команда Hierarchy (Иерархия)
       -----------------------------------------------------------------
            Открывает окно иерархии объектов (Hierarchy) для проверяемо-
       го объектного типа или класса. Это окно описано выше.
                      Show Inherited (Вывод наследования)
       -----------------------------------------------------------------
            Yes (Да) является значением по умолчанию этого  переключате-
       ля.  Когда  он  установлен в значение Yes,  показываются все поля
       данных и методы (функции),  независимо от того, определены ли они
       внутри данного (проверяемого)  типа  объекта  (класса),  или  они
       унаследованы от родительского (порождающего) типа. Когда переклю-
       чатель установлен в значение No (Нет),  на экран выводятся только
       определенные внутри проверяемого типа поля и методы (функции-эле-
       менты).

       TDeb 3.0 #2-3                = 37 =
                      Область методов объекта (нижняя)
       -----------------------------------------------------------------
            Перечислим элементы  локального меню нижней области (области
       методов объектов):
                                       -----------------------¬
            Проверка                   ¦ Inspect              ¦
            Иерархия                   ¦ Hierarchy            ¦

Для подсвеченного метода  открывается  окно 


            Вывод наследования         ¦ Show inherited   Yes ¦
                                       L-----------------------
                          Команда Inspect (Проверка)
       -----------------------------------------------------------------
            Для подсвеченного метода  открывается  окно  проверки  функ-
       ции/метода (Inspector).  Если вы нажмете клавиши Ctrl-I, а курсор
       будет при этом находиться выше адреса, показанного в окне провер-
       ки метода/функции, то на переднем плане появится окно Module (Мо-
       дуль), а курсор будет находиться на коде, реализующем проверяемый
       метод (функцию).
                         Команда Hierarchy (Иерархия)
       -----------------------------------------------------------------
            Открывает окно иерархии объектов (Hierarchy) для проверяемо-
       го объекта или класса. Это окно описано выше.
                      Show  Inherit  (Вывод наследования)
       -----------------------------------------------------------------
            Yes (Да) является состоянием по умолчанию для этого переклю-
       чателя.  Когда он установлен в значение Yes,  то показываются все
       методы или функции-элементы,  независимо от того,  определены  ли
       они в проверяемом объекте (классе), или они унаследованы от роди-
       тельского типа объекта (класса). Если этот переключатель установ-
       лен в значение No (Нет),  то показываются только методы,  опреде-
       ленные в проверяемом типе объекта (класса).

       TDeb 3.0 #2-3                = 38 =
                    Окно Object/Class Instance Inspector
       -----------------------------------------------------------------
            Окна Object/Class Instance  Inspector  (Проверка  экземпляра
       объектов/классов)  обеспечивают  информацию о типах объектов,  но
       ничего не говорит о данных,  содержащихся в отдельном  экземпляре
       объекта  или  класса в данный момент выполнения программы.  Турбо

отладчик предоставляет расширенную форму знакомых


       отладчик предоставляет расширенную форму знакомых уже  окон  про-
       верки  записей  специально  для проверки экземпляров объектов или
       классов.
            Откройте это  окно путем установки курсора на экземпляр объ-
       екта в окне Module (Модуль), затем нажмите клавиши Ctrl-I.
                  г=[*]==Inspecting tw=============3==[ ][ ]¬
                  ¦@75C6:01E8                               ^
                  ¦Screen::MaxX              500    (Ox1F4) -
                  ¦Screen::MaxY              512    (Ox200) v
                  ¦<--------------------------------------->¦
                  ¦Screen::Convert       @0000:0000         ¦
                  ¦Screen::VertVtoA      @0000:0000         ¦
                  ¦Screen::VertAtoV      @0000:0000         ¦
                  ¦-----------------------------------------¦
                  ¦class TextWindow                         ¦
                  L=========================================-
            Рис. 10.3 Окно Object/Class Instance Inspector
            Большинство окон Турбо отладчика,  предназначенных для  про-
       верки данных записи, имеют две части (области). В верхней области
       выводятся имена полей записи и их текущие значения,  а в нижней -
       тип поля,  подсвеченного в верхней области. Окно проверки экземп-
       ляра объекта/класса  (Object/Class Instance Inspector) предостав-
       ляет обе эти области,  а также третью область между ними. Эта но-
       вая область  содержит  методы экземпляра объекта или функции-эле-
       менты с адресами кода для каждого метода (функции).  (Адрес  кода
       учитывается полиморфическими объектами и  в  таблице  виртуальных
       методов.)
                 Примечание: Полное описание таблицы виртуальных методов
            можно найти в руководствах по Турбо Паскалю.

       TDeb 3.0 #2-3                = 39 =
             Локальное меню окна Object/Class Instance Inspector
       -----------------------------------------------------------------

Каждая из двух верхних областей 


            Каждая из двух верхних областей  окна  проверки  экземпляром
       объектов/классов  (Object/Class  Instance  Inspector)  имеет свое
       собственное локальное меню,  которое выводится на экран путем на-
       жатия клавиш Alt-F10. Здесь вы также можете использовать сокраще-
       ния с клавишей Ctrl для получения отдельных элементов  меню, если
       их использование разрешено с помощью утилиты TDINST.
                                            ----------------------¬
                   Диапазон                 ¦ Range...            ¦
                   Изменение                ¦ Change...           ¦
                   Методы                   ¦ Methods         Yes ¦
                   Вывод наследования       ¦ Show inherited  Yes ¦
                                            +---------------------+
                   Проверка                 ¦ Inspect             ¦
                   Спуск                    ¦ Descend             ¦
                   Новое выражение          ¦ New expression...   ¦
                   Приведение типа          ¦ Type cast           ¦
                   Иерархия                 ¦ Hierarchy           ¦
                                            L----------------------
            Как и в окне проверки  записи  (Inspector),  нижняя  область
       служит  только  для вывода типа подсвеченного поля и не имеет ло-
       кального меню.
            Верхняя область, которая содержит поля данных объекта, имеет
       следующие локальные команды:
                          Команда Range... (Диапазон)
       -----------------------------------------------------------------
            Эта команда  не изменилась при переходе от более ранних вер-
       сий.  Она позволяет выводить на экран границы элементов  массива.
       Если элемент не является массивом или указателем,  то эта команда
       недоступна.
                        Команда Change...  (Изменение)
       -----------------------------------------------------------------

Путем выбора этой команды вы


            Путем выбора этой команды вы можете загрузить новые значения
       в подсвеченное поле данных. Эта команда также не претерпела изме-
       нений по сравнению с более ранними версиями Турбо отладчика.
                           Команда Methods (Методы)
       -----------------------------------------------------------------
            Эта команда является переключателем между состояниями Yes/No
       (Да/Нет) и с состоянием Yes (Да) по умолчанию. Если переключатель
       установлен в значение Yes, то методы выводятся в средней области.
       В состоянии No (Нет) средняя область отсутствует. Этот переключа-
       тель запоминается следующим окном Inspector  (Проверка),  которое

       TDeb 3.0 #2-3                = 40 =
       будет открыто.
                  Команда Show Inherited (Вывод наследования)
       -----------------------------------------------------------------
            Это элемент,  который также переключается между  состояниями
       Yes и No.  В состоянии Yes (Да) выводятся все поля данных и мето-
       ды,  независимо от того, определены ли они в проверяемом объекте,
       или они унаследованы от родительского типа.  В состоянии No (Нет)
       выводятся только те поля и методы, которые определены в проверяе-
       мом объектном типе.
                          Команда Inspect (Проверка)
       -----------------------------------------------------------------
            Как и в предыдущих версиях Турбо отладчика,  выбор этой  ко-
       манды открывает окно проверки данных (Inspector) для подсвеченно-
       го поля. Нажатие клавиши Enter над подсвеченным полем ведет к то-
       му же результату.
                            Команда Descend (Спуск)
       -----------------------------------------------------------------
            Эта команда не изменилась по отношению к более ранним верси-
       ям Турбо отладчика.  Подсвеченный элемент занимает место элемента
       в текущем окне  Inspector.  Не  открывается  никаких  новых  окон

могли бы сделать это, если


       Inspector. Однако, вы не можете вернуться к предыдущему проверяе-
       мому полю,  как  могли бы сделать это, если бы использовали пара-
       метры Inspect.
                 Примечание: Используйте команду Descend (Спуск) при вы-
            полнении трассировки сложных структур данных и когда  вы  не
            собираетесь  открывать  отдельное  окно проверки (Inspector)
            для каждого проверяемого элемента.
                  Команда New Expression... (Новое выражение)
       -----------------------------------------------------------------
           Данная команда не изменена по сравнению с предыдущими версия-
       ми Турбо отладчика.  Эта команда подсказывает вам о необходимости
       ввести  новый  элемент  данных или выражение для проверки.  Новый
       элемент замещает текущий в окне, а новое окно не открывается.
                    Команда Type Cast... (Приведение типа)
       -----------------------------------------------------------------
            Команда Type Cast (Приведение типа) позволяет вам задать для
       проверяемого элемента другой тип данных. Ее полезно использовать,
       если окно Inspector содержит идентификатор,  для которого нет ин-
       формации о типе, а также для явного задания типа указателей.
                         Команда Hierarchy (Иерархия)
       -----------------------------------------------------------------

       TDeb 3.0 #2-3                = 41 =
            При выборе  данной команды открывается окно иерархии объекта
       (Hierarchy). Полное описание этого окна приведено выше.
                          Средняя и нижняя область
       -----------------------------------------------------------------
            В среднем окне выводятся методы объекта.  Единственным отли-
       чием между локальным меню области методов и локальным меню облас-
       ти полей данных (верхняя  область)  является  отсутствие  команды
       Change (Изменение).  В отличие от полей данных,  методы  и  функ-

В нижней области выводится  тип 


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

       TDeb 3.0 #2-3                = 42 =
                   Глава 11. Отладка на уровне Ассемблера
       -----------------------------------------------------------------
            Данная глава предназначена для программистов, которые знако-
       мы с программированием на Ассемблере для процессоров серии 80х86.
                 Примечание: Вам не обязательно использовать при отладке
            программы возможности, которые здесь описаны, но при возник-
            новении определенных проблем их можно быстрее и проще устра-
            нить, если использовать описанные в данной главе методы.
            Мы поясним,  в каких случаях желательно использовать отладку
       на уровне Ассемблера. Затем мы опишем окно центрального процессо-
       ра (CPU) со встроенным дисассемблером и Ассемблером.  Вы узнаете,
       как можно с помощью данного окна проверять и модифицировать байты
       данных непосредственно в шестнадцатиричном виде,  как  анализиро-
       вать стек вызова функций, как проверять и модифицировать регистры
       центрального процессора (ЦП) и его флаги.
             Когда недостаточно отладки на уровне исходного кода
       -----------------------------------------------------------------
            В большинстве случаев при отладке программы вы ссылаетесь на
       код и данные программы на уровне исходного кода, обращаясь к име-
       нам идентификаторов точно так, как они набраны в исходном коде, и
       "проходите" программу, выполняя участки исходного кода.
            Однако иногда лучше рассмотреть проблему "изнутри", анализи-
       руя те инструкции.  которые генерирует компилятор, содержимое ре-
       гистров ЦП и его стека. Чтобы сделать это, вы должны быть знакомы
       как  с  процессором  серии 80х86,  так и с компилятором,  который

рассказывать здесь об этом подробно.


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

       TDeb 3.0 #2-3                = 43 =
                                  Окно CPU
       -----------------------------------------------------------------
            В окне CPU (ЦП) показано все состояние центрального  процес-
       сора.  С его помощью вы можете проверять и изменять биты и байты,
       составляющие код и данные программы.  В окне Code (Код) для  вре-
       менной  коррекции своей программы вы можете использовать встроен-
       ный Ассемблер.  При этом инструкции вводятся точно также, как при
       наборе исходных операторов Ассемблера.  Можно также получить дос-
       туп к соответствующим данным любой структуры данных, выводя и из-
       меняя их в различных форматах.
             г[*]=CPU 80286================================3===[ ][ ]¬
             ¦TPDEMO.120: Inc(NumLines);               ^ ax 0004 ¦c=0¦
             ¦  cs:04C4:4F36063000 inc word ptr [TPDEMO- bx 3EEE ¦z=0¦
             ¦TPDEMO.121  i := 1;                      - cx 0000 ¦s=0¦

word ptr [bp+02].000


             ¦ cs:04C8 C:43FE0100  word ptr [bp+02].000- dx 5920 ¦o=0¦
             ¦TPDEMO.122: while i <= Length(S) do      - si 3CEC ¦p=0¦
             ¦ cs:04C0 C47ED4    les  di,[bp+04]       - bp 3EF4 ¦a=0¦
             ¦ cs:0400 288A05    mov  al,es:[di]       - sp 3EF4 ¦i=1¦
             ¦ cs:0403 3D84      xor  ah,ah            - ds 5920 ¦d=0¦
             ¦ cs:0405 3B48FE    cmp ax,[bp+02]        - es 5920 ¦   ¦
             ¦ cs:0408 7D03      jnl TPDEMO.125 (04DD) - ss 595A ¦   ¦
             ¦ cs:040A 898A00    jmp TPDEMO.148        - cs 548A ¦   ¦
             ¦TPDEMO.125 while (i <= Length(S)) and notv ip 04C8 ¦   ¦
             ¦<--------------------------------------->¦-------------¦
             ¦ ds: 0000 00 00 00 00 00 00 00 00         ¦             ¦
             ¦ ds:0008 5A 5D 5A 5D 5A 5D 00 00         ¦ ss:3EF2 548A¦
             ¦ ds:0010 00 00 00 00 00 00 5A 5D         ¦ ss:3EF0>04C1¦
             ¦ ds:0018 00 00 5A 5D 00 00 00 90         ¦ ss:3EEE 0246¦
             L=======================================================-
            Рис. 11.1 Окно CPU
            Окно CPU (ЦП) можно создать,  выбрав команду основного  меню
       View¦CPU  (Обзор¦Центральный  процессор).  В зависимости от того,
       что вы просматриваете в текущем окне, окно CPU будет позициониро-
       вано на соответствующие код,  данные или стек.  Это предоставляет
       удобный способ просматривать код,  данные или стек (соответствую-
       щие  текущему положению курсора) "на нижнем уровне".  В следующей
       таблице показано,  где будет позиционирован курсор при выборе ко-
       манды CPU:
        ----------------------------------------------------------------
        Текущее окно         Область окна CPU      Позиционируется на...
        ----------------------------------------------------------------
        Окно Stack (Стек)           Stack (Стек)          Текущие SS:SP
        Окно Module (Модуль)        Code (Код)            Текущие SS:SP

Если TDW вновь получает управление


        Окно Variable (Переменная)  Данные/Код            Адрес элемента
        Окно Watches (Просмотр)     Данные/Код            Адрес элемента
        Окно Inspector (Проверка)   Данные/кодж           Адрес элемента
        Точка останова (не          Код                   Адроес точки
        глобальная)                                       останова

       TDeb 3.0 #2-3                = 44 =
        ----------------------------------------------------------------
            Если TDW вновь получает управление от вашей прикладной прог-
       раммы, а текущим выполняемым кодом является код Windows  или DLL,
       то TDW автомачески переводит вас в окно CPU.
            Строка в  верхней части окна CPU (ЦП) показывает тип процес-
       сора (8086,  80186,  80286 или 80386). Окно CPU имеет пять облас-
       тей (или  6  в TDW).  Чтобы переходить из одной области в другую,
       можно использовать клавиши Tab или Shift-Tab. В верхней левой об-
       ласти (области кода) выводится дисассемблированный код программы,
       чередующийся со строками исходного текста. Во второй области (об-
       ласти регистров) показано содержимое регистров ЦП. Правая область
       представляет собой область флагов, где выводится состояние восьми
       флагов  ЦП.  В нижней левой области (области данных) в непосредс-
       твенном шестнадцатиричном виде выводится любая выбранная вами об-
       ласть  памяти.  В  нижней правой области (области стека) показано
       содержимое стека.
            Если вы работаете с TDW,  то в окне CPU имеется дополнитель-
       ная область - область селекторов. Эта область, которая расположе-
       на слева от области кода и области данных,  показывает все селек-
       торы Windows и показывает содержимое каждого из них.
            Как и во всех других окнах,  нажатие клавиш Alt-F10 приводит
       к выводу локального меню области кода. Если разрешено использова-
       ние сокращений с клавишей Ctrl,  то нажатие клавиши Ctrl с первой

нужной команды может использоваться для


       буквой  нужной команды может использоваться для непосредственного
       доступа к команде.
            В области кода, данных и стека для смещения начального адре-
       са вывода  на  1  байт  вверх или вниз можно использовать клавишу
       Ctrl со стрелками.  Если вы хотите просто слегка сместить изобра-
       жение, это легче, чем использовать команду Goto (Переход).

       TDeb 3.0 #2-3                = 45 =
                                Область кода
       -----------------------------------------------------------------
            В этой области по выбранному вами  адресу  выводятся  дисас-
       семблированные инструкции.
                 Примечание: Стрелка (>) в области кода показывает теку-
            щий адрес программы (CS:IP). В области стека стрелка показы-
            вает текущий указатель стека (SS:SP).
            В левой  части  каждой  дисассемблированной строки выводится
       адрес инструкции.  Адрес выводится либо в виде шестнадцатиричного
       значения сегмента и смещения,  либо со значением сегмента,  заме-
       ненным именем регистра CS (если значение сегмента совпадает с те-
       кущим  значение  регистра CS).  Эта область имеет ширину (которая
       может переключаться или настраиваться),  достаточную  для  вывода
       всех образующих  инструкцию байт.  Дисассемблированная инструкция
       выводится справа.
            Если в  подсвеченной  инструкции области кода имеется ссылка
       на память,  то адрес памяти и его текущее содержимое выводятся  в
       верхней строке  окна  CPU.  Это позволяет вам увидеть как операнд
       инструкции,  который указывает на память, так и значение, которое
       будет записано или считано.
                                Дисассемблер
       -----------------------------------------------------------------
            В области  кода  автоматически дисассемблируются и выводятся
       на экран инструкции вашей  программы.  Если  адрес  соответствует

если режим вывода Mixed установлен


       глобальному,  статическому  идентификатору или номеру строки,  то
       ( если режим вывода Mixed установлен в значение Yes) перед  дисас-
       семблированной  инструкцией  выводится строка.  Кроме того,  если
       имеется строка исходного кода, соответствующая адресу идентифика-
       тора, то она выводится после идентификатора.
            Глобальные идентификаторы  выводятся  просто  в  виде  имени
       идентификатора. Статические идентификаторы выводятся в виде имени
       модуля, за которым следует символ # или точка (.) и имя статичес-
       кого идентификатора.  Номера строк выводятся в виде имени модуля,
       за которым  следует разделяющий символ # или точка (.) и десятич-
       ный номер строки.
            При выводе непосредственного операнда вы  можете  определить
       его размер по числу цифр. Непосредственное байтовое значение сос-
       тоит из 2 цифр, а непосредственное значение размером в слово - из
       4 цифр.
            Турбо отладчик  может  распознавать наличие числового сопро-
       цессора 8087/80287/80387 и дисассемблировать соответствующие инс-
       трукции с плавающей точкой.
            Мнемоника инструкции  RETF  показывает,  что  это инструкция

       TDeb 3.0 #2-3                = 46 =
       возврата дальнего типа.  Обычная мнемоника RET свидетельствует  о
       ближнем возврате.
            Там, где  это  возможно,  инструкции  JMP и CALL выводятся в
       символическом виде.  Если CS:IP указывают на инструкцию  JMP  или
       инструкцию  условного  перехода,  то  стрелка  (стрелка вверх или
       вниз), показывающая направление перехода, будет выводиться только
       в  том  случае,  если  выполнение инструкции приведет к переходу.
       Кроме того,  адреса памяти, использующиеся в инструкциях MOV, ADD
       и др., выводятся в виде символических адресов.

       TDeb 3.0 #2-3                = 47 =
                         Локальное меню области кода
       -----------------------------------------------------------------

Затем для вывода локального меню


            Если вы не перешли в область  кода,  используйте  для  этого
       клавиши Tab или Shift-Tab.  Затем для вывода локального меню наж-
       мите клавиши Alt-F10.
                       ---------------¬
                       ¦ Goto...      ¦     Переход
                       ¦ Origin       ¦     Начало
                       ¦ Follow       ¦     Следующая
                       ¦ Caller       ¦     Вызывающая
                       ¦ Previous     ¦     Предыдущая
                       ¦ Search...    ¦     Поиск
                       ¦ View source  ¦     Просмотр исходного кода
                       ¦ Mixed    Yes ¦     Смешанный
                       +--------------+
                       ¦ New cs:ip    ¦     Новый CS:IP
                       ¦ Assemble...  ¦     Ассемблер
                       ¦ I¦O        > ¦     Ввод-вывод
                       L---------------
                               Команда Goto...
       -----------------------------------------------------------------
            После выбора  команды Goto (Переход) вам выводится подсказка
       для ввода нового адреса,  на который вы хотите перейти. Вы можете
       ввести адрес,  выходящий за пределы программы, что позволяет про-
       верить базовую  систему  ввода-вывода (BIOS),  внутренние области
       DOS и резидентные утилиты.  Полное описание ввода адресов  содер-
       жится в Главе 9.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то  состояние (позицию),  которое она имела до выполнения команды
       Goto.
                               Команда Origin
       -----------------------------------------------------------------
            Команда Origin  (Начало)  позиционирует вас на текущий адрес
       программы в соответствии со значениями регистров CS:IP.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то  состояние (позицию),  которое она имела до выполнения команды

в данный момент инструкции, по


       Origin.
                               Команда Follow
       -----------------------------------------------------------------
            Команда Follow (Следующий) позиционирует вас по целевому ад-
       ресу подсвеченной в данный момент инструкции.  Область кода пози-
       ционируется  заново,  чтобы  вывести код по адресу,  указанному в
       подсвеченной в данный момент инструкции, по которому будет переда-

       TDeb 3.0 #2-3                = 48 =
       но управление. Для условных переходов адрес показывается в случае
       выполнения перехода.
            Эту команду можно использовать с инструкциями CALL, JMP, ин-
       струкциями условных переходов (JZ, JNE, LOOP, JCXZ и т.д.) и инс-
       трукциями INT.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то  состояние (позицию),  которое она имела до выполнения команды
       Follow.
                               Команда Caller
       -----------------------------------------------------------------
            Команда Caller  (Вызывающая  программа) позиционирует вас на
       инструкцию, по которой была вызвана текущая подпрограмма или пре-
       рывание.
            Данная команда будет работать не всегда.  Если процедура об-
       работки прерывания или подпрограмма занесла в стек элементы  дан-
       ных, иногда Турбо отладчик не может определить, откуда был выпол-
       нен вызов.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то состояние (позицию),  которое она имела до выполнения  команды
       Caller.
                              Команда Previous
       -----------------------------------------------------------------
            Команда Previous (Предыдущий) восстанавливает позицию облас-
       ти кода в соответствии с адресом,  который был текущим перед пос-
       ледней командой, явно изменившей его значение. Использование кла-
       виш   перемещения  (стрелок)  или  PgUp  и  PgDn  не  приводит  к

При использовании команды Previous позиция


       запоминанию позиции.
            При использовании команды Previous позиция окна кода запоми-
       нается,  поэтому  повторное использование этой команды приводит к
       переключению между двумя адресами (туда и обратно).
                             Команда Search...
       -----------------------------------------------------------------
            Команда Search  (Поиск) позволяет вам вводить инструкцию или
       список байт,  которые  вы хотите найти.  Вводите инструкцию точно
       также, как это делается в команде Assemble (Ассемблирование).
            Будьте внимательны при поиске инструкций.  Следует выполнять
       поиск только тех инструкций,  которые не изменяют байт, в которые
       они ассемблируются,  в зависимости от того,  где в памяти они ас-
       семблируются.  Например,  поиск  следующих инструкций проблемы не

       TDeb 3.0 #2-3                = 49 =
       представляет:
               PUSH    DX
               POP     [DI+4]
               ADD     AX,100
       а попытка поиска следующих инструкций может привести к непредска-
       зуемым результатам:
               JE      123
               CALL    MYFUNC
               LOOP    $-10
            Вместо инструкции  можно  вводить  также список байт.  Более
       подробно об этом рассказывается в Главе 9.
                             Команда View Source
       -----------------------------------------------------------------
            Команда View Source (Просмотр исходного кода) для вывода ис-
       ходного  кода,  соответствующего текущей дисассемблированной инс-
       трукции открывает окно Module (Модуль). Если соответствующего ис-
       ходного кода нет (например, вы находитесь в коде Windows, или от-
       сутствует  отладочная информация),  вы просто остаетесь в области
       кода.
                                Команда Mixed
       -----------------------------------------------------------------
            Локальная команда Mixed (Смешанный) позволяет  выбрать  один

из трех способов вывода на


       из трех способов вывода на экран дисассемблированных инструкций и
       исходного кода:
       No (Нет)        Исходный код не выводится,  выводятся только  ди-
                       сассемблированные инструкции.
       Yes (Да)        Перед первой дисассемблированной инструкцией, со-
                       ответствующей данной строке, выводится строка ис-
                       ходного кода.  Область устанавливается  в  данный
                       режим,  если исходный модуль написан на языке вы-
                       сокого уровня.
       Both (Оба)      Для тех  строк,  которым  соответствует  исходный
                       код,  дисассемблированные строки заменяются стро-
                       ками  исходного текста.  В противном случае выво-
                       дятся дисассемблированные инструкции. Используйте
                       этот  режим,  когда  вы отлаживаете модуль на Ас-
                       семблере и хотите видеть строку исходного текста,
                       а не соответствующую дисассемблированную инструк-
                       цию. Область устанавливается в данный режим выво-
                       да, если текущим модулем является исходный модуль
                       Ассемблера.

       TDeb 3.0 #2-3                = 50 =
                              Команда New CS:IP
       -----------------------------------------------------------------
            Команда New CS:IP (Новое значение регистров CS:IP)  устанав-
       ливает значение счетчика адреса программы (значение регистров CS:
       IP) в соответствии с текущим (подсвеченным) адресом.  При повтор-
       ном  запуске  вашей программы выполнение начнется с этого адреса.
       Это полезно использовать,  когда вы хотите пропустить  какие-либо
       участки кода, не выполняя их.
            Пользоваться данной командой нужно очень аккуратно.  Если вы
       изменяете  значение регистров CS:IP в соответствии с адресом, где
       стек имеет состояние, отличное от текущего значения CS:IP, то это

пользуйтесь этой командой, чтобы установить


       почти  наверняка  приведет к аварийному завершению программы.  Не
       пользуйтесь этой командой, чтобы установить регистры CS:IP в зна-
       чение адреса, лежащего за пределами программы.
                             Команда Assemble...
       -----------------------------------------------------------------
            Команда Assemble  (Ассемблирование) ассемблирует инструкцию,
       заменяя текущую (подсвеченную)  инструкцию.  Инструкция,  которую
       требуется  ассемблировать,  вводится в ответ на подсказку.  Более
       детально это описывается далее в данной главе в разделе  "Ассемб-
       лер".
            Данную команду можно вызвать,  если просто  начать  набирать
       оператор, который вы хотите ассемблировать. Когда вы делаете это,
       то выводится окно подсказки (так же, как при использовании коман-
       ды Assemble).
                                 Команда I/O
       -----------------------------------------------------------------
            Команда I/O (Ввод-вывод) считывает или  записывает  значение
       в пространство адресов ввода-вывода ЦП и позволяет  вам проверить
       содержимое  регистров ввода-вывода и записать в них значения. При
       этом выводится меню, показанное ниже:
                        -------------¬
                        ¦ In byte    ¦    Ввести байт
                        ¦ Out byte   ¦    Вывести байт
                        ¦ Read byte  ¦    Прочитать байт
                        ¦ Write byte ¦    Записать байт
                        L-------------
                               Команда In Byte
       -----------------------------------------------------------------
            Команда In Byte (Ввести байт) считывает байт из адреса ввода
       -вывода.  Вам будет выведена подсказка для ввода адреса ввода-вы-
       вода,  значение которого вы хотите проверить.  Для считывания  из
       адреса ввода-вывода значения размером в слово используйте команду

Вывести байт) записывает байт по



       TDeb 3.0 #2-3                = 51 =
       Read word (Считать слово).
                              Команда Out Byte
       -----------------------------------------------------------------
            Команда Out Byte ( Вывести байт) записывает байт по заданному
       адресу ввода-вывода. Вам будет выведена подсказка для ввода адре-
       са ввода-вывода и значение, которое вы хотите записать. Для запи-
       си по адресу ввода-вывода значения размером в  слово  используйте
       команду Read word (Считать слово).
                              Команда Read Word
       -----------------------------------------------------------------
            Команда Read Word (Считать слово) считывает слово  из адреса
       ввода-вывода. Вам будет выведена подсказка для ввода адреса ввода
       -вывода, значение которого вы хотите проверить. Для считывания из
       адреса  ввода-вывода значения размером в байт используйте команду
       Read byte (Считать байт).
                             Команда Write Word
       -----------------------------------------------------------------
            Команда Write  Word (Записать слово) записывает слово по ад-
       ресу ввода-вывода.  Вам будет выведена подсказка для ввода адреса
       ввода-вывода и значения, которое вы хотите записать. Для считыва-
       ния из адреса ввода-вывода значения размером в  байт  используйте
       команду Write byte (Считать байт).
            Обращаться к пространству адресов ввода-вывода, где находят-
       ся такие контроллеры периферийных устройств,  как контроллер дис-
       ка,  платы  последовательных портов и видеоадаптеры,  можно с по-
       мощью инструкций Ассемблера IN и OUT.
             Будьте внимательны при использовании данных команд. В неко-
       торых  портах  ввода-вывода  считывание из порта рассматривается,
       как значительное событие,  приводящее к тому,  что устройство вы-
       полняет некоторые действия, такие, как переустановка бита состоя-

верхняя область справа от области


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

       TDeb 3.0 #2-3                = 52 =
                         Область регистров и флагов
       -----------------------------------------------------------------
            В области регистров ( верхняя область справа от области кода)
       выводится содержимое регистров центрального процессора.
            Верхней правой областью является область флагов, где показа-
       но содержимое  восьми  флагов центрального процессора.  В области
       флагов показано значение каждого флага ЦП.  Список различных фла-
       гов и то, как они выводятся в области флагов, показан в следующей
       таблице:
                 ----------------------T-----------------------¬
                 ¦   Буква в области   ¦     Название флага    ¦
                 +---------------------+-----------------------+
                 ¦         c           ¦     Флаг переноса     ¦
                 ¦         z           ¦     Флаг нуля         ¦
                 ¦         s           ¦     Флаг знака        ¦
                 ¦         o           ¦     Флаг переполнения ¦
                 ¦         p           ¦     Флаг четности     ¦
                 ¦         a           ¦     Флаг дополнитель- ¦
                 ¦                     ¦      ного переноса    ¦
                 ¦         i           ¦     Флаг разрешения   ¦
                 ¦                     ¦      прерывания       ¦
                 ¦         d           ¦     флаг направления  ¦
                 L---------------------+------------------------
                      Локальное меню области регистров
       -----------------------------------------------------------------
            Для вывода локального меню области регистров нажмите клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,

с первой буквой нужной команды


       то  нажатие клавиши Ctrl с первой буквой нужной команды может ис-
       пользоваться для непосредственного доступа к команде.
                                          --------------------¬
                   Увеличение             ¦ Increment         ¦
                   Уменьшение             ¦ Decrement         ¦
                   Обнуление              ¦ Zero              ¦
                   Изменение              ¦ Change...         ¦
                   32-разрядные регистры  ¦ Register 32-bit No¦
                                          L--------------------
                               Команда Increment
       -----------------------------------------------------------------
            Команда Increment  (Увеличение)  добавляет  одно  значение к
       подсвеченному в данный момент регистру.  Это позволяет легко исп-
       равить небольшие ошибки в значении регистра.
                               Команда Decrement
       -----------------------------------------------------------------
            Команда Decrement (Уменьшение) вычитает 1 из значения  подс-

       TDeb 3.0 #2-3                = 53 =
       веченного в данный момент регистра.
                                 Команда Zero
       -----------------------------------------------------------------
            Команда Zero (Ноль) обнуляет содержимое текущего (подсвечен-
       ного) регистра.
                               Команда Change...
       -----------------------------------------------------------------
            Команда Change   (Изменение)  изменяет  содержимое  текущего
       (подсвеченного) регистра. Для ввода нового значения вам выводится
       подсказка.  При вводе нового значения можно использовать средство
       вычисления выражений.
            Эту команду можно вызвать также, если просто начать набирать
       новое значение регистра.  Когда вы делаете  это,  выводится  окно
       подсказки.
                           Команда Registers 32-bit

При работе на процессора 80386


       -----------------------------------------------------------------
            Команда Registers 32-bit (32-разрядные регистры) позволяет с
       вывода регистров ЦП,  как 16-разрядных значений, на 32-разрядные.
       При работе на процессора 80386 вы обычно видите 32-разрядные  ре-
       гистры (если только не использована данная команда для переключе-
       ния на 16-разрядные регистры).  32-разрядные регистры  необходимы
       только в том случае, если вы отлаживаете программу, в которой ис-
       пользуются возможности 32-разрядной адресации процессора 386. Ес-
       ли  вы  отлаживаете  обычную  программу,  в  которой используется
       16-разрядная адресация,  можно выбрать вывод 16-разрядных регист-
       ров.
                         Локальное меню области флагов
       -----------------------------------------------------------------
            Для вывода  локального  меню  области флагов нажмите клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,
       то  нажатие клавиши Ctrl с первой буквой нужной команды может ис-
       пользоваться для непосредственного доступа к команде.
                                          ---------¬
                     Переключение         ¦ Toggle ¦
                                          L---------

       TDeb 3.0 #2-3                = 54 =
                                Команда Toggle
       -----------------------------------------------------------------
            Команда Toggle (Переключение) устанавливает значение флага в
       0,  если он был равен 1,  и в 1,  если он был равен 0. Значение 0
       означает,  что флаг сброшен, а 1 - что он установлен. Для измене-
       ния (инвертирования) значения текущего (подсвеченного) флага мож-
       но также нажать клавишу Enter.

       TDeb 3.0 #2-3                = 55 =
                              Область селектора
       -----------------------------------------------------------------
            В этой области выводится список селекторов защищенного режи-

и указывается некоторая информация для


       ма и указывается некоторая информация для каждого из них.
            Селектор может быть допустимым или нет.  Допустимый селектор
       указывает на ячейку таблицы дескрипторов защищенного режима,  со-
       ответствующего адресу памяти.  Если селектор недопустим, то он не
       используется.
            Для допустимого селектора в области выводится следующее:
            - являются ли содержимым данные или код;
            - загружена ли область памяти, на которую ссылается селектор
              (присутствует в памяти) или разгружена (выведена на диск);
            - длина  сегмента  памяти,  на которую ссылается селектор (в
              байтах).
            Если селектор ссылается на сегмент данных, то имеется допол-
       нительная информация по полномочиям доступа (Read/Write - Чтение/
       Запись или Read only - только чтение)  и  направление  расширения
       сегмента в памяти (Up - вверх или Down - вниз).
                       Локальное меню области селектора
       -----------------------------------------------------------------
            Для вывода локального меню в области селектора нажмите  кла-
       виши Alt-F10, или, если разрешено использование сокращений с кла-
       вишей Ctrl, для доступа к нужной команды используйте клавишу Ctrl
       с подсвеченной буквой команды.
                                          -------------¬
                     Селектор             ¦ Selector   ¦
                     Проверка             ¦ Examine... ¦
                                          L-------------
            Локальное меню области селектора вы можете  использовать для
       перехода к  новому селектору (команда Selector) или просмотра со-
       держимого селектора,  который подсвечен в данный момент в области
       селектора (команда Examine).  Содержимое выводится в области кода
       или в области данных, в зависимости от его характера.
                               Команда Selector
       -----------------------------------------------------------------

Данная команда  выводит  вам  подсказку


            Данная команда  выводит  вам  подсказку для ввода селектора,
       который нужно вывести в области.  Для ввода селектора  вы  можете
       использовать полный синтаксис выражений. Если вы вводите числовое
       значение, то TDW подразумевает,  что оно десятичное (если  вы  не
       используете синтаксис текущего языка для указания того,  что зна-

       TDeb 3.0 #2-3                = 56 =
       чение является шестнадцатиричным).
            Например, если текущим языком является язык  Си,  вы  можете
       ввести шестнадцатиричное  значение  селектора  7F  как Ox7F.  Для
       Паскаля вы могли бы ввести его как 7F.  Чтобы перейти к селектору
       7F, можно было бы также ввести десятичное значение 127.
            Другим методом  ввода значения селектора является вывод окна
       CPU и проверка содержимого сегментных регистров. Если регистр со-
       держит интересующий вас селектор, то вы можете ввести имя регист-
       ра с предшествующим символом подчеркивания (_).  Например, вы мо-
       жете задать имя сегментного регистра данных, как _DS.
                                Команда Examine
       -----------------------------------------------------------------
            Команда Examine (Проверка) выводит содержимое области  памя-
       ти,  на которую ссылается текущий селектор, и переключается в об-
       ласть,  где выводится содержимое. Если селектор указывает на сег-
       мент   кода,   то  содержимое  выводится  в  области  кода.  Если
       содержимое представляет собой данные,  то оно выводится в области
       данных.

       TDeb 3.0 #2-3                = 57 =
                               Область данных
       -----------------------------------------------------------------
            В этой области показано непосредственное содержимое  выбран-
       ной вами области памяти.  В левой части каждой строки показан ад-
       рес данных,  выводимых на данной строке.  Адрес выводится в  виде
       шестнадцатиричного значения сегмента и смещения или значение сег-

в области выводится непосредственное содержимое


       мента заменяется именем сегмента DS,  если значение сегмента сов-
       падает с текущим содержимым регистра DS.
            Далее в области выводится непосредственное содержимое одного
       или более элементов данных. Формат этой области зависит от режима
       вывода,  выбранного  с помощью команды локального меню Display As
       (Вывести как...).  Если вы выбираете один из  форматов  вывода  с
       плавающей точкой (Copm,  Float,  Double,  Extended), то на каждой
       строке выводится одно число с плавающей точкой. При байтовом фор-
       мате на одной строке выводится 8 байт, в формате размером в слово
       (Word) - 4 слова на строку,  а в длинном  формате  (Long)  -  два
       длинных слова на строку.
            В правой части каждой строки выводятся символы, соответству-
       ющие показанным байтам.  Турбо отладчик  выводит  все  печатаемые
       значения, соответствующие байтовым эквивалентам, поэтому не удив-
       ляйтесь,  если на экране вы увидите странные символы - просто это
       символьный эквивалент шестнадцатиричных значений байт данных.
            Число байт,  выводимых  на  каждой строке бывает различным и
       зависит от формата, заданного к команде Display As.
            Если вы  используете  окно  данных  для проверки содержимого
       дисплейной памяти, данных базовой системы ввода-вывода или векто-
       ров  в младших адресах памяти,  вы увидите значения,  находящиеся
       там во время выполнения отлаживаемой программы,  а действительные
       значения при работе Турбо отладчика. Они не совпадают с теми зна-
       чениями,  которые находятся в указанных областях памяти в тот мо-
       мент,  когда вы их просматриваете. Турбо отладчик определяет, что
       вы обращаетесь к областям данных,  которые также используются  им
       самим, и извлекает значения этих данных из их копии для программы
       пользователя.

       TDeb 3.0 #2-3                = 58 =
                        Локальное меню области данных

Для вывода  локального  меню  области


       -----------------------------------------------------------------
            Для вывода  локального  меню  области данных нажмите клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,
       то  нажатие клавиши Ctrl с первой буквой нужной команды может ис-
       пользоваться для непосредственного доступа к команде.
                      -----------------¬
                      ¦ Goto           ¦  Переход
                      ¦ Search         ¦  Поиск
                      ¦ Next           ¦  Следующая
                      ¦ Change         ¦  Изменение
                      ¦ Follow        >¦  Следовать
                      ¦ Previous       ¦  Предыдущий
                      +----------------+
                      ¦ Display as    >¦  Вывести как...
                      ¦ Block         >¦  Блок
                      L-----------------
                                 Команда Goto
       -----------------------------------------------------------------
            Команда Goto (Переход) позиционирует вас на адрес  в данных.
       Введите  новый  адрес,  на  который вы хотите перейти.  Вы можете
       ввести внутренний адрес DOS,  адрес,  расположенный в резидентных
       утилитах  или  вне  вашей программы,  что позволяет вам проверить
       данные в базовой системе ввода-вывода.  Полное описание ввода ад-
       ресов содержится в Главе 9.
                                Команда Search
       -----------------------------------------------------------------
            Команда Search (Поиск) выполняет поиск строки символов,  на-
       чиная с текущего адреса памяти, указанного позицией курсора. Вве-
       дите список байт для поиска.  При достижении конца сегмента поиск
       не будет автоматически возобновляться с его начала.
            Подробнее о списках байт рассказывается в Главе 9.
                                 Команда Next
       -----------------------------------------------------------------

щему месту расположения курсора. Если


            Команда Next  (Следующий) выполняет поиск следующего вхожде-
       ния списка  байт,  который  вы задали ранее в команде Search (По-
       иск).
                               Команда Change...
       -----------------------------------------------------------------
            Команда Change (Изменение) позволяет изменять байты по теку-
       щему месту расположения курсора. Если содержимое выводится в коде
       ASCII  или  в байтовом формате,  то выводится подсказка для ввода

       TDeb 3.0 #2-3                = 59 =
       списка байт.  В противном случае запрашивается элемент, соответс-
       твующий текущему формату вывода.  Полное описание списка байт со-
       держится в Главе 9.
            Эту команду можно вызвать также, если просто начать набирать
       новое значение или значения. Когда вы делаете это, выводится окно
       подсказки (как при использовании команды Change).
                                Команда Follow
       -----------------------------------------------------------------
            По данной команде выводится следующее локальное меню:
                                 --------------------------¬
               Ближний код       ¦ Near code               ¦
               Дальний код       ¦ Far code                ¦
                                 +-------------------------+
               Смещение данных   ¦ Offset to data          ¦
               Сегмент:смещение  ¦ Cegment:offset to data  ¦
               Базовый сегмент   ¦ Base segment:0 to data  ¦
                                 L--------------------------
                               Команда Near Code
       -----------------------------------------------------------------
            Данная команда  интерпретирует  слово под курсором в области
       данных, как смещение в текущем сегменте кода  (как  это  задается
       регистром CS). Область кода становится текущей областью и позици-
       онируется на данный адрес.