Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Quando un intero con segno a 32 bit è negativo, il bit più alto è uguale a uno. Quando viene eseguito il cast di questo intero con segno a 32 bit in un numero a 64 bit, i bit alti possono essere impostati a zero (mantenendo il valore intero senza segno ed esadecimale del numero) oppure i bit alti possono essere impostati a uno (mantenendo il valore con segno del numero). Quest'ultima situazione è detta estensione del segno.
Il debugger segue regole diverse per l'estensione del segno nelle espressioni MASM, nelle espressioni C++ e quando vengono visualizzati i numeri.
Estensione del segno nelle espressioni MASM
In determinate condizioni, i numeri vengono estesi nel segno automaticamente dall'analizzatore di espressioni MASM. L'estensione del segno può influire solo sui numeri da 0x80000000 a 0xFFFFFFFF. Ovvero, l'estensione del segno influisce solo sui numeri che possono essere scritti in 32 bit con il bit alto uguale a 1.
Il numero 0x12345678 rimane sempre 0x00000000'12345678 quando il debugger lo considera come un numero a 64 bit. D'altra parte, quando 0x890ABCDE viene considerato come un valore a 64 bit, potrebbe rimanere 0x00000000'890ABCDE o l'analizzatore di espressioni MASM potrebbe firmare l'estensione a 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 00000000EEAA1122 vengono estesi al segno, ma 00000000`EEAA1122 e 0`EEAA1122 non lo sono.
Un registro a 32 bit viene esteso in entrambe le modalità.
I pseudoregistri vengono sempre archiviati come valori a 64 bit. Non vengono estesi con segno quando vengono valutati. Quando a un pseudoregistro viene assegnato un valore, l'espressione usata viene valutata in base ai criteri C++ standard.
I singoli numeri e i registri in un'espressione possono essere estesi con segno, ma nessun altro calcolo durante la valutazione dell'espressione viene esteso con segno. Di conseguenza, è possibile mascherare i bit alti di un numero o registrare usando la sintassi seguente.
( 0x0`FFFFFFFF & expression )
Estensione del segno nelle espressioni C++
Quando il debugger valuta un'espressione C++, si applicano le regole seguenti:
I registri e gli pseudoregistri non vengono mai estesi con segno.
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 alti di un numero sono tutti zeri (ovvero se il numero è compreso tra 0x00000000'000000000 e 0x00000000'FFFFFFFF), il debugger visualizza il numero come numero a 32 bit.
Se i 32 bit alti di un numero sono tutti quelli e se il bit più alto dei 32 bit bassi è anche uno (ovvero, se il numero è compreso tra 0xFFFFFFFF'80000000 e 0xFFFFFFFF'FFFFFFFF), il debugger presuppone che il numero sia un numero a 32 bit esteso con segno e lo visualizza come numero a 32 bit.
Se le due condizioni precedenti non si applicano, ovvero se il numero è compreso tra 0x00000001'000000000 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 a 0xFFFFFFFF, non è possibile verificare se i 32 bit elevati sono tutti o tutti gli zeri. Per distinguere questi due casi, è necessario eseguire un calcolo aggiuntivo sul numero , ad esempio mascherando uno o più bit alti e visualizzando il risultato.