混合表达式示例

本主题包含各种命令中使用的 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,则可以使用以下示例之一在该位置设置访问断点。 (注意指针 arithmetic.) 的使用

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

另请参阅

MASM 数字和运算符

C++ 数字和运算符

MASM 表达式与C++ 表达式

符号扩展