求值表达式(Evaluating Expressions)
目录
调试器可以识别两种不同形式的表达式:MASM 表达式和 C++ 表达式。
除非另有说明,本帮助文档中的示例均使用 Microsoft 宏汇编器 (MASM) 表达式。在 MASM 表达式中,所有符号(symbols)都视为地址。
C++ 表达式与实际 C++ 代码中使用的表达式相同。在这些表达式中,符号理解为相应的数据类型。
1. 表达式种类设置
可以使用下列方式之一设置表达式求值器(expression evaluator):
(1) 在调试器启动之前使用 _NT_EXPR_EVAL 环境变量进行设置。
(2) 在调试器启动后使用 -ee{masm|c++} 命令行选项进行设置。
(3) 在调试器正在运行时,使用 .expr(选择表达式求值器(Choose Expression Evaluator))命令来显示或改变表达式求值。
如果不使用上述任何方法,调试器将使用 MASM 表达式求值器。
如果想在不改变调试器状态的情况下求值一个表达式,可以使用 `?(求值表达式)` 命令。
所有命令和调试信息窗口都通过默认表达式求值器解释其参数,但以下情况除外:
(1) ??(求值 C++ 表达式) 命令总是使用 C++ 表达式求值器。
(2) 监视(Watch)窗口总是使用 C++ 表达式求值器。
(3) 局部变量窗口(Locals) 窗口总是使用 C++ 表达式求值器。
(4) 有些扩展命令总是使用 MASM 表达式求值器(而其他扩展命令只接受数值参数,而不是完整的表达式)。
(5) 如果表达式的任何部分包含在括号中,并且在表达式之前插入两个 at 符号 (@@),则表达式将由通常不会在这种情况下使用的表达式求值器进行求值。
两个 @ 符号(@@) 允许你为单个命令的不同参数使用两个不同的求值器。它还允许你使用不同的方法计算长表达式的不同部分。你可以嵌套使用这两个@符号。每次出现这两个@符号时,调试器都会切换到另一个表达式求值器。
注意:
C++表达式语法适用于操作结构体和变量,但并不适合解析调试器命令的参数。当使用调试器命令进行一般操作或使用调试器扩展时,应将MASM表达式语法设置为默认表达式求值器。如果必须使用C++表达式语法指定特定参数,请使用双@符号(@@)语法。
2. 表达式中的数
MASM 表达式中的数会根据当前进制进行解释。可以使用 `n`(设置进制)命令将默认进制设置为 16进制、10进制 或 8进制 。所有未加前缀的数都将以该进制解释。可以通过指定 `0x`(十六进制)、`0n`(十进制)、`0t`(八进制)或 `0y`(二进制)前缀来覆盖默认进制。
C++ 表达式中的数默认以十进制形式解释,除非另有指定。要指定十六进制整数,请在数字前添加 `0x`。要指定八进制整数,请在数前添加 `0`(零)。(但是,在调试器的输出中,有时会使用十进制前缀 `0n`。)
如果要同时以多种进制显示数,请使用 `.formats`(显示数格式)命令。
3. 表达式中的符号
两种表达式对符号的解释不同:
(1) 在 MASM 表达式中,每一个符号都解释为一个地址。根据符号所指代的内容,该地址可以是全局变量、局部变量、函数、段(32位处理器中)、模块或任何其他可识别标签的地址。
(2) 在 C++ 表达式中,每一个符号都会根据其类型进行解释。根据符号所指代的对象,它可以解释为整数、数据结构、函数指针或任何其他数据类型。如果符号不对应于任何 C++ 数据类型(例如未经修改的模块名),则会产生语法错误。
若某个符号可能存在歧义,请在其前面加上模块名称和一个感叹号(!)。如果符号名称可以解释为十六进制数,请在其前面加上模块名称和一个感叹号(!) ,或者只加上一个感叹号。要指定某个符号是局部符号,请省略模块名称,并在符号名称前面加上美元符号和感叹号($!) 。有关符号解释的更多信息,请参阅“符号语法”和“符号匹配”。
4. 表达式中的运算符
每一种表达式类型都使用不同的运算符集合。
有关 MASM 表达式中可使用的运算符及其优先级规则的更多信息,请参阅“MASM 数和运算符”。
有关 C++ 表达式中可使用的运算符及其优先级规则的更多信息,请参阅“C++ 数和运算符”。
请记住,MASM 操作始终基于字节,而 C++ 操作遵循 C++ 类型规则(包括指针运算的缩放)。
有关不同语法的示例,请参阅“混合表达式示例”。

5312

被折叠的 条评论
为什么被折叠?



