本主题包含用于各种命令的 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++表达式,并将 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