Поделиться через


Вычисление выражений

Отладчик понимает две различные формы выражений: выражения MASM и выражения C++.

Выражения ассемблеров Microsoft (MASM) используются в примерах в этой справочной документации, за исключением случаев, когда указано иное. В выражениях MASM все символы обрабатываются как адреса.

Выражения C++ те же, что и в фактическом коде C++. В этих выражениях символы понимаются как соответствующие типы данных.

При использовании каждого синтаксиса

Вы можете выбрать вычислитель выражений по умолчанию одним из следующих способов:

Если вы не используете ни один из предыдущих методов, отладчик использует средство оценки выражений 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++ (включая масштабирование арифметики указателей).

Некоторые примеры различных синтаксисов см. в разделе Примеры смешанных выражений.