
Глава 12
Сопроцессор 80х87 и эмулятор
-----------------------------------------------------------------

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

     В этой  главе рассмотрены различия между сопроцессором 80х87
и его программным эмулятором.  Описывается также  окно  числового
процессора  (Numeric  Processor)  и объясняется,  как проверять и
модифицировать содержимое регистров сопроцессора, битов состояния
и управляющих битов.

     Глава предназначена  для  программистов,  знакомых с работой
математического сопроцессора 80х87.

Сравнение сопроцессора 80х87 и его эмулятора
--------------------------------------------

     Отладчик Turbo Debugger автоматически определяет, использует
ли программа  арифметический  сопроцессор  или  его  эмулятор,  и
соответствующим образом настраивает свою работу.

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

Окно числового процессора
-----------------------------------------------------------------

     Окно числового  процессора открывается командой View/Numeric
Processor главного  меню.  В  верхней  строке  окна  отображается
текущее  содержимое  указателя  команд,  указателя  данных  и код
операции текущей команды.  Указатель данных  и  указатель  команд
отображаются  в  виде 20- битовых физических адресов.  Эти адреса
можно преобразовать в формат  <сегмент>:<смещение>,  взяв  первые
четыре  разряда в качестве значения сегмента и последний разряд в
качестве значения смещения.

     Например, если   в   верхней   строке   записано    значение
IPTR=5A669,  можно  рассматривать  его  как  адрес  5a66:9,  если
требуется проверить текущие данные и команду в  окне  процессора.
Окно  числового  процессора  имеет  три  подокна:  левое  подокно
(подокно регистров)  отображает  содержимое  регистров  данных  с
плавающей точкой, среднее подокно (подокно управления) отображает
состояние управляющих флагов,  правое подокно (подокно состояния)
показывает значения флагов состояния.

     Рис. 12.1 Окно числового процессора

     В верхней   строке   приводится   информация   о   последней
выполненной  операции  с  плавающей   точкой.   IPTR   показывает
20-битовый  физический адрес,  по которому была вызвана последняя
команда с плавающей точкой.  OPCODE  показывает  тип  выполненной
команды.  OPTR  показывает  20-битовый  физический  адрес области
памяти,  к которой обращалась  выполненная  команда,  если  такая
имеется.

Подокно register    ---------------------------------------------

80-разрядные регистры данных с плавающей точкой
------------------------------------------------

     В подокне регистров отображается содержимое  всех  регистров
данных  с плавающей точкой (ST(0) - ST(7)) и их состояние (valid/
zero/special/empty). Содержимое регистров отображается в виде 80-
разрядного числа с плавающей точкой.

     Если увеличить  размеры  окна  числового  процессора  (нажав
клавишу   F5)   или   расширить    его    с    помощью    команды
Window/Move/Resize,   можно  просматривать  содержимое  регистров
данных в виде строк шестнадцатиричных байтов.

Локальное меню подокна регистров
--------------------------------

     --------
     Zero
     Empty
     Change
     --------

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

Команда Zero
------------

     Устанавливает в ноль значение выделенного курсором регистра.

Команда Empty
-------------

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

Команда Change
--------------

     Загружает новое значение  в  регистр,  выделенный  курсором.
Отладчик  запрашивает  значение,  которое  необходимо  загрузить.
Можно ввести целое или вещественное  значение,  используя  полный
синтаксис  выражений  языка Си.  Введенное значение автоматически
преобразуется к 80-битовому формату промежуточных данных, который
используется в числовом процессоре.

     Эту команду  можно  также  вызвать,  просто  начав вводить с
клавиатуры новое значение для выделенного регистра.  При этом  на
экране  появляется  поле  запроса,  точно  такое же,  как если бы
команда Change была выбрана из меню.

Подокно Control   -----------------------------------------------

Управляющие биты
----------------

     В следующей  таблице перечислены различные управляющие флаги
и указано их назначение.

     -------------------------------------------------------
       Название флага         Назначение
       в подокне
     -------------------------------------------------------
          im             Маска неверной операции
          dm             Маска ненормализованного операнда
          zm             Маска деления на нуль
          om             Маска переполнения
          um             Маска отрицательного переполнения
          pm             Маска точности
          iem            Маска запроса на прерывание
                         (только для 8087)
          pc             Управление точностью
          rc             Управление округлением
          ic             Управление бесконечностью
     ------------------------------------------------------


Локальное меню подокна управления
---------------------------------

     ----------
     Toggle
     ----------

     Перейдите в окно  управления,  нажав  клавиши  Shift-Tab,  а
затем вызовите его локальное меню,  нажав клавиши Alt-F10. (Можно
также  сразу  вызвать  нужную  команду,  нажав  клавишу  Ctrl   в
сочетании с первой буквой ее названия.)

Команда Toggle
--------------

     Циклически изменяет  значение  выделенного  курсором   флага
состояния. Большинство флагов может принимать только два значения
(0 и 1);  для них  команда  Toggle  переключает  флаг  во  второе
возможное  значение.  Часть  флагов  может принимать более одного
значения;  для  них  эта  команда   последовательно   увеличивает
значение флага, пока не будет достигнуто максимальное значение, а
затем сбрасывает его в ноль.

     Значение флага можно также изменять с помощью клавиши Enter.


Подокно Status  -------------------------------------------------

Биты состояния
--------------

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

          ----------------------------------------------
            Название флага         Назначение
            в подокне
          ----------------------------------------------
               ie             Неверная операция
               de             Ненормализованный операнд
               ze             Деление на нуль
               oe             Переполнение
               ue             Отрицательное переполнение
               pe             Точность
               ir             Запрос на прерывание
               cc             Код условия
               st             Указатель вершины стека
          ----------------------------------------------

Локальное меню подокна состояния
--------------------------------

     -------------
     Toggle
     -------------

     Нажмите клавишу Tab,  чтобы перейти в подокно  состояния,  а
затем нажав клавиши Alt-F10,  вызовите его локальное меню. (Можно
также  сразу  вызвать  нужную  команду,  нажав  клавишу  Ctrl   в
сочетании с первой буквой ее названия.)

Команда Toggle
--------------

     Циклически изменяет  значение  выделенного  курсором   флага
состояния. Большинство флагов может принимать только два значения
(0 и 1);  для них  команда  Toggle  переключает  флаг  во  второе
возможное  значение.  Часть  флагов  может принимать более одного
значения;  для  них  эта  команда   последовательно   увеличивает
значение флага, пока не будет достигнуто максимальное значение, а
затем сбрасывает его в ноль.

     Значение флага можно также изменять с помощью клавиши Enter.


