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


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.


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.


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"

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  #


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.


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.


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>.


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.



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.


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.


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.