Kod maszynowy jako język programowania. Język asemblera

Język asemblerowy (lub asembler) jest językiem programowania niskiego poziomu dla komputera lub innego programowalnego sprzętu, w którym występuje korelacja między językiem a architekturą instrukcji maszynowych. Każdy język zorientowany na maszynę (w terminologii profesjonalnej - "kolekcjoner") odnosi się do konkretnej architektury komputerowej. Wręcz przeciwnie, większość języków programowania wysokiego poziomu jest wieloplatformowa, ale wymaga interpretacji lub kompilacji. Kod zorientowany na platformę można również nazwać językiem symbolicznym lub zestawem instrukcji wykonywanych bezpośrednio przez centralny procesor komputera. Każdy program wykonywany przez procesor składa się z szeregu instrukcji. Kod maszynowy jest z definicji najniższym poziomem programowania widocznym dla programisty.




Zastosowanie

Dla wielu transakcji wymagany jest jeden lub więcej argumentów mogą tworzyć pełną instrukcję, a wiele assemblerы może wyrażenia liczb i stałych i rejestrów i etykietach operandy Uwalnia to specjalistę od programowania w języku kodu maszynowego od żmudnych powtarzalnych obliczeń. W zależności od architektury tych elementów mogą być również łączone dla konkretnych instrukcji lub tryby adresowania za pomocą przemieszczenia lub innych danych, oraz stałych adresów. Wiele z tych „kolekcjonerów” oferują dodatkowe mechanizmy ułatwiające tworzenie aplikacji, kompilację sterowania procesem i obsługę debugowania.


Perspektywa historyczna

Pierwszy język Zespół powstał w 1947 roku Kathleen Booth SM2 Byrkbekskom na Uniwersytecie w Londynie w pracach Johna von Neumanna i Hermann Holdstynom Institute for Advanced Studies. SOAP (Symbolic Optimal Assembly Program) był językiem asemblera asemblera dla IBM 650 PC stworzonego przez Stana Poula w 1955 roku. Historycznie wiele rozwiązań programowych napisano w asemblerze. OS w całości napisany w tym języku, przed wprowadzeniem Burroughs MCP (1961), który został napisany w wykonawczy Systems Problem Oriented Language (ESPOL). Wiele komercyjnych aplikacji napisano w języku maszynowym, w tym dużej ilości oprogramowania mainframe IBM, stworzonego przez gigantów IT. COBOL i FORTRAN ostatecznie zastąpione w większości sytuacji, chociaż wiele dużych organizacji zachowane infrastruktury aplikacji montażowej w 1990 roku.
Większość wczesnych mikrokomputerów opierała się na ręcznym kodowaniu języka asemblerowego, w tym większości systemów operacyjnych i aplikacji wielkoskalowych. Wynika to z faktu, że te maszyny miały poważne ograniczenia zasobów, ładowały indywidualną pamięć i architekturę wyświetlania oraz dostarczały ograniczone usługi systemowe z błędami. Być może ważniejszy był brak pierwszej klasy kompilatory języków wysokiego szczebla odpowiednich do zastosowania mikrokomputera, utrudniając kodu maszynowego uczenia się.

Zastosowanie

Języki montaż eliminuje wiele problemów, długi i pracochłonny programowania w asemblerze pierwszej generacji wymagane dla pierwszych komputerów. To wszystkouwalnia programistów od rutyny w postaci zapamiętywania kodów numerycznych i obliczania adresów. Na początkowych etapach kolektory były szeroko stosowane do wszystkich rodzajów programowania. Jednak do końca lat 80. ich użycie zostało w dużej mierze zastąpione przez języki wyższego poziomu w poszukiwaniu zwiększonego programowania wydajności. Obecnie język asemblera służy do bezpośredniej manipulacji sprzętem, dostępu do wyspecjalizowanych instrukcji procesora lub do rozwiązywania krytycznych problemów z wydajnością. Typowe aplikacje to sterowniki urządzeń, niskonapięciowe systemy wbudowane i ustawienia czasu rzeczywistego.

Przykłady zastosowań

Typowymi przykładami większych programów w języku asemblerowym są systemy operacyjne IBM PC DOS, kompilator Turbo Pascal i wczesne aplikacje, takie jak program do arkuszy kalkulacyjnych Lotus 1-2-3.
Machine-Oriented Language jest głównym językiem programowania wielu popularnych domowych komputerów z lat 80. i 90. XX wieku (takich jak MSX, Sinclair ZX Spectrum, Commodore 64 Commodore Amiga i Atari ST). Wynika to z faktu, że zinterpretowane okna dialogowe BASIC na tych systemach zapewniają niską prędkość wykonywania, a także ograniczone możliwości pełnego wykorzystania istniejącego sprzętu. Niektóre systemy mają nawet zintegrowane środowisko programistyczne (IDE) z wysoko rozwiniętymi narzędziami do debugowania i obiektami makro. Niektóre kompilatory dostępne dla Radio Shack TRS-80 i jego następców były w stanie połączyć wbudowane źródło kompilacji z programami wysokiego poziomu. Po kompilacji wbudowany asembler utworzył wbudowany kod binarny.

Kod maszynowy dla manekinów. Terminologia

Program asembler tworzy kody transakcji, tłumacząc kombinacje zasad mnemonicznych i składniowych dla operacji i trybów adresowania na ich numeryczne odpowiedniki. Reprezentacja ta zwykle zawiera kod operacji, a także inne bity kontrolne i dane. Asembler oblicza również wyrażenia stałe i definiuje nazwy znaków dla miejsc pamięci i innych obiektów.
Komendy montażu maszyn mogą również wykonywać proste typy optymalizacji, w zależności od zestawu poleceń. Jednym z konkretnych przykładów może być popularny "kolekcjoner" x86 od różnych dostawców. Większość z nich może wykonywać komendy zastępcze w dowolnej liczbie przejść, na żądanie. Są również w stanie wykonać proste przegrupowanie lub wstawienie instrukcji, takich jak niektóre kolektory RISC, które mogą pomóc zoptymalizować inteligentne planowanie poleceń w celu maksymalnego wykorzystania przenośnika procesora. Podobnie jak wczesne języki programowania, takie jak Fortran, Algol, Cobol i Lisp, kolekcjonery są dostępne od lat 50. XX wieku, a także pierwsza generacja tekstowych interfejsów komputerowych. Jednak kolektory pojawiły się jako pierwsze, ponieważ były znacznie łatwiejsze do napisania niż kompilatory dla języków wysokiego poziomu. Wynika to z faktu, że każdy mnemoniczny, jak również tryby adresowania i argumenty instrukcji są tłumaczone na reprezentacje numeryczne każdej instrukcji bez dużego kontekstu lub analizy. Było też kilka klas tłumaczy i półautomatycznych generatorów kodu o właściwościach podobnych do zespołów itak jak kod wysokiego poziomu i szybki kod, być może, jest jednym z najbardziej znanych przykładów.

Liczba przebiegów

Istnieją dwa rodzaje programowania asemblera na podstawie liczby przejść przez źródło (przez liczbę prób odczytania) w celu utworzenia pliku obiektowego.
Jednoprzebiegowe asemblery przechodzą przez kod źródłowy jeden raz. Wszelkie znaki użyte do jego zdefiniowania będą wymagały erraty na końcu kodu obiektu.
Wieloskładnikowe asemblery tworzą tabele ze wszystkimi znakami i ich wartościami w pierwszych fragmentach, a następnie stosują tabelę w następujących fragmentach, aby wygenerować kod. Początkowym powodem zastosowania kolektorów jednoprzebiegowych była szybkość zbierania danych - często drugi etap wymagał przewinięcia i ponownego odczytania źródła programu na taśmie. Późniejsze komputery z ogromną ilością pamięci (szczególnie do przechowywania dysków) miały miejsce do przeprowadzenia wszystkich niezbędnych operacji bez ponownego czytania. Zaletą zespołu wieloprzebiegowego jest to, że brak błędów prowadzi do tego, że proces wiązania (lub pobranie programu, jeśli asembler bezpośrednio tworzy kod wykonywalny) przebiega szybciej.

Co to jest kod binarny?

Program napisany w języku asemblera składa się z szeregu mnemonicznych poleceń procesora i meta-operatorów (znanych jako dyrektywy, pseudo-instrukcje i pseudooperacje), komentarzy i danych. Instrukcje dotyczące języka asemblera zazwyczaj składają się z kodu mnemonicznego. Podąża za listą danych, argumentów lub parametrów. Oni sąsą tłumaczone przez asembler w instrukcjach języka maszynowego, które są ładowane do pamięci i wykonywane. Na przykład poniższa instrukcja mówi procesorowi x86 /IA-32, aby przenieść 8-bitową wartość do rejestru. Kod binarny tej komendy to 10110, po której następuje 3-bitowy identyfikator, dla którego używany jest rejestr. Identyfikator AL wynosi 000, więc poniższy kod ładuje rejestr AL z danymi 01100001. Powstaje pytanie: czym jest kod binarny? Jest to system kodowania używający cyfr binarnych "0" i "1" do reprezentowania litery, cyfry lub innego znaku na komputerze lub innym urządzeniu elektronicznym. Przykład kodu maszynowego: 1011000001100001.

Cechy techniczne

Przekształcenie języka zespołu w kod maszynowy jest zadaniem złożenia zespołu. Odwrotny proces odbywa się za pomocą dezasemblera. W przeciwieństwie do języków wysokiego poziomu istnieje pojedyncza korespondencja między wieloma prostymi operatorami składania a instrukcjami języka maszynowego. Jednak w niektórych przypadkach asembler może dostarczać pseudo-instrukcje (makra). Mają one zastosowanie do kilku instrukcji języka maszynowego, aby zapewnić powszechnie potrzebną funkcjonalność. Większość w pełni wyposażonych asemblerów zapewnia również bogatą zawartość makr, która jest używana przez dostawców i programistów do generowania bardziej złożonych kodów i sekwencji danych.
Każda architektura komputera ma swój własny język maszynowy. Komputery różnią się pod względem liczby i typów obsługiwanych operacji, w różnych rozmiarach i liczbie rejestrów, a także w prezentacji danych w repozytorium. W tympodczas gdy większość komputerów ogólnego przeznaczenia może wykonywać praktycznie tę samą funkcjonalność, różnią się one sposobem ich działania. Odpowiednie języki asemblera odzwierciedlają te różnice. Wiele zestawów zespołów mnemonicznych lub składni może istnieć dla jednego zestawu poleceń zwykle tworzonych w różnych programach. W tych przypadkach najpopularniejsza jest z reguły taka, która jest dostarczana przez producenta i wykorzystywana w jego dokumentacji.

Język projektu

Istnieje ogromna różnorodność w sposobie klasyfikowania przez autorów kolekcjonowania aplikacji i nazewnictwa, z których korzystają. W szczególności niektóre opisują wszystko, co różni się od maszyny lub rozszerzonego mnemonika jako pseudooperacji. Podstawowy słownik zbioru składa się z systemu poleceń - trzech głównych typów instrukcji używanych do określania operacji programu:
  • mnemoniczny opcode;
  • określenie danych;
  • Przewodnik kolekcjonerski.
  • Mnemoniczny kod operacji i rozszerzony mnemonik

    Instrukcje napisane w języku asemblera są elementarne, w przeciwieństwie do języków wysokiego poziomu. Zazwyczaj mnemonik (symbole losowe) jest symbolem dla jednej wykonywalnej instrukcji kodu. Każde polecenie składa się zwykle z kodu operacji plus zero lub więcej operandów. Większość poleceń odnosi się do jednej lub dwóch wartości. Rozszerzone mnemoniki są najczęściej używane do wyspecjalizowanych instrukcji obsługi w celach nieoczywistych z nazwy podręcznika. Na przykład wiele procesorów nie ma wyraźnej instrukcji NOP, ale mawbudowane algorytmy używane do tego celu.
    Wiele kolektorów obsługuje podstawowe wbudowane makra, które mogą generować dwie lub więcej instrukcji maszynowych.

    Dyrektywy dotyczące danych

    Istnieją instrukcje służące do identyfikacji elementów do przechowywania danych i zmiennych. Określają rodzaj danych, długość i wyrównanie. Te instrukcje mogą określać dostępność informacji dla programów zewnętrznych (zebranych osobno) lub tylko dla aplikacji, która ma zdefiniowaną sekcję danych. Niektóre asemblery określają je jako pseudooperatory.

    Dyrektywy montażowe

    Reguły montażu, zwane również pseudokodami lub pseudooperacjami, są poleceniami dostarczanymi przez asembler i kierują je do operacji innych niż instrukcje montażu. Dyrektywy wpływają na pracę asemblera i mogą wpływać na kod obiektowy, tabelę symboli, listę plików i wartość parametrów wewnętrznego asemblera. Czasami termin pseudokod jest zarezerwowany dla dyrektyw generujących kod obiektowy. Nazwy pseudooperacji często zaczynają się w punkcie, w którym różnią się od poleceń maszynowych. Innym częstym zastosowaniem pseudooperacji jest rezerwowanie obszarów przechowywania danych dla środowiska wykonawczego i ewentualnie inicjalizacja ich zawartości do znanych wartości.

    Kod z własnym dokumentem

    Asemblery symboli umożliwiają programiście powiązanie dowolnych nazw (etykiet lub symboli) z komórkami pamięci i różnymi stałymi. Często każdej zmiennej stałej i zmiennej przypisuje się własną nazwę,więc instrukcje mogą odnosić się do tych lokalizacji po nazwie, ułatwiając w ten sposób samokodujący się kod. W kodzie wykonywalnym nazwa podprogramu odpowiada jego punktowi wejścia, więc wszelkie wywołania podprogramów mogą używać jego nazwy. W ramach podprogramów są przypisane etykiety GOTO. Wiele kolektorów obsługuje znaki lokalne, które są leksykalnie różne od zwykłych znaków. Asemblery takie jak NASM zapewniają elastyczne zarządzanie znakami, pozwalając programistom zarządzać różnymi przestrzeniami nazw, automatycznie obliczają przesunięcia w strukturach danych i przypisują znaczniki odnoszące się do wartości literalnych lub wyniku prostych obliczeń wykonanych przez asembler. Skróty mogą być również używane do inicjowania stałych i zmiennych z ruchomymi adresami. Języki asemblera, podobnie jak większość innych języków komputerowych, pozwalają na dodawanie komentarzy do kodu źródłowego programu, który zostanie zignorowany podczas procesu kompilacji. Komentarze sądowe są ważne w programach asemblerowych, ponieważ definiowanie i przypisywanie sekwencji binarnych poleceń maszynowych jest trudne do zdefiniowania. "Niezarządzany" (bez komentarzy) język asemblera, tworzony przez kompilatory lub dezasemblery, jest trudny do odczytania, gdy konieczne jest wprowadzenie zmian.

    Powiązane publikacje