Bagaimana saya bisa melihat kode perakitan untuk program C ++?

133

Bagaimana saya bisa melihat kode perakitan untuk program C ++?

Apa alat populer untuk melakukan ini?

Kutu buku
sumber
Microsoft Visual C ++ Express baru saja menetapkan breakpoint dan tekanAlt +8
jyz
Kemungkinan Gandakan: stackoverflow.com/questions/137038/…
legends2k

Jawaban:

167

Tanyakan pada kompiler

Jika Anda membuat program sendiri, Anda dapat meminta kompiler Anda untuk mengeluarkan sumber perakitan. Untuk sebagian besar kompiler UNIX gunakan -Ssakelar.

  • Jika Anda menggunakan GNU assembler, kompilasi dengan -g -Wa,-alhakan memberikan sumber dan perakitan yang dicampurkan di stdout ( -Wameminta driver kompiler untuk memberikan opsi kepada assembler, -almengaktifkan daftar perakitan, dan -ahmenambahkan daftar "sumber tingkat tinggi"):

    g++ -g -c -Wa,-alh foo.cc

  • Untuk Visual Studio, gunakan /FAsc.

Mengintip biner

Jika Anda telah mengompilasi biner,

Gunakan debugger Anda

Debuggers juga bisa menunjukkan disassebly.

Mempekerjakan bahasa Rusia
sumber
35

Di GCC / G ++, kompilasi dengan -S. Itu akan menampilkan something.sfile dengan kode rakitan.

Sunting: Jika Anda ingin output dalam sintaks Intel (yang IMO, jauh lebih mudah dibaca, dan sebagian besar tutorial perakitan menggunakannya), kompilasi dengan -masm=intel.

Zifre
sumber
5
tambahkan juga -fverbose-asmopsi
osgx
23

Di Visual Studio ;

  1. atur breakpoint
  2. jalankan program sampai berhenti di breakpoint
  3. klik kanan pada kode sumber dan pilih "tampilkan dissasembly"
Viktor Sehr
sumber
14

Untuk gcc / g ++

gcc -save-temps -fverbose-asm prog.c

Ini akan menghasilkan prog.s dengan beberapa komentar pada variabel yang digunakan di setiap baris asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #
osgx
sumber
6

Banyak orang sudah mengatakan bagaimana cara memancarkan kode perakitan dengan kompiler yang diberikan. Solusi lain adalah mengkompilasi file objek dan membuangnya dengan alat seperti objdump , readelf (di Unix) atau DUMPBIN ( tautan ) (di Windows). Anda juga dapat membuang yang dapat dieksekusi, tetapi akan lebih sulit untuk membaca hasilnya.

Ini memiliki keuntungan bekerja dengan cara yang sama dengan kompiler apa pun.

Bastien Léonard
sumber
6

Apapun debugger yang Anda gunakan harus memiliki tampilan perakitan (Visual Studio, Borland IDE, gdb, dll.). Jika Anda tidak menggunakan debugger dan Anda hanya ingin melihat perakitan apa yang ada dalam suatu program, Anda dapat menggunakan disassembler atau, jalankan program dan lampirkan dengan debugger dan lakukan dump dari sana. Lihat referensi untuk disassembler untuk informasi tentang opsi.

Adam Markowitz
sumber
5

Seperti orang lain sebutkan, debugger platform Anda adalah titik awal yang baik. Untuk penipu dari semua debugger dan disassembler, lihat IDA Pro.

Pada platform Unix / Linux (termasuk Cygwin) Anda dapat menggunakan objdump --disassemble <executable>.

Ori Pessach
sumber
Jika ada opsi untuk membuat kompiler menghasilkan assembler (seperti gcc -S, atau opsi VS / FA di bawah), itu lebih disukai daripada pembongkaran. Itu lebih simbolis.
Marco van de Voort
Tentu, jika Anda memiliki sumbernya.
Ori Pessach
2
Ngomong-ngomong, Anda akan terkejut betapa banyak informasi simbol dapat disimpulkan oleh IDA Pro.
Ori Pessach
5

Sebagian besar kompiler memiliki opsi untuk menampilkan daftar perakitan. Misalnya dengan VisualStudio Anda dapat menggunakan sesuatu seperti:

cl.exe /FAfile.asm file.c

Untuk keterbacaan terbaik, sebagian besar debugger akan menawarkan pandangan yang interleaves pembongkaran dengan sumber asli, sehingga Anda dapat membandingkan kode Anda dengan baris output kompiler demi baris.

Nik
sumber
3

Anda juga dapat mencoba situs ini: http://assembly.ynh.io/

Di sana, Anda dapat menempelkan kode C atau C ++ dan menekan tombol biru untuk melihat versi yang setara dengan perakitan.

Gomes JA
sumber
FYI, gagal memuat
kaiwan
Ya, pada tahun 2015 itu bekerja dengan baik, lalu tiba-tiba berhenti. Kemudian datang ctoassembly.com, tetapi hanya berfungsi untuk sebagian kecil dari C. Yang terjadi adalah: tidak memuat lagi. Sangat buruk.
Gomes JA
2

Di Visual Studio Anda bisa membuat daftar assembler untuk proyek C ++.

Buka properti proyek, lalu ke C ++ / Output File dan atur pengaturan Assembler Output dan lokasi daftar ASM ke nama file.

Cătălin Pitiș
sumber
1

Pada Intel Mac OS X 10.8 (Mountain Lion) -masm=intelarahan tidak berfungsi. Namun, jika Anda menginstal Xcode , seharusnya sudah menginstal alat bernama 'otool':

otool code.o -tV

Anda harus memberikan kode objek yang dikompilasi sebagai parameter.

gibertoni
sumber
0

Jika Anda pengguna Eclipse, Anda dapat menggunakan tampilan Disassembly .

Tampilan Disassembly menunjukkan program yang dimuat sebagai instruksi assembler dicampur dengan kode sumber untuk perbandingan. Baris yang sedang dieksekusi ditunjukkan oleh penanda panah dan disorot dalam tampilan. Anda dapat melakukan tugas-tugas berikut dalam tampilan Disassembly:

  • Tetapkan breakpoint di awal instruksi assembler
  • Aktifkan dan nonaktifkan breakpoints dan atur propertinya
  • Ikuti instruksi pembongkaran program Anda
  • Beralih ke instruksi spesifik dalam program
Pieter
sumber
Bisakah Anda sedikit menjelaskan?
Peter Mortensen
Ada juga tampilan perakitan saat debugging di MSVC
phuclv
Saya tidak memiliki lingkungan pengembangan Eclipse C ++ yang berfungsi saat ini, tetapi inilah dokumentasi resmi: help.eclipse.org/kepler/…
Pieter