混合表达式示例

本主题包含在各种命令中使用的 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++ 表达式求值,并将 Expression1Expression3 作为 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++ 表达式

符号扩展