计算表达式

调试器了解两种不同形式的表达式: MASM 表达式和C++ 表达式

此帮助 (示例中使用 Microsoft 宏 (MASM) 表达式,除非另有说明。 在 MASM 表达式中,所有符号都被视为地址。

C++ 表达式与实际 C++ 代码中使用的表达式相同。 在这些表达式中,符号被理解为适当的数据类型。

使用每个语法时

可以通过以下方法之一选择默认表达式计算程序:

  • 在_NT_EXPR_EVAL 之前, 请使用环境变量。

  • 启动调试器时,请使用 -ee {masmc|++} 命令行选项。

  • 使用 .expr (选择 表达式) 命令在调试器运行后显示或更改表达式计算程序。

如果不使用上述方法之一,调试器将使用 MASM 表达式计算程序。

如果要在不更改调试器状态的情况下计算表达式,可以使用 ? (Evaluate Expression) 命令。

所有命令和调试信息窗口都通过默认表达式计算程序解释其参数,但以下例外:

  • ? (C++ 表达式) 命令始终使用 C++ 表达式计算程序。

  • 该监视窗口始终使用 C++ 表达式计算程序。

  • " 局部区域" 窗口始终使用 C++ 表达式计算程序。

  • 某些扩展命令始终使用 MASM 表达式 (,其他扩展命令仅接受数值参数,而不接受完整的表达式) 。

  • 如果 @@ 表达式的任何部分括在括号中,并且你在表达式之前插入两个 at 符号 () ,则表达式由表达式计算器计算,在这种情况下通常不会使用。

两个 at 符号 (@@) 一个命令的不同参数使用两个不同的评估器。 它还使你能够按不同的方法计算长表达式的不同部分。 可以嵌套这两个 at 符号。 两个 at 符号的每个外观都切换到另一个表达式计算程序。

警告 C++ 表达式语法可用于操作结构和变量,但它不适合用作调试器命令的参数分析器。 将调试器命令用于常规用途或使用调试器扩展时,应设置 MASM 表达式语法作为默认表达式计算程序。 如果必须具有使用 C++ 表达式语法的特定参数,请使用两个 at 符号 () @@ 语法。

有关两种不同表达式类型的信息,请参阅 数值表达式语法

表达式中的数字

MASM 表达式中的数字根据当前基数进行解释。 " 设置 (基数") 命令可用于将默认基数设置为 16、10 或 8。 所有未前缀的数字都将在此基数中解释。 可以通过指定 0x 前缀 (十六进制) 、 0n 前缀 (十进制) 、 0t 前缀 (八进制) 或 0y 前缀 (二进制) 来替代默认基数。

除非以不同方式指定,否则 C++ 表达式中的数字将解释为十进制数。 若要指定十六进制整数,在数字之前 添加 0x 。 若要指定八进制整数,请添加 0 (0) 数字之前。 (但是,在调试器的输出中,有时使用 0n 十进制前缀。)

如果要同时显示多个基中的数字,请使用 .formats (显示 数字) 命令。

表达式中的符号

这两种类型的表达式以不同方式解释符号:

  • 在 MASM 表达式中,每个符号都解释为一个地址。 根据符号引用的内容,此地址是全局变量、局部变量、函数、段、模块或任何其他已识别标签的地址。

  • 在 C++ 表达式中,每个符号都根据其类型进行解释。 根据符号引用内容,它可能会解释为整数、数据结构、函数指针或任何其他数据类型。 与 C++ 数据类型不对应的符号 (如未修改的模块名称) 语法错误。

如果符号可能不明确,则其前加模块名称和感叹号 ( ) 。 如果符号名称可以解释为十六进制数字,则其前加模块名称和感叹号 ( ! ) 或 仅位于感叹号。 若要指定符号是本地符号,请省略模块名称,在符号名称之前包含一个美元符号 (感叹号 ) $! 。 有关解释符号的信息,请参阅 符号语法和符号匹配

表达式中的运算符

每个表达式类型使用不同的运算符集合。

有关可在 MASM 表达式中使用的运算符及其优先规则详细信息,请参阅 MASM 数字和运算符

有关可在 C++ 表达式及其优先规则中使用运算符的信息,请参阅 C++ 数字和运算符

请记住,MASM 操作始终基于字节,C++ 操作遵循 C++ 类型规则 (包括指针算术算法的) 。

有关不同语法的一些示例,请参阅 混合表达式示例