Sdílet prostřednictvím


Příklady smíšených výrazů

Tato témata obsahují příklady výrazů MASM a C++, které se používají v různých příkazech.

Všechny ostatní části této dokumentace nápovědy používají syntaxi výrazu MASM v příkladech (pokud není uvedeno jinak). Syntaxe výrazů jazyka C++ je velmi užitečná pro manipulaci se strukturami a proměnnými, ale neanalyzuje parametry příkazů ladicího programu velmi dobře.

Pokud používáte příkazy ladicího programu pro obecné účely nebo rozšíření ladicího programu, měli byste nastavit syntaxi výrazu MASM jako výchozí syntaxi, například pomocí .expr (Choose Expression Evaluator). Pokud potřebujete konkrétní parametr pro použití syntaxe výrazu C++, použijte syntaxi @@( ).

Pokud myInt je hodnota ULONG32 a pokud používáte vyhodnocovače výrazů MASM, následující dva příklady ukazují hodnotu MyInt.

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

Následující příklad však ukazuje adresumyInt.

0:000> ? myInt 

Podmíněné přerušení programu

Pomocí relačních operátorů můžete vytvářet podmíněné zarážky. Následující příklad kódu používá syntaxi výrazu MASM. Vzhledem k tomu, že aktuální výchozí radix je 16, použije příklad předponu 0n , aby číslo 20 bylo považováno za desetinné číslo.

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

V předchozím příkladu je MyVar celé číslo ve zdroji jazyka C. Vzhledem k tomu, že analyzátor MASM považuje všechny symboly za adresy, musí mít příklad operátor poi pro dereference MyVar.

Podmíněné výrazy

Následující příklad zobrazí hodnotu ecx , pokud je eax větší než ebx, 7 pokud eax je menší než ebx, a 3, pokud eax se rovná ebx. Tento příklad používá vyhodnocovač výrazů MASM, takže rovnítko (=) je relační operátor, nikoli operátor přiřazení.

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

Ve syntaxi jazyka C++ znak @ označuje registr, dvojité rovná se (==) je porovnávací operátor a kód musí explicitně přetypovat z BOOL na int. Proto je v syntaxi jazyka C++ předchozí příkaz následující.

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

Příklady smíšených výrazů MASM a C++

Ve výrazu jazyka C++ nelze použít výrazy zdrojového řádku. Následující příklad používá alternativní syntaxi vyhodnocovače @@( ) k vnoření výrazu MASM do výrazu C++. Tento příklad nastaví MyPtr na adresu řádku 43 souboru Myfile.c.

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

Následující příklady nastavují výchozí vyhodnocovač výrazů na MASM a pak vyhodnocují Výraz2 jako výraz C++ a vyhodnotí Výraz1 a Výraz3 jako výrazy MASM.

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

Pokud je myInt hodnotou typu ULONG64 a víte, že tuto hodnotu v paměti následuje další ULONG64 hodnota, můžete na tomto místě nastavit přístupovou zarážku pomocí jednoho z následujících příkladů. (Všimněte si použití aritmetiky ukazatelů.)

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

Viz také

Čísla a operátory MASM

Čísla a operátory jazyka C++

Výrazy MASM vs. výrazy C++

Rozšíření podpisu