Вычисление выражений
Отладчик понимает две различные формы выражений: выражения MASM и выражения C++.
Выражения ассемблеров Microsoft (MASM) используются в примерах в этой справочной документации, за исключением случаев, когда указано иное. В выражениях MASM все символы обрабатываются как адреса.
Выражения C++ те же, что и в фактическом коде C++. В этих выражениях символы понимаются как соответствующие типы данных.
При использовании каждого синтаксиса
Вы можете выбрать вычислитель выражений по умолчанию одним из следующих способов:
Используйте переменную среды _NT_EXPR_EVAL перед запуском отладчика.
При запуске отладчика используйте параметр командной строки-ee {masm|c++}.
Используйте команду .expr (Выбрать вычислитель выражений), чтобы отобразить или изменить средство оценки выражений после запуска отладчика.
Если вы не используете ни один из предыдущих методов, отладчик использует средство оценки выражений MASM.
Если вы хотите вычислить выражение без изменения состояния отладчика, можно использовать ? (Вычисление выражения) Команды.
Все команды и окна сведений об отладке интерпретируют свои аргументы через средство оценки выражений по умолчанию, за следующими исключениями:
? ? (Оценка выражения C++) Команда всегда использует средство оценки выражений C++.
В окне Контрольные значения всегда используется средство оценки выражений C++.
В окне Локальные всегда используется средство оценки выражений C++.
Некоторые команды расширения всегда используют средство оценки выражений MASM (а другие команды расширения принимают только числовые аргументы, а не полные выражения).
Если какая-либо часть выражения заключена в круглые скобки и перед выражением вставляется два знака (@@), то выражение вычисляется вычислителем выражений, который обычно не используется в этом случае.
Два знака (@@) позволяют использовать два разных средства оценки для разных параметров одной команды. Он также позволяет оценивать различные фрагменты длинного выражения различными методами. Вы можете вложить их в знаки. Каждое появление двух знаков переключается на другой вычислитель выражений.
Предупреждение Синтаксис выражений C++ полезен для управления структурами и переменными, но не подходит для синтаксического анализа параметров команд отладчика. При использовании команд отладчика в общих целях или расширений отладчика следует задать синтаксис выражений MASM в качестве средства оценки выражений по умолчанию. Если у вас должен быть определенный параметр, используйте синтаксис выражений C++, используйте синтаксис двух знаков (@@).
Дополнительные сведения о двух разных типах выражений см. в разделе Синтаксис числовых выражений.
Числа в выражениях
Числа в выражениях MASM интерпретируются в соответствии с текущим радиксом. Команда n (задать числовую базу) может использоваться, чтобы задать для радикса по умолчанию значение 16, 10 или 8. Все нефиксированные числа будут интерпретироваться в этой базе. Радикс по умолчанию можно переопределить, указав префикс 0x (шестнадцатеричный), префикс 0n (десятичный), префикс 0t (восьмеричный) или префикс 0y (двоичный).
Числа в выражениях C++ интерпретируются как десятичные числа, если не указано другое. Чтобы указать шестнадцатеричное целое число, добавьте 0x перед числом. Чтобы указать восьмеричное целое число, добавьте 0 (ноль) перед числом. (Однако в выходных данных отладчика иногда используется десятичный префикс 0n .)
Если вы хотите отобразить число в нескольких базах одновременно, используйте команду .formats (Показать числовые форматы).
Символы в выражениях
Два типа выражений интерпретируют символы по-разному:
В выражениях MASM каждый символ интерпретируется как адрес. В зависимости от того, к чему относится символ, этот адрес является адресом глобальной переменной, локальной переменной, функции, сегмента, модуля или любой другой распознаваемой метки.
В выражениях C++ каждый символ интерпретируется в соответствии с его типом. В зависимости от того, на что ссылается символ, он может интерпретироваться как целое число, структура данных, указатель функции или любой другой тип данных. Символ, не соответствующий типу данных C++ (например, неизмененному имени модуля), создает синтаксическую ошибку.
Если символ может быть неоднозначным, предшествуйте ему имя модуля и восклицательный знак ( ! ). Если имя символа может быть интерпретировано как шестнадцатеричное число, предшествуйте ему имя модуля и восклицательный знак ( ! ) или только восклицательный знак. Чтобы указать, что символ должен быть локальным, опустите имя модуля и добавьте знак доллара и восклицательный знак ( $! ) перед именем символа. Дополнительные сведения о интерпретации символов см. в разделе Синтаксис символов и сопоставление символов.
Операторы в выражениях
Каждый тип выражения использует разные коллекции операторов.
Дополнительные сведения об операторах, которые можно использовать в выражениях MASM, и правилах их приоритета см. в разделе Числа и операторы MASM.
Дополнительные сведения об операторах, которые можно использовать в выражениях C++, и правилах их приоритета см. в разделе Числа и операторы C++.
Помните, что операции MASM всегда основаны на байтах, а операции C++ соответствуют правилам типа C++ (включая масштабирование арифметики указателей).
Некоторые примеры различных синтаксисов см. в разделе Примеры смешанных выражений.