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


Примеры смешанных выражений

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

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

Если вы используете команды отладчика для общих целей или используете расширения отладчика, необходимо задать синтаксис выражения MASM в качестве синтаксиса по умолчанию, например с помощью .expr (выбор средства оценки выражений). Если у вас должен быть определенный параметр для использования синтаксиса выражения C++, используйте синтаксис @@( ).

Если myInt является ULONG32 значением и используете средство оценки выражений MASM, в следующих двух примерах показано значение MyInt.

0:000> ?? myInt 
0:000> dd myInt L1 

Однако в следующем примере показан адресmyInt.

0:000> ? myInt 

Условные точки останова

Операторы сравнения можно использовать для создания условных точек останова. В следующем примере кода используется синтаксис выражения MASM. Так как текущий радикс по умолчанию равен 16, в примере используется префикс 0n , чтобы число 20 было понято как десятичное число.

0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 

В предыдущем примере MyVar является целым числом в источнике C. Так как средство синтаксического анализа MASM обрабатывает все символы как адреса, в примере должен быть оператор poi для разыменования MyVar.

Условные выражения

В следующем примере выводится значение ecx, если eax больше ebx, 7, если eax меньше ebx, и 3, если eax равно ebx. В этом примере используется средство оценки выражений MASM, поэтому знак равенства (=) является оператором сравнения, а не оператором назначения.

0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 

В синтаксисе @ C++ знак указывает на регистр, двойный знак равенства (==) является оператором сравнения, а код должен явно приведения из boOL в int. Поэтому в синтаксисе C++ предыдущая команда становится следующей.

0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 

Примеры смешанных выражений MASM и C++

Нельзя использовать выражения исходной строки в выражении C++. В следующем примере для вложенных выражений MASM в выражение C++ используется альтернативный синтаксис вычислителя @@( ). Этот пример задает MyPtr равным адресу строки 43 файла Myfile.c.

0:000> ?? MyPtr = @@( `myfile.c:43` )

В следующих примерах вычислителя выражений по умолчанию задано значение MASM, а затем вычислить Expression2 как выражение C++ и оценить expression1 и Expression3 как выражения MASM.

0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 

Если myInt является значением ULONG64 и если вы знаете, что это значение следует в памяти другим ULONG64, можно задать точку останова доступа в этом расположении с помощью одного из следующих примеров. (Обратите внимание на использование арифметики указателя.)

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

См. также

Номера и операторы MASM

Номера и операторы C++

Выражения MASM и выражения C++

Расширение знака