签名扩展

当 32 位有符号整数为负时,其最高位等于 1。 当此 32 位有符号整数转换为 64 位数字时,可将高位设置为零(保留数字的无符号整数和十六进制值),或者可将高位设置为一个(保留数字的带符号值)。 后一种情况称为 符号扩展

调试器在 MASM 表达式、C++ 表达式和显示数字时遵循不同的符号扩展规则。

MASM 表达式中的符号扩展

在某些情况下,MASM 表达式求值器会自动对数字进行符号扩展。 签名扩展只能影响从0x80000000到0xFFFFFFFF的数字。 也就是说,符号扩展仅影响可以写入 32 位且高位等于 1 的数字。

当调试器将0x12345678视为64位数字时,它始终保持为0x0000000012345678。 另一方面,当 0x890ABCDE 被视为 64 位值时,它可能保持为 0x00000000`890ABCDE,或者 MASM 表达式计算器可能会将其符号扩展为 0xFFFFFFFF`890ABCDE。

根据以下条件,对0x80000000到0xFFFFFFFF范围内的数字进行符号扩展:

  • 数值常量在用户模式下绝不会进行符号扩展。 在内核模式下,除非数字常量包含在低字节之前的反引号( ` ),否则将进行符号扩展。 例如,在内核模式下,EEAA112200000000EEAA1122 的十六进制数字进行了符号扩展,但 00000000`EEAA11220`EEAA1122 没有。

  • 32 位寄存器在这两种模式下都进行了符号扩展。

  • 伪寄存器始终存储为 64 位值。 在计算它们时,它们不会进行符号扩展。 为伪寄存器 值时,将使用的表达式根据标准C++条件进行计算。

  • 表达式中的单个数字和寄存器可以进行符号扩展,但在表达式计算过程中,不会对其他计算进行符号扩展。 因此,您可以使用以下语法来屏蔽一个数字或寄存器的高位。

    ( 0x0`FFFFFFFF & expression )
    

C++表达式中的符号扩展

当调试器计算C++表达式时,将应用以下规则:

  • 寄存器和伪寄存器永远不会进行符号扩展。

  • 所有其他值的处理方式与C++将处理其类型的值完全相同。

显示 Sign-Extended 和 64 位数字

除 32 位和 16 位寄存器外,所有数字在调试器内部存储为 64 位值。 但是,当数字满足特定条件时,调试器会在命令输出中将其显示为 32 位数字。

调试器使用以下条件来确定如何显示数字:

  • 如果数字的高 32 位都是零(也就是说,如果数字从 0x00000000'000000000 到 0x00000000'FFFFFFFF),调试器会将数字显示为 32 位数字。

  • 如果数字的高 32 位都是数字,并且低 32 位的最高位也是一个(即,如果数字从 0xFFFFFFFF'800000000 到 0xFFFFFFFF'FFFFFFFF),则调试器假定该数字是一个符号扩展的 32 位数字,并将其显示为 32 位数字。

  • 如果前两个条件不适用(即,如果数字从 0x00000001'000000000 到 0xFFFFFFFF'7FFFFFFF),调试器会将数字显示为 64 位数字。

由于这些显示规则,当数字显示为从0x80000000到0xFFFFFFFF的 32 位数字时,无法确认高 32 位是所有位还是全部零。 若要区分这两种情况,必须对数字执行额外的计算(例如屏蔽一个或多个高位并显示结果)。

另请参阅

MASM 数字和运算符

C++数字和运算符

MASM 表达式与C++表达式

混合表达式示例