2012-09-14 31 views
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 

如何從第二個例子區別對待的第一個例子?

+0

這個問題可能會更好在StackOverflow。 – zxcdw

回答

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. 
+0

@ dirk-holsoppie - 非常感謝。你的解釋證實了我的想法;第一個例子是專門針對64位的,鑑於第一個例子操作碼位於64位二進制內,這非常有意義。 –

+0

第二個是64位指令,因爲它使用64位寄存器,但它所需的立即數是有符號的32位數。 –

+0

我明白了。對於什麼時候最好使用哪一種,我仍然有點不清楚(但不是雙關語),但你的答案明確地解釋了這些差異。不知道通常你會使用哪一個來源? –

相關問題