C++ - pokazanie skompilowanego asemblera

Odpowiedz Nowy wątek
2011-12-06 19:32
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?


Pozostało 580 znaków

2011-12-06 19:37
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.


"(...) otherwise, the behavior is undefined".
edytowany 3x, ostatnio: Endrju, 2011-12-06 19:40

Pozostało 580 znaków

2011-12-06 19:41
0

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


edytowany 1x, ostatnio: merlinnot, 2011-12-06 20:06
nie musi, bardziej popularne jest rozszerzenie ".s" - Rev 2011-12-06 20:35

Pozostało 580 znaków

2011-12-06 20:49
0

a żeby asm był skomentowany kodem C?

A może frytki do tego? :D - Blood 2011-12-06 21:10
Takie rzeczy tylko w Erze. - hauleth 2011-12-06 21:34
-Wa,-a więcej bajerów w man as. Chociaż to nie jest skomentowane w sumie... - Endrju 2011-12-06 21:38
czemu nie rozumiem tych żartów? - Xitami 2011-12-06 23:56
To trzeba użyć Visual C++:) - pozytywista 2011-12-07 12:49

Pozostało 580 znaków

2011-12-06 21:15
0

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


nasm? a nie as? - rafal__ 2011-12-06 21:29

Pozostało 580 znaków

2011-12-06 21:29
1

Bo to nie jest kod NASMa tylko GNU AS.

Pozostało 580 znaków

2011-12-06 21:42
0

Teraz mam coś takiego:

[email protected]:/home/merlinnot/Pulpit/ALL# as plik_zrodlowy.asm -o plik_wynikowy
[email protected]:/home/merlinnot/Pulpit/ALL# chmod +x plik_wynikowy
[email protected]:/home/merlinnot/Pulpit/ALL# ./plik_wynikowy
bash: ./plik_wynikowy: cannot execute binary file

Jeszcze linkować musisz. - Endrju 2011-12-06 21:45
Mógłbyś rozwinąć wypowiedź? - merlinnot 2011-12-06 21:47

Pozostało 580 znaków

2011-12-06 21:52
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.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2011-12-06 21:52

Pozostało 580 znaków

2011-12-07 11:01
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]

edytowany 1x, ostatnio: Azarien, 2011-12-07 11:01

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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