C++ - pokazanie skompilowanego asemblera

0

C++ przed kompilacją do binarki kompilowany jest do asemblera. I tu moje pytanie: gdzie znajduje się ten kod w asemblerze? Jak można go podejrzeć? Do kompilacji używam:
g++ ALLIN.cpp -O3 -fomit-frame-pointer -o ALLIN
w ALLIN.cpp mam kod C++, w ALLIN binarkę, ale gdzie asembler?

2

-save-temps zachowa pliki pośrednie, to jest plik po preprocesingu oraz plik z asm. Kompilacja dojdzie do końca i program będzie linkowany.
-S spowoduje, że kompilacja zatrzyma się przed asembalcją, czyli dostaniesz tylko plik wynikowy w asm. Nie musisz stosować opcji -o.

Być może zainteresuje Cię jeszcze opcja -masm=intel, bo domyślnie GCC używa składni AT&T.

0

Dzięki wielkie! Wymiatasz :)
Ale plik w asemblerze powinien mieć rozszerzenie .asm, prawda? A tam takiego nie ma.

0

a żeby asm był skomentowany kodem C?

0

Ciekawe jest to, że ten kod w asemblerze nie chce się skompilować :) Robię to tak:
nasm ALLIN.s -f elf -o ALLINasm.o

1

Bo to nie jest kod NASMa tylko GNU AS.

0

Teraz mam coś takiego:

root@merlinnot:/home/merlinnot/Pulpit/ALL# as plik_zrodlowy.asm -o plik_wynikowy
root@merlinnot:/home/merlinnot/Pulpit/ALL# chmod +x plik_wynikowy
root@merlinnot:/home/merlinnot/Pulpit/ALL# ./plik_wynikowy
bash: ./plik_wynikowy: cannot execute binary file
 
0

W zasadzie można by to zrobić za pomocą ld, ale gcc sam go użyje w odpowiedni sposób:

gcc plik_wynikowy -o plik_wykonywalny

Używaj rozszerzenia .o dla plików obiektowych (plik_wynikowy.o) żeby było wiadomo co to.

0

Bo to nie jest kod NASMa tylko GNU AS.
gcc -S -masm=intel wygeneruje sensowniej wyglądający plik asemblera, choć to nadal nie jest składnia NASM-a, a raczej MASM/TASM (co widać po zapisie typu DWORD PTR [ebp+12]

1 użytkowników online, w tym zalogowanych: 0, gości: 1