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