Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a témakör példákat tartalmaz a különböző parancsokban használt MASM- és C++ kifejezésekre.
A súgódokumentáció összes többi szakasza a MASM kifejezés-szintaxisát használja az példákban (hacsak nincs másként feljegyezve). A C++ kifejezésszintaxis nagyon hasznos struktúrák és változók manipulálására, de nem elemzi a hibakereső parancsok paramétereit.
Ha hibakereső parancsokat használ általános célokra vagy hibakeresőbővítményeket, akkor a MASM-kifejezés szintaxisát kell alapértelmezett szintaxisként beállítania, például a .expr (Kifejezésértékelő kiválasztása) használatával. Ha egy adott paraméterrel kell rendelkeznie a C++ kifejezésszintaxis használatához, használja a @@( ) szintaxist.
Ha a myInt egy ULONG32 érték, és a MASM-kifejezésértékelőt használja, az alábbi két példa a MyInt értékét mutatja.
0:000> ?? myInt
0:000> dd myInt L1
Az alábbi példában azonban a myIntcíme látható.
0:000> ? myInt
Feltételes töréspontok
Összehasonlító operátorokkal feltételes töréspontokat hozhat létre. Az alábbi példakód MASM-kifejezés szintaxist használ. Mivel az aktuális alapértelmezett radix értéke 16, a példa a 0n előtagot használja, így a 20-as szám decimális számként értelmezhető.
0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' "
Az előző példában a MyVar egy egész szám a C forrásban. Mivel a MASM-elemző az összes szimbólumot címként kezeli, a példának rendelkeznie kell a poi operátorral a MyVar dereferencia érdekében.
Feltételes kifejezések
Az alábbi példa az ecx értékét nyomtatja ki, ha az eax nagyobb, mint az ebx, 7, ha az eax kisebb , mint az ebx, és 3, ha az eaxértéke ebx. Ez a példa a MASM-kifejezés kiértékelőt használja, így az egyenlőségjel (=) egy összehasonlító operátor, nem pedig hozzárendelési operátor.
0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx)
A C++ szintaxisban a @ jel egy regisztrátort jelez, a kettős egyenlőségjel (==) az összehasonlító operátor, a kódnak pedig explicit módon kell a BOOL-ból intre leadnia. Ezért a C++ szintaxisban az előző parancs a következő lesz.
0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx)
MASM és C++ vegyes kifejezési példák
C++ kifejezésben nem használhat forrásvonalas kifejezéseket. Az alábbi példa a @@( ) alternatív kiértékelő szintaxissal ágyaz be egy MASM-kifejezést egy C++ kifejezésbe. Ez a példa a MyPtr értékét a Myfile.c fájl 43. sorának címével egyenlőre állítja.
0:000> ?? MyPtr = @@( `myfile.c:43` )
Az alábbi példák az alapértelmezett kifejezésértékelőt MASM-nek, majd a Expression2-t C++ kifejezésként értékelik ki, a Kifejezés1 és a Kifejezés3 pedig MASM-kifejezésként.
0:000> .expr /s masm
0:000> bp Expression1 + @@( Expression2 ) + Expression3
Ha a myInt egy ULONG64 érték, és ha tudja, hogy ezt az értéket egy másik ULONG64 követi a memóriában, az alábbi példák egyikével beállíthatja a hozzáférési töréspontot ezen a helyen. (Figyelje meg a mutató aritmetikai használatát.)
0:000> ba r8 @@( &myInt + 1 )
0:000> ba r8 myInt + 8