2.Architektura procesora 8086
Ze struktury mikroprocesora 8086 dają się wyodrębnić dwa, pracujące w dużej mierze niezależnie, układy:
wykonawczy EU (ang. execution unit)
sterowania magistralą BIU (ang. bus interface unit).
Mikroprocesor 8086 można ustawić do pracy w jednej z dwu konfiguracji:
minimalnej - przewidzianej dla systemów jednoprocesorowych, w której sygnały sterujące magistralą zewnętrzną generuje układ BIU
lub
maksymalnej - dla systemów wieloprocesorowych; w tym przypadku sygnały sterowania systemem generuje, wykorzystując sygnały procesora, zewnętrzny sterownik magistrali (element 8288).
Układ wykonawczy: Jego głównym zadaniem jest dekodowanie oraz wykonywanie kolejnych rozkazów wprowadzanych, przez układ sterowania magistralą, do tzw. kolejki rozkazów. Wykonanie rozkazów odbywa się przy udziale jednostki arytmetyczno-logicznej ALU (ang. aritmetic logic unit), związanego z nią rejestru znaczników (ang. flags), rejestrów arytmetycznych ogólnego przeznaczenia oraz programowo niedostępnych rejestrów roboczych (chwilowych). Układ wykonawczy komunikuje się z otoczeniem zewnętrznym za pośrednictwem układu sterowania magistralą. Układ ten realizuje wszystkie operacje dotyczące zewnętrznej magistrali procesora, takie jak komunikacja z pamięcią operacyjną i wymiana danych z urządzeniami zewnętrznymi. Układ sterowania magistralą zawiera sumator oraz rejestry służące do obliczania 20-bitowego adresu fizycznego. Dane przesyłane są po 16-bitowej magistrali danych. Magistrala adresowa jest 20-bitowa, co pozwala na bezpośrednie adresowanie za jej pośrednictwem pamięci operacyjnej o pojemności do 1MB.
Jednostka arytmetyczno-logiczna. Jest podstawowym elementem układu wykonawczego mikroprocesora. W typowych konstrukcjach realizuje ona podstawowe operacje arytmetyczne, takie jak dodawanie i odejmowanie słów danych, ponadto realizuje także operacje logiczne: sumy, iloczynu i sumy modulo 2. Często realizuje ona większość funkcji procesora, np. zliczanie. Jest to o tyle korzystne, że jednostka arytmetyczno-logiczna zawiera układy realizujące te funkcje.
Rejestry. Rejestry są to grupy przerzutników służące do przechowywania informacji. Często pewne rejestry procesora są związane z określonymi operacjami, a wykonanie niektórych rozkazów jest związane z określonymi rejestrami. Rejestry są na ogół szybsze niż układy pamięci programu lub danych. W porównaniu z liczbą komórek pamięci operacyjnej ich liczba jest niewielka i w części adresowej rozkazu niewielka liczba bitów jest potrzebna dla wskazania rejestru. Główne użycie rejestrów polega na przechowywaniu adresów lub danych przed lub w trakcie ich przetwarzania. Różne mikroprocesory zawierają różną liczbę rejestrów. Rejestry mogą być używane do modyfikacji adresów, do zapamiętania adresów powrotu z podprogramu, jako liczniki rozkazów, jako akumulatory pomocnicze lub jako małe pamięci notatnikowe. Sposób ich użycia istotnie zależy od architektury mikroprocesora.
Architektura procesora 8086 została przedstawiona na rysunku poniżej:
Dostępne programowo rejestry procesora 8086
Rejestry te są wykorzystywane jako rejestry uniwersalne do przechowywania danych i wykonywania różnych operacji (np. arytmetycznych bądź logicznych), ale jednocześnie pełnią pewne funkcje specjalne odpowiadające ich nazwom:
AH |
AL. |
akumulator AX |
BH |
BL |
rejestr bazowy BX |
CH |
CL |
rejestr zliczający CX |
DH |
DL |
rejestr danych DX |
FLAGS |
rejestr znaczników |
SP |
wskaźnik stosu |
BP |
wskaźnik bazy |
SI |
rejestr indeksowy źródła |
DI |
rejestr indeksowy przeznaczenia |
CS |
rejestr segmentowy programu |
DS |
rejestr segmentowy danych |
SS |
rejestr segmentowy stosu |
ES |
rejestr segmentowy dodatkowy |
IP |
licznik rozkazów |
Rejestry podstawowe
AX (accumulator) - akumulator
BX (basis register) - rejestr bazowy
CX (count register) - rejestr zliczający
DX (data register) - rejestr danych.
Wszystkie te rejestry można traktować jako pary rejestrów 8-bitowych z niezależnym dostępem do części mniej (low) oraz bardziej znaczącej (high). Poszczególne rejestry przyjmują wtedy nazwy: AL, AH, BL, BH, CL, CH, DL, DH. Taka organizacja rejestrów pozwala na wykonywanie w prosty sposób zarówno operacji 8-bitowych, jak i 16-bitowych. Dla wielu rozkazów szczególną funkcję pełni akumulator AX (lub AL). Rozkazy wykorzystujące rejestr AX (w przeciwieństwie do rozkazów wykorzystujących pozostałe rejestry) mają zwarty kod, a czas ich wykonania jest najkrótszy.
Rejestry wskaźnikowe i indeksowe
Mikroprocesor 8086 posiadają dwa rejestry wskaźnikowe i dwa indeksowe. Wszystkie są rejestrami 16-bitowymi. Mogą być one wykorzystane jako argumenty większości rozkazów arytmetycznych i logicznych.
SP (stack pointer) - wskaźnik stosu
SP jest to rejestr wskaźnikowy stosowany do adresowania danych w obrębie wydzielonego obszaru pamięci, zwanego segmentem stosu Rejestr SP jest modyfikowany przy standardowych operacjach prowadzonych z wykorzystaniem stosu.
BP (base pointer) - wskaźnik bazy
SI (source index register) - rejestr indeksowy źródła
DI (destination index register) - rejestr indeksowy przeznaczenia
Rejestr BP podobnie jak rejestr bazowy BX może być źródłem jednego ze składników (adresu bazowego) adresu efektywnego. Wskaźnik BP bywa też wykorzystywany podczas operacji niestandardowych np. przy pobieraniu parametrów przekazywanych przez stos.
Z kolei oba rejestry indeksowe mogą wchodzić w skład sumy dającej w wyniku adres efektywny, z tym że po wykonaniu rozkazu wykorzystującego indeksowany tryb adresacji podlegają automodyfikacji (zwiększeniu/zmniejszeniu o jeden lub dwa).
Inną grupę stanowią rejestry specjalnego przeznaczenia:
Rejestry segmentowe
Rejestry te są wykorzystywane do adresowania pamięci operacyjnej. Pamięć o maksymalnej wielkości 1 MB jest dzielona na logiczne segmenty nie większe niż 64kB. Adresy wewnątrz segmentu są co najwyżej dwubajtowe i mogą być generowane przez 16-bitowe rejestry np. SI, DI, BP, SP.
Rejestry segmentowe zawierają adresy początkowe segmentów
CS (code segment register) - rejestr segmentowy programu wskazuje segment programu, z którego aktualnie są pobierane kolejne rozkazy do wykonania
DS (data segment register) - rejestr segmentowy stosu wskazuje segment, w którym są zapamiętane zmienne używane w programie
ES (extra segment register) - rejestr segmentowy dodatkowy wskazuje dodatkowy segment danych
SS (stack segment register) - rejestr segmentowy stosu wskazuje segment pamięci, w którym jest zdefiniowany stos.
Licznik rozkazów
Rejestr IP (instruction pointer) łącznie z rejestrem segmentowym CS adresuje kolejne rozkazy przeznaczone do wykonania. IP wskazuje adres względem początku segmentu programu (offset). Jako rejestr 16-bitowy może przyjąć maksymalną wartość 2-1. W tej sytuacji dodanie jedynki zeruje cały rejestr, który wtedy wskazuje początek segmentu programu. Mówimy o tzw. zamkniętym cyklu (wrap around).
Znaczniki
Każdy znacznik (flag) jest bitem w rejestrze znaczników, który wskazuje, czy określony stan wystąpił. Znaczniki mogą być wykorzystywane zarówno przez procesor jak i programistę na dwa sposoby:
- ustawienie znacznika w stan jedynki logicznej lub jego wyzerowanie celem zapamiętania określonego stanu zaistniałego po wykonaniu rozkazu,
- testowanie znacznika celem umożliwienia podjęcia decyzji o sposobie dalszego przetwarzania danych.
Znaczniki przechowywane są w rejestrze znaczników
X - bit nie wykorzystany
nr.bitu |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
X |
X |
X |
X |
VF |
DF |
IF |
TF |
SF |
ZF |
X |
AC |
X |
PF |
X |
CF |
Procesor 8086 ma dziewięć znaczników przypisanych poszczególnym bitom w rejestrze FLAGS, w sposób przedstawiony na rysunku powyżej.
Znaczniki stanu: informujące o pewnych cechach otrzymanego wyniku po wykonaniu operacji arytmetycznej bądź logicznej. W zależności od stanu pojedynczych znaczników lub ich logicznej kombinacji można (przykładowo) za pomocą właściwych rozkazów skoków zmienić przebieg realizowanego programu.
C (ang.carry flag) - przeniesienie
P (ang. parity flag) - parzystość
AC (ang. auxiliary carry) - przeniesienie pomocnicze
Z (ang. zero flag) - zero
S (ang. sign flag) - znak
V (overflow) - nadmiar (przepełnienie)
Znaczniki kontrolne ustawiane lub zerowane programowo celem wymuszania odpowiedniego sposobu pracy procesora.
TF (ang.trap flag) - praca krokowa (pułapka)
IF (ang. interupt enable flag) - zezwolenie na przerwanie
DF (ang. direction flag) - znacznik kierunku (inkrementacja/dekrementacja rejestru indeksowego).
Ogólne reguły ustawiania i zerowania poszczególnych znaczników zostaną zilustrowane prostymi przykładami. Celem uproszczenia zapisu przykłady będą dotyczyć działań na bajtach. Wszystkie uwagi dotyczące bitu znaku (najbardziej znaczącego bitu) odnoszą się do bitu o wadze 2 dla działań wykonywanych na bajtach oraz do bitu o wadze dla działań na słowach 16-bitowych.
Znacznik przeniesienia CF przyjmuje wartość 1 wówczas, gdy na skutek wykonanego działania nastąpiło przeniesienie z bitu najbardziej znaczącego na zewnątrz (np. przy dodawaniu) lub też nastąpiła pożyczka z zewnątrz do bitu najbardziej znaczącego (np. przy odejmowaniu). w przeciwnym przypadku znacznik jest zerowany.
PRZYKŁADY
Dodawanie naturalnych liczb binarnych (bez znaku)
1010 1110
+ 0111 0100
----------------
1 0010 0010
CF=1
W wyniku dodawania pojawiło się przeniesienie z pozycji bitu najbardziej znaczącego i znacznik CF przyjął wartość 1. Jest to informacja, że otrzymany wynik jest błędny, bowiem sumy obu liczb nie można przedstawić w 8-bitowej precyzji.
Dodawanie liczb w kodzie U2 ze znakiem
1001 0011 (-109)
+ 0011 0001 (+49)
--------------------------
1100 0100 (-60)
CF=0
Interpretacja liczby dwójkowej jako liczby ze znakiem lub liczby bez znaku zależy wyłącznie od programisty. Tak więc otrzymany wynik może być traktowany jako -60 lub też 196. W obu przypadkach jest on prawidłowy, ale przeniesienie nie wystąpiło i znacznik CF jest wyzerowany.
Odejmowanie liczb bez znaku
0000 0001 1
- 0000 0011 -3
----------------------
1111 1110 254
Jeżeli dwójkowe liczby traktujemy jako liczby bez znaku, to po wykonaniu odejmowania znacznik CF informuje. że nastąpiła pożyczka i otrzymany wynik - interpretowany jako liczba bez znaku - jest błędny.
Znacznik parzystości PF przyjmuje wartość 1 wówczas, gdy w wyniku wykonanego działania liczba bitów o wartości 1 w mniej znaczącym bajcie wyniku jest parzysta. Znacznik jest zerowany wówczas, gdy liczba ta jest nieparzysta.
PRZYKŁAD
0010 1100 1010 0111
+ 1011 0001 AND 1100 0011
------------- --------------
1101 1101 1000 0011
PF=1 PF=0
Wskaźnik przeniesienia pomocniczego AC przyjmuje wartość 1 wówczas, gdy nastąpiło przeniesienie z bitu 3 na 4 lub pożyczka z bitu 4 na 3. W przeciwnym przypadku wskaźnik jest zerowany. Wskaźnik AF jest wykorzystywany przy działaniach na liczbach w kodzie BCD.
PRZYKŁADY
0010 1110 0010 0011
+ 0111 0100 + 0110 0100
------------- --------------
1010 0010 1000 0111
AF=1 AF=0
Znacznik zera ZF przyjmuje wartość 1 wówczas, gdy wynik działania jest równy zero, w przeciwnym przypadku jest zerowany.
PRZYKŁADY
0110 1001 0011 0010 1111 1111
- 0110 1001 AND 1000 1100 + 0000 0010
------------- -------------- --------------
0000 0000 0000 0000 0000 0001
ZF=1 ZF=1 ZF=0
Znacznik znaku SF przyjmuje wartość 1 wówczas, gdy najbardziej znaczący bit w otrzymanym wyniku jest równy 1, w przeciwnym przypadku jest zerowany. Stan znacznika SF jest zatem zgodny z bitem znaku.
PRZYKŁADY
0110 0000 1000 0000
+ 0100 0001 - 0000 0000
------------- --------------
1010 0001 0111 1111
SF=1 SF=0
Znacznik nadmiaru (przepełnienia) VF przyjmuje wartość 1 wówczas, gdy przy wykonywaniu określonego działania wystąpiło przeniesienie na bit znaku (lub też z tego bitu została pobrana pożyczka), ale nie wystąpiło przeniesienie (lub pożyczka) z bitu znaku (tzn. CF=0). W przeciwnym przypadku znacznik jest zerowany. Stan znacznika VF jest istotny w czasie działania na liczbach ze znakiem.
PRZYKŁADY
Dodawanie liczb ze znakiem.
0110 1010 (+106)
+ 0101 1001 +(+89)
------------- ------
1100 0011 (-69) zamiast 195
VF=1
Nastąpiło przeniesienie na pozycję znaku przy braku przeniesienia z pozycji znaku.
Procesor nie rozróżnia czy liczbę traktujemy jako liczbę ze znakiem czy bez znaku. Wynik dodawania mieści się w 8 bitach i jedynie znacznik VF pozwala stwierdzić, czy jest on poprawny.
1111 1111 (-1)
+ 1111 1111 +(-1)
------------- -----
1 1111 1110 (-2) w obrębie 8-bitowej precyzji wynik jest poprawny
VF=0
W wyniku dodawania wystąpiło zarówno przeniesienie z bitu znaku na zewnątrz, jak i przeniesienie na pozycję bitu znaku. Znacznik CF=1, ale znacznik VF=0, bowiem dla liczb ze znakiem otrzymany wynik jest poprawny.
Znacznik pracy krokowej TF ustawiony w stan 1 powoduje wprowadzenie procesora w tryb pracy (ang. simple step modus) umożliwiający po każdym wykonanym rozkazie wygenerowanie przerwania (ang. single step interrupt) i przejście do specjalnych procedur obsługi (np. programów uruchomieniowych). Wyzerowanie znacznika TF powoduje powrót procesora do normalnej pracy.
Znacznik zezwolenia na przerwanie IF ustawiony w stan 1 powoduje odblokowanie systemu przerwań procesora. Zewnętrzne przerwania maskowalne mogą przerwać realizację wykonywalnego aktualnie programu. Wyzerowanie znacznika powoduje, że przerwania te są przez procesor ignorowane.
Znacznik kierunku DF jest wykorzystywany przy wykonaniu działań na łańcuchach (ciągach słów). Jeżeli ma wartość 1, to przetwarzanie łańcuchów odbywa się przy rosnących adresach (zawartość rejestru indeksowego jest zwiększana), jeżeli jest równy 0 - przy malejących adresach.
Cykl pracy procesora 8086
Wykonanie kolejnych rozkazów związane jest z sekwencją pewnych stałych kroków zwanych fazami cyklu. W zależności od rodzaju rozkazu mogą wystąpić maksymalnie cztery fazy cyklu:
pobranie (fetch)- rozkaz zostaje pobrany z pamięci operacyjnej do procesora;
odczyt (read) - jeżeli rozkaz wymaga argumentu z pamięci operacyjnej, to zostaje obliczony jego adres, a następnie argument jest odczytywany i wprowadzony do procesora;
wykonanie (execute) - operacja zdefiniowana rozkazem jest wykonywana;
zapis (write) - jeżeli wynik operacji ma być umieszczony w pamięci operacyjnej, to zostaje obliczony adres i wykonany zapis do pamięci.
Ponieważ układ wykonawczy EU oraz układ sterowania magistralą - BIU mogą pracować niezależnie, jest możliwe równoczesne wykonywanie dwóch faz należących do cykli kolejnych rozkazów. Zwiększa to szybkość pracy całego systemu. Gdy w kolejce rozkazów są wolne co najmniej dwa bajty, a układ wykonawczy EU nie żąda od BIU dostępu do magistrali, to układ sterowania magistralą wykonuje samodzielnie cykle pobrania, uzupełniając kolejnymi bajtami kolejkę rozkazów. Operacja ta jest nazywana pobraniem wstępnym (prefetch) i może przebiegać równocześnie z fazą wykonania realizowaną przez układ EU. Jeżeli układ wykonawczy zażąda dostępu do magistrali w czasie, gdy układ sterowania magistralą obsługuje fazę pobrania, to najpierw zostanie zakończona faza pobrania, a dopiero potem uwzględnione żądanie układu wykonawczego. W przypadku zdekodowania przez układ wykonawczy rozkazu skoku, rozkazy z kolejki zostaną usunięte. Na ich miejsce będą pobierane nowe, spod adresu będącego argumentem zdekodowanego rozkazu. W przypadku tego procesora tylko co najwyżej jeden argument rozkazu może być odczytywany z pamięci operacyjnej.
Pamięć
W skład pamięci mikroprocesora zwykle musi wchodzić pamięć o dostępie swobodnym (RAM) oraz pamięć stała (ROM). W systemach z dużą pamięcią, do jej adresowania trzeba jeszcze dodać kilka rejestrów. W niektórych mikroprocesorach logiczna część współpracy z pamięcią nie jest dostatecznie rozbudowana; stąd dla rozszerzenia pamięci jest wymagane dodanie zewnętrznych układów sterujących.
Wejście/wyjście
Część wejściowa/wyjściowa (we/wy) komputera najtrudniej poddaje się standaryzacji. Zwykle jest potrzebne buforowanie danych i sygnałów sterujących między komputerem a urządzeniami we/wy. Producenci ciągle dążą do umieszczenia możliwie dużej liczby tych buforów w kostce mikroprocesora. Całościowe tworzenie sekwencji sterowania wejściem/wyjściem dla przesyłania danych do i z procesora wymaga wbudowania odpowiednich funkcji w układy sterowania (mikroprogram) procesora. Jeżeli potrzeba rozbudować system we/wy, to te wbudowane funkcje nie wystarczają i na ogół potrzeba dołączyć dodatkowe układy sterujące.
Mikrosterowanie ustala kolejność podstawowych operacji wewnątrz procesora. Ten podzespół procesora ustala na przykład kolejność kroków potrzebnych do pobrania instrukcji z pamięci programu i jej wykonania. Funkcje sterujące mogą być realizowane za pomocą sieci układów logicznych ze stałymi drogami przesyłania informacji. Alternatywne rozwiązanie polega na zastosowaniu układów mikroprogramowalnych i pamięci mikroprogramu do realizacji (emulacji) każdego kroku pobierania i wykonywania kolejnych instrukcji mikrokomputera w sposób określony przez projektanta. Czasem jest pożądane oddzielenie funkcji sterujących od innych funkcji procesora.
Model programowy procesora i elementy programowania
Algorytmy, ich struktura i konstrukcja
Istota algorytmu
Mikrokomputer jest zdolny wyłącznie do realizacji sekwencji precyzyjnie zdefiniowanych operacji arytmetyczno-logicznych. Aby go więc zastosować dla konstrukcji mikrosystemu przeznaczonego do realizacji określonego zadania (np. zadania sterowania sygnalizacją uliczną) należy rozwiązanie tego zadania sformułować również w kategoriach precyzyjnie zdefiniowanych operacji arytmetyczno-logicznych, lub - jak się często mówi - trzeba dokonać algorytmizacji tego zadania.
Algorytm w szerokim znaczeniu nazywa się ściśle określony sposób postępowania, doprowadzający do rozwiązania każdego zadania z pewnej klasy zadań.
Następujące elementy tej definicji zasługują na bliższą uwagę:
Warunek ścisłości wymaga przedstawienia algorytmu w postaci ciągu operacji arytmetyczno-logicznych, realizowanych na pewnym zbiorze danych, charakteryzujących rozwiązane zadanie. Operacje realizowane kolejno w czasie nazywa się często krokami algorytmu i numeruje kolejnymi liczbami naturalnymi.
Warunek określoności nie dopuszcza istnienia żadnych niejasności w sformułowaniu algorytmu.
Warunek uniwersalności, zgodnie z którym algorytm jest przeznaczony nie do rozwiązywania pojedynczego zadania, lecz większej liczby zadań tworzących określoną klasę zadań.
Na uwagę zasługuje jeszcze jeden warunek stawiany algorytmom przeznaczonym do realizacji za pomocą komputera, nie wymieniony w przytoczonej definicji. Warunkiem tym jest iteracyjność algorytmu. Warunek ten żąda, aby zasadnicza część algorytmu była wielokrotnym powtórzeniem określonego szeregu operacji arytmetyczno-logicznych, realizowanych za każdym razem dla innych danych. Warunek ten wynika ze specyfiki działania komputera i można go uzasadnić w następujący sposób:
Niech pamięć przechowująca rozkazy ma pojemność od słów (4 k słów) do słów (32 k słów). Gdyby każda komórka pamięci zawierała rozkaz, który byłby realizowany tylko jeden raz, to przy prędkości realizacji rozkazów rzędu rozkazów na sekundę, program zawarty w tej pamięci zostałby zrealizowany w czasie krótszym od jednej sekundy. Moc obliczeniowa tak zaprogramowanego komputera byłaby niezwykle ograniczona, a jej powiększanie byłoby bardzo kosztowne ze względu na potrzebną pojemność pamięci i czas opracowania programów. Olbrzymia w rzeczywistości moc obliczeniowa komputerów ma swoje źródło m. in. właśnie w tym, że dzięki odpowiednim technikom konstrukcji algorytmów i programowania możliwe jest wielokrotne wykorzystanie rozkazów znajdujących się w pamięci tylko w jednej kopii. Do technik tych należy m. in. stosowanie algorytmów iteracyjnych (algorytmów z pętlami).
Język asemblerowy mikroprocesorów 8086/8088
Ogólna charakterystyka języka
Program źródłowy przygotowany w języku asemblerowym jest tłumaczony na język wewnętrzny mikroprocesora za pomocą programów zwanych asemblerami. W ogólnym przypadku rozróżnia się asemblery proste (zwane po prostu asemblerami), złożone (zwane makroasemblerami) oraz asemblery strukturalne. Podstawowe funkcje asemblera sprowadzają się do:
- zastąpienia dwójkowych kodów rozkazów procesora kodami symbolicznymi w postaci mnemonicznych skrótów,
- możliwości adresowania symbolicznego i względnego,
- zapisywania argumentów rozkazów w dogodnej postaci,
- generowania danych,
- łatwej komunikacji z podprogramami standardowymi i systemem operacyjnym.
Makroasembler umożliwia tworzenie różnych dodatkowych konstrukcji w programie źródłowym, z czego najistotniejszą jest możliwość symbolicznego reprezentowania ciągów rozkazów procesora i innych instrukcji języka. Asemblery strukturalne to języki z pogranicza języków maszynowych (asemblerowych) oraz problemowych. Języki tego typu są w dalszym ciągu bliskie sprzętu, choć mają wiele możliwości charakteryzujących języki wysokiego poziomu. Mimo wielu zalet nie mają aktualnie większego znaczenia. Od nazw asemblerów przyjęła się także nazwa - języki asemblerowe. MASM to niewątpliwie najpopularniejszy makroasembler firmy Microsoft dla procesorów 8086/8088, pracujących pod kontrolą systemu operacyjnego MS-DOS (PC-DOS) w mikrokomputerach zgodnych z IBM PC.
Składnia wiersza programu
W wierszu programu źródłowego może znajdować się:
instrukcja właściwa będąca symbolicznym kodem rozkazu maszynowego procesora, zwana instrukcją;
dyrektywa sterująca pracą asemblera (i nie pozostawiająca śladu w programie wynikowym) bądź pseudoinstrukcja generująca stałe lub deklarująca zmienne, zwana dalej instrukcją;
makroinstrukcja zamieniana w czasie asemblacji na ciąg instrukcji i dyrektyw, a ostatecznie na ciąg rozkazów maszynowych procesora.
Wiersz programu kończy się zasadniczo znakiem nowego wiersza lub (i) znakiem powrotu kursora. Jeżeli wiersz jest zbyt krótki do zapisania całej wymaganej treści, to można go kontynuować w następnym, umieszczając w pierwszej kolumnie znak &.
Składnia wiersza z instrukcją wiaściwą lub wywołaniem makroinstrukcji
[etykieta:] [przedrostek] [instrukcja] [argument(y)] [;komentarz]
Nawiasy kwadratowe oznaczają, że dane pole wiersza nie musi wystąpić dla każdej instrukcji.
Poszczególne pola oznaczają
[etykieta:]
Nazwa symboliczna zakończona dwukropkiem będąca symbolicznym adresem wykorzystywanym w rozkazach skoków. Wiersz może mieć wyłącznie wypełnione pole etykiety - jej adres dotyczy wtedy instrukcji w następnym wierszu.
[przedrostek]
Rozszerzenie rozkazu (np. REP, LOCK) stosowane w niektórych bardziej złożonych konstrukcjach programu.
[instrukcja]
Pole instrukcji zawierające rozkaz procesora 8086/8088 lub wywołanie wcześniej zdefiniowanej makroinstrukcji, zamieniane na ciąg rozkazów. Pole instrukcji może zostać puste - wtedy jednak musi wystąpić etykieta lub (i) komentarz.
[argument(y)]
Rozkaz może być bezargumentowy, może mieć jeden lub dwa argumenty. Wywołanie makroinstrukcji może z kolei mieć listę argumentów. Argumenty muszą być oddzielone od siebie przecinkami.
[;komentarz)
Komentarz rozpoczyna się średnikiem i nie jest analizowany przez asembler. Komentarz służy wyłącznie do poprawienia czytelności programu i sporządzenia jego pełnej dokumentacji.
Wiersz programu z dyrektywą lub (pseudo) instrukcją
[nazwa] dyrektywa/instrukcja [argument(y)] [;komentarz]
Poszczególne pola oznaczają
[nazwa]
Niektóre dyrektywy wymagają nazwy. Dla innych pole nazwy jest puste. Nazwa dyrektywy nie może być zakończona dwukropkiem, ani używana w programie tak jak etykieta.
dyrektywa/instrukcja
Język MASM dopuszcza około 50 różnych dyrektyw sterujących pracą asemblera oraz instrukcji generujących dane.
[argument(y)]
Dyrektywy są bezargumentowe bądź mogą mieć jeden lub więcej argumentów. Brak argumentów w wierszu programu z dyrektywą wymagającą argumentów powoduje przyjęcie argumentów standardowych. W zależności od dyrektywy, argumenty są oddzielane przecinkiem lub spacją.
[;komentarz]
komentarz rozpoczyna się średnikiem; nie jest analizowany przez asembler
Mikrokomputer
Mikrokomputer jest systemem, do którego budowy wykorzystano mikroprocesor. Kostki mikroprocesora mają różne wymiary i są wykonywane w różnych technologiach. Przez połączenie kostki mikroprocesora z innymi układami scalonymi można stworzyć system mikrokomputerowy.
Jednym z kluczowych aspektów topologii systemów mikrokomputerowych jest liczba funkcji realizowanych przez pojedynczą kostkę. Aby z mikroprocesora uzyskać mikrokomputer, trzeba użyć dodatkowych układów tak, aby można było zrealizować pracujący z pamięcią i sterujący wejściem i wyjściem danych.
Sterowanie. Ze względu na potrzebę synchronizacji pracy różnych układów komputera potrzebny jest generator sygnału zegarowego.
Złącze. Kluczowym problemem przy budowie mikrokomputera jest zapewnienie współpracy różnych kostek, realizujących różne funkcje, a w szczególności połączenie procesora z pamięcią i układami we/wy. Jednym z rozwiązań tego problemu jest procesor jednoukładowy.
Ewolucja konfiguracji mikrokomputerów przedstawiona jest poniżej: