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?
-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.
Dzięki wielkie! Wymiatasz :)
Ale plik w asemblerze powinien mieć rozszerzenie .asm, prawda? A tam takiego nie ma.
a żeby asm był skomentowany kodem C?
Ciekawe jest to, że ten kod w asemblerze nie chce się skompilować :) Robię to tak:
nasm ALLIN.s -f elf -o ALLINasm.o
Bo to nie jest kod NASMa tylko GNU AS.
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
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.
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 typuDWORD PTR [ebp+12]