混合表达式示例
本主题包含在各种命令中使用的 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。
条件表达式
下面的示例会在 eax 大于 ebx 时打印 ecx 的值,在 eax 小于 ebx 时打印 7,并在 eax 等于 ebx 时打印 3。 此示例使用 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 设置为 Myfile.c 文件第 43 行的地址。
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