3. Przykład prostej listy rozkazów.
Typowy zbiór rozkazów prostego procesora składa się z 4 grup rozkazów:
1. rozkazów arytmetyczno-logicznych;
2. rozkazów przesłań (pomiędzy procesorem i pamięcią lub procesorem i urządzeniami
zewnętrznymi);
3. rozkazów sterujących wykonywaniem programu;
4. rozkazów sterujących pracą procesora.
1. Rozkazy arytmetyczno-logiczne - służą do przetwarzania informacji, czyli w wyniku ich wykonania jest ona zmieniana
Rozkazy arytmetyczne:
ADD - addition - dodawanie;
SUB - subtraction - odejmowanie;
MUL - multiplication - mnożenie;
DIV - division - dzielenie;
ABS - absolute - wartość bezwzględna liczby;
NEG - negate - zmiana znaku liczby;
INC - increment - zwiększenie wartości o jeden;
DEC - decrement - zmniejszenie wartości o jeden.
Pierwsze cztery rozkazy tej grupy są dwuargumentowe, pozostałe cztery są jednoargumentowe. Argumentami takich rozkazów mogą być liczby stałopozycyjne i zmiennopozycyjne.
Rozkazy operacji logicznych:
AND - conjuction - iloczyn;
OR - disjunction - suma;
EXOR- exclusive-OR - suma mod 2;
NOT - complement - negacja.
Pierwsze trzy rozkazy są dwuargumentowe i ostatni rozkaz jest jednoargumentowy.
Rozkazy przesuwania:
SHL - shift left - przesuwanie zawartości rejestru w lewo (na najmniej znaczącą pozycję
wpisywane jest 0, a na najbardziej znaczącą pozycję jest zapisywany znacznik
przeniesienia).
SHR - shift right - przesuwanie zawartości rejestru w prawo (na najbardziej znaczącą
pozycję wpisywane jest 0, a na najmniej znaczącą pozycję jest zapisywany znacznik
przeniesienia).
SAL - shift arithmetic left - przesuwanie arytmetyczne w lewo (jak SHL), czyli mnożenie
przez 2 z zachowaniem bitu znaku.
SAR - shift arithmetic right - przesuwanie arytmetyczne w prawo, czyli dzielenie przez 2
(najbardziej znaczący bit jest pozostawiany a najmniej znaczący jest zapisywany na pozycję
znacznika przeniesienia).
ROL - rotate left - przesuwanie cykliczne w lewo (najbardziej znaczący bit jest zapisywany
na najmniej znaczącą pozycję oraz na pozycję znacznika przeniesienia).
ROR - rotate right - przesuwanie cykliczne w prawo (najmniej znaczący bit jest zapisywany
na najbardziej znaczącą pozycję i na pozycję znacznika przeniesienia).
RCL - rotate left with extend - przesuwanie cykliczne w lewo rejestru wydłużonego o znacznik przeniesienia.
RCR - rotate right with extend - przesuwanie cykliczne w prawo rejestru wydłużonego o znacznik przeniesienia.
Wszystkie podane operacje są jednoargumentowe. Rozkazy przesunięć mogą dotyczyć zarówno zawartości rejestrów jak i zawartości komórki pamięci.
W niektórych komputerach można spotkać różne modyfikacje tych rozkazów, jak np. przesuwanie na dwóch połączonych rejestrach lub przesuwanie dwuargumentowe, gdzie drugi argument określa liczbę pozycji, o jaką ma być przesunięta zawartość danego rejestru.
2. Rozkazy przesłań - są najczęściej wykonywanymi rozkazami. Nie zmieniają one wartości informacji, natomiast przenoszą ją z miejsca na miejsce. Jeśli chcemy wykonać jakąś operację, musimy zwykle pobrać jej argumenty, a po jej wykonaniu zapisać wynik.
MOV - move - przesłanie słowa pomiędzy rejestrami procesora.
STR - store - przesłanie słowa ze wskazanego w rozkazie rejestru procesora do komórki
pamięci.
LD - load - przesłanie słowa z pamięci do wskazanego rejestru procesora.
XCH - exchange - wymiana zawartości rejestrów.
IN - input- odczyt słowa z urządzenia wejściowego.
OUT - output - przesłanie zawartości wskazanego rejestru procesora do urządzenia
wyjściowego.
CLR - clear - zerowanie rejestru.
SET - set - zapisanie do rejestru jedynek.
PUSH - push - zapisanie zawartości rejestru na stos
POP - pop - odczyt słowa z wierzchołka stosu i przesłanie go do rejestru.
Pierwsze sześć rozkazów to rozkazy jednoargumentowe. Pozostałe cztery rozkazy są rozkazami bezargumentowymi.
3. Rozkazy sterujące pracą programu pozwalają zmieniać kolejność wykonywania instrukcji programu.
JMP - jump - skok bezwarunkowy do miejsca w pamięci wyspecyfikowanego w rozkazie.
J c - jump conditional - skok warunkowy, gdzie c określa jaki warunek musi być spełniony,
aby rozkaz wykonać.
CALL - call to subroutine - wywołanie podprogramu polegające na tym, że wykonywany
jest skok wraz z zapamiętaniem na stosie zawartości licznika rozkazów (ostatni adres).
C c - call conditional - warunkowe wywołanie podprogramu.
RET - return - skok powrotny z podprogramu polegający na przesłaniu ze stosu
zapamiętanej wcześniej zawartości licznika rozkazów.
SKIP - skip - przeskok przez jeden rozkaz.
Rozkazy warunkowe są wykorzystywane do realizacji rozgałęzień w programach. Jeśli warunek nie jest spełniony, to rozkaz nie jest wykonywany, a wykonywany jest rozkaz następny, tj. znajdujący się w programie po rozkazie warunkowym. Rozkazy skoków i wywołań zawierają adres skoku, tj. adres komórki pamięci, w której znajduje się rozkaz wykonywany bezpośrednio po wykonaniu rozkazu skoku.
4. Rozkazy sterujące pracą procesora
HALT - stop - zatrzymanie wykonywania programu.
NOP - no operation - rozkaz pusty.
Rozkaz HALT zatrzymuje pracę procesora, aż do momentu ponownego uruchomienia programu przez zdarzenie zewnętrzne (ponowną inicjalizację procesora, czyli po pojawieniu się sygnału RESET lub po zgłoszeniu przerwania, tj. pojawieniu się sygnału HIT), a rozkaz NOP jest rozkazem pustym - „nic nie rób”.
Przykład poszczególnych etapów przetwarzania następującego rozkazu:
add ax, [bx] ;
(dodaj zawartość rejestru AX do zawartości komórki, której adres znajdziesz w BX, wynik prześlij do AX.)
Faza pierwsza: pobranie (Prefetch , PF). Pobranie kodu instrukcji.
Faza druga: dekodowanie (Decode, DE). Określenie czynności do wykonania, obliczenie adresu efektywnego dla drugiego argumentu (16xDS)+BX.
Faza trzecia: wykonanie(Execute, EX). Dostęp do komórki pamięci o adresie (16xDS)+BX, operacja dodawania do AX.
Faza czwarta: zakończenie i zapisanie wyników (Write Back, WB). Umieszczenie wyniku w AX, ustawienie flag.