ГЛАВА 3


 Отладка за 30 Минут
   3.1 Введение
   3.2 Вызов Всплывающего Окна
   3.3 Возврат Из Окна
   3.4 Изменение Размера Окна
   3.5 Перемещение Окна
   3.6 Клавиши Редактирования
   3.7 Диалоговая Строка Состояния
   3.8 Синтаксис Команд
   3.8.1 Определение Адресов Памяти
   3.9 Функциональные Клавиши
   3.10 Помощь
   3.11 Обучающая Часть

      15


 3.1 Введение

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

Окно сразу выводится во весь экран, если вы используете
файл конфигурации Soft-ICE (S-ICE.DAT), включенный
в дистрибутив.


 3.2 Вызов Всплывающего Окна

Вы можете вызвать окно в любое время после установки Soft-ICE. По умолчанию
Soft-ICE вызывается нажатием клавиш CTRL и D. Однако, эта комбинация
может быть изменена, при помощи команды ALTKEY (см. часть 5.8).


 3.3 Возврат Из Окна

Вернитесь к первоначальному экрану, используя команду X или комбинацию
клавиш, которую вы использовали для вызова Soft-ICE. Любые точки останова,
которые вы установили во время работы в Soft-ICE, останутся в силе.


 3.4 Изменение Размера Окна

Вы можете изменять как ширину, так и высоту окна Soft-ICE.
Изменение размера окна особенно полезно в автономном режиме, когда на экран
выводится память с кодом программы.

 16

Высота окна может изменяться от 8 до 25 строк. Для изменения высоты
окна используйте следующие комбинации клавиш:

    ALT Up -- увеличивает высоту окна
    ALT Down -- уменьшает высоту окна

Для изменения ширины окна, используйте команду WIN (см. часть 5.9).
Ввод WIN без параметров переключает следующие два режима:

   режим WIDE - полная ширина экрана
   режим NARROW - ширина 46 символов

Некоторые команды (то есть D, E, R, U) используют преимущество большой ширины
для вывода большего количества информации, когда окно находится в режиме WIDE.


 3.5 Перемещение Окна

Окно Soft-ICE подвижно и может быть помещено куда угодно на
экране. Это особенно полезно, когда окно находится в режиме NARROW.
Перемещайте окно в любое время, когда вам нужно видеть информацию на экране за
окном. Следующие комбинации клавиш перемещают окно:

    CTRL Up -- на строку вверх
    CTRL Down -- на строку вниз
    CTRL Right -- на одну позицию вправо
    CTRL Left -- на одну позицию влево


3.6 Клавиши Редактирования

Простой в использовании строковый редактор Soft-ICE позволяет повторно вызы-
вать и редактировать предыдущие команды. Функции строкового редактора подобны
функциям популярного редактора CED.

      17

 Следующие комбинации клавиш помогают при редактировании команд в окне команд:
    Right   -- перемещает курсор вправо
    Left    -- перемещает курсор влево
    INS     -- переключает режим вставки
    DEL     -- удаляет текущий символ
    HOME    -- перемещает курсор в начало строки
    END     -- перемещает курсор в конец строки
    Up      -- выводит предыдущую команду
    Down    -- выводит следующую команду
    SHIFT Up -- прокрутка на одну строку вверх
    SHIFT Down -- прокрутка на одну строку вниз
    PAGE UP -- прокрутка на одну страницу вверх
    PAGE DN -- прокрутка на одну страницу вниз
    BKSP    -- удаляет предыдущий символ
    ESC     -- отменяет текущую команду

Есть специальные назначения клавиш, когда курсор находится в окне данных или
окне кода. Они описаны в частях для команд E и EC соответственно. Одно из
таких специальных назначений - SHIFT Up и SHIFT Down, когда курсор находится в
окне кода. Эти клавиши переназначаются так, что они выполняют функции, которые
обычно выполняют клавиши Up и Down. Таким образом вы можете повторно вызывать
предыдущие команды, когда курсор находится в окне кода.


 3.7 Диалоговая Строка Состояния

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

      18


 3.8 Синтаксис Команд

Soft-ICE - отладочный инструмент с командным управлением. Для взаимодействия с
Soft-ICE вы вводите команды, которые могут изменяться при помощи параметров.

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

Выражения - обычно числа, но могут также быть комбинациями чисел и операторов
(например, + - / *). Все числа выводятся в шестнадцатеричном формате.
Параметры типа byte - 2 цифры длиной, параметры типа word - 4 и параметры
типа double word - 2 параметра типа word, разделенные двоеточием (:).
Вот несколько примеров параметров:

    12 -- параметр типа byte
    10FF -- параметр типа word
    E000:0100 -- параметр типа double word


Вместо байтов или слов в выражении могут использоваться регистры. Например,
команда " U CS:IP-10 " начнет дизассемблирование инструкций с адреса, находя-
щегося за десять байт до текущего адреса в указателе команд. В выражениях
могут использоваться следующие названия регистров:

   AL, AH, AX, BL, BH, BX, CL, CH, CX, DL, DH,
   DX, DI, SI, BP, SP, IP, CS, DS, ES, SS или FL


 3.8.1 Определение Адресов Памяти

Много команд Soft-ICE требуют в качестве параметров адреса памяти. Адрес
памяти - это значение, состоящее из двух 16-битных слов, разделенных
двоеточием. Первое слово - адрес сегмента, второе слово - смещение
сегмента.

       19

В любой команде Soft-ICE вместо адреса могут использоваться публичные символы.
Публичные символы могут быть загружены в Soft-ICE загрузчиком программ
(LDR.EXE). См. главу 7 (Символы и Исходный текст) для получения полного описа-
ния использования публичных имен.

Интерпретатор выражений Soft-ICE распознает несколько специальных символов в
объединении с адресами. Это следующие специальные символы:

    $ -- Текущий CS:IP.
    @адрес -- указатель типа double word
    .число -- номер строки в исходном тексте

Символ $ может использоваться вместо CS:IP при вводе текущего адреса указателя
команд.

Символ @ позволяет вам обращаться к двойному слову, на которое указывает
адрес. Вы можете использовать несколько уровней @.

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

Примеры:
   U.1234
    Эта команда начинает дизассемблирование инструкций в строке 1234(десятич.)
    исходного текста.

    U $-10
    Эта команда дизассемблирует инструкции,  начинающиеся за 10
    байт до текущего адреса в указателе команд.

      20

    G @SS:SP
    Предполагает, что вы - на первой инструкции обработчика
    прерывания. Ввод этой команды установит временную точку
    останова на адрес возврата в стеке и пропускает подпрограмму
    обработчика прерывания.


 3.9 Функциональные Клавиши

Функциональные клавиши могут назначаться на выполнение любой командной строки,
которая может быть введена в Soft-ICE. Их можно переназначать из командной
строки или заранее путем их определения в файле S-ICE.DAT.

По умолчанию S-ICE.DAT, поставляемый на дистрибутивной дискете, содержит
определения для всех 12 функциональных клавиш. Вы можете изменять любое из
этих определений в любое время. Они присутствуют в качестве примера, но они
предназначены для облегчения работы пользователей Microsoft CodeView, по умол-
чанию работают следующие назначения:

    F1 -- Выводит общую помощь (H;)
    F2 -- Включает окно регистров (^WR;)
    F3 -- Изменяет текущий режим работы с исходным текстом (^SRC;)
    F4 -- Восстанавливает экран (^RS;)
    F5 -- Возвращается в вашу программу (^X;)
    F6 -- Переключает курсор между окном команд и
             окном кода (^EC;)
    F7 -- Прогоняет программу до текущей позиции курсора (^HERE;)
    F8 -- Выполняет одиночную инструкцию (^T;)
    F9 -- Устанавливает точку останова в текущей позиции курсора (^BPX;)

      21


    F10 - Выполняет подпрограмму или цикл (^P;)
    F11 - Перейти к адресу возврата (большая модель)
              (^G @SS:SP;)
    F12 - выводит номер версии Soft-ICE (^VER;)

 Знак "сaret" (^), предшествующий команде, делает ее невидимой, точка с
запятой (;) после команды производит перевод строки. Вы можете вывести на
экран текущие назначения функциональных клавиш, введя команду:

 FKEY

Для использования функциональной клавиши просто нажмите ее вместо ввода
команды. При необходимости программирования функциональных клавиш, см.
часть 5.8 для получения описания команды FKEY или главу 6 для получения
описания предварительной инициализации функциональных клавиш в S-ICE.DAT.


 3.10 Помощь

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

   ? или H -- выводит краткие описания всех
                      команд и операторов
   ? команда или
   H команда -- выводит более детальную информацию по
                      указанной команде, синтаксис и
                      пример
   ? выражение или
   H выражение -- выводит значение выражения в шестнадцатеричном,
                      десятичном и ASCII формате

      22


 3.11 Обучающая Часть

Эта обучающая часть демонстрирует некоторые из возможностей Soft-ICE и дает
вам возможность попробовать использовать Soft-ICE. Soft-ICE может быть
использован вместе с другим отладчиком или как автономный отладчик. Обучающая
часть демонстрирует использование Soft-ICE как дополнение к отладчику DOS
DEBUG, а потом показывает, каким образом Soft-ICE может использоваться как
автономный отладчик с загруженным исходным текстом и символами. DEBUG можно
найти на системной дискете PC DOS или MS DOS. Если у вас нет DEBUG, вы можете
найти другой отладчик или использовать Soft-ICE как автономный отладчик.

Пользователи, которым необходимо использовать Soft-ICE для "обратного проекти-
рования" или для отладки загружаемых драйверов устройств DOS или резидентных
программ, также должны пройти эту обучающую часть. Даже если примеры программ
этих типов непосредственно не демонстрируются, вы получите представление об
отладке при помощи Soft-ICE. Рекомендуется поэкспериментировать с Soft-ICE и
вашим специфическим окружением до начала работы с реальным проектом.

Для демонстрации аппаратных точек останова используется короткая программа на
языке ассемблера с тонким изъяном. Программа-пример была сделана максимально
короткой и ясной для тех, кто не очень знаком с языком ассемблера. Обучающая
часть предназначена для того, чтобы дать вам почувствовать возможности
Soft-ICE. Не стесняйтесь экспериментировать по собственной инициативе после
прохождения обучающей части.

Так как Soft-ICE очень гибок, он позволяет вам загружать его оптимальным для
вашей системы образом. Пройдите процедуры установки в части 2.2 перед тем
как продолжить изучать обучающую часть.

Если у вас в системе нет расширенной памяти, вы должны загрузить Soft-ICE
из командной строки. При загрузке Soft-ICE из командной строки вы не сможете
загружать символы или файлы с исходными текстами. В этом случае вы должны
перейти к последней

      23

 теме обучающей части, где Soft-ICE используется как автономный отладчик.

Soft-ICE может быть загружен из командной строки DOS или как драйвер
устройства в CONFIG.SYS. Для этой обучающей части вы должны установить
Soft-ICE в CONFIG.SYS с хотя бы 50КБ расширенной памяти для символов и
файлов с исходным текстом. Soft-ICE должен быть первым драйвером устройства,
установленным в CONFIG.SYS. Строка установки устройства должна выглядеть так:

      DEVICE = диск:\путь\S-ICE.EXE /SYM 50

Параметр /SYM 50 указывает Soft-ICE резервировать 50 килобайтов расширенной
памяти для символов и файла с исходным текстом. Этого недостаточно для решения
реальных задач, но будет работать с нашей программой-примером.

Вы должны перезагрузить вашу систему после помещения этой строки в CONFIG.SYS.

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

            Soft-ICE Ваше имя Название вашей компании # SInnnnnn
Copr. (C) Nu-Mega Technologies 1987-1989 All Rights Reserved Soft-ICE
Version 2.00 Soft-ICE is loaded from 00132000H up to 00160000H. 50K of
symbol space reserved. 10K of back trace space reserved. 200 K of extended
memory available.

      24

Сообщение "Soft-ICE загружен ..." указывает вам точную область
памяти, которая занята Soft-ICE и его компонентами. Если у вас
Compaq или клон Compaq и включено слово COMPAQ в ваш файл S-ICE.DAT,
вы также увидите сообщение : "Using high memory from XXXXXXXX to
00FE0000H".

Следующая строка сообщает, сколько памяти было зарезервировано под символы.
Эта память используется для символов и файлов с исходными текстами.

Следующая строка сообщает, сколько памяти было зарезервировано для истории
обратной трассировки. По умолчанию резервируется 10КБ. Эта область памяти
используется командой SNAP и командой BPR с опциями T или TW.

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

Перейдите в директорию вашего жесткого диска, в которую вы поместили все
файлы с вашей дистрибутивной дискеты. Помните, что этот каталог должен быть
доступен через переменную PATH.

Прежде чем начинать тяжелую отладку, давайте вызовем окно Soft-ICE и
произведем его проверку.
    Очистите экран, введя:
      CLS
    Вызовите окно Soft-ICE, нажав:
       CTRL D

Теперь окно Soft-ICE - на экране. Если ваш файл S-ICE.DAT доступен
через переменную PATH, то окно Soft-ICE будет занимать весь экран. Он
будет разделен на четыре части. Сверху вниз эти части :
окно регистров, окно данных, окно

      25

кода и окно команд. Если S-ICE.DAT не был найден, у вас будет маленькое окно
в центре экрана. Это также означает, что другие компоненты, необходимые для
обучающей части, не были загружены.

Если видимо маленькое окно, вы должны:
    1. Выйти из Soft-ICE, введя X.
    2. Выгрузить Soft-ICE, введя S-ICE /U.
    3. Скопировать файл S-ICE.DAT с дистрибутивной
         дискеты в каталог, доступный через существующую
         переменную PATH.
    4. Повторно начать демонстрационный пример.

Сейчас мы перейдем к маленькому окну. Маленькое окно очень
удобно для использования Soft-ICE в дополнение к другому отладчику.

    Введите:
      WIN

Это приведет к появлению маленького окна команд в центре экрана вместо большо-
го. На этом экране видно несколько команд Soft-ICE. Это - остатки строки
инициализации из S-ICE.DAT, которые первоначально установили Soft-ICE в
полноэкранный режим.

Вы заметите символ стимула (:) и строку состояния в нижней части
окна.

Окно Soft-ICE может перемещаться относительно экрана, так же может быть
отрегулирован размер окна.

   Переместите окно по экрану, нажимая:
        CTRL Up -- перемещает окно на одну строку вверх
        CTRL Down -- перемещает окно на одну строку вниз
        CTRL Right -- перемещает окно на одну позицию вправо
        CTRL Left -- перемещает окно на одну позицию влево

      26

   Измените размер окна так, чтобы оно заполнило весь экран,
   введя:
      WIN

Вы увидите, что восстановился первоначальный экран.

   Вернитесь к маленькому окну, снова введя
   WIN.
   Сделайте окно выше или ниже, нажимая:

      ALT Up -- делает окно выше
      ALT Down -- делает окно ниже

Теперь представьте, что происходит, когда вы - перед новой программой и точно
не знаете, что делать дальше -- вы просите помощи.

Получите помощь, введя:
       ?

Обратите внимание, что вывод на экран прекращается до нажатия любой клавиши
прежде чем прокрутить информацию по экрану. Посмотрите на строку состояния в
в нижней части окна. В строке состояния выведены инструкции: "Любая клавиша -
продолжение, ESC - отмена". Теперь нажмите любую клавишу, для продолжения вы-
вода информации помощи. Продолжайте нажимать клавишу до повторного появления
стимула (:).

    Прокрутите информацию помощи назад, нажав
      SHIFT Up

Выведенная ранее информация может прокручиваться в окне команд при помощи
клавиш shift вверх, shift вниз, page up и page down. Попробуйте разные
клавиши для перемещения по информации помощи.

      27

Средство помощи Soft-ICE дает вам краткий обзор каждой команды. Если
вы введете знак вопроса (?) сопровождаемый названием команды, вы увидите
экран, показывающий синтаксис команды, краткое описание команды
и пример.

   Попробуйте поэкспериментировать с помощью, вводя команды в
   следующем формате:
     ? команда
   Например,
     ? ALTKEY

Если вы запутались, обратите внимание на сообщения в строке состояния в нижней
части экрана.

Команда помощи также позволяет вам вычислять шестнадцатеричные выражения.

    Например, введите:
     ? 10*2+42

    Результирующий экран показывает вам значение выражения, сначала в
    шестнадцатеричном, потом десятичном, а потом в
    ASCII - представлении:
      0062 00098 "b"

Мы вызвали окно комбинацией клавиш CTRL D. Некоторых это устраивает, но вы
можете предпочесть использовать другую комбинацию клавиш.

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

      28

   Введите букву "A". Строка состояния покажет список всех
   команд,  начинающихся с буквы "A". Завершите
   ввод слова "ALTKEY". Строка состояния теперь
   покажет короткое описание команды ALTKEY
   Нажмите "пробел". Строка состояния теперь покажет
   требуемый синтаксис для команды ALTKEY. Наберите
   буквы "ALT D" потом нажмите ВВОД, чтобы ввести полную
   команду:

     ALTKEY ALT D

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

    Для выхода из окна, введите:
       ALT D

Окно Soft-ICE только что исчезло.
    Чтобы вернуться в окно Soft-ICE, отпустите клавишу ALT,
    а потом нажмите:
       ALT D

Окно восстановилось.
    Для просмотра предыдущих команд, нажмите:
    клавишу Up несколько раз.


      29

Имейте в виду, что Soft-ICE помнит команды, которые были введены. Попробуйте
отредактировать одну просто для забавы. Вот некоторые клавиши редактирования:

         INS  -- переключает режим вставки
         DEL  -- Удаляет один символ
         HOME -- Перемещает курсор в начало строки
         END  -- Перемещает курсор в конец строки
         Right -- Перемещает курсор на символ вправо
         Left  -- Перемещает курсор на символ влево

Имейте в виду, что когда включен режим вставки, курсор принимает форму блока.

Теперь, когда вы немного знакомы с окружением, давайте, попробуем некоторые
другие команды.

    Сотрите команду, которую вы редактировали, нажав
    клавишу HOME, потом нажимая клавишу DEL пока
    команда не исчезнет.

    Введите:
           WR

Команда WR делает видимым окно регистров. Окно регистров
показывает содержимое регистров 8086. Заметьте что значения регистров
отражают местоположение, где выполнялся код, когда вы вызвали
Soft-ICE.

Команда WR назначена в файле инициализации Soft-ICE, S-ICE.DAT
на функциональную клавишу F2.

    Нажмите клавишу F2 несколько раз, и вы увидите, как
    включается/выключается окно регистров. Оставьте окно
    регистров видимым.

      30

   Увеличьте вертикальный размер окна Soft-ICE, держа
   нажатыми ALT и Up, пока окно не займет весь экран.
    Запомните значения регистров CS и IP в окне
    регистров, потом введите:

       MAP

Команда MAP покажет карту памяти системы. Область текущего указателя
инструкций (CS:IP) будет подсвечена. Если у вас сложная карта памяти,
вам может быть придется несколько раз нажать клавишу, пока вновь не появится
командная строка.

    Теперь попробуйте следующую последовательность несколько раз, запоминая
    регистры (CS:IP) в окне регистров.
      ALT D
      Отпустите ALT и D
      ALT D

Каждый раз при возвращении в окно Soft-ICE, вы будет замечать что
регистры CS и IP изменились. Когда CS и IP изменились, вы может ввести
команду MAP снова и посмотреть, показывает ли теперь указатель инструкций
на другую область.

Это небольшое упражнение демонстрирует, что Soft-ICE является отладчиком
системного уровня, который всплывает по горячей комбинации клавиш Soft-ICE,
куда бы ни показывал указатель инструкций. Указатель инструкций непрерывно
меняется, потому что выполняется множество команд между вызовами, даже когда
вы - в командной строке DOS, типа прерываний таймера, работы драйверов
устройств DOS, занятости DOS при ожидании других прерываний и т.д.

      31

    Нажмите функциональную клавишу F12.

Функциональной клавише F12 по умолчанию назначена команда VER.
Она выводит сообщение об авторских правах на Soft-ICE и номер версии.
Теперь мы назначим функциональной клавише F12 команду RS.

    Введите:
       RS

Она временно покажет экран программы без окна Soft-ICE.
    Нажмите "пробел", чтобы вернуться в окно
    Soft-ICE.
    Введите:
      FKEY F12 RS;

Это назначает команду RS на клавишу F12. Точка с запятой заменяет
клавишу ВВОД.
    Нажмите клавишу F12.

Повторите это несколько раз для переключения между окном Soft-ICE и
экраном программы. Теперь удостоверьтесь, что выведено окно Soft-ICE,
при необходимости, нажав клавишу F12. Вы заметите, что RS выведен в окне
несколько раз. Одно появление на экране команды RS соответствует одному
нажатию клавиши F12, чтобы показать экран программы.

    Очистите окно Soft-ICE, введя:
       CLS
      32

    Введите:
      FKEY F12 ^RS;

символ (^) - shift + 6. Это назначит команду RS клавише F12,
но сделает эту команду невидимой.

    Нажмите клавишу F12 несколько раз. Заметьте что команда
    RS больше не выводится в окне Soft-ICE.


Вы также можете назначать функциональной клавише последовательность команд.
Не забывайте ставить знак возврата каретки между командами.
Теперь давайте подготовимся использовать Soft-ICE в дополнение к утилите
MS-DOS DEBUG.

    Уберите окно регистров, нажав F2.
    Потом сократите размер окна до приблизительно 6 строк
    используя ALT Down.
    Введите:
      ACTION INT3

Эта команда заставляет Soft-ICE сгенерировать int 3 при выполнении условий
точки останова. Таким образом, Soft-ICE будет взаимодействовать с DEBUG.
Установка по умолчанию - HERE. ACTION HERE будет заставлять возвращать
управление непосредственно Soft-ICE. Используйте ACTION HERE при работе с
Soft-ICE как с автономным отладчиком.

Тем, кто не использует DEBUG с этой обучающей частью, теперь возможно придется
импровизировать. CODEVIEW работает с ACTION установленным на NMI. Большинство
других отладчиков будет работать с ACTION INT3. Если ваш отладчик не делает
этого и вам необходима помощь для импровизации, обратитесь к полному
описанию ACTION (см. часть 5.4).

      33

    Для того чтобы снова убрать окно Soft-ICE, введите:
        X

Это - альтернативный метод для выхода из Soft-ICE. Это особенно
полезно при переопределениях функциональных клавиш.

Теперь, когда вы знакомы с некоторыми из азов использования Soft-ICE, давайте
вникнем в некоторые детали, отлаживая программу-пример (SAMPLE.ASM).

SAMPLE.ASM - простая программа, написанная на Ассемблере
программистом по имени Jed. Программа читает нажатия клавиш из DOS и выводит
сообщение, говорящее был ли нажат пробел.

   Для запуска программы SAMPLE, введите:
      SAMPLE

Теперь нажмите "пробел". Нажмите несколько клавиш. Очевидно у программы Jed'а
проблемы! Jed потратил часы, изучая этот исходный код, и уверен, что в его
логике нет никаких недостатков. Однако, Jed позаимствовал несколько
вспомогательных подпрограмм у его друга Jake'а (get_key, is_space?). Jed
немного подозревает эти подпрограммы, но не может найти ошибку.

      34

Исходный код программы Jed'а выглядит следующим образом:

   Page 55,80
   Title Пример программы для обучающей части Soft-ICE
 DATA Segment Public 'Data'
 pad       db 12H dup(O)
 char db 0
 answer db 0
 space_msg db 'Был нажат ПРОБЕЛ',0DH,0AH,'$'
 no_space_msg db 'Введенный символ - НЕ '
              db 'ПРОБЕЛ',0DH,0AH,'$'
 DATA Ends
 STACK Segment Stack 'Stack'
   Dw 128 Dup (?)     ;Стек программы
 STACK Ends
 CODE Segment Public 'Code'
 Assume CS:CODE,DS:DATA,ES:Nothing,SS:STACK

start:


; Устанавливаем сегменты
   mov ax,DATA
   mov es,ax
   mov ds,ax

; Основной цикл программы
main_loop:
    call get_key
    call is_space?
    cmp answer,0
    je no_space
; Это пробел, выводим сообщение о пробеле

      35

   mov ah,9
   mov dx,offset space_msg
   int 21H
   jmp main_loop
; Это НЕ пробел, выводим сообщение об отсутствии пробела

no_space:
   mov ah,9
   mov dx,offset no_space_msg
   int 21H
   jmp main_loop

;----------------------------------------------------------;
; ПОДПРОГРАММЫ JAKE'а
;----------------------------------------------------------;

; Подпрограмма Get Key (одна из подпрограмм Jake'а)
get_key proc
   mov ah,8
   int 21H
   mov char,al
   ret
get_key endp

; Проверка, является ли символ пробелом (одна из подпрограмм Jake'а)

is_space? proc
   cmp char,20H
   jne not_space
   mov answer,1
   ret
not_space:
   mov cs:answer,0
   ret
is_space? endp

CODE Ends
     End start

      36

Jed использовал DEBUG, но не был способен решить проблему с его помощью. По
рекомендации его племянника Jethro, Jed купил Soft-ICE. Он немного сомневался
в необходимости этого, потому что он уже пытался использовать отладчик
аппаратного уровня, но так и не смог заставить его правильно работать. Он
хотел попробовать Soft-ICE, потому что он мог бы продолжать использовать DEBUG
- единственный отладчик, с которым он действительно умеет работать.

    Нажмите CTRL C, чтобы выйти из программы.
    Введите следующие команды:
      DEBUG диск:\путь\SAMPLE.EXE
        U
        R

За часы, которые Jed потратил, пытаясь найти эту неуловимую ошибку, он понял,
что что-то непонятным образом записывается поверх его кода. Jed решает при
помощи Soft-ICE установить точку останова на диапазон его сегмента кода.

     Нажмите:
       ALT D

Окно Soft-ICE вернулось. Переместите окно (с использованием
CTRL и клавиш стрелок), пока не будет виден экран регистров
DEBUG. Настало время установить нашу первую точку останова.

     Введите:
         BPR сег. кода:0 сег. кода:25 W

Сег. кода - значение в регистре CS, показываемое
при помощи команды R в DEBUG.

Команда BPR устанавливает точку останова на диапазон памяти. Длина сегмента
кода Jed'а - 25H байт, так что указанный диапазон памяти продолжается от
начала его кода до конца. W сообщает Soft-ICE останавливаться при записи
в этот диапазон. Мы хотим перехватить любую неожиданную запись в код Jed'а.

      37

    Введите:
        BL


Команда BL покажет все точки останова. Вывод после команды BL
выглядит следующим образом:

   0) BPR сег. кода:0000 сег. кода:0025 W C = 01

0 - идентификатор этой точки останова. Диапазон и W
показаны, так как были введены, а счетчик (так как он не был определен)
по умолчанию равен 1.

Теперь настал момент истины.
   Нажмите ALT D.

Окно снова исчезает.
   Чтобы запустить SAMPLE из DEBUG, введите:
        G
    Нажмите "пробел". Пока все Ok. Теперь нажмите непробельную
    клавишу.

Наша точка останова только что пробудила DEBUG. Выведены регистры и
одна дизассемблированная инструкция.

    Введите:
       U cs:адрес

Адрес - значение регистра IP минус 10 (шестнадцатеричное). Так как DEBUG
довольно примитивен, значение регистра IP минус 10 должно быть рассчитано
вручную. Указатель инструкции указывает на инструкцию, следующую за той,
которая активизировала точку останова. Возвратом на десять (шестнадцатеричных)
байт мы синхронизируем DEBUG с нужной нам инструкцией.

      38

Инструкция по смещению 3BH:
       CS:
       MOV BYTE PTR [13],0

Jed говорит, "Вот оно! Я так и знал, что проблема была во вспомогательных
подпрограммах Jake'а! Инструкция выходящая за его сегмент кода записывает
нулевой байт прямо в мой код! Кто мог об этом знать!"

    Введите:
        U 0

Местоположение 13H должно являться смещением инструкции условного перехода.
Относительное смещение условного перехода устанавливается в ноль. Если вы
являетесь гуру в 8086, вы, очевидно, знаете, что JE НИКОГДА не сработает,
если относительное смещение - ноль. Какая тонкая ОШИБКА!

Теперь давайте разберемся, как эта проблема была бы решена при использовании
Soft-ICE как автономного отладчика. Но сначала мы должны выйти из DEBUG.

Перед выходом из отладчика будет неплохо дезактивировать все точки останова,
если ACTION не установлена на HERE. Если вы это не сделаете, то когда
выполнится останов и ACTION попробует вернуться к отладчику, который не
загружен, результаты будут непредсказуемы. Мы изменили ACTION на INT3,
следовательно, мы должны отменить точку останова.

   Для вызова окна введите:
      ALT D

    Просмотрите список точек останова, введя:
        BL

      39

Обратите внимание, что строка описания точки останова выделена.
Выделенная точка останова - последняя выполненная точки останова.

    Заметьте, что номер точки останова - 0. Для дезактивации
    точки останова с номером ноль, введите:
      BD 0
    Снова просмотрите список точек останова, введя:
        BL

Звездочка (*) после номера точки останова покажет, что точка останова
неактивна.

    Чтобы удалить точку останова, введите:
      BC 0
   Снова введите BL.

Обратите внимание, что не выведено ни одной строки с точками останова.

   Выйдите из Soft-ICE, а потом из отладчика,
   введя:
        X
        Q

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

Для подготовки Soft-ICE производить отладку на уровне исходного текста,
он должен быть установлен в вашем файле CONFIG.SYS и часть расширенной памяти
должна быть занята для символов и файлов с исходными текстами. Soft-ICE может
использоваться как отладчик на уровне исходного текста, только если в вашей
системе есть расширенная память. Если у вас нет
      40

расширенной памяти вы все равно можете прочитать остаток обучающей части,
чтобы увидеть возможности Soft-ICE с расширенной памятью. Если вы не загрузили
S-ICE.EXE в ваш файл CONFIG.SYS с памятью, зарезервированной для символов,
сделайте это сейчас.

Для отладки программы-примера Soft-ICE как автономным отладчиком мы
должны использовать загрузчик программ Soft-ICE (LDR.EXE). Чтобы загрузить
пример программы (SAMPLE.EXE), файл символов (SAMPLE.SYM) и файл с исходным
текстом (SAMPLE.ASM), введите:

      LDR SAMPLE

Теперь вы - в Soft-ICE с SAMPLE.EXE, загруженным в память. Заметьте
что Soft-ICE занимает весь экран. Soft-ICE переключается в полноэкранный
режим всякий раз, когда загружается программа. Исходный текст из SAMPLE.ASM
должен быть виден в окне кода. Кроме того, видимы окно регистров и окно
данных.

    Выполните одну инструкцию, нажав F10.

Обратите внимание, что видео курсор перемещается на следующую инструкцию,
которая будет выполнена на следующем шаге программы.

    Нажмите F6.

Это переместит курсор в окно кода.
    Теперь поэкспериментируйте с клавишами Up, Down, PageUp и
    PageDn, для перемещения курсора и прокрутки
    исходного файла.
    Переместите курсор до 42 строки с клавишей Down.

      41

    Нажмите F9.
Мы только что установили точку останова при выполнении на строку 42. Строка
должна выделиться, показывая, что точка останова установлена.

    Введите:
            BL

Это покажет точку останова, которую мы только что установили.
   Теперь нажмите ALT D.

Произойдет выход из Soft-ICE, выполнение программы-примера, пока не произойдет
останов в строке 42. Soft-ICE должен немедленно восстановиться, с выделенным
видео курсором на строке 42.

   Снова нажмите F6.

Это вернет курсор в командное окно. Теперь введите:
      BC *

Это уничтожит все точки останова (хотя должна быть установлена только одна).
    Теперь выйдете из Soft-ICE, нажав ALT D.

Вы вернулись к программе-примеру. Нажмите несколько клавиш, чтобы
удостовериться, что она все еще не работает.
   Теперь вызовите Soft-ICE при помощи ALT D.

Так как ошибка уже произошла, мы хотим повторно начать программу. Введите:
      EXIT RD

      42

Эта команда принудительно завершает программу-пример. R сообщает Soft-ICE о
необходимости восстановить векторы прерываний в состояние, в котором они были
когда была загружена LDR'ом программа-пример. D сообщает Soft-ICE о
необходимости удалять все активные точки останова. R и D необязательны в этом
случае, но неплохо будет выработать привычку к их указанию при выходе из
программы, загруженной LDR.EXE.

   Теперь вы вернулись к командной строке DOS. Загрузите программу,
   снова введя:

      LDR SAMPLE.EXE

Заметьте, что сейчас было введено расширение .EXE. Когда указано расширение,
Soft-ICE не пытается загружать файл символов или файл с исходным текстом.
В нашем случае файлы символов и исходного текста уже - в памяти.

    Введите:
      SYM

Будут выведены все публичные символы программы-примера.
    Нажмите Esc, чтобы вернуться к командной строке.

Теперь установим точку останова на диапазон, такую же, как мы устанавливали
когда использовали Soft-ICE как дополнение к отладчику. На этот раз мы будем
использовать символы, чтобы установить точку останова. Введите:

      BPR START .82 W

Это установит точку останова на диапазон на наш сегмент кода от символа
START до 82 строки исходного файла.

    Введите:
        BL

Вы можете проверить, что точка останова установлена должным образом.

      43

   Нажмите ALT D.
   Нажмите непробельную клавишу.

Мы вернулись в Soft-ICE. Заметьте что текущая инструкция (строка с
инвертированным видео курсором) - инструкция, идущая после той, что вызвала
останов.

    Чтобы увидеть фактический код нажмите клавишу F3.

Это переводит Soft-ICE в смешанный режим. Заметьте, что видео курсор покрывает
2 строки. Это - фактическая строка кода и строка кода из исходного файла
с текущей инструкцией.

   Еще раз нажмите клавишу F3.


Сейчас мы - в режиме кода. Никакие исходные строки не видны. Инструкция,
находящаяся выше инвертированного видео курсора - инструкция, вызвавшая
останов на диапазон.

   Нажмите клавишу F3 еще раз, чтобы вернуться к режиму исходного текста.

Теперь исправим ошибку в программе-примере.
   Выйдите из программы и вернитесь в командную строку DOS,
   введя:
      EXIT RD

    Загрузите программу снова, введя:
      LDR SAMPLE.EXE

    Установите окно кода в режим кода, дважды нажав
    клавишу F3.
    дизассемблируйте неправильную подпрограмму, введя:
    U not_space

      44

Сейчас мы используем интерактивный ассемблер Soft-ICE, чтобы решить проблему.

    Введите:
      A not_space

Soft-ICE выдаст в своей командной строке адрес.
    Введите:
      NOP
    Нажмите ВВОД для выхода из ассемблера.

Обратите внимание, что в окне кода появилась инструкция NOP вместо
перекрытия CS по смещению 003BH.

    Нажмите клавишу F3, чтобы вернуться к режиму исходного текста, (исходный
    код, конечно, не изменился).
   Нажмите ALT D, чтобы запустить исправленную программу-пример.

    Нажмите:
        Пробел и несколько непробельных клавиш

Работает! Вы исправили ошибку!
    Для выхода из программы Jed'а и возврата в DOS, введите:
      CTRL C

Теперь мы продемонстрируем другую особенность Soft-ICE.
    Введите:
      LDR SAMPLE.EXE

Это загрузит программу-пример еще раз.

      45

    Введите:
      RIP HANG_EXAMPLE

Первые две показанных инструкции:
   CLI
   JMP $

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

    Введите:
      BREAK ON

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

   Выйдите из Soft-ICE, нажав ALT D.
   Ваша система теперь зависла. Для неверующих, нажмите:
      CTRL ALT DEL

Ничего не случилось! Она определенно зависла.
   Теперь нажмите ALT D.

Окно Soft-ICE - вернулось!
   Чтобы выйти из бесконечного цикла, введите:
      EXIT RD

Сейчас вы вернулись в DOS. Попробуйте произвести какие-нибудь действия, чтобы
почувствовать снижение производительности. Много людей считают удобным
оставлять BREAK ON как конфигурацию по умолчанию.

      46

   Отключите режим BREAK, введя:
      ALT D
      BREAK OFF
      ALT D

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

      47

      Не заполнено

      48

     РАЗДЕЛ II -- Команды

 Раздел II содержит списки синтаксиса для каждой команды Soft-ICE и
объяснения и примеры для каждой команды. Все числа находятся в
шестнадцатеричном формате; любое число может быть выражением с использованием
+,-,/,* или регистров. Все команды нечувствительны к регистру букв. Слова,
выделенные курсивом в выражениях синтаксиса команд должны быть заменены
фактическими значениями, вместо их ввода курсивом.

В этой части везде используются следующие письменные условные обозначения:
[] -- Скобками выделяется необязательный пункт синтаксиса.
< > -- Угловыми скобками выделяется список пунктов
                   или вариантов.
x | y -- Вертикальной чертой разделяются альтернативы.
                   Используйте или пункт x или пункт y.
count -- Счетчик - байтовое значение, которое определяет
                   количество случаев возникновения условий останова, которое
                   должен быть пропущено перед фактической точкой останова.
                   Если счетчик не определен, принимается
                   значение по умолчанию 1. Каждый раз как
                   вызывается окно Soft-ICE'а, значения
                   счетчика переустанавливаются на первоначально указанные
                   значения.
verb -- Опция - значение, определяющее на какой тип
                   доступа будет настроена точка останова. Он
                   может быть установлен на "R" для чтения, "W" для записи,
                   "RW" для чтения и записи или "X" для
                   выполнения.
address -- Адрес - значение, состоящее из двух 16-битных
                   слов, разделенных двоеточием. Первое
                   слово - адрес сегмента,

      49

                   второе слово - смещение сегмента.
                   Адреса могут состоять из выражений с
                   регистрами и символов.
                   Адрес может также содержать специальные
                   символы "$", "." и "@". См. часть
                   3.8 (Синтаксис Команд) для описания
                   этих специальных символов.
break-number -- Номер останова - идентификационный номер, который
                   определяет точку останова, используемый
                   при управлении точками останова
                   (Например, их редактирование, удаление, активация или
                    дезактивация). Номером останова может
                    быть шестнадцатеричная цифра от 0 до F.
list -- Список - ряд номеров останова, разделенных
                    запятыми или пробелами.
mask -- Маска - битовая маска, представленная:
                    комбинацией единиц, нулей и X'ов. X'ы -
                    любые биты.

   Пример:

   BPIO 21 W EQ M 1XXX XXXX

   Эта команда вызовет останов, который произойдет, если в порт
   21H будет произведена запись набора битов в вышеуказанном порядке.

GT, LT -- GT и LT - определители команды
                 беззнакового сравнения значений.

      50


~~\ Перевел Сергей Середа, 1998, Кишинев 24-71-96, /~~
~~\ e-mail: serge_sereda@hotmail.com /~~


[   ВЕРНУТЬСЯ К ОГЛАВЛЕНИЮ   ]