Jak Mogę zobaczyć kod asemblera dla programu C++?

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

Jakie są popularne narzędzia do tego?

Author: Peter Mortensen, 2009-05-08

14 answers

Zapytaj kompilatora

Jeśli sam budujesz program, możesz poprosić kompilator o wysłanie źródła assembly. Dla większości kompilatorów UNIX używa przełącznika -S.

  • JeĹ "li uĺźywasz GNU assemblera, kompilacja z -g -Wa,-alh Da ĹşrĂłdĹ' o mieszane i Assembler na stdout (-Wa prosi sterownik kompilatora o przekazanie opcji do assemblera, -al włącza listing assemblera, a -ah dodaje listing "ĹşrĂłdĹ' o wysokiego poziomu"):

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

  • Na Visual Studio, zastosowanie /FAsc.

Zajrzyj do binarnego

Jeśli skompilowałeś plik binarny,

Użyj debuggera

Debugery mogą również wyświetlać disassebly.

  • użyj polecenia disas W GDB,
  • lub okno demontażu programu Visual Studio na Windows.
 150
Author: Employed Russian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 10:11:34

W GCC/g++ skompiluj za pomocą -S. Spowoduje to wyświetlenie pliku something.s z kodem złożenia.

Edit: jeśli chcesz, aby wyjście było w składni Intela (która jest IMO dużo bardziej czytelna, a większość samouczków asemblowania jej używa), skompiluj za pomocą -masm=intel.

 30
Author: Zifre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 18:42:36

W Visual Studio;

  1. Ustaw punkt przerwania
  2. Uruchom program, dopóki nie zatrzyma się w punkcie przerwania
  3. rightclick on the sourcecode and pick "show dissasembly"
 20
Author: Viktor Sehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 15:23:17

Dla gcc / g++

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

To wygeneruje prog.s z kilkoma komentarzami na temat 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  #
 11
Author: osgx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 17:08:12

Wiele osób już powiedziało jak emitować kod asemblera z danym kompilatorem. Innym rozwiązaniem jest skompilowanie pliku obiektowego i zrzut go za pomocą narzędzia objdump, readelf (w systemie Unix) lub DUMPBIN (link ) (w systemie Windows). Można również zrzut pliku wykonywalnego, ale będzie trudniej odczytać wynik.

To ma tę zaletę, że działa tak samo z każdym kompilatorem.

 6
Author: Bastien Léonard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 17:38:56

Jakikolwiek debuger używasz powinien mieć widok assembly (Visual Studio, Borland IDE, gdb, itp.). Jeśli nie używasz debuggera i chcesz tylko zobaczyć, jaki Assembler jest w programie, możesz użyć disassemblera lub alternatywnie, uruchomić program i dołączyć do niego za pomocą debuggera i zrobić zrzut stamtąd. Zobacz odniesienia do disassemblers aby uzyskać informacje na temat opcji.

 6
Author: Adam Markowitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 14:11:41

Jak ktoś inny wspomniał, debugger Twojej platformy jest dobrym punktem wyjścia. Aby uzyskać młot pneumatyczny wszystkich debugerów i disassemblerów, spójrz na IDA Pro.

Na platformach Unix/Linux (w tym Cygwin) można używać objdump --disassemble <executable>.

 5
Author: Ori Pessach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 15:22:26

Większość kompilatorów ma możliwość wypisania listy złożeń. Np. z VisualStudio możesz użyć czegoś w stylu:

cl.exe /FAfile.asm file.c

Dla najlepszej czytelności, większość debugerów oferuje widok, który przeplata demontaż z oryginalnym źródłem, dzięki czemu można porównać kod z wyjściowym kompilatorem linia po linii.

 5
Author: Nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 15:25:46

Ta strona obecnie działa dla mnie (2017): https://godbolt.org/

 5
Author: Carlo Wood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-25 14:39:17

PE Explorer Disassembler dla 32-bitowych plików PE. IDA dla innych.

 4
Author: Wylder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-17 23:51:00

Możesz również wypróbować tę stronę: http://assembly.ynh.io/

Tam możesz wkleić swój kod C lub C++ i nacisnąć niebieski przycisk, aby zobaczyć równoważną wersję assembly.

 3
Author: Gomes J. A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-01 05:50:44

W Visual Studio możesz wygenerować listę asemblera dla projektu C++.

Przejdź do właściwości projektu, a następnie do plików wyjściowych C++i ustaw ustawienia wyjściowe asemblera i lokalizację listy ASM na nazwę pliku.

 2
Author: Cătălin Pitiș,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 16:46:19

Na Intel Mac OS X 10.8 (Mountain Lion) dyrektywa -masm=intel nie zadziałała. Jeśli jednak masz zainstalowane Xcode, powinno ono mieć zainstalowane narzędzie o nazwie "otool":

otool code.o -tV

Musisz podać skompilowany kod obiektowy jako parametr.

 1
Author: KuramaYoko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 14:13:33

Jeśli jesteś użytkownikiem Eclipse, możesz użyć widoku Disassembly .

Widok Disassembly pokazuje załadowany program jako asembler instrukcje zmieszane z kodem źródłowym dla porównania. Obecnie wykonujący wiersz jest oznaczony znacznikiem Strzałki i podświetlony w widok. W widoku demontażu można wykonać następujące zadania:

  • Ustawia punkty przerwania na początku dowolnej instrukcji asemblera
  • Włączanie i wyłączanie punktów przerwania i ich zestawu ich właściwości
  • przejdź przez instrukcje demontażu Twojego programu
  • przejdź do szczegółowych instrukcji w programie
 0
Author: Pieter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 17:43:08