Bagikan melalui


Contoh Ekspresi Campuran

Topik ini berisi contoh ekspresi MASM dan C++ yang digunakan dalam berbagai perintah.

Semua bagian lain dari dokumentasi Bantuan ini menggunakan sintaks ekspresi MASM dalam contoh (kecuali dinyatakan lain). Sintaks ekspresi C++ sangat berguna untuk memanipulasi struktur dan variabel, tetapi tidak mengurai parameter perintah debugger dengan sangat baik.

Jika Anda menggunakan perintah debugger untuk tujuan umum atau menggunakan ekstensi debugger, Anda harus mengatur sintaks ekspresi MASM sebagai sintaks default, misalnya dengan menggunakan .expr (Pilih Evaluator Ekspresi). Jika Anda harus memiliki parameter tertentu untuk menggunakan sintaks ekspresi C++, gunakan sintaks @@( ).

Jika myInt adalah nilai ULONG32 dan jika Anda menggunakan evaluator ekspresi MASM, dua contoh berikut menunjukkan nilai MyInt.

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

Namun, contoh berikut menunjukkan alamatmyInt.

0:000> ? myInt 

Titik Henti Kondisional

Anda dapat menggunakan operator perbandingan untuk membuat titik henti bersyariah. Contoh kode berikut menggunakan sintaks ekspresi MASM. Karena radix default saat ini adalah 16, contohnya menggunakan awalan 0n sehingga angka 20 dipahami sebagai angka desimal.

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

Dalam contoh sebelumnya, MyVar adalah bilangan bulat di sumber C. Karena pengurai MASM memperlakukan semua simbol sebagai alamat, contohnya harus memiliki operator poi untuk mendereferensikan MyVar.

Ekspresi bersyarat

Contoh berikut mencetak nilai ecx jika eax lebih besar dari ebx, 7 jika eax kurang dari ebx, dan 3 jika eax sama dengan ebx. Contoh ini menggunakan evaluator ekspresi MASM, sehingga tanda sama dengan (=) adalah operator perbandingan, bukan operator penugasan.

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

Dalam sintaks C++, @ tanda menunjukkan register, tanda sama ganda (==) adalah operator perbandingan, dan kode harus secara eksplisit ditransmisikan dari BOOL ke int. Oleh karena itu, dalam sintaks C++, perintah sebelumnya menjadi berikut.

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

Contoh Ekspresi Campuran MASM dan C++

Anda tidak dapat menggunakan ekspresi baris sumber dalam ekspresi C++. Contoh berikut menggunakan sintaks evaluator alternatif @@( ) untuk menumpuk ekspresi MASM dalam ekspresi C++. Contoh ini menetapkan MyPtr sama dengan alamat baris 43 dari file Myfile.c.

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

Contoh berikut mengatur evaluator ekspresi default ke MASM lalu mengevaluasi Expression2 sebagai ekspresi C++, dan mengevaluasi Ekspresi1 dan Ekspresi3 sebagai ekspresi MASM.

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

Jika myInt adalah nilai ULONG64 dan jika Anda tahu bahwa nilai ini diikuti dalam memori oleh ULONG64 lain, Anda dapat mengatur titik henti akses di lokasi tersebut dengan menggunakan salah satu contoh berikut. (Perhatikan penggunaan aritmatika pointer.)

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

Lihat juga

Nomor dan Operator MASM

Nomor dan Operator C++

Ekspresi MASM vs. Ekspresi C++

Tanda tangani Ekstensi