Jak mogę zobaczyć kod asemblera programu C ++?


Odpowiedzi:


169

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 -Sprzełącznika.

  • Jeśli używasz asemblera GNU, kompilacja za pomocą -g -Wa,-alhda wymieszane źródło i asembler na stdout ( -Waprosi sterownik kompilatora o przekazanie opcji do asemblera, -alwłącza listę asemblera i -ahdodaje 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,

  • używać objdump -d a.outw 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.

  • Użyj disaspolecenia w GDB,
  • lub okno demontażu programu Visual Studio w systemie Windows.

35

W GCC / G ++ skompiluj z -S. Spowoduje to wyświetlenie something.spliku 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.


5
dodaj także -fverbose-asmopcję
osgx

23

W programie Visual Studio ;

  1. ustawić punkt przerwania
  2. uruchom program, aż zatrzyma się w punkcie przerwania
  3. kliknij prawym przyciskiem myszy kod źródłowy i wybierz „Pokaż demontaż”

15

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  #


6

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.


6

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.


5

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


Jeśli istnieje opcja, aby kompilator generował asembler (jak gcc -S lub opcja VS / FA poniżej), jest to lepsze niż deasemblacja. To jest bardziej symboliczne.
Marco van de Voort

Jasne, jeśli masz źródło.
Ori Pessach

2
Nawiasem mówiąc, byłbyś zaskoczony, ile informacji o symbolach można wydedukować przez IDA Pro.
Ori Pessach

5

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.



3

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.


Do Twojej wiadomości, nie można załadować
kaiwan

Tak, w 2015 roku działało dobrze, a potem nagle się zatrzymało. Potem pojawił się ctoassembly.com, ale działał tylko dla niewielkiego podzbioru C. Stało się to samo: już się nie ładuje. Szkoda.
Gomes JA

2

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.


1

Na Intel Mac OS X 10.8 (Mountain Lion) -masm=inteldyrektywa nie działała. Jeśli jednak masz zainstalowany Xcode , powinno było zainstalować narzędzie o nazwie „otool”:

otool code.o -tV

Musisz podać skompilowany kod obiektowy jako parametr.


0

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

Możesz trochę rozwinąć?
Peter Mortensen,

Istnieje również widok asemblera podczas debugowania w MSVC
phuclv

Nie mam teraz działającego środowiska programistycznego Eclipse C ++, ale oto oficjalna dokumentacja: help.eclipse.org/kepler/ ...
Pieter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.