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.