Condividi tramite


Esempi di espressioni miste

Questo argomento contiene esempi di espressioni MASM e C++ usate in vari comandi.

Tutte le altre sezioni di questa documentazione della Guida usano la sintassi delle espressioni MASM negli esempi ( se non diversamente specificato). La sintassi delle espressioni C++ è molto utile per la modifica di strutture e variabili, ma non analizza i parametri dei comandi del debugger molto bene.

Se si usano i comandi del debugger per scopi generali o usando le estensioni del debugger, è necessario impostare la sintassi dell'espressione MASM come sintassi predefinita, ad esempio usando .expr (Choose Expression Evaluator). Se è necessario disporre di un parametro specifico per usare la sintassi delle espressioni C++, usare la sintassi @@( ).

Se myInt è un valore ULONG32 e se si usa l'analizzatore di espressioni MASM, i due esempi seguenti mostrano il valore di MyInt.

0:000> ?? myInt 
0:000> dd myInt L1 

Tuttavia, l'esempio seguente mostra l'indirizzo di myInt.

0:000> ? myInt 

Punti di interruzione condizionali

È possibile usare gli operatori di confronto per creare punti di interruzione condizionali. Nell'esempio di codice seguente viene utilizzata la sintassi dell'espressione MASM. Poiché il radix predefinito corrente è 16, nell'esempio viene usato il prefisso 0n in modo che il numero 20 venga interpretato come numero decimale.

0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 

Nell'esempio precedente MyVar è un numero intero nell'origine C. Poiché il parser MASM considera tutti i simboli come indirizzi, l'esempio deve avere l'operatore poi per dereferenziare MyVar.

Espressioni condizionali

Nell'esempio seguente viene stampato il valore di ecx se eax è maggiore di ebx, 7 se eax è minore di ebx e 3 se eax è uguale a ebx. In questo esempio viene usato l'analizzatore di espressioni MASM, quindi il segno di uguale (=) è un operatore di confronto, non un operatore di assegnazione.

0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 

Nella sintassi C++ il @ segno indica un registro, un segno di uguale doppio (==) è l'operatore di confronto e il codice deve eseguire il cast esplicito da BOOL a int. Pertanto, nella sintassi C++, il comando precedente diventa il seguente.

0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 

Esempi di espressioni miste MASM e C++

Non è possibile usare espressioni della riga di origine in un'espressione C++. Nell'esempio seguente viene usata la sintassi dell'analizzatore alternativo @@( ) per annidare un'espressione MASM all'interno di un'espressione C++. Questo esempio imposta MyPtr uguale all'indirizzo della riga 43 del file Myfile.c.

0:000> ?? MyPtr = @@( `myfile.c:43` )

Gli esempi seguenti impostano l'analizzatore di espressioni predefinito su MASM e quindi valutano Expression2 come espressione C++ e valutano Expression1 ed Expression3 come espressioni MASM.

0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 

Se myInt è un valore ULONG64 e se si sa che questo valore è seguito in memoria da un altro ULONG64, è possibile impostare un punto di interruzione di accesso in tale posizione usando uno degli esempi seguenti. Si noti l'uso dell'aritmetica del puntatore.

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

Vedi anche

Operatori e numeri MASM

Numeri e operatori C++

Espressioni MASM e espressioni C++

Firma estensione