Come posso vedere il codice assembly per un programma C ++?
Quali sono gli strumenti popolari per farlo?
Come posso vedere il codice assembly per un programma C ++?
Quali sono gli strumenti popolari per farlo?
Risposte:
Se si crea il programma da soli, è possibile chiedere al compilatore di emettere la sorgente dell'assembly. Per la maggior parte dei compilatori UNIX utilizzare l' -S
opzione.
Se si utilizza l'assemblatore GNU, la compilazione con -g -Wa,-alh
fornirà origine e assemblaggio mescolati su stdout ( -Wa
chiede al driver del compilatore di passare le opzioni all'assemblatore, -al
attiva l'elenco dell'assemblaggio e -ah
aggiunge l'elenco "sorgente di alto livello"):
g++ -g -c -Wa,-alh foo.cc
Per Visual Studio, utilizzare /FAsc
.
Se hai compilato binario,
objdump -d a.out
su UNIX (funziona anche per cygwin),dumpbin /DISASM foo.exe
Su Windows.I debugger potrebbero anche mostrare in modo disassato.
disas
comando in GDB,In GCC / G ++, compilare con -S
. Ciò produrrà un something.s
file con il codice assembly.
Modifica: se si desidera che l'output sia nella sintassi Intel (che è IMO, molto più leggibile e la maggior parte delle esercitazioni di assembly lo usano), compilare con -masm=intel
.
-fverbose-asm
opzione
In Visual Studio ;
Questo sito attualmente funziona per me (2017): https://godbolt.org/
Molte persone hanno già detto come emettere il codice assembly con un determinato compilatore. Un'altra soluzione è quella di compilare un file oggetto e scaricarlo con uno strumento come objdump , readelf (su Unix) o DUMPBIN ( link ) (su Windows). Puoi anche scaricare un eseguibile, ma sarà più difficile leggere l'output.
Questo ha il vantaggio di lavorare allo stesso modo con qualsiasi compilatore.
Qualunque debugger che stai usando dovrebbe avere una vista assembly (Visual Studio, Borland IDE, gdb, ecc.). Se non si utilizza un debugger e si desidera semplicemente vedere quale assembly si trova in un programma, è possibile utilizzare un disassemblatore o, in alternativa, eseguire il programma e collegarlo ad esso con un debugger ed eseguire il dump da lì. Vedi i riferimenti ai disassemblatori per informazioni sulle opzioni.
Come ha detto 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 piattaforme Unix / Linux (incluso Cygwin) è possibile utilizzare objdump --disassemble <executable>
.
La maggior parte dei compilatori ha un'opzione per generare un elenco di assiemi. Ad esempio con VisualStudio puoi usare qualcosa come:
cl.exe /FAfile.asm file.c
Per una migliore leggibilità, tuttavia, la maggior parte dei debugger offrirà una vista che intercalera lo smontaggio con l'origine originale, in modo da poter confrontare il codice con l'output del compilatore riga per riga.
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 tuo codice C o C ++ e premere un pulsante blu per vedere la versione equivalente dell'assembly.
In Visual Studio è possibile generare l'elenco dell'assemblatore per un progetto C ++.
Vai alle proprietà del progetto, quindi su C ++ / File di output e imposta l'impostazione Output assemblatore e la posizione dell'elenco ASM su un nome file.
Se sei un utente Eclipse, puoi utilizzare la vista Disassemblaggio .
La vista Disassemblaggio mostra il programma caricato come istruzioni assembler mescolate con il codice sorgente per il confronto. La linea attualmente in esecuzione è indicata da un indicatore a freccia ed evidenziata nella vista. È possibile eseguire le seguenti attività nella vista Smontaggio:
- Impostare i punti di interruzione all'inizio di qualsiasi istruzione dell'assemblatore
- Abilita e disabilita i punti di interruzione e le loro proprietà impostate
- Scorri le istruzioni di smontaggio del tuo programma
- Vai a istruzioni specifiche nel programma
Alt +8