Konfiguracja sprzętu i oprogramowania

Struktura programu montażowego. Streszczenie: Plan: Przedmowa

Wstęp.

Język, w którym napisany jest oryginalny program, nazywa się Wejście język i język, na który jest tłumaczony w celu wykonania przez procesor - weekend język. Proces konwersji języka wejściowego na język wyjściowy nazywa się audycja. Ponieważ procesory są zdolne do wykonywania programów w binarnym języku maszynowym, który nie jest używany do programowania, konieczne jest tłumaczenie wszystkich programów źródłowych. znany dwie drogi tłumaczenia: kompilacje i tłumaczenia ustne.

Na kompilacja program źródłowy jest najpierw w całości tłumaczony na równoważny program w języku docelowym, zwany obiekt program, a następnie wykonywane. Proces ten odbywa się za pomocą specjalnego programy, nazywa kompilator. Nazywa się kompilator, dla którego język wejściowy jest symboliczną reprezentacją języka maszynowego (wyjściowego) kodów binarnych monter.

Na interpretacje każda linia tekstu programu źródłowego jest parsowana (interpretowana) i polecenie w nim określone jest natychmiast wykonywane. Wdrożenie tej metody leży po stronie program tłumacza. Interpretacja zajmuje dużo czasu. Aby zwiększyć jego wydajność, zamiast przetwarzać każdą linię, tłumacz wstępnie konwertuje wszystkie Komenda ciągi do znaków (

). Wygenerowana sekwencja symboli służy do wykonywania funkcji przypisanych do oryginalnego programu.

Omówiony poniżej język asemblera jest zaimplementowany za pomocą kompilacji.

Cechy języka.

Główne cechy asemblera:

● zamiast kodów binarnych język używa nazw symbolicznych - mnemonika. Na przykład dla polecenia dodawania (

) używany jest mnemonik

Odejmowania (

mnożenie (

Podziały (

itd. Nazwy symboliczne są również używane do adresowania komórek pamięci. Aby programować w języku asemblerowym, zamiast kodów i adresów binarnych, musisz znać tylko nazwy symboliczne, które asembler tłumaczy na kody binarne;

każde oświadczenie odpowiada jedno polecenie maszyny(kod), to znaczy istnieje korespondencja jeden-do-jednego między instrukcjami maszynowymi a operatorami w programie asemblerowym;

● język zapewnia dostęp do wszystkich obiektów i zespoły. Języki wysokiego poziomu nie mają tej umiejętności. Na przykład język asemblerowy pozwala na sprawdzenie bitu rejestru flag i języka wysokiego poziomu (na przykład

) nie ma tej możliwości. Zwróć uwagę, że języki programowania systemów (na przykład C) często zajmują pozycję pośrednią. Pod względem dostępności są one bliższe asemblerowi, ale mają składnię języka wysokiego poziomu;

● język asemblera nie jest językiem uniwersalnym. Każda konkretna grupa mikroprocesorów ma swój własny asembler. Języki wysokiego poziomu nie mają tej wady.

W przeciwieństwie do języków wysokiego poziomu, pisanie i debugowanie programu w języku asemblerowym zajmuje dużo czasu. Mimo to język asemblera stał się szerokie zastosowanie z powodu następujących okoliczności:

● Program napisany w języku asemblerowym jest znacznie mniejszy i znacznie szybszy niż program napisany w języku wysokiego poziomu. W przypadku niektórych aplikacji wskaźniki te odgrywają nadrzędną rolę, na przykład wiele programy systemowe(w tym kompilatory), programy w kartach kredytowych, telefony komórkowe, sterowniki urządzeń itp.;

● niektóre procedury wymagają pełny dostęp do sprzętu, co zwykle nie jest możliwe w języku wysokiego poziomu. Ten przypadek obejmuje przerwania i procedury obsługi przerwań w systemach operacyjnych, a także kontrolery urządzeń w systemach wbudowanych czasu rzeczywistego.

W większości programów tylko niewielki procent całego kodu odpowiada za duży procent czasu wykonywania programu. Zazwyczaj 1% programu odpowiada za 50% czasu realizacji, a 10% programu odpowiada za 90% czasu realizacji. Dlatego do napisania konkretnego programu w rzeczywistych warunkach używany jest zarówno asembler, jak i jeden z języków wysokiego poziomu.

Format operatora w asemblerze.

Program w języku asemblerowym jest listą poleceń (wyrażeń, zdań), z których każde zajmuje oddzielną linię i zawiera cztery pola: pole etykiety, pole operacji, pole operandu i pole komentarza. Każde pole ma osobną kolumnę.

Pole etykiety.

Dla pola etykiety przydzielona jest kolumna 1. Etykieta jest nazwą symboliczną lub identyfikatorem, adresy pamięć. Jest to konieczne, aby móc:

● dokonać warunkowego lub bezwarunkowego przejścia do polecenia;

● uzyskać dostęp do miejsca, w którym przechowywane są dane.

Takie oświadczenia są oznaczone. Do oznaczenia nazwy używane są (duże) litery alfabetu angielskiego i cyfry. Nazwa musi zaczynać się od litery i kończyć się dwukropkiem. Etykietę dwukropka można zapisać w osobnym wierszu, a kod operacji można wpisać w następnym wierszu w kolumnie 2, co upraszcza pracę kompilatora. Brak dwukropka uniemożliwia odróżnienie etykiety od kodu, jeśli znajdują się one w osobnych wierszach.

W niektórych wersjach języka asemblera, dwukropki są umieszczane tylko po etykietach instrukcji, a nie po etykietach danych, a długość etykiety może być ograniczona do 6 lub 8 znaków.

Pole etykiety nie powinno zawierać tych samych nazw, ponieważ etykieta jest powiązana z adresami poleceń. Jeżeli podczas wykonywania programu nie ma potrzeby wywoływania polecenia lub danych z pamięci, to pole etykiety pozostaje puste.

Pole kodu transakcji.

To pole zawiera komendę mnemonik lub pseudo komendę (patrz niżej). Kod mnemoniczny polecenia jest wybierany przez projektantów języka. W języku asemblera

mnemonik wybrany do załadowania rejestru z pamięci

) oraz przechowywanie zawartości rejestru w pamięci - mnemonik

). W językach asemblera

możesz użyć tej samej nazwy dla obu operacji, odpowiednio

Jeśli wybór nazw mnemonicznych może być dowolny, to konieczność użycia dwóch instrukcji maszynowych wynika z architektury procesora

Mnemoniki rejestrów zależą również od wersji asemblera (Tabela 5.2.1).

Pole operandowe.

Oto dodatkowe informacje wymagane do wykonania operacji. W polu operandów instrukcji skoku wskazany jest adres, pod którym chcesz przeskoczyć, a także adresy i rejestry będące operandami instrukcji maszynowej. Jako przykład, oto operandy, których można użyć w procesorach 8-bitowych

● dane liczbowe,

przedstawione w różnych systemach liczbowych. Aby wskazać używany system liczbowy, po stałej następuje jedna z liter łacińskich: B,

Odpowiednio, binarne, ósemkowe, szesnastkowe, dziesiętne systemy liczbowe (

nie mogą być rejestrowane). Jeśli pierwsza cyfra liczby szesnastkowej to A, B, C,

Następnie z przodu dodaje się nieznaczące 0 (zero);

● kody wewnętrznych rejestrów mikroprocesora i komórek pamięci

M (źródła lub odbiorcy informacji) w postaci liter A, B, C,

M lub ich adresy w dowolnym systemie liczbowym (na przykład 10V - adres rejestru)

v system binarny);

● identyfikatory,

dla zarejestrowanych par samolotów,

Pierwsze litery B

H; dla pary akumulatora i rejestru cech -

; dla licznika programów -

; dla wskaźnika stosu -

● etykiety wskazujące adresy operandów lub kolejne instrukcje w trybie warunkowym

(gdy warunek jest spełniony) i bezwarunkowe przejścia. Na przykład argument M1 w poleceniu

oznacza konieczność bezwarunkowego przejścia do polecenia, którego adres w polu etykiety jest oznaczony identyfikatorem M1;

● wyrażenia,

które są budowane poprzez łączenie omówionych powyżej danych za pomocą operatorów arytmetycznych i logicznych. Pamiętaj, że sposób rezerwacji miejsca na dane zależy od wersji języka. Deweloperzy języka asemblera dla

Zdefiniuj słowo), a później wprowadził alternatywę.

który od samego początku był w języku dla procesorów

W wersji językowej

używany

zdefiniować stałą).

Procesory przetwarzają operandy o różnych długościach. Aby to zdefiniować, deweloperzy asemblera podjęli różne decyzje, na przykład:

II rejestry o różnej długości mają różne nazwy: EAX - do umieszczania 32-bitowych operandów (typ

); AX - dla 16-bitów (typ

i AN - dla 8-bitów (typ

● dla procesorów

przyrostki są dodawane do każdego opcode: przyrostek

Dla typu

; przyrostek „.B” dla typu

dla operandów o różnych długościach używane są różne kody operacji, na przykład do załadowania bajtu, półsłowa (

) i słowa w rejestrze 64-bitowym używają opkodów

odpowiednio.

Pole komentarzy.

To pole zawiera wyjaśnienia dotyczące działań programu. Komentarze nie mają wpływu na działanie programu i są przeznaczone dla osoby. Mogą być potrzebne do modyfikacji programu, który bez takich komentarzy może być zupełnie niezrozumiały nawet dla doświadczonych programistów. Komentarz zaczyna się od znaku i służy do wyjaśniania i dokumentowania programów. Początkowy znak komentarza może mieć postać:

● średnik (;) w językach dla procesorów firmy

Wykrzyknik(!) w językach dla

Każda osobna linia zarezerwowana na komentarz jest poprzedzona znakiem startu.

Pseudo rozkazy (dyrektywy).

W języku asemblerowym można wyróżnić dwa główne typy poleceń:

podstawowy instrukcje, które są równoważne kodowi maszynowemu procesora. Te polecenia wykonują całe przetwarzanie zapewniane przez program;

pseudopolecenia lub dyrektywy, przeznaczony do obsługi procesu tłumaczenia programu na język kombinacji normowych. Jako przykład w tabeli. 5.2.2 pokazuje niektóre pseudo-polecenia z as-asemblera

dla rodziny

.

Podczas programowania zdarzają się sytuacje, w których zgodnie z algorytmem ten sam ciąg poleceń musi być wielokrotnie powtarzany. Aby wyjść z tej sytuacji, możesz:

● napisz żądaną sekwencję poleceń, gdy tylko wystąpi. Takie podejście prowadzi do zwiększenia objętości programu;

● zorganizuj tę sekwencję w procedurę (podprogram) i wywołaj ją, jeśli to konieczne. Takie wyjście ma swoje wady: za każdym razem trzeba wykonać specjalną instrukcję wywołania procedury i instrukcję powrotu, które przy krótkiej i często używanej sekwencji mogą znacznie zmniejszyć szybkość działania programu.

Najprostszy i skuteczna metoda wielokrotne powtarzanie łańcucha poleceń ma na celu użycie makro, które można traktować jako pseudopolecenie przeznaczone do ponownego przetłumaczenia grupy poleceń często spotykanych w programie.

Makro lub makroinstrukcja charakteryzuje się trzema aspektami: definicją makra, odwróceniem makra i rozwinięciem makra.

definicja makra

Jest to oznaczenie powtarzającej się sekwencji poleceń programu, używanej do odniesień w tekście programu.

Makro ma następującą strukturę:

Lista wyrażeń; definicja makra

Powyższa struktura definicji makr składa się z trzech części:

● nagłówek

makro zawierające nazwę

Pseudo-polecenie

oraz zestaw parametrów;

● kropkowany ciało makro;

● drużyna

ukończenie szkoły

definicje makr.

Zestaw parametrów makro zawiera listę wszystkich parametrów podanych w polu operandu dla wybranej grupy instrukcji. Jeżeli parametry te zostaną podane wcześniej w programie, to można je pominąć w nagłówku definicji makra.

Do ponownego złożenia wybranej grupy instrukcji wykorzystuje się wywołanie składające się z nazwy

makro i lista parametrów z innymi wartościami.

Gdy asembler napotka definicję makra podczas kompilacji, przechowuje ją w tabeli definicji makr. Z kolejnymi występami w programie nazwa (

) makra, asembler zastępuje je treścią makra.

Nazywa się używanie nazwy makra jako kodu operacji makro-odwrócenie(wywołanie makra) i zastąpienie go treścią makra - makro ekspansja.

Jeśli program jest reprezentowany jako ciąg znaków (litery, cyfry, spacje, znaki interpunkcyjne i powrót karetki, aby przejść do Nowa linia), to makroekspansja polega na zastąpieniu niektórych łańcuchów z tej sekwencji innymi łańcuchami.

Rozwijanie makr następuje podczas procesu składania, a nie podczas wykonywania programu. Sposoby manipulowania ciągami znaków są przypisane do narzędzia makr.

Prowadzony jest proces montażu w dwóch przejazdach:

● W pierwszym przebiegu wszystkie definicje makr są zachowywane, a wywołania makr są rozszerzane. W tym przypadku program źródłowy jest odczytywany i konwertowany na program, w którym wszystkie definicje makr są usuwane, a każde wywołanie makra jest zastępowane treścią makra;

● Drugi przebieg przetwarza odebrany program bez makr.

Makra z parametrami.

Do pracy z powtarzającymi się sekwencjami poleceń, których parametry mogą przyjmować różne wartości, dostępne są definicje makr:

● z rzeczywisty parametry, które są umieszczane w polu operandu wywołania makra;

● z formalny parametry. Podczas rozwijania makra każdy formalny parametr, który pojawia się w treści makra, jest zastępowany odpowiadającym mu parametrem rzeczywistym.

za pomocą makr z parametrami.

Program 1 pokazuje dwie podobne sekwencje poleceń, różniące się tym, że pierwsza z nich zamienia P i

I drugi

Program 2 zawiera makro z dwoma parametrami formalnymi P1 i P2. Podczas rozszerzania makra każdy znak P1 w treści makra jest zastępowany przez pierwszy rzeczywisty parametr (P,

), a symbol P2 zostaje zastąpiony przez drugi aktualny parametr (

) z programu nr 1. W wywołaniu makra

program 2 jest oznaczony: P,

Pierwszy rzeczywisty parametr,

Drugi aktualny parametr.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P, EBX MOV P2, EAX

Rozszerzone możliwości.

Rozważ niektóre zaawansowane funkcje języka

Jeśli makro zawierające instrukcję rozgałęzienia warunkowego i etykietę, do której należy przejść, zostanie wywołane dwa lub więcej razy, etykieta zostanie zduplikowana (problem z powielaniem etykiet), co spowoduje błąd. Dlatego każdemu wywołaniu przypisywana jest (przez programistę) osobna etykieta jako parametr. w języku

etykieta jest zadeklarowana lokalnie (

) a dzięki zaawansowanym funkcjom asembler automatycznie generuje inną etykietę za każdym razem, gdy makro jest rozwijane.

pozwala na definiowanie makr wewnątrz innych makr. Ta zaawansowana funkcja jest bardzo przydatna w połączeniu z warunkowym łączeniem programów. Rozważać

JEŚLI WORDSIZE GT 16 M2 MAKRO

Makro M2 można zdefiniować w obu częściach zestawienia

Jednak definicja zależy od tego, czy program jest montowany na procesorze 16-bitowym czy 32-bitowym. Jeśli M1 nie zostanie wywołane, to makro M2 nie zostanie w ogóle zdefiniowane.

Inną zaawansowaną funkcją jest to, że makra mogą wywoływać inne makra, w tym siebie - rekursywny połączenie. W tym drugim przypadku, aby uniknąć nieskończonej pętli, makro musi przekazać do siebie parametr, który zmienia się przy każdym rozwinięciu, a także sprawdzać ten parametr i zakończyć rekursję, gdy parametr osiągnie określoną wartość.

O wykorzystaniu makr w asemblerze.

Używając makr, asembler musi być w stanie wykonać dwie funkcje: zapisz definicje makr oraz rozwiń wywołania makr.

Zapisywanie definicji makr.

Wszystkie nazwy makr są przechowywane w tabeli. Każdej nazwie towarzyszy wskaźnik do odpowiedniego makra, aby w razie potrzeby można je było wywołać. Niektóre asemblery mają osobną tabelę nazw makr, inne mają wspólną tabelę, w której obok nazw makr znajdują się wszystkie polecenia maszynowe i dyrektywy.

W przypadku napotkania makra podczas montażu Utworzony:

nowy element tabeli z nazwą makra, liczbą parametrów i wskaźnikiem do innej tabeli definicji makra, w której będzie przechowywany korpus makra;

● lista formalny parametry.

Treść makra, która jest po prostu ciągiem znaków, jest następnie odczytywana i przechowywana w tabeli definicji makr. Parametry formalne występujące w treści pętli są oznaczone specjalnym symbolem.

Wewnętrzna reprezentacja makra

z powyższego przykładu dla programu 2 (s. 244) to:

MOV EAX, MOV EBX, MOV MOV i

gdzie średnik jest używany jako znak powrotu karetki, a ampersand & jest używany jako formalny znak parametru.

Rozszerzenie połączeń makro.

Za każdym razem, gdy podczas składania zostanie napotkana definicja makra, jest ona przechowywana w tabeli makr. Gdy makro jest wywoływane, asembler tymczasowo zawiesza odczytywanie danych wejściowych z urządzenia wejściowego i rozpoczyna odczytywanie treści zapisanego makra. Parametry formalne wyodrębnione z treści makra są zastępowane przez parametry rzeczywiste i dostarczane przez wywołanie. Znak & przed parametrami pozwala asemblerowi je rozpoznać.

Chociaż istnieje wiele wersji asemblera, procesy montażu mają wspólne cechy i są podobne pod wieloma względami. Poniżej omówiono pracę montera dwuprzebiegowego.

Asembler dwuprzebiegowy.

Program składa się z szeregu stwierdzeń. Wydawałoby się zatem, że podczas montażu można zastosować następującą sekwencję czynności:

● przetłumaczyć na język maszynowy;

● przenieść otrzymany kod maszynowy do pliku, a odpowiednią część zestawienia - do innego pliku;

● powtórz powyższe procedury, aż cały program zostanie wyemitowany.

Jednak takie podejście nie jest efektywne. Przykładem jest tzw. problem wiodący link. Jeśli pierwsza instrukcja jest skokiem do instrukcji P na samym końcu programu, to asembler nie może jej przetłumaczyć. Musi najpierw określić adres operatora P, a do tego konieczne jest przeczytanie całego programu. Każde pełne przeczytanie oryginalnego programu nazywa się przejście. Pokażmy, jak możemy rozwiązać problem z referencjami do przodu za pomocą dwóch przebiegów:

na pierwszym przejściu zebrać i przechowuj wszystkie definicje symboli (w tym etykiety) w tabeli, a przy drugim przejściu odczytaj i złóż każdy operator. Ta metoda jest stosunkowo prosta, ale drugie przejście przez oryginalny program wymaga dodatkowego czasu we/wy;

● na pierwszym przejeździe, konwertować zaprogramować na formę pośrednią i zapisać w tabeli, a drugie przejście wykonuje się nie według oryginalnego programu, ale według tabeli. Ta metoda montażu oszczędza czas, ponieważ przy drugim przejściu nie są wykonywane żadne operacje we/wy.

Pierwsze podanie.

Cel pierwszego przejazdu- zbuduj tablicę symboli. Jak wspomniano powyżej, kolejnym celem pierwszego przebiegu jest zapisanie wszystkich definicji makr i rozwinięcie wywołań w miarę ich pojawiania się. Dlatego zarówno definicja znaku, jak i rozwinięcie makra występują w tym samym przebiegu. Symbolem może być albo etykieta, lub oznaczający, któremu przypisano konkretną nazwę za pomocą dyrektywy -you:

;Wartość - wielkość bufora

Przez nadanie znaczenia nazwom symbolicznym w polu etykiety instrukcji, asembler zasadniczo ustawia adresy, które każda instrukcja będzie miała podczas wykonywania programu. Aby to zrobić, monter podczas procesu montażu oszczędza licznik adresu instrukcji(

) jako zmienną specjalną. Na początku pierwszego przebiegu wartość zmiennej specjalnej jest ustawiana na 0 i zwiększana po każdym poleceniu przetworzonym o długość tego polecenia. Jako przykład w tabeli. 5.2.3 pokazuje fragment programu wskazujący długość poleceń i wartości liczników. Tabele generowane są podczas pierwszego przejazdu nazwy symboli, dyrektywy oraz kody operacji, a jeśli to konieczne dosłowny Tabela. Literał jest stałą, dla której asembler automatycznie rezerwuje pamięć. Od razu zauważamy, że nowoczesne procesory zawierają instrukcje z adresami bezpośrednimi, więc ich asemblery nie obsługują literałów.

Tabela symboli

zawiera jeden element dla każdej nazwy (tabela 5.2.4). Każdy element tablicy symboli zawiera samą nazwę (lub wskaźnik do niej), jej wartość liczbową, a czasem dodatkowe informacje, które mogą obejmować:

● długość pola danych skojarzonego z symbolem;

● bity remapowania pamięci (które wskazują, czy wartość symbolu zmienia się, jeśli program jest ładowany pod innym adresem niż zamierzony asembler);

● informacja o tym, czy do symbolu można uzyskać dostęp spoza procedury.

Nazwy symboliczne to etykiety. Można je określić za pomocą operatorów (na przykład

Tabela dyrektyw.

Ta tabela zawiera listę wszystkich dyrektyw lub pseudo rozkazów, które występują podczas asemblowania programu.

Tabela kodów operacji.

Dla każdego kodu operacji w tabeli znajdują się oddzielne kolumny: oznaczenie kodu operacji, operand 1, operand 2, wartość szesnastkowa kodu operacji, długość instrukcji i typ instrukcji (Tabela 5.2.5). Kody operacji są podzielone na grupy w zależności od liczby i rodzaju operandów. Typ polecenia określa numer grupy i określa procedurę wywoływaną w celu przetworzenia wszystkich poleceń w tej grupie.

Drugie podanie.

Cel drugiego przejazdu- stworzenie programu obiektowego i wydrukowanie, jeśli to konieczne, protokołu asemblera; wyprowadza informacje potrzebne konsolidatorowi do łączenia procedur, które zostały złożone w różnym czasie w jeden plik wykonywalny.

W drugim przebiegu (podobnie jak w pierwszym) wiersze zawierające oświadczenia są odczytywane i przetwarzane jeden po drugim. Oryginalny operator i dane wyjściowe pochodzące z niego w postaci szesnastkowej obiekt kod może być wydrukowany lub zbuforowany w celu późniejszego wydrukowania. Po zresetowaniu licznika adresów poleceń wywoływane jest polecenie następne stwierdzenie.

Oryginalny program może zawierać błędy, na przykład:

dany symbol nie jest zdefiniowany lub zdefiniowany więcej niż raz;

● Opcode jest reprezentowany przez nieprawidłową nazwę (z powodu literówki), nie ma wystarczającej liczby operandów lub ma zbyt wiele operandów;

● brak operatora

Niektóre asemblery mogą wykryć niezdefiniowany symbol i zastąpić go. Jednak w większości przypadków, gdy zostanie znaleziona instrukcja z błędem, asembler wyświetla na ekranie komunikat o błędzie i próbuje kontynuować proces asemblacji.

Artykuły poświęcone asemblerowi.

Temat 2.5 Podstawy programowania procesora

Wraz ze wzrostem długości programu trudniej jest zapamiętać kody dla różnych operacji. Pewną pomoc w tym zakresie zapewniają mnemoniki.

Symboliczny język kodowania instrukcji nazywa się monter.

język programowania to język, w którym każda instrukcja odpowiada dokładnie jednej instrukcji maszynowej.

montaż wywoływana konwersja programu z języka asemblerowego, czyli przygotowanie programu w języku maszynowym poprzez zastąpienie symbolicznych nazw operacji kodami maszynowymi, a adresów symbolicznych liczbami bezwzględnymi lub względnymi, a także włączanie programów bibliotecznych i generowanie sekwencji instrukcji symbolicznych poprzez określenie określonych parametrów w mikroinstrukcji. Ten program zwykle umieszczane w pamięci ROM lub wprowadzane do pamięci RAM z jakiegoś zewnętrznego nośnika.

Język asemblera ma kilka cech, które odróżniają go od języków wysokiego poziomu:

1. Jest to korespondencja jeden do jednego pomiędzy instrukcjami języka asemblerowego i instrukcjami maszynowymi.

2. Programista języka asemblerowego ma dostęp do wszystkich obiektów i poleceń obecnych na maszynie docelowej.

Zrozumienie podstaw programowania w językach maszynowych jest przydatne w przypadku:



Lepsze zrozumienie architektury PC i lepsze wykorzystanie komputerów;

Opracowanie bardziej racjonalnych struktur algorytmów dla programów do rozwiązywania problemów stosowanych;

Opcje przeglądania i edycji programy wykonywalne z rozszerzeniami .exe i .com skompilowanymi z dowolnych języków wysokiego poziomu, w przypadku utraty programów źródłowych (poprzez wywołanie wskazanych programów do debuggera programu DEBUG i dekompilację ich wyświetlania w języku asemblerowym);

Kompilowanie programów do rozwiązywania najbardziej krytycznych zadań (program skompilowany w języku maszynowym jest zwykle wydajniejszy - krótszy i szybszy o 30-60 proc. niż programy uzyskane w wyniku tłumaczenia z języków wysokiego poziomu)

Do realizacji procedur zawartych w programie głównym jako osobnych fragmentów w przypadku, gdy nie można ich zaimplementować ani w używanym języku wysokiego poziomu, ani przy użyciu procedur obsługi systemu operacyjnego.

Program w języku asemblerowym może działać tylko na komputerach z tej samej rodziny, podczas gdy program napisany w języku wysokiego poziomu może potencjalnie działać na różnych komputerach.

Alfabet języka asemblera składa się ze znaków ASCII.

Liczby są tylko liczbami całkowitymi. Wyróżnić:

Liczby binarne zakończone literą B;

Liczby dziesiętne kończące się na D;

Liczby szesnastkowe kończące się na literę N.

Baran, rejestry, reprezentacja danych

Dla pewnej serii MPs używany jest indywidualny język programowania - język asemblera.

Język asemblera zajmuje pozycję pośrednią między kodami maszynowymi a językami wysokiego poziomu. Programowanie w tym języku jest łatwiejsze. Program w języku asemblerowym wykorzystuje możliwości konkretnej maszyny (dokładniej MP) bardziej racjonalnie niż program w języku wysokiego poziomu (który jest łatwiejszy dla programisty niż asemblera). Jako przykład rozważymy podstawowe zasady programowania w językach maszynowych z wykorzystaniem języka asemblera dla MP KR580VM80. Do programowania w języku stosowana jest ogólna technika. Specyficzne techniki nagrywania programów są związane z architekturą i cechami systemu dowodzenia docelowego MP.

Model oprogramowania system mikroprocesorowy oparty na MP KR580VM80

Model programowy MPS zgodnie z rys. 1

Pamięć portów MP

S Z AC P C

Obrazek 1

Z punktu widzenia programisty KR580VM80 MP posiada następujące rejestry dostępne przez program.

A– 8-bitowy rejestr akumulatorów. Jest to główny rejestr MP. Każda operacja wykonywana w ALU polega na umieszczeniu jednego z operandów do przetworzenia w akumulatorze. Wynik operacji w ALU jest również zwykle przechowywany w A.

B, C, D, E, H, L– 8-bitowe rejestry ogólnego przeznaczenia (RON). Wewnętrzna pamięć MP. Przeznaczony do przechowywania przetworzonych informacji, a także wyników operacji. Podczas przetwarzania 16-bitowych słów z rejestrów powstają pary BC, DE, HL, a podwójny rejestr nazywa się pierwszą literą - B, D, H. W parze rejestrów pierwszy rejestr jest najwyższy. specjalna własność posiadają rejestry H, L, używane zarówno do przechowywania danych, jak i do przechowywania 16-bitowych adresów komórek RAM.

FL– rejestr flag (rejestr cech) 8-bitowy rejestr przechowujący pięć cech wyniku wykonania operacji arytmetycznych i logicznych w MP. Format FL zgodnie z obrazkiem

Bit C (CY - carry) - przeniesienie, ustawione na 1, jeśli podczas wykonywania nastąpił transfer z wyższego rzędu bajtu działania arytmetyczne.

Bit P (parity) - parzystość, ustawiany na 1, jeśli liczba jednostek w bitach wyniku jest parzysta.

Bit AC jest dodatkowym przeniesieniem, przeznaczonym do przechowywania wartości przeniesienia z niższej tetrady wyniku.

Bit Z (zero) - ustawiony na 1, jeśli wynik operacji wynosi 0.

Bit S (znaku) jest ustawiony na 1, jeśli wynik jest ujemny, i na 0, jeśli wynik jest dodatni.

SP-- wskaźnik stosu, rejestr 16-bitowy, jest przeznaczony do przechowywania adresu komórki pamięci, w której został zapisany ostatni wprowadzony bajt na stosie.

RS– licznik programu (licznik programu), rejestr 16-bitowy, przeznaczony do przechowywania adresu następnej instrukcji wykonywalnej. Zawartość licznika programu jest automatycznie zwiększana o 1 natychmiast po pobraniu kolejnego bajtu instrukcji.

W początkowym obszarze pamięci znajduje się adres 0000H - 07FF program kontrolny i programy demonstracyjne. To jest obszar pamięci ROM.

0800 - 0AFF - obszar adresowy do nagrywania badanych programów. (BARAN).

0В00 - 0ВВ0 - obszar adresowy do zapisu danych. (BARAN).

0BB0 to adres początkowy stosu. (BARAN).

Stack to specjalnie zorganizowany obszar pamięci RAM przeznaczony do tymczasowego przechowywania danych lub adresów. Ostatnia liczba odłożona na stos jest pierwszą liczbą odrzuconą ze stosu. Wskaźnik stosu przechowuje adres ostatniej lokalizacji stosu, w której przechowywane są informacje. Kiedy podprogram jest wywoływany, adres powrotu do programu głównego jest automatycznie zapisywany na stosie. Z reguły na początku każdego podprogramu zawartość wszystkich rejestrów biorących udział w jego wykonaniu jest przechowywana na stosie, a na końcu podprogramu są one odtwarzane ze stosu.

Format danych języka asemblera i struktura poleceń

Pamięć MP KR580VM80 to tablica 8-bitowych słów zwanych bajtami.Każdy bajt ma swój własny 16-bitowy adres, który określa jego pozycję w sekwencji komórek pamięci. MP może adresować 65536 bajtów pamięci, która może zawierać zarówno ROM, jak i RAM.

Format danych

Dane są przechowywane w pamięci jako słowa 8-bitowe:

D7 D6 D5 D4 D3 D2 D1 D0

Najmniej znaczący bit to bit 0, najbardziej znaczący to bit 7.

Polecenie charakteryzuje się formatem, tj. liczbą przydzielonych mu bitów, które są dzielone bajt po bajcie na określone pola funkcjonalne.

Format poleceń

Polecenia MP KR580VM80 mają format jedno-, dwu- lub trzybajtowy. Instrukcje wielobajtowe muszą być umieszczone w sąsiednich PL. Format polecenia zależy od specyfiki wykonywanej operacji.

Pierwszy bajt polecenia zawiera kod operacji zapisany w formie mnemonicznej.

Określa format polecenia i czynności, jakie musi wykonać MP na danych podczas jego wykonywania, a także sposób adresowania, a także może zawierać informacje o lokalizacji danych.

Drugi i trzeci bajt mogą zawierać dane, na których należy operować, lub adresy wskazujące lokalizację danych. Dane, na których wykonywane są operacje, nazywane są operandami.

Jednobajtowy format polecenia zgodnie z rysunkiem 2

Rysunek 4

W instrukcjach języka asemblerowego opcode ma skróconą formę zapisu słów angielskich - notację mnemoniczną. Mnemotechnika (z greckiego mnemonika – sztuka zapamiętywania) ułatwia zapamiętywanie poleceń zgodnie z ich przeznaczeniem funkcjonalnym.

Przed wykonaniem program źródłowy jest tłumaczony za pomocą programu tłumaczącego, zwanego asemblerem, na język kombinacji kodowych - język maszynowy, w tej postaci jest umieszczany w pamięci MP, a następnie używany podczas wykonywania polecenia.


Metody adresowania

Wszystkie kody operandów (wejście i wyjście) muszą gdzieś się znajdować. Mogą znajdować się w wewnętrznych rejestrach MP (najwygodniejsza i najszybsza opcja). Mogą znajdować się w pamięci systemowej (najczęstsza opcja). Wreszcie mogą znajdować się w urządzeniach I / O (najrzadszy przypadek). Lokalizacja operandów jest określona przez kod instrukcji. Istnieją różne metody, dzięki którym kod instrukcji może określić, skąd wziąć argument wejściowy i gdzie umieścić argument operacji wyjściowej. Metody te nazywane są metodami adresowania.

W przypadku MP KR580VM80 dostępne są następujące metody adresowania:

Natychmiastowy;

Zarejestrować;

pośredni;

Stos.

Natychmiastowy adresowanie zakłada, że ​​operand (wejście) znajduje się w pamięci bezpośrednio po kodzie instrukcji. Operand jest zwykle stałą, którą należy gdzieś wysłać, dodać do czegoś itp. dane są zawarte w drugim lub drugim i trzecim bajcie instrukcji, młodszy bajt danych w drugim bajcie polecenia, a starszy bajt danych w trzecim bajcie polecenia.

Prosty (inaczej absolutne) adresowanie zakłada, że ​​operand (wejście lub wyjście) znajduje się w pamięci pod adresem, którego kod znajduje się wewnątrz programu bezpośrednio po kodzie instrukcji. Używany w poleceniach trzybajtowych.

Zarejestrować adresowanie zakłada, że ​​operand (wejście lub wyjście) znajduje się w wewnętrznym rejestrze MP. Używane w poleceniach jednobajtowych

Pośredni (niejawne) adresowanie zakłada, że ​​rejestr wewnętrzny MP nie jest samym operandem, ale jego adresem w pamięci.

Stos adresowanie zakłada, że ​​polecenie nie zawiera adresu. Adresowanie do komórek pamięci przez zawartość 16-bitowego rejestru SP (wskaźnik stosu).

System dowodzenia

System dowodzenia MP to pełna lista podstawowe czynności, które MP jest w stanie wykonać. MP kontrolowany przez te polecenia wykonuje proste kroki, takich jak elementarne operacje arytmetyczne i logiczne, przesyłanie danych, porównywanie dwóch wartości itp. Liczba poleceń MP KR580VM80 - 78 (w tym modyfikacje 244).

Wyróżnić następujące grupy polecenia:

Transmisja danych;

Arytmetyka;

Łamigłówka;

Polecenia skoku;

Polecenia wejścia-wyjścia, sterowania i pracy ze stosem.


Symbole i skróty używane w opisie poleceń i pisaniu programów

Symbol Zmniejszenie
ADDR 16-bitowy adres
DANE 8-bitowe dane
DANE 16 16-bitowe dane
PORT 8-bitowy adres we/wy (urządzenia we/wy)
bajt 2 Drugi bajt polecenia
bajt 3 Trzeci bajt polecenia
R, R1, R2 Jeden z rejestrów: A, B, C, D, E, H, L
RP Jedna z par rejestrów: B - ustawia parę samolotów; D - ustawia parę DE; H - określa parę HL
RH Pierwszy rejestr pary
RL Drugi rejestr pary
Λ Mnożenie logiczne
V Dodawanie logiczne
Modulo dwa dodatki
m Komórka pamięci, której adres określa zawartość pary rejestrów HL, tj. M = (HL)

Ze względu na cel można rozróżnić polecenia (przykłady mnemonicznych opkodów poleceń asemblera PC, takiego jak IBM PC, podano w nawiasach):

l wykonuję operacje arytmetyczne (ADD i ADC - dodawanie i dodawanie z przeniesieniem, SUB i SBB - odejmowanie i odejmowanie z pożyczką, MUL i IMUL - mnożenie bez znaku i ze znakiem, DIV i IDIV - dzielenie bez znaku i ze znakiem, CMP - porównania itp.) ;

l wykonywanie operacji logicznych (OR, AND, NOT, XOR, TEST itp.);

l transfer danych (MOV - wysyłanie, XCHG - wymiana, IN - wejście do mikroprocesora, OUT - wycofanie z mikroprocesora itp.);

l przeniesienie sterowania (rozgałęzienia programu: JMP - rozgałęzienie bezwarunkowe, CALL - wywołanie procedury, RET - powrót z procedury, J * - rozgałęzienie warunkowe, LOOP - sterowanie pętlą itp.);

l przetwarzanie ciągów znaków (MOVS - transfery, CMPS - porównania, LODS - pobieranie, SCAS - skany. Te polecenia są zwykle używane z prefiksem (modyfikator powtórzeń) REP;

l przerwania programowe (INT - przerwania programowe, INTO - przerwania warunkowe przy przepełnieniu, IRET - powrót z przerwania);

l sterowanie mikroprocesorowe (ST* i CL* - ustawianie i kasowanie flag, HLT - stop, WAIT - stan czuwania, NOP - bezczynność itp.).

Z pełna lista polecenia asemblera można znaleźć w pracach.

Polecenia przesyłania danych

l MOV dst, src - transfer danych (przenieś - przenieś z src do dst).

Transfery: jeden bajt (jeśli src i dst są w formacie bajtowym) lub jedno słowo (jeśli src i dst są w formacie słowa) między rejestrami lub między rejestrem a pamięcią i zapisuje natychmiastową wartość do rejestru lub pamięci.

Operandy dst i src muszą mieć ten sam format - bajt lub słowo.

Src może być typu: r (rejestr) - rejestr, m (pamięć) - pamięć, i (impedancja) - wartość natychmiastowa. Dst może być typu r, m. Operandy nie mogą być użyte w jednym poleceniu: rsegm razem z i; dwa argumenty typu m i dwa argumenty typu rsegm). Operand, którym mogę być proste wyrażenie:

mov AX, (152 + 101B) / 15

Ocena wyrażenia jest wykonywana tylko podczas tłumaczenia. Flagi się nie zmieniają.

l PUSH src - umieszczanie słowa na stosie (push - forsować; push do stosu z src). Odkłada zawartość src na wierzch stosu - dowolny rejestr 16-bitowy (włącznie z segmentem) lub dwie komórki pamięci zawierające 16-bitowe słowo. Flagi się nie zmieniają;

l POP dst — wyodrębnianie słowa ze stosu (pop — pop; liczba ze stosu w dst). Usuwa słowo z wierzchołka stosu i umieszcza je w dst - dowolnym 16-bitowym rejestrze (włącznie z segmentem) lub dwóch lokalizacjach pamięci. Flagi się nie zmieniają.

Programowanie na poziomie instrukcji maszynowych to minimalny poziom, na którym możliwe jest programowanie. System instrukcji maszynowych musi być wystarczający do realizacji wymaganych działań poprzez wydawanie instrukcji do sprzętu komputerowego.

Każda instrukcja obsługi maszyny składa się z dwóch części:

  • sala operacyjna – ustalanie „co robić”;
  • operand - definiowanie obiektów przetwarzania, „co z tym zrobić”.

Instrukcja maszynowa mikroprocesora, napisana w asemblerze, jest pojedynczą linią o następującej formie składniowej:

polecenie/dyrektywa etykiet argument(y) ;komentarze

W tym przypadku obowiązkowe pole w linii to polecenie lub dyrektywa.

Etykieta, polecenie/dyrektywa i operandy (jeśli występują) są oddzielone co najmniej jedną spacją lub znakiem tabulacji.

Jeśli polecenie lub dyrektywa muszą być kontynuowane w następnym wierszu, używany jest znak odwrotnego ukośnika: \.

Domyślnie język asemblerowy nie rozróżnia wielkich i małych liter w poleceniach lub dyrektywach.

Przykładowe wiersze kodu:

Odliczanie 1 ;Nazwa, dyrektywa, jeden argument
ruch, 0 ;Polecenie, dwa operandy
cbw ; Zespół

Tagi

Etykieta w asemblerze może zawierać następujące symbole:

  • wszystkie litery alfabetu łacińskiego;
  • liczby od 0 do 9;
  • znaki specjalne: _, @, $, ?.

Kropka może być użyta jako pierwszy znak etykiety, ale niektóre kompilatory odradzają ten znak. Zarezerwowane nazwy asemblera (dyrektywy, operatory, nazwy poleceń) nie mogą być używane jako etykiety.

Pierwszy znak na etykiecie musi być literą lub znakiem specjalnym (nie cyfrą). Maksymalna długość etykiety to 31 znaków. Wszystkie etykiety, które są napisane w wierszu, który nie zawiera dyrektywy asemblera, muszą kończyć się dwukropkiem: .

Drużyny

Zespół mówi tłumaczowi, jaką akcję powinien wykonać mikroprocesor. W segmencie danych polecenie (lub dyrektywa) definiuje pole, obszar roboczy lub stałą. W segmencie kodu instrukcja definiuje akcję, taką jak ruch (mov) lub dodanie (add).

dyrektywy

Asembler posiada szereg operatorów, które pozwalają kontrolować proces składania i generowania zestawienia. Operatorzy ci nazywają się dyrektywy . Działają tylko w procesie asemblacji programu i w przeciwieństwie do instrukcji nie generują kodów maszynowych.

operandy

Argument – obiekt, na którym wykonywane jest polecenie maszynowe lub operator języka programowania.
Instrukcja może mieć jeden lub dwa operandy lub wcale. Liczba argumentów jest domyślnie określona przez kod instrukcji.
Przykłady:

  • Brak operandów ret ;Return
  • Jeden operand inc ecx ;Increment ecx
  • Dwa operandy dodają eax,12 ;Dodaj 12 do eax

Etykieta, polecenie (dyrektywa) i operand nie muszą zaczynać się w żadnej konkretnej pozycji w łańcuchu. Zaleca się jednak zapisanie ich w kolumnie dla większej czytelności programu.

Operandy mogą być

  • identyfikatory;
  • ciągi znaków ujęte w pojedyncze lub podwójne cudzysłowy;
  • liczby całkowite w formacie binarnym, ósemkowym, dziesiętnym lub szesnastkowym.
Identyfikatory

Identyfikatory – sekwencje prawidłowych znaków używanych do oznaczania obiektów programu, takich jak kody operacji, nazwy zmiennych i nazwy etykiet.

Zasady pisania identyfikatorów.

  • Identyfikator może składać się z jednego lub więcej znaków.
  • Jako znaki możesz użyć liter alfabetu łacińskiego, cyfr i niektórych znaków specjalnych: _, ?, $, @.
  • Identyfikator nie może zaczynać się od cyfry.
  • Identyfikator może mieć do 255 znaków.
  • Tłumacz akceptuje pierwsze 32 znaki identyfikatora i ignoruje resztę.
Uwagi

Komentarze są oddzielone od linii wykonywalnej znakiem; . W tym przypadku wszystko, co jest napisane po średniku i do końca wiersza, jest komentarzem. Użycie komentarzy w programie poprawia jego przejrzystość, zwłaszcza gdy cel zestawu instrukcji jest niejasny. Komentarz może zawierać dowolne znaki, które można wydrukować, w tym spacje. Komentarz może obejmować całą linię lub podążać za poleceniem w tym samym wierszu.

Struktura programu montażowego

Program napisany w asemblerze może składać się z kilku części, zwanych moduły . Każdy moduł może zdefiniować jeden lub więcej segmentów danych, stosu i kodu. Każdy kompletny program w języku asemblerowym musi zawierać jeden główny lub główny moduł, od którego rozpoczyna się jego wykonywanie. Moduł może zawierać segmenty kodu, danych i stosu zadeklarowane odpowiednimi dyrektywami. Przed zadeklarowaniem segmentów należy określić model pamięci za pomocą dyrektywy .MODEL.

Przykład programu "nic nie robiącego" w asemblerze:

686P
. MODEL PŁASKI, STDCALL
.DANE
.KOD
POCZĄTEK:

GNIĆ
KONIEC START

Ten program zawiera tylko jedną instrukcję mikroprocesora. To polecenie to RET . Zapewnia prawidłowe zakończenie programu. Ogólnie rzecz biorąc, to polecenie służy do wyjścia z procedury.
Pozostała część programu związana jest z obsługą translatora.
.686P — Dozwolone są polecenia trybu chronionego Pentium 6 (Pentium II). Ta dyrektywa wybiera obsługiwany zestaw instrukcji asemblera przez określenie modelu procesora. Litera P na końcu dyrektywy mówi tłumaczowi, że procesor działa w trybie chronionym.
.MODEL FLAT, stdcall to płaski model pamięci. Ten model pamięci jest używany w system operacyjny Okna. standardowe wywołanie
.DATA to segment programu zawierający dane.
.CODE to blok programu zawierający kod.
START to etykieta. W asemblerze dużą rolę odgrywają etykiety, czego nie można powiedzieć o nowoczesnych językach wysokiego poziomu.
KONIEC START – koniec programu i komunikat dla tłumacza, że ​​program należy uruchomić z etykiety START.
Każdy moduł musi zawierać dyrektywę END oznaczającą koniec kod źródłowy programy. Wszystkie wiersze następujące po dyrektywie END są ignorowane. Pominięcie dyrektywy END generuje błąd.
Etykieta po dyrektywie END informuje kompilator o nazwie modułu głównego, od którego rozpoczyna się wykonywanie programu. Jeżeli program zawiera jeden moduł, etykietę po dyrektywie END można pominąć.

Temat 1.4 Mnemotechnika asemblera. Struktura i formaty poleceń. Rodzaje adresowania. Zestaw instrukcji mikroprocesora

Plan:

1 Język asemblera. Podstawowe koncepcje

2 Symbole języka asemblera

3 Rodzaje instrukcji asemblera

4 dyrektywy montażowe

5 Zestaw instrukcji procesora

1język programowania. Podstawowe koncepcje

język programowaniajest symboliczną reprezentacją języka maszynowego. Wszystkie procesy w maszynie na najniższym poziomie sprzętowym są sterowane wyłącznie poleceniami (instrukcjami) języka maszynowego. Z tego jasno wynika, że ​​pomimo wspólnej nazwy, język asemblera dla każdego typu komputera jest inny.

Program w języku asemblerowym to zbiór bloków pamięci zwanych segmenty pamięci. Program może składać się z jednego lub więcej takich segmentów bloków. Każdy segment zawiera zbiór zdań językowych, z których każdy zajmuje oddzielny wiersz kodu programu.

Oświadczenia montażowe są czterech typów:

1) polecenia lub instrukcje które są symbolicznym odpowiednikiem poleceń maszynowych. Podczas procesu translacji instrukcje asemblera są konwertowane na odpowiednie polecenia zestawu instrukcji mikroprocesora;

2) makra -zdania tekstu audycji, które są w pewien sposób sformalizowane, zastępowane są w trakcie emisji innymi zdaniami;

3) dyrektywy,które są instrukcjami dla tłumacza asemblera, aby wykonał pewne czynności. Dyrektywy nie mają odpowiedników w reprezentacji maszynowej;

4) linie komentarza , zawierający dowolne znaki, w tym litery alfabetu rosyjskiego. Komentarze są ignorowane przez tłumacza.

­ Struktura programu montażowego. składnia asemblera.

Zdania tworzące program mogą być konstrukcją składniową odpowiadającą poleceniu, makro, dyrektywie lub komentarzowi. Aby tłumacz asemblera mógł je rozpoznać, muszą być uformowane zgodnie z pewnymi regułami składniowymi. W tym celu najlepiej jest użyć formalnego opisu składni języka, podobnie jak zasad gramatyki. Najczęstsze sposoby podobny opis język programowania - diagramy składni oraz rozszerzone formy Backusa-Naura. Do praktyczne użycie wygodniejszy diagramy składni. Na przykład, składnia instrukcji języka asemblerowego może być opisana za pomocą diagramów składni pokazanych na poniższych rysunkach 10, 11, 12.

Rysunek 10 - Format zdania zespołu


­ Rysunek 11 - Format dyrektyw

­ Rysunek 12 - Format poleceń i makr

Na tych rysunkach:

­ Nazwa etykiety- identyfikator, którego wartością jest adres pierwszego bajtu zdania kodu źródłowego programu, który oznacza;

­ Nazwa -identyfikator, który odróżnia tę dyrektywę od innych dyrektyw o tej samej nazwie. W wyniku przetworzenia przez asembler pewnej dyrektywy, pewne cechy mogą być przypisane do tej nazwy;

­ kod operacji (COP) i dyrektywa - są to symbole mnemoniczne dla odpowiedniej instrukcji maszynowej, makroinstrukcji lub dyrektywy kompilatora;

­ operandy -części polecenia, makra lub dyrektywy asemblera, oznaczające obiekty, na których wykonywane są akcje. Operandy asemblera są opisywane za pomocą wyrażeń ze stałymi numerycznymi i tekstowymi, etykietami zmiennych i identyfikatorów za pomocą znaków operatora i niektórych słów zastrzeżonych.

Pomoc w diagramach składni znajdź, a następnie przemierz ścieżkę od wejścia diagramu (po lewej) do jego wyjścia (po prawej). Jeśli taka ścieżka istnieje, to zdanie lub konstrukcja są poprawne składniowo. Jeśli nie ma takiej ścieżki, to kompilator nie zaakceptuje tej konstrukcji.

­ 2 symbole języka asemblera

Dozwolone znaki podczas pisania tekstu programów to:

1) wszystkie litery łacińskie: A-Z,a-z. W takim przypadku wielkie i małe litery są uważane za równoważne;

2) liczby od 0 zanim 9 ;

3) znaki ? , @ , $ , _ , & ;

4) separatory , . () < > { } + / * % ! " " ? = # ^ .

Zdania asemblera są tworzone z tokeny, które są syntaktycznie nierozłącznymi sekwencjami prawidłowych znaków językowych, które mają sens dla tłumacza.

tokeny są:

1) identyfikatory - sekwencje poprawnych znaków używane do oznaczania obiektów programu, takich jak kody operacji, nazwy zmiennych i nazwy etykiet. Zasada pisania identyfikatorów jest następująca: identyfikator może składać się z jednego lub więcej znaków;

2) ciągi znaków - sekwencje znaków ujęte w pojedyncze lub podwójne cudzysłowy;

3) liczby całkowite w jednym z następujących systemów liczbowych : binarny, dziesiętny, szesnastkowy. Identyfikacja numerów podczas zapisywania ich w programach asemblera odbywa się według pewnych zasad:

4) liczby dziesiętne nie wymagają dodatkowych symboli do ich identyfikacji, np. 25 lub 139. Do identyfikacji w kodzie źródłowym programu liczby binarne konieczne jest, po wpisaniu zer i jedynek wchodzących w ich skład, umieścić łacinę „ b”, na przykład 10010101 b.

5) Liczby szesnastkowe mają więcej konwencji w notacji:

Po pierwsze składają się z liczb. 0...9 , małe i wielkie litery alfabetu łacińskiego a,b, C,D,mi,F lub A,b,C,D,mi,F.

Po drugie, tłumacz może mieć trudności z rozpoznaniem liczb szesnastkowych, ponieważ mogą one składać się zarówno z cyfr 0...9 (np. 190845), jak i zaczynać się od litery alfabetu łacińskiego (np. ef15). Aby "wyjaśnić" tłumaczowi, że dany leksem nie jest liczbą dziesiętną ani identyfikatorem, programista musi specjalnie przydzielić liczbę szesnastkową. Aby to zrobić, na końcu sekwencji cyfr szesnastkowych, które tworzą liczbę szesnastkową, napisz łacińską literę „ h”. Ten wymagany warunek. Jeśli liczba szesnastkowa zaczyna się od litery, jest poprzedzona wiodącym zerem: 0 ef15 h.

Niemal każde zdanie zawiera opis przedmiotu, na którym lub za pomocą którego dokonuje się jakiejś czynności. Obiekty te nazywają się operandy. Można je zdefiniować w następujący sposób: operandy- są to obiekty (niektóre wartości, rejestry lub komórki pamięci), na które mają wpływ instrukcje lub dyrektywy, lub są to obiekty, które definiują lub udoskonalają działanie instrukcji lub dyrektyw.

Możliwe jest przeprowadzenie następującej klasyfikacji argumentów:

­ operandy stałe lub natychmiastowe;

­ operandy adresowe;

­ przesunięte operandy;

licznik adresów;

­ operand rejestru;

­ argumenty bazowe i indeksowe;

­ operandy strukturalne;

dokumentacja.

Argumenty to elementarne komponenty, które tworzą część instrukcji maszynowej, oznaczające obiekty, na których wykonywana jest operacja. W bardziej ogólnym przypadku operandy mogą być zawarte jako komponenty w bardziej złożonych formacjach zwanych wyrażenia.

Wyrażenia to kombinacje operandów i operatorów rozpatrywane jako całość. Wynikiem oceny wyrażenia może być adres jakiejś komórki pamięci lub pewna stała (bezwzględna) wartość.

­ 3 Rodzaje instrukcji asemblera

Wymieńmy możliwe typy oświadczenia asemblera i składniowych reguł tworzenia wyrażeń asemblera:

­ operatory arytmetyczne;

­ operatorzy zmian;

­ operatory porównania;

­ operatory logiczne;

­ operator indeksu;

­ operator nadpisania typu;

­ operator redefinicji segmentu;

­ operator nazewnictwa typu struktury;

­ operator do uzyskania składnika segmentowego adresu wyrażenia;

­ wyrażenie offset operator pobierania.

1 Dyrektywy montażowe

­ Dyrektywy asemblera to:

1) Dyrektywy segmentacyjne. W trakcie poprzedniej dyskusji odkryliśmy wszystkie podstawowe zasady pisania instrukcji i operandów w programie asemblerowym. Pytanie, jak prawidłowo sformatować sekwencję poleceń, aby tłumacz mógł je przetwarzać, a mikroprocesor mógł je wykonywać, pozostaje otwarte.

Rozważając architekturę mikroprocesora dowiedzieliśmy się, że posiada on sześć rejestrów segmentowych, dzięki którym może pracować jednocześnie:

­ z jednym segmentem kodu;

­ z jednym segmentem stosu;

­ z jednym segmentem danych;

­ z trzema dodatkowymi segmentami danych.

Fizycznie segment jest obszarem pamięci zajmowanym przez polecenia i (lub) dane, których adresy są obliczane względem wartości w odpowiednim rejestrze segmentowym. Opis składniowy segmentu w asemblerze to konstrukcja pokazana na rysunku 13:


­ Rysunek 13 - Opis składniowy segmentu w asemblerze

Należy zauważyć, że funkcjonalność segmentu jest nieco szersza niż po prostu dzielenie programu na bloki kodu, danych i stosu. Segmentacja jest częścią bardziej ogólnego mechanizmu związanego z: koncepcja programowania modułowego. Polega ona na ujednoliceniu konstrukcji modułów obiektowych tworzonych przez kompilator, w tym pochodzących z różnych języków programowania. Pozwala to na łączenie programów napisanych w różnych językach. To jest do realizacji różne opcje taki związek i operandy w dyrektywie SEGMENT są zamierzone.

2) Wykaz dyrektyw kontrolnych. Dyrektywy sterujące listowaniem są podzielone na następujące grupy:

­ ogólne dyrektywy kontrolne listowania;

­ dyrektywy wyjściowe zawierające listę plików;

­ dyrektywy wyjściowe dla warunkowych bloków montażowych;

­ dyrektywy wyjściowe do listy makr;

­ dyrektywy do wyświetlania informacji o odsyłaczach na liście;

­ dyrektywy dotyczące zmiany formatu aukcji.

2 Zestaw instrukcji procesora

Zestaw instrukcji procesora pokazano na rysunku 14.

Rozważ główne grupy poleceń.

­ Rysunek 14 - Klasyfikacja instrukcji montażu

Polecenia to:

1 Polecenia przesyłania danych. Instrukcje te zajmują bardzo ważne miejsce w zestawie instrukcji dowolnego procesora. Pełnią następujące podstawowe funkcje:

­ zapisanie w pamięci zawartości wewnętrznych rejestrów procesora;

­ kopiowanie treści z jednego obszaru pamięci do drugiego;

­ zapis do urządzeń I/O i odczyt z urządzeń I/O.

W niektórych procesorach wszystkie te funkcje są wykonywane przez pojedynczą instrukcję MOV (dla transferów bajtów - MOVB ) ale z różnymi metodami adresowania operandów.

W innych procesorach oprócz instrukcji MOV istnieje kilka innych poleceń do wykonywania wymienionych funkcji. Polecenia przesyłania danych obejmują również polecenia wymiany informacji (ich oznaczenie oparte jest na słowie Giełda ). Możliwe jest zapewnienie wymiany informacji między rejestrami wewnętrznymi, między dwiema połówkami jednego rejestru ( ZAMIANA ) lub między rejestrem a komórką pamięci.

2 Polecenia arytmetyczne. Instrukcje arytmetyczne traktują kody operandów jako numeryczne kody binarne lub BCD. Polecenia te można podzielić na pięć głównych grup:

­ komendy do operacji na punkcie stałym (dodawanie, odejmowanie, mnożenie, dzielenie);

­ instrukcje zmiennoprzecinkowe (dodawanie, odejmowanie, mnożenie, dzielenie);

­ polecenia czyszczenia;

­ polecenia inkrementacji i dekrementacji;

­ polecenie porównania.

3 Instrukcje stałoprzecinkowe działają na kodach w rejestrach procesora lub w pamięci, tak jak w przypadku normalnych kodów binarnych. Instrukcje zmiennoprzecinkowe (przecinkowe) używają formatu reprezentacji liczbowej z wykładnikiem i mantysą (zwykle te liczby zajmują dwie kolejne lokacje w pamięci). W nowoczesnych wydajnych procesorach zestaw instrukcji zmiennoprzecinkowych nie jest ograniczony tylko do czterech operacji arytmetycznych, ale zawiera również wiele innych bardziej złożonych instrukcji, na przykład obliczanie funkcji trygonometrycznych, funkcji logarytmicznych, a także złożone funkcje niezbędne do przetwarzania dźwięku i obrazu.

4 Polecenia Clear mają na celu zapisanie kodu zerowego do rejestru lub komórki pamięci. Polecenia te można zastąpić instrukcjami transferu kodu zerowego, ale specjalne instrukcje kasujące są zwykle szybsze niż instrukcje transferu.

5 Polecenia zwiększania (zwiększania o jeden) i zmniejszania

(obniżki o jeden) są również bardzo wygodne. Zasadniczo można je zastąpić instrukcjami dodawania lub odejmowania, ale inkrementacja i dekrementacja są szybsze niż dodawanie i odejmowanie. Te instrukcje wymagają jednego argumentu wejściowego, który jest również operandem wyjściowym.

6 Instrukcja Compare służy do porównywania dwóch argumentów wejściowych. W rzeczywistości oblicza różnicę tych dwóch operandów, ale nie tworzy operandu wyjściowego, a jedynie zmienia bity w rejestrze stanu procesora na podstawie wyniku tego odejmowania. Instrukcja następująca po instrukcji porównania (zwykle instrukcja skoku) przeanalizuje bity w rejestrze statusu procesora i wykona działania na podstawie ich wartości. Niektóre procesory dostarczają instrukcje do porównywania łańcuchów dwóch sekwencji operandów w pamięci.

7 Polecenia logiczne. Instrukcje logiczne wykonują logiczne (bitowe) operacje na operandach, to znaczy traktują kody operandów nie jako pojedynczą liczbę, ale jako zestaw pojedynczych bitów. W tym różnią się od poleceń arytmetycznych. Polecenia logiczne wykonują następujące podstawowe operacje:

­ logiczne AND, logiczne OR, dodawanie modulo 2 (XOR);

­ przesunięcia logiczne, arytmetyczne i cykliczne;

­ sprawdzanie bitów i operandów;

­ ustawianie i kasowanie bitów (flag) rejestru stanu procesora ( PSW).

Instrukcje logiczne umożliwiają obliczanie bit po bicie podstawowych funkcji logicznych na podstawie dwóch argumentów wejściowych. Ponadto operacja AND służy do wymuszenia wyczyszczenia określonych bitów (jako jeden z operandów używa kodu maski, w którym bity wymagające wyczyszczenia są ustawione na zero). Operacja OR służy do wymuszenia ustawienia określonych bitów (jako jeden z operandów używany jest kod maski, w którym bity wymagające ustawienia na jeden są równe jeden). Operacja XOR służy do odwracania podanych bitów (jako jeden z operandów używany jest kod maski, w którym bity do odwrócenia są ustawione na jeden). Instrukcje wymagają dwóch argumentów wejściowych i tworzą jeden argument wyjściowy.

8 Polecenia przesunięcia umożliwiają przesuwanie kodu operandu bit po bicie w prawo (w kierunku niższych bitów) lub w lewo (w kierunku wyższych bitów). Rodzaj przesunięcia (logiczne, arytmetyczne lub cykliczne) określa, jaka będzie nowa wartość najbardziej znaczącego bitu (przy przesunięciu w prawo) lub najmniej znaczącego bitu (przy przesunięciu w lewo), a także określa, czy stara wartość najbardziej znaczącego bit zostanie zapisany gdzieś (przy przesunięciu w lewo) lub najmniej znaczący bit (przy przesunięciu w prawo). Przesunięcia obrotowe umożliwiają przesuwanie bitów kodu operandu w okręgu (zgodnie z ruchem wskazówek zegara przy przesuwaniu w prawo lub przeciwnie do ruchu wskazówek zegara przy przesuwaniu w lewo). W takim przypadku pierścień zmiany biegów może, ale nie musi zawierać flagi przeniesienia. Bit flagi przeniesienia (jeśli jest używany) jest ustawiony na najbardziej znaczący bit dla obrotu w lewo i najmniej znaczący bit dla obrotu w prawo. Odpowiednio, wartość bitu flagi przeniesienia zostanie przepisana do najmniej znaczącego bitu przy lewym przesunięciu cyklicznym i do najbardziej znaczącego bitu przy prawym przesunięciu cyklicznym.

9 Polecenia skoku. Polecenia skoku są przeznaczone do organizowania wszelkiego rodzaju pętli, rozgałęzień, wywołań podprogramów itp., to znaczy zakłócają sekwencyjny przepływ programu. Instrukcje te zapisują nową wartość do rejestru licznika instrukcji i tym samym powodują, że procesor przeskakuje nie do następnej instrukcji w kolejności, ale do dowolnej innej instrukcji w pamięci programu. Niektóre komendy skoku pozwalają cofnąć się do punktu, z którego wykonano skok, a inne nie. Jeśli podano zwrot, bieżące parametry procesora są przechowywane na stosie. Jeśli nie zostanie podany zwrot, bieżące parametry procesora nie zostaną zapisane.

Polecenia skoku bez cofania są podzielone na dwie grupy:

­ polecenia skoków bezwarunkowych;

­ instrukcje skoku warunkowego.

Te polecenia używają słów Gałąź (gałąź) i Skok (skok).

Instrukcje skoku bezwarunkowego powodują skok do nowego adresu bez względu na wszystko. Mogą powodować skok do określonej wartości przesunięcia (do przodu lub do tyłu) lub do określonego adresu pamięci. Wartość przesunięcia lub nowa wartość adresu jest określona jako argument wejściowy.

Polecenia skoku warunkowego nie zawsze powodują skok, ale tylko wtedy, gdy spełnione są określone warunki. Takimi warunkami są zazwyczaj wartości flag w rejestrze stanu procesora ( PSW ). Oznacza to, że warunek przejścia jest wynikiem poprzedniej operacji, która zmienia wartości flag. W sumie takich warunków skoku może być od 4 do 16. Kilka przykładów poleceń skoku warunkowego:

­ skok, jeśli jest równy zero;

­ skok, jeśli niezerowe;

­ skacz, jeśli jest przepełnienie;

­ skacz, jeśli nie ma przelewu;

­ skok, jeśli jest większy od zera;

­ skok, jeśli jest mniejszy lub równy zero.

Jeżeli warunek przejścia jest spełniony, to nowa wartość jest ładowana do rejestru licznika instrukcji. Jeśli warunek skoku nie jest spełniony, licznik instrukcji jest po prostu zwiększany, a procesor wybiera i wykonuje następną instrukcję w sekwencji.

W szczególności do sprawdzania warunków rozgałęzień używana jest instrukcja porównania (CMP), która poprzedza instrukcję skoku warunkowego (lub nawet kilka instrukcji skoku warunkowego). Ale flagi można ustawić za pomocą dowolnego innego polecenia, takiego jak polecenie przesyłania danych, dowolne polecenie arytmetyczne lub logiczne. Zwróć uwagę, że same polecenia skoku nie zmieniają flag, co pozwala po prostu umieścić kilka poleceń skoku jedna po drugiej.

Polecenia przerwań zajmują szczególne miejsce wśród poleceń skoku z powrotem. Te instrukcje wymagają numeru przerwania (adresu wektora) jako argumentu wejściowego.

Wniosek:

Język asemblera jest symboliczną reprezentacją języka maszynowego. Język asemblera dla każdego typu komputera jest inny. Program w języku asemblerowym jest zbiorem bloków pamięci zwanych segmentami pamięci. Każdy segment zawiera zbiór zdań językowych, z których każdy zajmuje oddzielny wiersz kodu programu. Instrukcje asemblera są czterech typów: polecenia lub instrukcje, makra, dyrektywy, wiersze komentarza.

Prawidłowe znaki podczas pisania tekstu programów to wszystkie litery łacińskie: A-Z,a-z. W takim przypadku wielkie i małe litery są uważane za równoważne; liczby z 0 zanim 9 ; oznaki ? , @ , $ , _ , & ; separatory , . () < > { } + / * % ! " " ? = # ^ .

Stosuje się następujące typy instrukcji asemblera i reguły składni dla tworzenia wyrażeń asemblera. operatory arytmetyczne, operatory przesunięcia, operatory porównania, operatory logiczne, operator indeksu, operator redefinicji typu, operator redefinicji segmentu, operator nazewnictwa typu struktury, operator uzyskiwania składnika adresu segmentu wyrażenia, operator uzyskiwania przesunięcia wyrażenia.

System dowodzenia podzielony jest na 8 głównych grup.

­ Pytania kontrolne:

1 Co to jest język asemblera?

2 Jakich symboli można użyć do pisania poleceń w asemblerze?

3 Czym są etykiety i jaki jest ich cel?

4 Wyjaśnij strukturę instrukcji montażu.

5 Wymień 4 typy instrukcji asemblera.

Podobał Ci się artykuł? Podziel się z przyjaciółmi!
Czy ten artykuł był pomocny?
tak
Nie
Dziekuję za odpowiedź!
Coś poszło nie tak i Twój głos nie został policzony.
Dziękuję Ci. Twoja wiadomość została wysłana
Znalazłeś błąd w tekście?
Wybierz, kliknij Ctrl+Enter a my to naprawimy!