2014-07-25 5 views
5

Jestem nowy w programowaniu i zacząłem od języka C++, o ile wiem, język C++ jest konwertowany na język assemblera przez kompilator C++ (Ex: Visual Studio), ale próbowałem patrzeć w górę za to, co zamienia język asemblera na kod maszynowy, aby został zrozumiany i wykonany przez komputer, ale nie mogłem znaleźć odpowiedzi.Co powoduje konwersję języka Assemblera na kod maszynowy

Pytanie brzmi, gdzie iw jaki sposób język asemblkowy jest konwertowany na kod maszynowy? czy jest to jakiś kompilator zintegrowany z systemem operacyjnym?

Z góry dziękuję.

+1

Nie, to tylko się w dawnych czasach.Typowy etap ładowania, ale nikt nie chce czekać na dodatkowe wymagane przejście asemblera. Pozostaje tylko to, że kompilatory C i C++ nadal mają opcję generowania listy zespołów. –

+0

Kompilator Microsoft C++ generuje kod maszynowy bezpośrednio, podczas gdy kompilator GNU C generuje asembler, a następnie używa asemblera, aby przekształcić go w kod maszynowy. –

+1

Kompilatory Microsoft mają możliwość wyprowadzania kodu zespołu. Nie wiem, czy istnieje opcja kompilacji do kodu zespołu, a następnie złożenia kodu zespołu. Microsoft asembler to ML.EXE dla wersji 32-bitowej i ML64.EXE dla wersji 64-bitowej. Istnieje również MASM.EXE, który w niektórych przypadkach odnosi się do wersji MASM 5.x, a ML.EXE to/jest nowa nazwa dla MASM 6.x lub nowszych wersji. – rcgldr

Odpowiedz

0

Kod zespołu ma podobny proces konwersji do kodu obiektu/maszyny, ponieważ jest uruchamiany przez coś o nazwie assembler (analogicznie do kompilatora w podanym przykładzie).

2

Język zespołu jest konwertowany na wykonywalny kod maszynowy przez program narzędziowy określany jako asembler; proces konwersji jest nazywany montażem lub montażem kodu.

Czytaj więcej here

Cheers !!

9

Niektóre kompilatory (np. GNU) konwertują kod C/C++ na kod zespołu. Narzędzie o nazwie "asembler" przekształca kod złożenia w kod maszynowy, a narzędzie o nazwie "linker" łączy wiele plików maszynowego kodu w jeden plik wykonywalny (.EXE pod Windows). Większość z tych kompilatorów umożliwia zapisanie powstałego kodu asemblera w pliku, dzięki czemu można spojrzeć na kod asemblera lub go zmodyfikować.

Asembler i linker są częścią łańcucha narzędzi, co oznacza, że ​​są zwykle dostarczane razem z kompilatorem.

Niektóre kompilatory (np. Microsoft) bezpośrednio konwertują kod C/C++ na język maszynowy, więc nie jest już potrzebny asembler. Wiele z tych kompilatorów nie jest w stanie utworzyć kodu asemblera, więc nie można zapisać kodu asemblera w pliku.

Przy okazji: Istnieją nawet kompilatory (nie dla C/C++, ale dla innych języków programowania), które bezpośrednio tworzą plik .EXE, więc nie jest wymagany linker.

+0

Ale jeśli tak ... dlaczego nie wszystkie kompilatory konwertują język programowania wyższego poziomu bezpośrednio na kod maszynowy, a nie na zespół? czy nie byłoby lepiej? Mam na myśli, z tego co przeczytałem, asemblera ułatwia użytkownikowi odczytać kod niskiego poziomu, ale nie na komputerze, aby uruchomić program. –

+0

W każdym razie potrzebujesz narzędzia "asembler", ponieważ jakiś kod (w jądrze systemu operacyjnego) nie może być zapisany w języku wysokiego poziomu. Kod asemblera jest łatwiejszy do generowania i łatwiejszy do debugowania, więc pisanie kodu asemblera ułatwia programowanie kompilatora. Niektóre typy procesorów używają różnych kodów maszynowych, ale mają te same instrukcje asemblera (historyczny przykład: 6800/6809, nowoczesne przykłady: procesory mieszane endian, ARM abi/kciuk). W takich przypadkach potrzebny jest tylko jeden kompilator dla dwóch procesorów. –

+0

clang/LLVM emituje również bezpośrednio kod maszynowy, ale sposób, w jaki o nim mówią, polega na tym, że używa wbudowanego wewnętrznego asemblera. Może nadal kompilować kod, który używa składni GNU C inline asm. Jednak instrukcje generowane przez kompilator mogą nigdy nie przechodzić przez reprezentację tekstową; Nie jestem pewny. clang i MSVC absolutnie mogą generować asm dla użytkowników do czytania (nawet z komentarzami); nie musisz po prostu demontować plików obiektów. –

3

Kiedy kompilator konwertuje wysokiego poziomu kodu do asemblera, który wygląda mniej więcej tak jak poniżej -

  • MOV AX, [A]; # Przesuń A, aby zarejestrować siekierę
  • ADD AX, [B]; # Dodaj B do A
  • IMUL AX; # Kwadrat (A + B)
  • MOV [C], AX;

Asembler konwertuje te instrukcje montażu na kod maszynowy.

instrukcja montażu jest typową formą jak: opcode argumentu [argumentu]

A jeśli sprawdzić instrukcję mikroprocesora będzie poznać w jaki sposób każda instrukcja może być przekształcany do postaci binarnej jak 1001000. Niektóre kawałki są dla opcode i niektóre są dla operandów.

http://www.mathemainzel.info/files/x86asmref.html