Come posso vedere il codice assembly per un programma C ++?

Come posso vedere il codice assembly per un programma C ++?

Quali sono gli strumenti popolari per fare questo?

Chiedi al compilatore

Se stai costruendo il programma da solo, puoi chiedere al compilatore di emettere la sorgente dell’assembly. Per la maggior parte dei compilatori UNIX usa l’ -S .

  • Se si utilizza l’assemblatore GNU, compilando con -g -Wa,-alh fornirà l’origine e l’assemblaggio intermix su stdout ( -Wa chiede al driver del compilatore di passare le opzioni all’assembler, -al accende l’elenco degli assembly e -ah aggiunge “alto -level source “):

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

  • Per Visual Studio, utilizzare /FAsc .

Sbircia nel binario

Se hai compilato un binario,

  • usa objdump -d a.out su UNIX (funziona anche con cygwin),
  • dumpbin /DISASM foo.exe su Windows.

Usa il tuo debugger

I debuggers potrebbero anche mostrare disordinatamente.

  • Usa il comando disas in GDB,
  • o la finestra di disassemblaggio di Visual Studio su Windows.

In GCC / G ++, compilare con -S . Ciò produrrà un file something.s con il codice assembly.

Modifica: se si desidera che l’output sia in syntax Intel (che è IMO, molto più leggibile e la maggior parte delle esercitazioni di assemblaggio lo utilizzano), compila con -masm=intel .

In Visual Studio ;

  1. impostare un punto di interruzione
  2. eseguire il programma fino a quando non si ferma al punto di interruzione
  3. fai clic destro sul codice sorgente e seleziona “mostra dissasembly”

Per gcc / g ++

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

Questo genererà progs con alcuni commenti sulle variabili usate in ogni linea asm:

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

Molte persone hanno già detto come emettere il codice assembly con un determinato compilatore. Un’altra soluzione è compilare un file object e scaricarlo con uno strumento come objdump , readelf (su Unix) o DUMPBIN ( link ) (su Windows). È anche ansible scaricare un file eseguibile, ma sarà più difficile leggere l’output.

Questo ha il vantaggio di funzionare allo stesso modo con qualsiasi compilatore.

Qualunque sia il debugger che si sta utilizzando dovrebbe avere una vista assembly (Visual Studio, Borland IDE, gdb, ecc.). Se non si utilizza un debugger e si desidera semplicemente vedere quale assembly è presente in un programma, è ansible utilizzare un disassemblatore o, in alternativa, eseguire il programma e collegarlo a un debugger e eseguire il dump da lì. Vedi i riferimenti ai disassemblatori per informazioni sulle opzioni.

Come menzionato da qualcun altro, il debugger della tua piattaforma è un buon punto di partenza. Per il martello pneumatico di tutti i debugger e disassemblatori, dai un’occhiata a IDA Pro.

Su piattaforms Unix / Linux (incluso Cygwin) è ansible utilizzare objdump --disassemble .

La maggior parte dei compilatori ha un’opzione per generare un elenco di assembly. Ad esempio con VisualStudio puoi usare qualcosa come:

 cl.exe /FAfile.asm file.c 

Tuttavia, per una migliore leggibilità, la maggior parte dei debugger offrirà una visualizzazione che intercala il disassemblaggio con la fonte originale, in modo da poter confrontare il codice con l’output del compilatore riga per riga.

Questo sito funziona attualmente per me (2017): https://godbolt.org/

Disassemblatore PE Explorer per file PE a 32 bit. IDA per gli altri.

Puoi anche provare questo sito: http://assembly.ynh.io/

Qui puoi incollare il codice C o C ++ e premere un pulsante blu per vedere la versione equivalente dell’assemblaggio.

In Visual Studio è ansible generare l’elenco assembler per un progetto C ++.

Passare alle proprietà del progetto, quindi a C ++ / Output Files e impostare l’impostazione Output Assembler e la posizione dell’elenco ASM su un nome file.

Su Intel Mac OS X 10.8 (Mountain Lion) la direttiva -masm=intel non funzionava. Tuttavia, se hai installato Xcode , dovrebbe aver installato lo strumento denominato “otool”:

 otool code.o -tV 

Devi fornire il codice object compilato come parametro.

Se sei un utente Eclipse, puoi utilizzare la vista Disassembly .

La vista Disassembly mostra il programma caricato come istruzioni assembler mescolato con il codice sorgente per il confronto. La linea attualmente in esecuzione è indicata da un indicatore a freccia ed evidenziata nella vista. È ansible svolgere le seguenti attività nella vista Disassemblaggio:

  • Imposta i breakpoint all’inizio di ogni istruzione assembler
  • Abilita e disabilita i punti di interruzione e imposta le loro proprietà
  • Passare attraverso le istruzioni di sassembly del programma
  • Vai a istruzioni specifiche nel programma