Примеры смешанных выражений
В этих разделах содержатся примеры выражений 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