1

この x86_64 hex/逆アセンブル コードの例では、次のように表示されます。

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

最初の例は、2 番目の例とどのように異なって扱われますか?

4

1 に答える 1

6

C7 オペコードは、符号付き 32 ビット数を 64 ビット レジスタに移動します。符号拡張します。つまり、ソースの符号ビットが何であれ上位ビットを埋めて、符号付き数値として解釈されたときに同じ値になるようにします。

これは即値であるため、唯一の違いは、上のものは最大 64 ビット長の即値をサポートするのに対し、下のものは最大 32 ビットしかサポートしないことです。

Intel のリファレンス マニュアルからの関連行を次に示します。

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 に答える