是什么让有符号整数的行为有所不同?

时间:2012-09-14 16:59:27

标签: assembly

在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

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

1 个答案:

答案 0 :(得分: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.