Jak Mogę zobaczyć kod asemblera dla programu C++?
Jak mogę zobaczyć kod asemblera dla programu C++?
Jakie są popularne narzędzia do tego?
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
objdump -d a.out
na Uniksie (działa również na cygwin), -
dumpbin /DISASM foo.exe
na Windows.
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.
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
.
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;
- Ustaw punkt przerwania
- Uruchom program, dopóki nie zatrzyma się w punkcie przerwania
- rightclick on the sourcecode and pick "show dissasembly"
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 #
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.
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.
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>
.
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.
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/
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.
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.
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.
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.
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
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