混合表达式示例

本主题包含用于各种命令的 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++表达式中使用源行表达式。 以下示例使用 @@( ) 备用计算器语法在C++表达式中嵌套 MASM 表达式。 本示例将 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++表达式

签名扩展