2010-06-20 13 views
5

Rozumiem, że kompilator konwertuje język wysokiego poziomu na kod maszynowy. Mam pytanie, czy kompilator (np. VC++) z kolei używa również asemblera? Pamiętam, że widziałem kod assemblera, kiedykolwiek nastąpiła awaria lub coś podobnego.Czy kompilator ma również asembler?

+1

Asembler to pojedyncze odwzorowanie instrukcji maszynowych (bitów kodu) do niektórych kodów mnemonicznych (np. 'Mov ax, bx'). Dlatego możesz tłumaczyć kody zespołów i kody maszyn bez większego wysiłku. Kompilator wykonujący dużo bardziej skomplikowaną pracę i nie ma relacji jeden do jednego między kodem źródłowym a wygenerowanym kodem (bez względu na to, czy jest to bezpośredni kod maszyny czy instrukcja montażu). Dlatego zwykle nie można zobaczyć kodu źródłowego z kodu binarnego. – ony

+0

ony: dotyczy to nie symbolicznego, a nie makrowego zaplecza asemblera. Ale nawet wydruki GAS są symboliczne. –

Odpowiedz

5

To zależy od kompilatora; wiele kompilatorów może kompilować do montażu. Na przykład, jeśli przejdą flagę „-s” do gcc, jak:

gcc -S -o test.S test.c 

który będzie montażowa dla pliku test.c do test.S plików, które można patrzeć. (Zalecam użycie opcji -O0, jeśli próbujesz odczytać złożenie, ponieważ optymalizacje kompilatora prawdopodobnie zmyli cię z tego powodu).

Od kiedy wspomniałeś Visual C++ w swoim pytaniu, Paul Dixon wskazuje poniżej, że Visual C++ używa the /FA flag, aby osiągnąć to samo.

+1

Tak naprawdę, głównie GCC to robi :-) Większość komercyjnych ma to buildin uniknąć powolnego generowania/reparsowanie kroku tekstowego, z opcją generowania asemblera w razie potrzeby. –

1

Kompilator przechodzi bezpośrednio do kodu maszyny.

Debugger wyświetli instrukcje kodu maszynowego jako asembler, ale debugger może również pokazać inny kod, który nie został skompilowany przez kompilator.

Kompilator może również zawierać asembler, dzięki czemu można dołączyć wbudowany kod assemblera w języku wyższego poziomu lub wygenerować dane wyjściowe asemblera.

+0

niepoprawna .... Mógłbym zaprogramować kompilator, który wyprowadza tylko źródło zespołu, który zostanie złożony oddzielnie z asemblerem ... ponadto, kompilator prawie nie idzie tak bezpośrednio do kodu maszynowego ... reprezentacja wewnętrzna (inna niż docelowa maszyna cod) kodu (!) może być bardzo przydatna do optymalizacji i tak dalej ... ok, wszystko prawdopodobnie jest ukryte, ale "_directly_" to za dużo! : D – ShinTakezou

+0

Można tylko odpowiedzieć na pytanie OP Visual Studio nie wypuszcza asemblera, a następnie wywołuje MASM, aby wygenerować exe –

1

Większość kompilatorów będzie miał opcję wyświetlania zespół listą

  • VC można powiedzieć do wyjścia asembleropodobny aukcji z /FA
  • z gcc, użyj -S przełączyć
0

A kompilator tłumaczy niektóre języki programowania wysokiego poziomu na niektóre języki niższego poziomu (takie jak kod maszynowy, montaż, a nawet inny język wysokiego poziomu, na przykład od Vala do C lub od uC++ do C++).

Nie wiem o VC++, ale większość kompilatorów, jako GNU GCC, nie zawiera asemblera, ale wywołuje zewnętrzny program Asembler (jako NASM lub GNU AS).

Cheers

3

Generalnie, kompilator tłumaczy jednego języka na drugi. Większość kompilatorów kieruje się kodem maszynowym; Oto najczęstsze sposoby zrobienia tego, w kolejności od najniższego poziomu do najwyższego poziomu:

  1. Twórz bezpośrednio kod maszynowy, dołączając back-end dla każdego zestawu instrukcji.
  2. Tworzenie języka asemblera, który jest przekazywany do zewnętrznego asemblera. Tak właśnie działa Gcc. Po tym wszystkim, dlaczego nie skorzystać z istniejących asemblerów? Bezpośrednie generowanie opkodu to ból.
  3. Generuje niskopoziomową pośrednią formę kodu, taką jak LLVM bytecode, która zostaje przekształcona w kod maszynowy. LLVM jest darem niebios dla twórców kompilatorów, ponieważ obsługuje ogromną liczbę optymalizacji i obsługuje wiele back-endów, pozwalając ci pisać na wyższym poziomie niż montaż.
  4. Przekształć kod na język taki jak C, a następnie przekaż go do innego kompilatora. Facebook does this to PHP: kompilują go do C++, a następnie używają gcc do kompilacji tego do zestawu, który jest montowany do kodu natywnego przez GNU as.

Jeśli chcesz spróbować napisać kompilator, polecam zacząć od czegoś w stylu C jako back-end. Jeśli chcesz uzyskać bardziej rozbudowany później, spróbuj LLVM. Jeśli spróbujesz bezpośrednio stworzyć język asemblerowy lub kod maszynowy, prawdopodobnie będzie to mniej wydajne niż to, co wytworzyłby kompilator języka C lub LLVM. Mówię z żenującego osobistego doświadczenia na ten temat.

Powiązane problemy