Perintah disassemble
Memecah sebuah fungsi atau fragmen fungsi yang ditentukan.
Sintaksis
disassemble [Fungsi]
disassemble [Alamat]
disassemble [Mulai],[Akhir]
disassemble [Fungsi],+[Panjang]
disassemble [Alamat],+[Panjang]
disassemble /m [...]
disassemble /r [...]
Parameter
- Fungsi
- Menentukan fungsi yang akan dipecah. Jika ditentukan, perintah disassemble akan menghasilkan output pemecahan seluruh fungsi.
- Alamat
- Menentukan alamat di dalam fungsi yang akan dipecah. Perhatikan bahwa ketika hanya satu alamat ditentukan, perintah ini akan memecah seluruh fungsi yang mencakup alamat yang diberikan, termasuk instruksi di atasnya.
- Mulai/Akhir
- Menentukan alamat awal dan akhir untuk dipecah. Jika formulir ini digunakan, perintah tidak akan memecah seluruh fungsi, tetapi hanya instruksi di antara alamat awal dan akhir.
- Panjang
- Menentukan jumlah byte yang akan dipecah dimulai dari alamat atau fungsi yang diberikan.
- /m
- Ketika opsi ini ditentukan, perintah disassemble akan menunjukkan baris sumber yang sesuai dengan instruksi-instruksi yang dipecah.
- /r
- Ketika opsi ini ditentukan, perintah disassemble akan menunjukkan nilai byte mentah dari semua instruksi yang dipecah.
Catatan
Default gaya pemecahan yang digunakan oleh GDB adalah gaya AT&T (mis. mov 0xc(%ebp),%eax) yang dapat membingungkan pengguna Windows. Untuk beralih ke gaya pemecahan Intel (mis. mov eax, DWORD PTR [ebp+0xc]) gunakan perintah set disassembly-flavor.
Catatan bahwa perintah disassemble hanya berfungsi untuk kode di dalam fungsi. Jika Anda ingin memecah memori di luar fungsi yang diketahui, gunakan varian x/i dari perintah x.
Contoh
Kami akan menunjukkan beberapa contoh perintah disassemble berdasarkan contoh berikut:
int func(int a, int b) { return a + b; } int main() { return func(1, 2); }
Kami akan mengompilasi file ini tanpa optimasi dan menjalankan beberapa varian dari perintah disassemble untuk menampilkan isi kedua fungsi.
(gdb) break main Breakpoint 1 at 0x8048400: file test.c, line 8. (gdb) run Starting program: /home/bazis/test Breakpoint 1, main () at test.c:8 8 return func(1, 2); (gdb) disassemble Dump of assembler code for function main: 0x080483fa <+0>: push %ebp 0x080483fb <+1>: mov %esp,%ebp 0x080483fd <+3>: sub $0x8,%esp => 0x08048400 <+6>: movl $0x2,0x4(%esp) 0x08048408 <+14>: movl $0x1,(%esp) 0x0804840f <+21>: call 0x80483ed <func> 0x08048414 <+26>: leave 0x08048415 <+27>: ret End of assembler dump. (gdb) disassemble func Dump of assembler code for function func: 0x080483ed <+0>: push %ebp 0x080483ee <+1>: mov %esp,%ebp 0x080483f0 <+3>: mov 0xc(%ebp),%eax 0x080483f3 <+6>: mov 0x8(%ebp),%edx 0x080483f6 <+9>: add %edx,%eax 0x080483f8 <+11>: pop %ebp 0x080483f9 <+12>: ret End of assembler dump. (gdb) disassemble func,+6 Dump of assembler code from 0x80483ed to 0x80483f3: 0x080483ed <func+0>: push %ebp 0x080483ee <func+1>: mov %esp,%ebp 0x080483f0 <func+3>: mov 0xc(%ebp),%eax End of assembler dump. (gdb) disassemble func+3,func+7 Dump of assembler code from 0x80483f0 to 0x80483f4: 0x080483f0 <func+3>: mov 0xc(%ebp),%eax 0x080483f3 <func+6>: mov 0x8(%ebp),%edx End of assembler dump. (gdb) disassemble 0x80483f0 Dump of assembler code for function func: 0x080483ed <+0>: push %ebp 0x080483ee <+1>: mov %esp,%ebp 0x080483f0 <+3>: mov 0xc(%ebp),%eax 0x080483f3 <+6>: mov 0x8(%ebp),%edx 0x080483f6 <+9>: add %edx,%eax 0x080483f8 <+11>: pop %ebp 0x080483f9 <+12>: ret End of assembler dump. (gdb) disassemble /m func Dump of assembler code for function func: 2 { 0x080483ed <+0>: push %ebp 0x080483ee <+1>: mov %esp,%ebp 3 return a + b; 0x080483f0 <+3>: mov 0xc(%ebp),%eax 0x080483f3 <+6>: mov 0x8(%ebp),%edx 0x080483f6 <+9>: add %edx,%eax 4 } 0x080483f8 <+11>: pop %ebp 0x080483f9 <+12>: ret End of assembler dump. (gdb) disassemble /r func Dump of assembler code for function func: 0x080483ed <+0>: 55 push %ebp 0x080483ee <+1>: 89 e5 mov %esp,%ebp 0x080483f0 <+3>: 8b 45 0c mov 0xc(%ebp),%eax 0x080483f3 <+6>: 8b 55 08 mov 0x8(%ebp),%edx 0x080483f6 <+9>: 01 d0 add %edx,%eax 0x080483f8 <+11>: 5d pop %ebp 0x080483f9 <+12>: c3 ret End of assembler dump.
Error Umum
Jika Anda mencoba menggunakan perintah disassemble untuk memecah kode di luar fungsi yang diketahui, itu akan gagal. Sebagai gantinya, gunakan perintah x/i. Berikut ini contoh memecah buffer yang berisi salinan fungsi:
(gdb) start Temporary breakpoint 1 at 0x8048463: file test2.c, line 8. Starting program: /home/bazis/test2 Temporary breakpoint 1, main () at test2.c:8 8 void *pCopyOfFunction = malloc(512); (gdb) next 9 memcpy(pCopyOfFunction, func, 512); (gdb) next 10 return func(1, 2); (gdb) disassemble pCopyOfFunction No function contains specified address. (gdb) x/5i pCopyOfFunction 0x804b008: push %ebp 0x804b009: mov %esp,%ebp 0x804b00b: mov 0xc(%ebp),%eax 0x804b00e: mov 0x8(%ebp),%edx 0x804b011: add %edx,%eax