Jak mogę zobaczyć kod asemblera programu C ++?
Jakie są popularne narzędzia do tego?
c++
assembly
disassembly
Maniak
źródło
źródło
Alt +8
Odpowiedzi:
Zapytaj kompilatora
Jeśli sam tworzysz program, możesz poprosić kompilator o wyemitowanie źródła asemblera. W przypadku większości kompilatorów UNIX użyj
-S
przełącznika.Jeśli używasz asemblera GNU, kompilacja za pomocą
-g -Wa,-alh
da wymieszane źródło i asembler na stdout (-Wa
prosi sterownik kompilatora o przekazanie opcji do asemblera,-al
włącza listę asemblera i-ah
dodaje listę "źródeł wysokiego poziomu"):g++ -g -c -Wa,-alh foo.cc
W przypadku programu Visual Studio użyj
/FAsc
.Zajrzyj do pliku binarnego
Jeśli skompilowałeś plik binarny,
objdump -d a.out
w systemie UNIX (działa również dla cygwin),dumpbin /DISASM foo.exe
w systemie Windows.Użyj swojego debugera
Debuggery mogą również pokazywać się w sposób dezorientujący.
disas
polecenia w GDB,źródło
W GCC / G ++ skompiluj z
-S
. Spowoduje to wyświetleniesomething.s
pliku z kodem asemblera.Edycja: Jeśli chcesz, aby dane wyjściowe były w składni Intel (czyli IMO, znacznie bardziej czytelnym i używa go większość samouczków asemblera), skompiluj z
-masm=intel
.źródło
-fverbose-asm
opcjęW programie Visual Studio ;
źródło
Dla gcc / g ++
gcc -save-temps -fverbose-asm prog.c
Spowoduje to wygenerowanie prog.s z komentarzami do zmiennych używanych w każdej linii asm:
movl $42, -24(%ebp) #, readme movl -16(%ebp), %eax # pid, pid movl %eax, 4(%esp) # pid, movl $.LC0, (%esp) #, call printf #
źródło
Ta strona obecnie pracuje dla mnie (2017): https://godbolt.org/
źródło
Wiele osób już powiedziało, jak emitować kod asemblera za pomocą danego kompilatora. Innym rozwiązaniem jest skompilowanie pliku obiektowego i zrzucenie go za pomocą narzędzia takiego jak objdump , readelf (w systemie Unix) lub DUMPBIN ( link ) (w systemie Windows). Możesz również zrzucić plik wykonywalny, ale odczyt danych wyjściowych będzie trudniejszy.
Ma to tę zaletę, że działa w ten sam sposób z każdym kompilatorem.
źródło
Niezależnie od używanego debugera powinien mieć widok zestawu (Visual Studio, Borland IDE, gdb itp.). Jeśli nie używasz debuggera i chcesz po prostu zobaczyć, jaki zestaw jest w programie, możesz użyć dezasemblera lub alternatywnie, uruchomić program i dołączyć do niego za pomocą debugera i wykonać zrzut z tego miejsca. Zobacz odniesienia do deasemblerów, aby uzyskać informacje na temat opcji.
źródło
Jak ktoś inny wspomniał, debugger Twojej platformy jest dobrym punktem wyjścia. Aby poznać młot pneumatyczny wszystkich debuggerów i deasemblerów, spójrz na IDA Pro.
Na platformach Unix / Linux (w tym Cygwin) możesz użyć
objdump --disassemble <executable>
.źródło
Większość kompilatorów ma opcję wyświetlania listy asemblera. Np. Z VisualStudio możesz użyć czegoś takiego jak:
cl.exe /FAfile.asm file.c
Jednak dla najlepszej czytelności większość debugerów oferuje widok, który przeplata dezasemblację z oryginalnym źródłem, dzięki czemu można porównać swój kod z danymi wyjściowymi kompilatora wiersz po wierszu.
źródło
Dezasembler Eksploratora PE dla 32-bitowych plików PE. IDA dla innych.
źródło
Możesz także wypróbować tę stronę: http://assembly.ynh.io/
Tam możesz wkleić swój kod C lub C ++ i nacisnąć niebieski przycisk, aby wyświetlić równoważną wersję zestawu.
źródło
W programie Visual Studio można wygenerować listę asemblera dla projektu C ++.
Przejdź do właściwości projektu, a następnie do C ++ / Output Files i ustaw ustawienie Assembler Output i lokalizację listy ASM na nazwę pliku.
źródło
Na Intel Mac OS X 10.8 (Mountain Lion)
-masm=intel
dyrektywa nie działała. Jeśli jednak masz zainstalowany Xcode , powinno było zainstalować narzędzie o nazwie „otool”:Musisz podać skompilowany kod obiektowy jako parametr.
źródło
Jeśli jesteś użytkownikiem Eclipse, możesz skorzystać z widoku Demontaż .
źródło