|
Часть 4
- 41 -
4. ДИАЛОГОВЫЕ КОМАНДЫ
СОДЕРЖАНИЕ
Лист
4. Диалоговые команды.............................. 41
4.1. Введение........................................ 42
4.2. Ввод команд и аргументов........................ 42
4.2.1. Употребление спецключей......................... 42
4.2.2. Использование командного буфера................. 43
4.3. Формат CodeView команд и их аргументов...........43
4.4. "C"выражения.....................................44
4.4.1. Идентификаторы.................................. 45
4.4.2. Константы....................................... 45
4.4.3. Регистры........................................ 45
4.4.4. Адреса.......................................... 46
4.4.5. Адресные отрезки................................ 47
4.4.6. Номера строк.....................................47
4.4.7. Строковые константы............................. 47
.
- 42 -
4.1. Введение
CodeView диалоговые команды употребляются в последователь-
ном режиме или диалоговом окне. В последовательном режиме это
единственный метод ввода команд, в оконном режиме диалоговые ко-
манды используются для ввода команд, либо не имеющих оконного
аналога, либо требующих расширенный аргумент.
Обычно, оконные версии команд удобнее, но диалоговые мощ-
нее. Например, установка точек останова в строке исходного текста
выглядит так: передвижение курсора (либо указателя mouse'а) на
интересующую строку и нажатие F9 (или левой кнопки mouse'а). Диа-
логовая версия требует больше усилий для ввода, но она позволяет
специфицировать адрес, количество проходов, строку команд, выпол-
няемых после останова.
В остальной части этой главы объясняется, как вводить диа-
логовые команды и специфицировать их аргументы.
4.2. Ввод команд и аргументов
Диалоговые команды вводятся в ответ на CodeView приглашение
'>'. После набора команды и аргументов для ее выполнения необхо-
димо нажать Enter.
В оконном режиме можно вводить команды, не обращая внимания
на то, есть или нет курсор у CodeView приглашения. Текст при этом
возникает в текущем месте диалогового окна.
4.2.1. Употребление спецключей
При вводе диалоговых команд и просмотре можно употреблять
следующие спецключи:
Ключ Действие
CTL+C Снятие текущего вывода или
CTL+BREAK текущей командной строки. Например,
при длинном выводе дамп команды
CTL+C (CTL+BREAK) прервет вывод и
вернет CodeView приглашение. Если
вы сделали ошибку при вводе
команды, нажмите CTL+C для ее
отмены.
Примечание.
Опция стартового запуска CodeView /D запрещает CTL+C ключ.
Более детально см. раздел 2.3.8.
CTL+S Пауза в выводе. Команда
приостанавливает выдачу на экран.
Для продолжения вывода необходимо
нажать любой ключ. Команда полезна,
например, при просмотре длинного
дампа.
- 43 -
BACKSPACE Удаление предыдущего символа в
командной строке и передвижение
курсора назад.
4.2.2. Использование командного буфера
В оконном режиме CodeView отладчик имеет буфер, содержащий
последние 4K (приблизительно 3 экрана) протокола диалогового ок-
на.
Когда курсор находится в диалоговом окне, вы можете листать
протокол, просматривая предыдущую работу. Описание команд листа-
ния окна дано в разделах 3.1.1.1. и 3.1.2.1.
Это особенно полезно для просмотра вывода дамповых команд,
чей вывод не умещается в диалоговом окне.
Пролистав диалоговое окно, можно вводить последующие коман-
ды, не обращая внимание на то, что их текст наложится на листинг.
Все равно команда разместится в конце буфера и, пролистав буфер
назад, вы убедитесь, что листинг не испорчен.
При старте отладчика буфер пуст; при переполнении буфера
происходит стирание начала листинга диалогового окна.
4.3. Формат CodeView команд и их аргументов.
Формат CodeView команд аналогичен формату команд предыдущих
MicroSoft отладчиков SYMDEB'а и DEBUG'а. Однако некоторые опера-
торы и выражения отличны. Общий формат CodeView команд следующий:
<команда> [<аргументы>] [;<следующая команда>]
<Команда> -- это имя команды, <аргументы> -- "C"выражения,
представляющие значения или адреса для использования командами.
Обычно первый аргумент располагается непосредственно за командой
(без пробела).
Число аргументов для различных команд различно; если коман-
да требует более двух аргументов, то они должны разделяться про-
белами. Точка с запятой ';' используется как разделитель при за-
дании нескольких команд в одной строке.
CodeView не чувствителен к большим и малым буквам в именах
команд, но, как соглашение для ясности, в примерах этого руковод-
ства команды пишутся заглавными буквами, а их аргументы малыми.
Примеры:
>DB 100 200 ; * Пример 1
>U label1 ; * Пример 2
>U label2 ; * Пример 3
Пример 1 -- DB (дамп-байтовая команда) с аргументами 100 и
200 ; вторая команда строки -- команда комментария. Точка с запя-
той используется как разделитель команд.
Примеры 2,3 -- команда дезассемблировать.
- 44 -
4.4. "C"выражения
CodeView аргументы всегда состоят из "C"выражений. Выраже-
ния должны состоять из идентификаторов, других доступных имен,
констант, регистров, операций. Выражения имеют 8-, 16- или 32-би-
товое значение, используемое CodeView как аргументы (адреса).
CodeView использует операции, аналогичные "C"операциям, и
одну специфичную CodeView-операцию -- ':'. CodeView операции соб-
раны в таблице 4.1 в порядке старшинства.
Таблица 4.1.
-----------------------------------------------------------------
Уровень Операции
старшинства
-----------------------------------------------------------------
(Наивысший)
1 () [] -> .
2 ! ~ - (тип) ++ -- * & sizeof
3 * / % :
4 + -
5 < > <= >=
6 == !=
7 &&
8 ||
9 = += -= *= /= %=
(Наименьший)
-----------------------------------------------------------------
В 2 перечислены унарные операции.
-----------------------------------------------------------------
Употребление "C"операций описано в MicroSoft C Compiler
Language Referens.
Двоеточие ':' -- CodeView операция, она используется как
<сегмент>:<смещение> разделитель (см. раздел 4.4.3 "Регистры").
Точка '.' приминяется в CodeView не только как селектор, но
и для спецификации локальных переменных функций, вызвавших теку-
щую. Синтаксис этого обращения показан ниже:
<функция>.<переменная>
<Функция> должна быть функцией, вызвавшей данную, а <пере-
менная> -- ее локальной переменной. Переменная не может быть ре-
гистровой.
(Тип)-операция должна определять только предопределенные
"C" типы. CodeView ограничивает указатели одним уровнем кос-
венности. Например (char *)sym разрешено, а (char **)sym -- нет.
При использовании "C"выражений в командах с несколькими ар-
гументами, "C"выражения не должны содержать пробелы. Например,
count+6 -- это один аргумент, а count + 6 CodeView проинтерпрети-
рует как 3 аргумента.
Примечание:
При обращении к еще неопределенным переменным CodeView вы-
дает сообщение: "Unknown symbol".
- 45 -
4.4.1. Идентификаторы
Синтаксис
<Имя>
Идентификатор -- имя, представляющее регистр, абсолютное
значение, сегментный адрес, смещение. Идентификаторы (как и дру-
гие доступные имена) -- это имена, допускаемые транслятором.
Примечание:
CodeView команды не чувствительны к большим и малым буквам
в командах, но чувствительны к ним в именах, если соответствующая
опция из Option меню не выключена.
В ассемблерном режиме или в выводе команд контроля имен
CodeView высвечивает некоторые имена в объектном формате, содер-
жащем впереди символ подчеркивания. Например, функция main будет
видна в ассемблерном режиме как _main. Только глобальные метки
(такие как имена процедур) высвечиваются в этом формате. При упо-
минании этих имен вы не обязаны писать символ подчеркивания, но
метки из библиотеки времени исполнения, содержащие два подчерки-
вания впереди, должны писаться с этими подчеркиваниями. Например:
__chrstk.
4.4.2. Константы
Синтаксис Формат
цифры Десятичный формат
0цифры Восьмеричный формат
0xцифры Шестнадцатеричный формат
0nцифры Альтернативный десятичный формат
Константы используются в CodeView командах для представле-
ния целых значений. Они могут состоять из 8-,10-,16-ричных цифр и
вводятся в текущем радиксе (см.раздел 11.3"Радикс-команда"), если
формат константы не указан.
По умолчанию CodeView стартует в 10-тичном радиксе.
Если текущий радикс не 10-тичный, для ввода 10-тичных чисел
используется альтернативный вариант.
В 16-ричном радиксе константа, начинающаяся с буквы
(A,B,C,D,E,F), воспринимается как имя, поэтому ее нужно записы-
вать в 0x... виде.
В таблице 4.2 показан вид одного и того же числа (63) в
различных радиксах и форматах.
Таблица 4.2.
-----------------------------------------------------------------
Радикс 8-ричный 10-тичный 16-ричный
-----------------------------------------------------------------
8 77 0n63 0x3F
10 077 63 0x3F
16 077 0n63 3F
-----------------------------------------------------------------
4.4.3. Регистры
Синтаксис
[@]регистр
- 46 -
Для того чтобы ссылаться на текущие значения регистров, не-
обходимо уметь специфицировать их имена. Регисты редко нужны при
отладке в "C" режиме, но они часто используются для ассемблерной
отладки.
При спецификации идентификатора CodeView ищет имя в таблице
имен, если его там нет, то среди регистров.
Используйте префикс @ для восстановления уникальности имен
регистров. Например, вы имеете переменную AX и хотите использо-
вать регистр AX. В этом случае обращайтесь к нему как к @AX.
Имена регистров, известных CodeView:
Таблица 4.3. Регистры
-----------------------------------------------------------------
Тип Имя
-----------------------------------------------------------------
16-битовые основные AX, BX, CX, DX
8-битовые верхние AH, BH, CH, DH
8-битовые нижние AL, BL, CL, DL
16-битовые сегментные CS, DS, SS, ES
16-битовые указатели SP, BP, IP
16-битовые индексные SI, DI
-----------------------------------------------------------------
4.4.4. Адреса
Синтаксис
[<сегмент>:]<смещение>
Адрес специфицируется в CodeView при помощи операции двое-
точие ':' в виде <сегмент>:<смещение>, где <сегмент> и <смещение>
-- "C"выражения.
Полный адрес -- это <сегмент> и <смещение>, разделенные
двоеточием. На практике адрес -- это только <смещение>; к нему
добавляется сегмент умолчания.
Умалчиваемые <сегменты> различны для различных команд. Ко-
манды управления данными (Dump, Watch, ...) используют DS ре-
гистр. Команды управления кодом (ассемблер, установ точек остано-
ва, ...) используют CS регистр.
Полный адрес редко необходим в отладке. Он может понадо-
биться для ссылки на адрес не из программы, например, BIOS'а или
MS-DOS'а. Полный адрес эквивалентен "C"выражению, используемому
как far указатель на char:
1234:5678 эквивалентен (char far *)1234:5678.
Примеры:
>DB 100 ; * Пример 1
>DB array[count] ; * Пример 2
>DB label+10 ; * Пример 3
>DB 0x800:0xFF ; * Пример 4
В примере 1 DB дамп-команда используется для дампирования
памяти с адреса <смещение> 100. По умолчанию к смещению добавля-
ется <сегмент> из регистра DS -- DS:100. В примере 2 DB дамп-ко-
манда используется для дампирования памяти с адреса array[count].
В примере 3 DB дамп-команда используется для дампирования памяти
с адреса label+10. По умолчанию к смещению добавляется <сегмент>
из регистра CS -- CS:100. В примере 4 DB дамп-команда использует-
- 47 -
ся для дампирования памяти с адреса 0x800:0xFF.
4.4.5. Адресные отрезки
Синтаксис
<Начальный адрес> <Конечный адрес>
<Начальный адрес> L<Счетчик>
Отрезок - пара адресов, связанных с последовательностью
байтов памяти.
Отрезок специфицируется двумя способами: один из них - ука-
зание адресов начала и конца; в этом случае отрезок содержится
между ними. Если второй адрес не указан, CodeView часто берет
длину отрезка по умолчанию (обычно 128 байт).
Отрезок также можно специфицировать, указав стартовый адрес
и количество объектов, содержащихся в нем. Этот тип отрезка назы-
вается объектным отрезком; <начальный адрес> специфицирует первый
элемент, <счетчик> - количество объектов данного типа: для коман-
ды DB -- байт, DW -- слов, для U -- ассемблерных инструкций.
Примеры:
>DB buffer ;* дамп 128 байт buffer'a
>DB buffer buffr+20 ;* дамп 20 байт buffer'a
>DB buffer L20 ;* дамп 20 байт buffer'a
>U label-30 label ;* 30 ассемблерных команд перед
меткой label.
4.4.6. Номера строк
Синтаксис
.[<имя файла>:]<номер строки>
Адрес, соответствующий номеру исходной строки, специфициру-
ется ее номером с префиксной точкой '.'. Если не было специфици-
ровано имя файла, CodeView возьмет эту строку из текущего файла
исходного текста.
CodeView выдает сообщения об ошибке, если файл не найден
или не найдена специфицированная строка.
Примеры:
>V .100 ; * просмотреть 100 строку текущего файла
>V .sampele.c:100 ;* просмотреть 100 строку текущего
файла.
4.4.7. Строковые константы
Синтаксис
"<заканчивающаяся нулем строка>"
Формат строковых констант аналогичен "C" формату.
Пример:
>EA message "This \"string\" is okay"
Пример использования EA (ввод в ASCII формате) для ввода
строки по адресу переменной message.
|