ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 6


                                      - 55 -
           
           
                                                                   
                     6. КОМАНДЫ КОНТРОЛЯ ДАННЫХ И ВЫРАЖЕНИЙ
                                                                    
               
               
                                    СОДЕРЖАНИЕ
                                                                   
                                                                     Лист
           
               6.      Команды контроля данных и выражений............ 55
               6.1.    Введение....................................... 56
               6.2.    Команда "Вычислить выражение" (?).............. 56
               6.3.    Команда "Контроль имен переменных" (X)......... 58
               6.4.    Дамп-команды (D)............................... 59
               6.4.1.  Команда "Дамп" (D)............................. 60
               6.4.2.  Команда "Дамп байт" (DB)....................... 61
               6.4.3.  Команда "Дамп ASCII" (DA)...................... 61
               6.4.4.  Команда "Дамп целых" (DI)...................... 62
               6.4.5.  Команда "Дамп беззнаковых целых" (DU).......... 62
               6.4.6.  Команда "Дамп слов" (DW)....................... 63
               6.4.7.  Команда "Дамп двойных слов" (DD)............... 63
               6.4.8.  Команда "Дамп коротких плавающих" (DS)......... 63
               6.4.9.  Команда "Дамп длинных плавающих" (DL).......... 64
               6.4.10. Команда "Дамп  10-байтовых  плавающих"(DT)..... 65
               6.5.    Команда "Регистр" (R).......................... 65
               6.6.    Команда "8087" (7)............................. 66
           
.
                                      - 56 -
         
         
               6.1. Введение
 
               CodeView  отладчик  обеспечен несколькими командами анализа
         данных: вычисления выражений, просмотра значений переменных,  от-
         резков  памяти  и регистров. Команды контроля данных, описанные в
         этой главе, приведены ниже:
                
               Команда                    Действие
                
         Вычислить выражение         Вычислить  и вывести  значение
                (?)                выражения или идентификатора.
                                       
         Контроль имен (X?)          Вывести адрес имени.
                                       
         Дамп (D)                    Вывести      кусок     памяти,
                                   содержащий    данные;    несколько
                                   вариантов команды просмотра данных
                                   в различном формате.
                                       
         Регистры (R)                Показ    текущего     значения
                                   регистров и флагов.
                                       
         8087 (7)                    Показ     текущих     значений
                                   регистров    8087    или     80287
                                   процессора.
                

               6.2. Команда "Вычислить выражение" (?)
                
               Команда  "Вычислить  выражение" (?) предназначена для прос-
         мотра значений CodeView выражений.
               CodeView  выражения должны быть любыми "C"выражениями, сос-
         тавленными из констант, имен, адресов и выражений. Отладчик  под-
         держивает операции, описанные в главе 4. "Диалоговые команды".
               Эта команда разрешает побочные эффекты. Например,  если  вы
         хотите высветить значение выражения ++i командой "Вычислить выра-
         жение", то в результате ее выполнения значение i увеличится на 1.
               Можно специфицировать формат, в котором будет высвечиваться
         значение  выражения.  Тип  спецификации  следующий:  <запятая>  и
         . Помните, что спецификации форматов
         CodeView  базируются  на использовании им "C" printf функции. Они
         даны в табл. 6.1.

           
           
                                                               Таблица 6.1
                                                               
         -----------------------------------------------------------------
           Символ      Формат вывода         Примерное       Пример
                                             выражение       вывода
         -----------------------------------------------------------------
             d     Десятичный      знаковый    ?40000,d        -25536
                   целый.
             i     Десятичный      знаковый    ?40000,i        -25536
                   целый.

                                      - 57 -
         
         
             u     Десятичный   беззнаковый    ?40000,u         40000
                   целый.
             o     Восьмеричный беззнаковый    ?40000,o        116100
                   целый.
            x|X    Шестнадцатиричный целый.    ?40000,x         9c40
            (1)
             f     Знаковое  значение float   ?(float)3/2,f  1.500000
                   в десятичном формате с 6
                   цифрами после запятой.
            
            e|E    Знаковое  значение float   ?(float)3/2,e  1.500000e+000
            (2)    в десятичном формате с 6
                   цифрами  после запятой и
                   порядком.
                   
            g|G    Знаковое  значение float   ?(float)3/2,g      1.5
            (2)    в компактном виде.
                   
             c     Знаковое символьное.         ?65,c             A
                   
             s     Символы  печатаются   до     ?"строка",s     строка
                   первого нулевого символа.
         
         
               Если x маленькое, то шестнадцатеричные цифры A-F высвечива-
         ются маленькими буквами, если нет, то нет.
               Если  e или g маленькие, то указатель порядка высвечивается
         маленькой буквой, если нет, то нет.
         
               Если спецификатор формата не указан, значения типа float  и
         double высвечиваются в g формате; если тип выражения знаковый, то
         в формате d, а если беззнаковый, то в формате u. Указатели высве-
         чиваются в формате u.
               Префикс h используется с целыми спецификаторами (d,o,u,x,X)
         для спецификации short int, префикс l используется для специфика-
         ции long int.
         
               Примечание:
               Спецификаторы  n  и  p  и  префиксы F и H не поддерживаются
         CodeView.
         

               Mouse.
               Для вычисления значения выражения  укажите  View  заголовок
         из  сроки меню и вытащите Evaluate-команду. Введите в появившемся
         диалоговом окошке выражение и формат,  нажмите  Enter  или  любую
         кнопку mouse'а.
                
               Клавиатура.
               Для  вычисления  значения выражения  выберите ALT+V и ALT+E
         ключами Evaluate-команду из View-меню. Введите в появившемся диа-
         логовом окошке выражение и формат, нажмите Enter или любую кнопку
         mouse'а.

               Диалоговая.

                                      - 58 -
         
         
               Для вывода значения выражения  введите диалоговую команду в
         следующем синтаксисе:
         
               ? <выражение> [,<формат>]
               
               Примеры:
               
               >? 92,X   ; * преобразование из 10-тичного в 16-ричный
                  5C
               >? 109*37,o  ; * вычисление 109*37  в 8-ричном формате
                  7701
               >? 'T'       ; * 10-тичный код 'T'
                  84
               >? 118,c     ; * символ с кодом 118
                  v
               >? ++student.age ; * значение student.age увеличить на
                                ; 1 и вывести.
                  19
                
                
               6.3. Команда "Контроль имен переменных" (X)
                
               Команда  "Контроль  имен  переменных" (X) предназначена для
         демонстрации символьных имен и их адресов, имен модулей, входящих
         в программу. Этой  командой  можно  специфицировать  демонстращию
         имен или группы имен, конкретного модуля или процедуры.
                
               Mouse.
               Эту команду нельзя ввести mouse'ом.

               Клавиатура.
               Эту команду нельзя ввести спецключами.
                
               Диалоговая.
               Для того, чтобы увидеть адрес имени, введите диалоговую ко-
         манду в следующем синтаксисе:
         
                X *
                X? [<модуль>!][<функция>.][<имя>][*]
                
               Различные варианты команды демонстрируют следующие символь-
         ные имена:

           
           
         -----------------------------------------------------------------
                    Синтаксис                     Имя
         -----------------------------------------------------------------
           X?<модуль>!<функция>.<имя>    Специфицированное        имя
                                         специфицированной    функции
                                         специфицированного модуля.
                                         
           X?<модуль>!<функция>.*        Все  имена специфицированной
                                         функции   специфицированного
                                         модуля.

                                      - 59 -
         
         
                                         
           X?<модуль>!<имя>              Специфицированное        имя
                                         специфицированного   модуля;
                                         имена       из       функций
                                         (автоматические            и
                                         статичаские)              не
                                         рассматриваются.
                                         
           X?<модуль>!*                  Все     глобальные     имена
                                         специфицированного модуля.
                                         
           X?<функция>.<имя>             Специфицированное        имя
                                         специфицированной   функции.
                                         Функция   ищется  сначала  в
                                         текущем модуле, а  потом  во
                                         всех остальных.
                                         
           X?<имя>                       Ищется специфицированное имя
                                         в таком порядке:
                                         1) в текущей функции;
                                         2) в текущем модуле;
                                         3) в остальных модулях.
                                         
           X?*                           Все имена текущей функции.
           
           X*                            Имена всех модулей.
           
           
               Примеры:
               
               >x*      ; * вывод  имен  2  модулей  и  библиотечного
                             файла, который данные модули вызывают.
                PI.OBJ
                MATH.OBJ
                C:B(chkstk)
                .
                .
                .
                C:B(unlink)
               >
                
               >x?*                    ; * все имена текущей функции.
                     DI    int       d
                [BP-0006]  int       quotient
                     SI    int       i
                [BP-0002]  int       remainder
                [BP+0004]  int       divisar
                

               6.4. Дамп-команды (D..)
                
               Отладчик оснащен  несколькими  командами  для  дампирования
         данных из памяти на экран (или другое устройство вывода).
               Вот они:
               D                  Дамп (размер определен текущим типом).

                                      - 60 -
         
         
               DB                 Дамп байт.
               DA                 Дамп ASCII.
               DI                 Дамп целых.
               DU                 Дамп беззнаковых целых.
               DW                 Дамп слов.
               DD                 Дамп двойных слов.
               DS                 Дамп коротких плавающих.
               DL                 Дамп длинных плавающих.
               DT                 Дамп 10-байтовых плавающих.
               
               Mouse.
               Дамп-команды не могут быть введены mouse'ом.
                
               Клавиатура.
               Дамп-команды не могут быть введены спецключами.
                
               Диалоговые.
               Для  выполнения  дамп-команды  введите  команду в следующем
         формате:
         
                D[<тип>] [<адрес>:<отрезок>]
                
               <Тип> - однобуквенный спецификатор, указывающий вид, в  ко-
         тором  будет выводиться дамп. Дамп-команда ожидает в качестве ар-
         гумента стартовый <адрес> или <отрезок> памяти. Если введен  <ад-
         рес>,  то команда берет отрезок умолчания (обычно 128 байт), если
         введен отрезок, то команда делает дамп от начала до конца  отрез-
         ка.  Если ни <адрес>, ни <отрезок> не заданы, команда берет теку-
         щий дамп-<адрес> как стартовый и <отрезок> умолчания. Большинство
         дамп-команд имеют <отрезок> умолчания 128 байт, но команды  дампа
         плавающих по умолчанию выводят один объект.
               Текущий дамп-адрес -  адрес следующего за последним байтом,
         специфицированным  предыдущей  дамп-командой.  Текущий дамп-адрес
         при старте CodeView равен началу сегмента данных (DS).
           
           
               Примечание:
               Дамп-команды, выводящие данные с плавающей запятой (DS, DL,
         DT), могут высветить следующие символьные значения:  #NAN,  #INF,
         #IND.  NAN  говорит о том, что данные не могут быть  представлены
         как плавающие, INF - что данные без конца, IND -  что  данные  не
         определены.
         
               В разделах 6.3.1 - 6.3.10  описаны варианты дамп-команд.
                
                
               6.4.1. Команда "Дамп" (D)
                
               Синтаксис:
               
               D[<адрес>:<отрезок>]
               
               Дамп-команда  выводит  содержимое памяти, специфицированное
         <адресом> или <отрезком>. Команда выводит данные в  <умалчиваемом
         типе>.  <Умалчиваемый  тип>  -  последний  тип, специфицированный

                                      - 61 -
         
         
         Dump-, Enter-, Watch Memory- или Trasepoint Memory-командой. Если
         ни одна из них не была употреблена, то умалчиваемый <тип> -  бай-
         товый.
               Вывод дамп-команды занимает одну или более строк, в зависи-
         мости от спецификации <отрезка>. Дамп-команда должна быть отделе-
         на от адресного спецификатора одним или более пробелом. Например,
         для  дампа массива A  нужно набрать D A, а не DA (DA будет проин-
         терпретированно как дамп-ASCII команда).
                
                
               6.4.2. Команда "Дамп байт" (DB)
                
               Синтаксис:
               
               DB [<адрес>:<отрезок>]
               
               Дамп-байт-команда выводит 16-ричные и ASCII- значения  бай-
         тов, специфицированных <адресом> или <отрезком>.
               Вывод  дамп-байт-команды займет одну или более строк, в за-
         висимости от спецификации <отрезка>. По умолчанию CodeView  берет
         <отрезок> длиной 128 байт.
               Каждая  срока  вывода  содержит  шестнадцать байт, в начале
         строки находится полный адрес  первого  байта  строки.  16-ричные
         значения  байт прокомментированы ASCII-значениями. ASCII-значения
         байтов больших 126 и меньших 32 выводятся как точки.
         
               Пример:
           
     >DB 0 36
     3D5E:0000 53 6F 6D 65 20 6C 74-74 65 72 73 20 61 6E 64    Some letters and
     3D5E:0010 20 6E 75 6D 62 65 72 73-3A 00 10 EA 89 FC FF EF  numbers:.......
     3D5E:0020 00 F0 00 CA E4                                   ...........
     >
           
           
               6.4.3. Команда "Дамп ASCII" (DA)
                
               Синтаксис:
               
               DA [<адрес>:<отрезок>]
               
               Дамп-ASCII-команда выводит ASCII - символы, специфицирован-
         ные <адресом> или <отрезком>.
               Вывод дамп-ASCII-команды занимает одну или более  строк,  в
         зависимости  от  спецификации  <отрезка>. Если в команде не задан
         <отрезок>, команда выводит либо 128 байт, либо  меньше,  если  ей
         встретится  '\0' символ.  Команда  выводит по 64 символа в строке.
         Значения байтов больших 126 и меньших 64 при выводе заменяются на
         точки.
           
               Пример:
               
               >DA 0
               3D7C:0000  Some letters and numbers:
               >

                                      - 62 -
         
         
           
               >DA 0 36
               3D7C:0000  Some letters and numbers:..............
               >
           
           
               6.4.4. Команда "Дамп целых" (DI)
                
               Синтаксис:
               
               DI [<адрес>:<отрезок>]
               
               Дамп целых - команда, выводящая целые  знаковые  десятичные
         значения слов (2-х байт), специфицированных <адресом> или <отрез-
         ком>.
               Вывод команды дамп-целых займет одну или более строк, в за-
         висимости от спецификации <отрезка>. Если <отрезок> не специфици-
         рован, то по умолчанию дамп-целых-команда выводит 64 слова.
               Каждая  срока  вывода содержит восемь слов, в начале строки
         находится полный адрес первого слова строки.
         
               Пример:
           
               >DI 0 36
               3D5E:0000 28499 25965 27680 29797 25972 29554 24864 25710
               3D5E:0010 28192 28021 25954 29554    58 -5616  -887 -4097
               3D5E:0020 -4096-13824  2532
               >
           
                
               6.4.5. Команда "Дамп беззнаковых целых" (DU)
                
               Синтаксис:
               
               DU [<адрес>:<отрезок>]
                
               Дамп беззнаковых целых - команда, выводящая целые беззнако-
         вые десятичные значения слов (2-х байт), специфицированных <адре-
         сом> или <отрезком>.
               Вывод команды дамп-беззнаковаковых-целых  займет  одну  или
         более строк, в зависимости от спецификации <отрезка>. Если <отре-
         зок>  не  специфицирован,  то  по  умолчанию дамп-беззнаковых-це-
         лых-команда выводит 64 слова.
               Каждая срока вывода содержит восемь слов, в  начале  строки
         находится полный адрес первого слова строки.
         
               Пример:
           
               >DU 0 36
               3D5E:0000 28499 25965 27680 29797 29972 29554 24864 25710
               3D5E:0010 28192 28021 25954 29554    58 59920 64649 61439
               3D5E:0020 61440 51712  2532
               >
                
                

                                      - 63 -
         
         
               6.4.6. Команда "Дамп слов" (DW)
                
               Синтаксис:
               
               DW [<адрес>:<отрезок>]
               
               Дамп  слов  - команда, выводящая шестнадцатеричные значения
         слов (2-х байт), специфицированных <адресом> или <отрезком>.
               Вывод команды дамп-слов займет одну или более строк, в  за-
         висимости от спецификации <отрезка>. Если <отрезок> не специфици-
         рован, то по умолчанию дамп-слов выводит 64 слова.
               Каждая  срока  вывода содержит восемь слов, в начале строки
         находится полный адрес первого слова строки.
         
               Пример:
           
               >DW 0 36
               3D5E:0000 6F53 656D 6C20 7465 6574 7372 6120 646F
               3D5E:0010 6E20 6D75 6562 7372 003A EA10 FC89 EFFF
               3D5E:0020 F000 CA00 09E4
               >

                
               6.4.7. Команда "Дамп двойных слов" (DD)
                
               Синтаксис:
               
               DD [<адрес>:<отрезок>]
                
               Дамп двойных слов -  команда,  выводящая  шестнадцатеричные
         значения двойных слов (4-х байт), специфицированных <адресом> или
         <отрезком>.
               Вывод  команды  дамп-двойных-слов  займет  одну  или  более
         строк, в зависимости от спецификации <отрезка>. Если <отрезок> не
         специфицирован, то по умолчанию команда дамп-двойных-слов выводит
         32 двойных слова.
               Каждая срока вывода содержит четыре пары  слов,  в  которых
         первое  и  второе слово разделены двоеточием (:); в начале строки
         находится полный адрес первого слова строки.
         
               Пример:
           
               >DD 0 36
               3D5E:0000 656D:6F53 7465:6C20 7372:6574 646E:6120
               3D5E:0010 6D75:6E20 7372:6562 EA10:003A EFFF:FC89
               3D5E:0020 CA00:F000 6F73:09E4
               >
                

               6.4.8. Команда "Дамп коротких плавающих" (DS)

               Синтаксис:
               
               DS [<адрес>:<отрезок>]
                

                                      - 64 -
         
         
               Дамп коротких плавающих - команда,  выводящая  шестнадцате-
         ричные и десятичные значения коротких (4 байта) плавающих, специ-
         фицированных <адресом> или <отрезком>.
               Вывод команды дамп-коротких-плавающих займет одну или более
         строк, в зависимости от спецификации <отрезка>. Если <отрезок> не
         специфицирован,  то  по умолчанию команда дамп-коротких-плавающих
         выводит одно значение.
               В каждой строке вывода содержится по одному значению,  каж-
         дое значение выводится в таком формате:
         
               <адрес>   <4 16-ричных байта>   <десятичное значение>,
               
         где <десятичное значение> имеет вид:
         
               [-]<цифра>.<десят.цифры>E<+>:<-><мантисса>
                   
               Пример:
           
               >DS s_pi
               5E68:0100  DB OF 49 40 3.141593E+000
               >
                
                
               6.4.9. Команда "Дамп длинных плавающих" (DL)

               Синтаксис:
               
               DL [<адрес>:<отрезок>]
                
               Дамп длинных плавающих - команда, выводящая шестнадцатерич-
         ные  и десятичные значения длинных (8 байт) плавающих, специфици-
         рованных <адресом> или <отрезком>.
               Вывод команды дамп-длинных-плавающих займет одну или  более
         строк, в зависимости от спецификации <отрезка>. Если <отрезок> не
         специфицирован,  то  по  умолчанию команда дамп-длинных-плавающих
         выводит одно значение.
               В каждой строке вывода содержится по одному значению,  каж-
         дое значение выводится в таком формате:
         
               <адрес>   <8 16-ричных байта>   <десятичное значение>,
               
         где <десятичное значение> имеет вид:
         
               [-]<цифра>.<десят.цифры>E<+>:<-><мантисса>
               
               Пример:
           
               >DL l_pi
               5E68:0200 11 2D 44 54 FB 21 09 40 3.141593E+000
               >
                
                

                                      - 65 -
               
               
               6.4.10. Команда "Дамп 10-байтовых плавающих" (DT)

               Синтаксис:

               DT [<адрес>:<отрезок>]
                
               Дамп  10-байтовых плавающих - команда, выводящая шестнадца-
         теричные и десятичные значения 10-байтовых плавающих,  специфици-
         рованных <адресом> или <отрезком>.
               Вывод  команды  дамп-10-байтовых-плавающих  займет одну или
         более строк, в зависимости от спецификации <отрезка>. Если <отре-
         зок> не  специфицирован,  то  по  умолчанию  команда  дамп-корот-
         ких-плавающих выводит одно значение.
               В  каждой строке вывода содержится по одному значению, каж-
         дое значение выводится в таком формате:
         
               <адрес>   <10 16-ричных байта>   <десятичное значение>,
         где <десятичное значение> имеет вид:
         
               [-]<цифра>.<десят.цифры>E<+>:<-><мантисса>
                  
               Пример:
           
               >DT t_pi
               5E68:0300 DE 87 68 21 A2 DA OF C9 00 40 3.141593E+000
               >
                
                
               6.5. Команда "Регистр" (R)
                
               Команда  Register имеет две функции: вывод значений регист-
         ров CPU и изменение их  значений.  Изменение  значений  регистров
         описано в главе 10 "Команды модификации кода и данных".
                
               Mouse.
               Для  отображения значений регистров укажите Options заголо-
         вок из сроки меню и выберите Register-команду. С правого края эк-
         рана откроется окно регистров. Для закрытия окна регистров повто-
         рите команду.
           
               Клавиатура.
               Для отображения значений регистров  нажмите  функциональный
         ключ  F2. В результате этого с правого края экрана откроется окно
         регистров. Для закрытия окна регистров повторите команду.
           
               Диалоговая.
               Для вывода значения регистров введите диалоговую команду  в
         следующем синтаксисе:
               
               R
               
               В  результате ее выполнения в диалоговом окне (для оконного
         режима) появятся текущие значения всех регистров, флагов и  теку-
         щая ассемблерная команда.
               Если режим работы - режим исходного текста (S+) или смешан-
         ный (S&) (см. главу 9 "Команды контроля кода"), то текущая строка
         текста также высветится этой командой.
               В последовательном режиме команды трассировки (T), програм-

                                      - 66 -
         
         
         мный шаг (P), выполнить (G и E), высвечивают содержимое регистров
         в формате команды регистр (R).
               
               Пример:
           
           >S&        ; * Смешанный режим
           mixed
           >R
           AX=0043 BX=0043 CX=025C DX=0000 SP=18F4 BP=18F8 SI=04BA DI=1946
           DS=5BF2 ES=5BF2 SS=5BF2 CS=5701 IP=026E NV UP EI PL NZ NA PO NC
           92:     ++letters;
           
           5701:026E FF067201  INC Word Ptr [_letters(0172)] DS:0172=0000
    

           >S-        ; * Режим исходного текста
           source
           >R
           AX=024F BX=0001 CX=0000 DX=0000 SP=1900 BP=1908 SI=04BA DI=1946
           DS=5BF2 ES=4BF2 SS=5BF2 CS=5701 IP=021F NV UP EI PL NZ NA PO NC
           5701:021F 807EFC20  CMP  Byte Ptr [code],20        ;BR2
           >
           
                
               6.6. Команда "8087" (7)

               Команда 8087  выводит  значения  регистров  арифметического
         сопроцессора  8087. Эта команда необходима при отладке программ с
         плавающей запятой (при условии, что имеется 8087 или  80287  про-
         цессор).
         
               Примечание:
               В  этом руководстве не дается описание 8087 процессора. Для
         знакомства с  ним  используйте  соответсвующую  документацию  или
         учебник.
         

               Mouse.
               Эту команду нельзя ввести mouse'ом.

               Клавиатура.
               Эту команду нельзя ввести с клавиатуры.
                
               Диалоговая.
               Для того, чтобы увидеть значения регистров 8087 процессора,
         введите диалоговую команду в следующем синтаксисе:
               
               7
           
               >7
         Control 037F (Projective closure, Round nearest, 64-bit precision)
                                  iem=0 pm=1 um=1 om=1 zm=1 dm=1 im=1
         Status 6004 cond=1000  top=4 pe=0 ue=0 oe=0 ze=1 de=0 ie=0
         Tag   A1FF     instruction=59380 operand=59360 opcode=D9EE
         Stack          Exp   Mantissa           Value

                                      - 67 -
         
         
         ST(3) special  7FFF  8000000000000000=+ Infinity
         ST(2) special  7FFF  0101010101010101=+ Not a Number
         ST(1) valid    4000  C90FDAA22168C235=+3.141592265110390E+000
         ST(0) zero     0000  0000000000000000=+0.000000000000000E+000
         >
.


Яндекс цитирования