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