Condividi tramite


Estensione di firma

Quando un intero con segno a 32 bit è negativo, il bit più alto è uguale a uno. Quando questo intero con segno a 32 bit viene eseguito il cast su un numero a 64 bit, i bit elevati possono essere impostati su zero (mantenendo il valore intero senza segno e esadecimale del numero) o i bit elevati possono essere impostati su uno (mantenendo il valore firmato del numero). Quest'ultima situazione è denominata estensione del segno.

Il debugger segue regole diverse per l'estensione di accesso nelle espressioni MASM, nelle espressioni C++ e durante la visualizzazione di numeri.

Estensione di accesso nelle espressioni MASM

In determinate condizioni, i numeri vengono firmati automaticamente dall'analizzatore di espressioni MASM. L'estensione di firma può influire solo sui numeri da 0x80000000 tramite 0xFFFFFFFF. Vale a dire, l'estensione del segno influisce solo sui numeri che possono essere scritti in 32 bit con il bit elevato uguale a 1.

Il numero 0x12345678 rimane sempre 0x00000000'12345678 quando il debugger lo considera come numero a 64 bit. D'altra parte, quando 0x890ABCDE viene considerato come valore a 64 bit, potrebbe rimanere 0x00000000'890ABCDE o l'analizzatore di espressioni MASM potrebbe firmarlo per 0xFFFFFFFF'890ABCDE.

Un numero compreso tra 0x80000000 e 0xFFFFFFFF viene esteso in base ai criteri seguenti:

  • Le costanti numeriche non vengono mai firmate in modalità utente. In modalità kernel, una costante numerica viene estesa a meno che non contenga un accento grave ( ` ) prima dei byte bassi. Ad esempio, in modalità kernel, i numeri esadecimali EEAA1122 e 00000000EEEA122 sono estesi, ma non sono presenti 00000000000 e 0'EEAA1122 EEAA1122.

  • Un registro a 32 bit viene esteso in entrambe le modalità.

  • I registri pseudo-registrati vengono sempre archiviati come valori a 64 bit. Non vengono firmate quando vengono valutate. Quando viene assegnato un valore pseudoregistrato , l'espressione usata viene valutata in base ai criteri C++ standard.

  • I singoli numeri e i registri in un'espressione possono essere estesi, ma nessun altro calcolo durante la valutazione delle espressioni viene esteso. Di conseguenza, è possibile mascherare i bit elevati di un numero o un registro usando la sintassi seguente.

    ( 0x0`FFFFFFFF & expression )
    

Estensione di accesso nelle espressioni C++

Quando il debugger valuta un'espressione C++, si applicano le regole seguenti:

  • I registri e i registri pseudo-registrati non vengono mai firmati estesi.

  • Tutti gli altri valori vengono trattati esattamente come C++ trattano i valori del tipo.

Visualizzazione di numeri Sign-Extended e a 64 bit

Oltre ai registri a 32 bit e a 16 bit, tutti i numeri vengono archiviati internamente all'interno del debugger come valori a 64 bit. Tuttavia, quando un numero soddisfa determinati criteri, il debugger lo visualizza come numero a 32 bit nell'output dei comandi.

Il debugger usa i criteri seguenti per determinare come visualizzare i numeri:

  • Se i 32 bit elevati di un numero sono tutti zero , ovvero se il numero è compreso tra 0x00000000'00000000 e 0x00000000'FFFFFFFFFF, il debugger visualizza il numero come numero a 32 bit.

  • Se i 32 bit elevati di un numero sono tutti quelli e se il bit più alto dei 32 bit bassi è anche uno (ovvero, se il numero si trova da 0xFFFFFFFF'800000000 a 0xFFFFFFFF'FFFFFFFFFF), il debugger presuppone che il numero sia un numero a 32 bit esteso e lo visualizza come numero a 32 bit.

  • Se la condizione precedente non si applica , ovvero se il numero è compreso tra 0x00000001'0000000000 e 0xFFFFFFFF'7FFFFFFF, il debugger visualizza il numero come numero a 64 bit.

A causa di queste regole di visualizzazione, quando un numero viene visualizzato come numero a 32 bit da 0x80000000 attraverso 0xFFFFFFFF, non è possibile confermare se i 32 bit elevati sono tutti uno o tutti gli zero. Per distinguere questi due casi, è necessario eseguire un calcolo aggiuntivo sul numero , ad esempio mascherando uno o più bit elevati e visualizzando il risultato.

Vedi anche

Numeri e operatori MASM

Numeri e operatori C++

Espressioni MASM vs. Espressioni C++

Esempi di espressioni miste

Estensione di firma