计算表达式
调试器理解两种不同形式的表达式: MASM 表达式 和 C++ 表达式。
Microsoft 宏汇编程序 (MASM) 表达式在本帮助文档的示例中使用,除非另有说明。 在 MASM 表达式中,所有符号都被视为地址。
C++ 表达式与实际 C++ 代码中使用的表达式相同。 在这些表达式中,符号被理解为适当的数据类型。
使用每个语法时
可以通过以下方法之一选择默认表达式计算器:
在启动调试器之前,请使用_NT_EXPR_EVAL 环境变量 。
启动调试器时,请使用 -ee {masm|c++} 命令行选项 。
使用 .expr (选择表达式计算器) 命令在调试器运行后显示或更改表达式计算器。
如果不使用上述方法之一,调试器将使用 MASM 表达式计算器。
如果要在不更改调试器状态的情况下计算表达式,可以使用 ? (计算表达式) 命令。
所有命令和调试信息窗口都通过默认表达式计算器解释其参数,但以下情况除外:
?? (计算 C++ 表达式) 命令始终使用 C++ 表达式计算器。
监视窗口始终使用 C++ 表达式计算器。
“ 局部变量”窗口 始终使用 C++ 表达式计算器。
某些扩展命令始终使用 MASM 表达式计算器 (,其他扩展命令仅接受数值参数,而不是) 的完整表达式。
如果表达式的任何部分括在括号中,并在表达式前插入两个 at 符号 (@@) ,则表达式由通常不会在本例中使用的表达式计算器计算。
() @@ 的两个 at 符号使你能够对单个命令的不同参数使用两个不同的计算器。 它还使你能够通过不同的方法计算长表达式的不同部分。 可以将这两个标记嵌套在标志处。 两个 at 符号的每个外观都切换到另一个表达式计算器。
警告 C++ 表达式语法可用于操作结构和变量,但它不适合用作调试器命令参数分析程序。 将调试器命令用于常规用途或使用调试器扩展时,应将 MASM 表达式语法设置为默认表达式计算器。 如果必须具有使用 C++ 表达式语法的特定参数,请使用两个 at 符号 (@@) 语法。
有关这两种不同表达式类型的详细信息,请参阅 数值表达式语法。
表达式中的数字
MASM 表达式中的数字根据当前基数进行解释。 n (Set Number Base) 命令可用于将默认基数设置为 16、10 或 8。 所有无前缀数字都将在此基数中解释。 可以通过指定 0x 前缀 (十六进制) 、 0n 前缀 (十进制) 、 0t 前缀 (八进制) 或 0y 前缀 (二进制) 来替代默认基数。
除非以不同的方式指定,否则 C++ 表达式中的数字将被解释为十进制数。 若要指定十六进制整数,请在数字前添加 0x 。 若要指定八进制整数,请在数字前添加 0 (零) 。 (但是,在调试器的 输出中,有时会使用 0n 十进制前缀。)
如果要同时以多个基数显示数字,请使用 .formats (显示数字格式) 命令。
表达式中的符号
两种类型的表达式以不同的方式解释符号:
在 MASM 表达式中,每个符号都解释为一个地址。 根据符号所引用的内容,此地址是全局变量、局部变量、函数、段、模块或任何其他已识别标签的地址。
在 C++ 表达式中,每个符号都根据其类型进行解释。 根据符号所引用的内容,它可能被解释为整数、数据结构、函数指针或任何其他数据类型。 与 C++ 数据类型 ((如未修改的模块名称)不对应的符号) 会产生语法错误。
如果符号可能不明确,请在其前面加上模块名称和感叹号 ( ! ) 。 如果符号名称可以解释为十六进制数字,请在它前面加上模块名称和感叹号 ( ! ) 或仅一个感叹号。 若要指定符号应为本地符号,请省略模块名称,并在符号名称前 ( $! ) 包含美元符号和感叹号。 有关解释符号的详细信息,请参阅 符号语法和符号匹配。
表达式中的运算符
每个表达式类型使用不同的运算符集合。
有关可在 MASM 表达式中使用的运算符及其优先规则的详细信息,请参阅 MASM 数字和运算符。
有关可在 C++ 表达式中使用的运算符及其优先规则的详细信息,请参阅 C++ 数字和运算符。
请记住,MASM 操作始终基于字节,C++ 运算遵循 C++ 类型规则 (包括指针算术) 缩放。
有关不同语法的一些示例,请参阅 混合表达式示例。