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


Risposte:


167

Chiedi al compilatore

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

  • Se si utilizza l'assemblatore GNU, la compilazione con -g -Wa,-alhfornirà origine e assemblaggio mescolati su stdout ( -Wachiede al driver del compilatore di passare le opzioni all'assemblatore, -alattiva l'elenco dell'assemblaggio e -ahaggiunge l'elenco "sorgente di alto livello"):

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

  • Per Visual Studio, utilizzare /FAsc.

Dai un'occhiata al binario

Se hai compilato binario,

Usa il tuo debugger

I debugger potrebbero anche mostrare in modo disassato.


35

In GCC / G ++, compilare con -S. Ciò produrrà un something.sfile 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.


5
aggiungi anche l' -fverbose-asmopzione
osgx

23

In Visual Studio ;

  1. impostare un breakpoint
  2. eseguire il programma fino a quando non si ferma al punto di interruzione
  3. fai clic con il tasto destro del mouse sul codice sorgente e seleziona "mostra lo smontaggio"

14

Per gcc / g ++

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

Questo genererà prog. Con alcuni commenti sulle variabili utilizzate in ogni riga asm:

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


6

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.


6

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.


5

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


Se esiste un'opzione per fare in modo che il compilatore generi l'assemblatore (come gcc -S o l'opzione VS / FA di seguito), è preferibile allo smontaggio. È più simbolico.
Marco van de Voort,

Certo, se hai la fonte.
Ori Pessach,

2
A proposito, rimarrai sorpreso dalla quantità di informazioni sui simboli che IDA Pro può dedurre.
Ori Pessach,

5

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.



3

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.


Cordiali saluti, non
riesco

Sì, nel 2015 stava funzionando bene, poi si è improvvisamente fermato. Poi è arrivato ctoassembly.com, ma ha funzionato solo per un piccolo sottoinsieme di C. Lo stesso successo: non si carica più. Peccato.
Gomes JA

2

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.


1

Su un Intel Mac OS X 10.8 (Mountain Lion) la -masm=inteldirettiva non ha funzionato. Tuttavia, se hai Xcode installato, dovrebbe aver installato lo strumento chiamato 'otool':

otool code.o -tV

Devi fornire il codice oggetto compilato come parametro.


0

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

Puoi elaborare un po '?
Peter Mortensen,

Esistono anche viste di assieme durante il debug in MSVC
phuclv,

Non ho un ambiente di sviluppo Eclipse C ++ funzionante in questo momento, ma ecco la documentazione ufficiale: help.eclipse.org/kepler/…
Pieter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.