Condividi tramite


Valutazione di espressioni

Il debugger comprende due diverse forme di espressioni: espressioni MASM e espressioni C++.

Le espressioni MASM (Microsoft Macro Assembler) vengono usate negli esempi descritti in questa documentazione della Guida, ad eccezione di quanto indicato in caso contrario. Nelle espressioni MASM tutti i simboli vengono considerati come indirizzi.

Le espressioni C++ sono uguali a quelle usate nel codice C++ effettivo. In queste espressioni i simboli sono compresi come tipi di dati appropriati.

Quando viene usata ogni sintassi

È possibile selezionare l'analizzatore di espressioni predefinito in uno dei modi seguenti:

Se non si usa uno dei metodi precedenti, il debugger usa l'analizzatore di espressioni MASM.

Se si vuole valutare un'espressione senza modificare lo stato del debugger, è possibile usare ? (Valuta espressione) Comando.

Tutti i comandi e le informazioni di debug interpretano gli argomenti tramite l'analizzatore di espressioni predefinite, con le eccezioni seguenti:

  • Il ?? (Valutare l'espressione C++) il comando usa sempre l'analizzatore di espressioni C++.

  • La finestra Watch usa sempre l'analizzatore di espressioni C++.

  • La finestra Variabili locali usa sempre l'analizzatore di espressioni C++.

  • Alcuni comandi di estensione usano sempre l'analizzatore di espressioni MASM e altri comandi di estensione accettano solo argomenti numerici anziché espressioni complete.

  • Se una parte di un'espressione è racchiusa tra parentesi e si inseriscono due segni (@@) prima dell'espressione, l'espressione viene valutata dall'analizzatore di espressioni che in genere non verrà usata in questo caso.

I due segni (@@) consentono di usare due analizzatori diversi per parametri diversi di un singolo comando. Consente inoltre di valutare parti diverse di un'espressione lunga in base a metodi diversi. È possibile annidare i due segni. Ogni aspetto dei due segni passa all'altro analizzatore di espressioni.

Avviso La sintassi delle espressioni C++ è utile per modificare strutture e variabili, ma non è adatta come parser per i parametri dei comandi del debugger. Quando si usano i comandi del debugger per scopi generali o si usano estensioni del debugger, è necessario impostare la sintassi dell'espressione MASM come analizzatore di espressioni predefinito. Se è necessario disporre di un parametro specifico usa la sintassi dell'espressione C++, usare la sintassi due in corrispondenza del segno (@@).

Per altre informazioni sui due diversi tipi di espressione, vedere Sintassi dell'espressione numerica.

Numeri nelle espressioni

I numeri nelle espressioni MASM vengono interpretati in base al radix corrente. Il comando n (Set Number Base) può essere usato per impostare il radix predefinito su 16, 10 o 8. Tutti i numeri senza prefisso verranno interpretati in questa base. Il radix predefinito può essere sottoposto a override specificando il prefisso 0x (esadecimale), il prefisso 0n (decimale), il prefisso 0t (ottale) o il prefisso 0y (binario).

I numeri nelle espressioni C++ vengono interpretati come numeri decimali a meno che non si specifichi in modo diverso. Per specificare un intero esadecimale, aggiungere 0x prima del numero. Per specificare un intero ottale, aggiungere 0 (zero) prima del numero. Tuttavia, nell'output del debugger viene talvolta usato il prefisso decimale 0n .

Se si vuole visualizzare un numero in diverse basi contemporaneamente, usare il comando .format (Show Number Format).

Simboli nelle espressioni

I due tipi di espressioni interpretano i simboli in modo diverso:

  • Nelle espressioni MASM ogni simbolo viene interpretato come indirizzo. A seconda del simbolo a cui fa riferimento, questo indirizzo è l'indirizzo di una variabile globale, variabile locale, funzione, segmento, modulo o qualsiasi altra etichetta riconosciuta.

  • Nelle espressioni C++ ogni simbolo viene interpretato in base al relativo tipo. A seconda del simbolo a cui fa riferimento, può essere interpretato come intero, una struttura di dati, un puntatore a funzioni o qualsiasi altro tipo di dati. Un simbolo che non corrisponde a un tipo di dati C++ (ad esempio un nome di modulo non modificato) crea un errore di sintassi.

Se un simbolo potrebbe essere ambiguo, precederlo con il nome del modulo e un punto esclamativo ( ! ). Se il nome del simbolo può essere interpretato come numero esadecimale, precederlo con il nome del modulo e un punto esclamativo ( ! ) o solo un punto esclamativo. Per specificare che un simbolo deve essere locale, omettere il nome del modulo e includere un segno dollaro e un punto esclamativo ( $! ) prima del nome del simbolo. Per altre informazioni sull'interpretazione dei simboli, vedere Sintassi dei simboli e corrispondenza dei simboli.

Operatori nelle espressioni

Ogni tipo di espressione usa una raccolta diversa di operatori.

Per altre informazioni sugli operatori che è possibile usare nelle espressioni MASM e sulle relative regole di precedenza, vedere Numeri e operatori MASM.

Per altre informazioni sugli operatori che è possibile usare nelle espressioni C++ e sulle relative regole di precedenza, vedere Numeri e operatori C++.

Tenere presente che le operazioni MASM sono sempre basate su byte e le operazioni C++ seguono le regole di tipo C++ (incluso il ridimensionamento dell'aritmetica del puntatore).

Per alcuni esempi delle diverse sintassi, vedere Esempi di espressioni miste.