L'elenco di disassemblaggio generato da un disassemblatore è esattamente uguale all'elenco di codice assembly che viene facoltativamente generato da un compilatore durante la compilazione del codice C?
No, mi aspetto che l'output dell'assieme del compilatore possa includere nomi simbolici, funzioni e variabili, anche struct
nomi di membri. Lo smontaggio conterrebbe solo numeri.
In altre parole, sia il compilatore che il disassemblatore possono emettere i nomi delle istruzioni del codice operativo, ma il disassemblatore emette semplicemente numeri anziché simboli quando fa riferimento a indirizzi di memoria. O se sta smontando una DLL, il disassemblatore potrebbe emettere i simboli pubblici esportati dalla DLL; ma (a differenza del compilatore) non i nomi simbolici delle variabili interne e delle subroutine.
A parte questo, è lo stesso codice macchina. C'è anche un linker, che avviene dopo il compilatore (l'elaborazione del linker sarà evidente negli indirizzi numerici mostrati dal disassemblatore).
Dipende dal compilatore e in genere potrebbe non essere lo stesso (ad esempio perché il compilatore genera molte etichette locali che vanno perse).
Se usi GCC per compilare il tuo codice sorgente foo.c
(tecnicamente, un unità di traduzione ) Suggerisco di usare
gcc -Wall -O -fverbose-asm -S foo.c
che produce il codice assembler foo.s
che puoi esaminare con un editor. Grazie a -fverbose-asm
il file assemblatore contiene anche commenti generati utili (per aiutarti a capire cosa sta succedendo).