1

在这个 x86_64 十六进制/反汇编代码示例中,我看到:

48B80000000000000000 mov rax, 0x0

    Signed Byte 52
    Unsigned Byte   52
    Signed Short    14388
    Unsigned Short  14388
    Signed Int  943863860
    Unsigned Int    943863860
    Signed Int64    3472328296363079732
    Unsigned Int64  3472328296363079732
    Float   4.630555e-05
    Double  1.39804332763832e-76
    String  48B80000000000000000

在我看来,这似乎具有与以下相同的功能:

48C7C000000000 mov rax, 0x0

    48C7C000000000

    Signed Byte 52
    Unsigned Byte   52
    Signed Short    14388
    Unsigned Short  14388
    Signed Int  927152180
    Unsigned Int    927152180
    Signed Int64    3472328377950746676
    Unsigned Int64  3472328377950746676
    Float   1.163599e-05
    Double  1.39806836023098e-76
    String  48C7C000000000

第一个示例与第二个示例的处理方式有何不同?

4

1 回答 1

6

C7 操作码将带符号的 32 位数字移动到 64 位寄存器中。它将对其进行符号扩展,这意味着它将用源的符号位填充高位,以便在解释为有符号数时具有相同的值。

由于它是一个立即数,您将看到的唯一区别是顶部的立即数将支持最多 64 位长的立即数,但底部的将仅支持最多 32 位。

以下是英特尔参考手册中的相关行。

REX.W + B8+ rd    MOV r64, imm64     OI     Valid     N.E.     Move imm64 to r64.
REX.W + C7 /0     MOV r/m64, imm32   MI     Valid     N.E.     Move imm32 sign extended to 64-bits to r/m64.
于 2012-09-14T17:13:04.133 回答