Perintah disassemble

Memecah sebuah fungsi atau fragmen fungsi yang ditentukan.

Sintaksis

disassemble
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