Jak mogę zobaczyć kod asemblera programu C ++?
Jakie są popularne narzędzia do tego?
Jak mogę zobaczyć kod asemblera programu C ++?
Jakie są popularne narzędzia do tego?
Odpowiedzi:
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
.
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.Debuggery mogą również pokazywać się w sposób dezorientujący.
disas
polecenia w GDB,W GCC / G ++ skompiluj z -S
. Spowoduje to wyświetlenie something.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
.
-fverbose-asm
opcję
W programie Visual Studio ;
Ta strona obecnie pracuje dla mnie (2017): https://godbolt.org/
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.
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.
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>
.
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.
Dezasembler Eksploratora PE dla 32-bitowych plików PE. IDA dla innych.
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.
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.
Jeśli jesteś użytkownikiem Eclipse, możesz skorzystać z widoku Demontaż .
Widok Disassembly pokazuje załadowany program jako instrukcje asemblera zmieszane z kodem źródłowym dla porównania. Aktualnie wykonywana linia jest wskazywana przez znacznik strzałki i podświetlana w widoku. W widoku Demontaż można wykonać następujące zadania:
- Ustaw punkty przerwania na początku dowolnej instrukcji asemblera
- Włączanie i wyłączanie punktów przerwania oraz ustawianie ich właściwości
- Przejdź przez instrukcje dezasemblacji programu
- Przejdź do konkretnych instrukcji w programie
Alt +8