在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
第一个示例与第二个示例的处理方式有何不同?
答案 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.