Kod montażowy vs kod maszynowy vs Kod obiektowy?

Jaka jest różnica między kodem obiektowym, kodem maszynowym i kodem złożenia?

Możesz podać wizualny przykład ich różnicy?

Author: mmcdole, 2009-01-21

8 answers

Kod maszynowy jest kodem binarnym (1 i 0), który może być wykonywany bezpośrednio przez procesor. Jeśli chcesz otworzyć plik z kodem maszynowym w edytorze tekstowym, zobaczysz śmieci, w tym Znaki niedrukowalne (Nie, Nie te niedrukowalne znaki ;) ).

Kod obiektowy jest częścią kodu maszynowego, która nie została jeszcze połączona z kompletnym programem. Jest to kod maszynowy dla jednej konkretnej biblioteki lub modułu, który będzie składał się z gotowego produktu. Może również zawierają symbole zastępcze lub przesunięcia, których nie można znaleźć w kodzie maszynowym ukończonego programu. Linker użyje tych elementów zastępczych i offsetów, aby połączyć wszystko razem.

Kod asemblera jest zwykłym tekstem i (w pewnym sensie) ludzkim kodem źródłowym, który w większości posiada bezpośredni analog 1: 1 z instrukcjami maszynowymi. Jest to realizowane za pomocą mnemotechniki dla rzeczywistych instrukcji, rejestrów lub innych zasobów. Przykładami są JMP i MULT dla skoków procesora i instrukcje mnożenia. W przeciwieństwie do kodu maszynowego, procesor nie rozumie kodu złożenia. Konwertujemy kod asemblera na maszynę za pomocą asemblera lub kompilatora , choć zwykle myślimy o kompilatorach w powiązaniu z językiem programowania wysokiego poziomu, który jest abstrakcyjny dalej od instrukcji procesora.

Budowanie kompletnego programu wymaga napisania kodu źródłowego dla programu w asemblerze lub w języku wyższego poziomu, takim jak C++. Źródło kod jest montowany (dla kodu złożenia) lub kompilowany (dla języków wyższego poziomu) do kodu obiektowego, a poszczególne moduły są połączone ze sobą, aby stać się kodem maszynowym dla końcowego programu. W przypadku bardzo prostych programów krok łączący może nie być potrzebny. W innych przypadkach, takich jak IDE (integrated development environment) linker i kompilator mogą być wywoływane razem. W innych przypadkach skomplikowany skrypt make lub plik solution może być użyty do poinformowania środowiska jak zbudować finalną aplikację.

Istnieją również języki interpretowane , które zachowują się inaczej. Języki interpretowane opierają się na kodzie maszynowym specjalnego programu interpretera. Na poziomie podstawowym interpreter przetwarza kod źródłowy i natychmiast konwertuje polecenia do nowego kodu maszynowego i wykonuje je. Współczesne Interpretatory, czasami nazywane również środowiskiem uruchomieniowym lub maszyną wirtualną , są znacznie bardziej skomplikowane: kod źródłowy na raz, buforowanie i optymalizacja tam, gdzie to możliwe, oraz obsługa złożonych zadań zarządzania pamięcią. Język interpretowany może być również wstępnie skompilowany do języka pośredniego niższego poziomu lub kodu bajtowego, podobnego do kodu asemblera.

 243
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 16:40:39

Inne odpowiedzi dały dobry opis różnicy, ale prosiłeś o wizualizację również. Oto schemat przedstawiający podróż z kodu C do pliku wykonywalnego.

 109
Author: Graphics Noob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 20:42:17

Kod zestawu jest czytelną dla człowieka reprezentacją kodu maszynowego:

mov eax, 77
jmp anywhere

Kod maszynowy jest czystym kodem szesnastkowym:

5F 3A E3 F1

Zakładam, że masz na myśli kod obiektowy jak w pliku obiektowym. Jest to wariant kodu maszynowego, z tą różnicą, że skoki są tak parametryzowane, że linker może je wypełnić.

Asembler jest używany do konwersji kodu złożenia na kod maszynowy (kod obiektu) Linker łączy kilka plików obiektowych (i bibliotek) w celu wygenerowania wykonywalny.

Napisałem kiedyś program asemblera w czystym hex (nie ma asemblera) na szczęście było to dawno temu na starym, dobrym (ancient) 6502. Ale cieszę się, że są asemblery dla Pentium opcodes.

 45
Author: Toon Krijthe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 00:39:36

8B 5D 32 jest kodem maszynowym

mov ebx, [ebp+32h] is assembly

lmylib.so zawiera 8B 5D 32 jest kodem obiektu

 16
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 20:24:52

Jeszcze nie wspomniano, że istnieje kilka różnych typów kodu asemblera. W najbardziej podstawowej formie wszystkie liczby używane w instrukcjach muszą być określone jako stałe. Na przykład:

$1902: BD 37 14 : LDA $1437,X
$1905: 85 03    : STA $03
$1907: 85 09    : STA $09
$1909: CA       : DEX
$190A: 10       : BPL $1902

Powyższy bit kodu, jeśli jest przechowywany pod adresem $1900 w kasecie Atari 2600, wyświetli kilka linii w różnych kolorach pobranych z tabeli, która zaczyna się od adresu $1437. W niektórych narzędziach wpisanie adresu, wraz z prawą częścią powyższej linii, zapisywałoby zapamiętaj wartości pokazane w środkowej kolumnie i rozpocznij następną linię z następującym adresem. Wpisywanie kodu w tej formie było o wiele wygodniejsze niż wpisywanie w hex, ale trzeba było znać dokładne adresy wszystkiego.

Większość asemblerów pozwala na używanie adresów symbolicznych. Powyższy kod byłby napisany bardziej jak:

rainbow_lp:
  lda ColorTbl,x
  sta WSYNC
  sta COLUBK
  dex
  bpl rainbow_lp

Asembler automatycznie dostosowywał instrukcję LDA tak, aby odnosiła się do dowolnego adresu odwzorowanego na etykiecie ColorTbl. Używając tego styl asemblera znacznie ułatwia pisanie i edycję kodu, niż byłoby to możliwe, gdyby trzeba było ręcznie kluczować i ręcznie utrzymywać wszystkie adresy.

 7
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-19 02:58:10

Kod asemblera jest omówiony tutaj .

" język asemblera jest językiem niskopoziomowym dla komputerów programistycznych. Implementuje symboliczną reprezentację kodów maszyn numerycznych i innych stałych potrzebnych do zaprogramowania określonej architektury procesora."

Kod maszynowy jest omawiany tutaj.

" kod maszynowy lub język maszynowy jest systemem instrukcji i danych wykonywanym bezpośrednio przez centralną jednostkę przetwarzania komputera."

Zasadniczo, kod asemblera jest językiem i jest tłumaczony na kod obiektowy (kod macierzysty, który uruchamia procesor) przez asembler (analogiczny do kompilatora).

 1
Author: nzpcmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 20:21:02

Myślę, że to są główne różnice

  • czytelność kodu
  • kontrola nad tym, co robi twój kod

Czytelność może sprawić, że kod zostanie poprawiony lub zastąpiony 6 miesięcy po jego utworzeniu, z drugiej strony, jeśli wydajność jest krytyczna, możesz użyć języka niskiego poziomu, aby skierować konkretny sprzęt, który będziesz miał w produkcji, aby uzyskać szybsze wykonanie.

IMO dzisiaj komputery są na tyle szybkie, by pozwolić programiście zyskaj szybką realizację z OOP.

 1
Author: Alberto Zaccagni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 20:26:25

Assembly to krótkie terminy opisowe, które ludzie mogą zrozumieć, które można bezpośrednio przetłumaczyć na kod maszynowy, którego faktycznie używa procesor.

Chociaż jest to zrozumiałe dla ludzi, Assembler wciąż jest na niskim poziomie. Potrzeba dużo kodu, aby zrobić coś użytecznego.

Więc zamiast tego używamy języków wyższego poziomu, takich jak C, BASIC, FORTAN(OK wiem, że się umawiałem). Po skompilowaniu generują one kod obiektowy. Wczesne języki miały język maszynowy jako kod obiektowy.

Wiele obecnie języki takie jak JAVA i C# Zwykle kompilują się w Bajt kodu, który nie jest kodem maszynowym, ale takim, który można łatwo zinterpretować w czasie wykonywania, aby wytworzyć kod maszynowy.

 0
Author: Jim C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 20:45:11