Realizacja operacji przez procesor
Operacje jednoargumentowe
Przykład
Procesor 6100 (DEC PDP-8)
Słowa pamięci są 12-bitowe, procesor stosuje instrukcje jednoadresowe, które mają format:
Kod operacji |
Adres pamięci |
bity 11 ... 9 |
Bity 8 ... 0 |
Przykładowe instrukcje:
TAD (kod 001) - dodać zawartość wskazanej komórki pamięci do akumulatora i wynik umieścić w akumulatorze zakładając, że argumenty operacji są wyrażone w kodzie dopełnieniowym (2s complement add);
DCA (kod 011) - Przenieść zawartość akumulatora do wskazanej komórki pamięci i wyzerować akumulator (deposit and clear accumulator);
JMP (kod 101) - wykonać skok do komórki o wskazanym adresie (jump).
Przykładowe instrukcje:
1) Słowo pamięci 001 000 100 110 oznacza, że zawartość komórki pamięci pod adresem 0001001102=0468=38 ma być dodana do akumulatora i wynik umieszczony w akumulatorze.
2) Słowo pamięci 011 000 001 101 oznacza wykonanie operacji DCA wykorzystując adres 0000011012=0158=13.
3) Załóżmy, że w momencie wczytywania instrukcji o adresie 418 zawartością akumulatora było 01028. Rozważmy następujący fragment programu:
Adres (ósemkowy) |
Zawartość pamięci (ósemkowo) |
Zawartość pamięci (binarnie) |
... |
... |
... |
418 |
30508 |
011 000 101 000 |
428 |
10518 |
001 000 101 001 |
... |
... |
... |
508 |
02228 |
000 010 010 010 |
518 |
02438 |
000 010 100 011 |
Instrukcja o adresie 418 spowoduje wyzerowanie akumulatora i umieszczenie wartości 01028 w komórce o adresie 508. Następna instrukcja pod adresem 428 wykona dodawanie 00008+02438=02438 tzn. wczyta do akumulatora zawartość komórki o adresie 518.
4) Przeanalizujmy fragment programu:
Adres (ósemkowy) |
Zawartość pamięci (ósemkowo) |
Zawartość pamięci (binarnie) |
Nazwa operacji |
... |
... |
... |
|
418 |
30518 |
011 000 101 001 |
DCA |
428 |
10528 |
001 000 101 010 |
TAD |
438 |
10538 |
001 000 101 011 |
TAD |
448 |
30548 |
011 000 101 100 |
DCA |
458 |
50718 |
101 000 111 001 |
JMP |
... |
... |
|
|
518 |
06008 |
000 110 000 000 |
|
528 |
02008 |
000 010 000 000 |
|
538 |
02128 |
000 010 001 010 |
|
548 |
03108 |
000 011 001 000 |
|
... |
... |
... |
|
718 |
... |
... |
|
Skutki wykonania operacji o danym adresie:
418: załadowanie aktualne zawartości akumulatora do komórki o adresie 518 i wyzerowanie akumulatora;
428: załadowanie do akumulatora wartości 2008 (zawartość komórki o adresie 528);
438: wykonanie dodawania 2008+2128=4128 i umieszczenie wyniku w akumulatorze;
448: przetransferowanie wartości 4128 do komórki o adresie 548 i wyzerowanie akumulatora;
458: skok do komórki o adresie 718 i kontynuowanie programu.
Operacje z wykorzystaniem stosu
Na stosie wykonuje się operacje PUSH i POP, a adres wierzchołka stosu przechowywany jest w rejestrze o nazwie Stack Pointer. Wykonanie każdej z wymienionych operacji powoduje stosowne uaktualnienie zawartości tego rejestru i dlatego operacji wykorzystujące stos nie wymagają adresu. Istnieje procesory, które wykorzystują stos wykonując takie operacje jak np. dodawanie czy mnożenie.
Operacje dwuadresowe
Struktura operacji jednoadresowej:
Kod operacji |
Adres argumentu |
Struktura operacji dwuadresowej:
Kod operacji |
Adres argumentu nr 1 |
Adres argumentu nr 2 |
Przykład
Operacja ADD dla procesora z dwoma akumulatorami GRA i GRB może mieć jedną z następujących postaci:
a)
ADD |
GRA |
MEM |
b)
ADD |
MEM |
GRB |
c)
ADD |
GRA |
GRB |
d)
ADD |
MEM1 |
MEM2 |
Zasady reprezentacji instrukcji i danych w pamięci operacyjnej
Dominuje stosowanie słów pamięci o stałej długości, często jest to 8 bitów (1 bajt). Instrukcje mają długość, która jest wielokrotnością długości słowa pamięci.
Techniki adresowania pamięci
Przyczyny stosowania są następujące:
dążenie do skrócenia adresu;
wygoda tworzenia programu;
potrzeba dokonywania relokacji pamięci w przypadku realizacji kilku procesów jednocześnie (multitasking).
Adresowanie bezpośrednie (Direct Addressing)
Jest najprostszy sposób polegający na podaniu pełnego adresu jako operanda operacji.
Przykład
Procesor 8080
Pamięć zorganizowana jest w słowa 8-bitowe, adresy są 16-bitowe, procesor ma 1 akumulator 8-bitowy. Instrukcje mogą zajmować 3 bajty, przy czym najpierw wczytywany jest kod operacji, potem adresy operandów.
Przykładowa instrukcja:
LAD (kod 0011 10102=3A16): załadować do akumulatora zawartość pamięci z komórki o podanym adresie (load accumulator).
Rozważmy następującą sesję:
Adres (szesnastkowy) |
Zawartość pamięci (szesnastkowo) |
024516 |
3A16 |
024616 |
4916 |
024716 |
0316 |
... |
... |
034916 |
2316 |
Realizacja tej części programu spowoduje załaduje wartości 2316 do akumulatora.
Przykład
Procesory serii 6800 (należą do niej procesory 6802, 6805, 6809, 68HC11 firmy Motorola)
Pamięć zorganizowana jest w słowa 8-bitowe, adresy są 16-bitowe, procesor ma 2 akumulatory 8-bitowe oznaczane przez litery A i B.
Przykładowe instrukcje:
ADDA (kod 101110112=BB16): dodać zawartość wskazanej komórki pamięci do akumulatora A i wynik umieścić w A;
ADDB (kod 111110112=FB16): dodać zawartość wskazanej komórki pamięci do akumulatora B i wynik umieścić w B.
Oto fragment programu:
Adres (dziesiętny) |
Zawartość pamięci binarnie |
Zawartość pamięci szesnastkowo i dziesiętnie |
... |
... |
... |
11 |
1011 1011 |
BB16 |
12 |
0001 0110 |
1616=22 |
13 |
0000 1111 |
0716=7 |
14 |
1111 1011 |
FB16 |
15 |
0010 0011 |
2316=35 |
16 |
1010 0010 |
A216=162 |
... |
... |
... |
227 |
1001 0011 |
9316=147 |
... |
... |
... |
35162 |
0000 1111 |
0F16=15 |
... |
... |
... |
Jego wykonanie spowoduje dodanie do aktualnych wartości akumulatorów A i B odpowiednio wartości 147 i 15 (zawartości komórek pamięci o adresach 227 i 35162).
Uwaga. Istnieją instrukcje, które mają adres 8-bitowy, a również „bezadresowe” takie jak HALT.
Przykład
Procesor PDP-11 ( komputery firmy DEC różnych rozmiarów)
Procesor ma 8 rejestrów generalnych 16-bitowych R0 , R1 , ... , R7 , słowa pamięci 8-bitowe.
Przykładowe operacje:
ADD (kod 01102): dodać zawartość rejestru źródłowego do zawartości rejestru docelowego i wynik umieścić w rejestrze docelowym. Kod operacji jest 4-bitowy, każdy adres 6-bitowy (3 bardziej znaczące bity na określenie typu adresowania, 3 mniej znaczące na numer rejestru generalnego).
INC (kod 00001010102): dodać 1 do zawartości wskazanego rejestru.
Przykładowa instrukcja 0110 000011 000101 doda zawartość rejestrów R3 oraz R5 i wynik umieści w rejestrze R5. Natomiast instrukcja 0000 101010 000101 powiększy o 1 zawartość rejestru R5.
Adresowanie natychmiastowe (Immediate Addressing)
W tym przypadku argument operacji (operand) jest częścią składową rozkazu.
Przykład
Procesor 8080
Przykładowa operacja:
ADI (kod 1100 01102=C616): dodać bajt zawarty w drugiej części rozkazu do akumulatora.
Oto fragment programu:
Adres (szesnastkowy) |
Zawartość pamięci (binarnie) |
Zawartość pamięci (szesnastkowo) |
... |
... |
... |
1616 |
110001102 |
C616 |
1716 |
000011002 |
0C16 |
... |
|
... |
Jego wykonanie spowoduje dodanie do akumulatora wartości C16=12.
Przykład
Procesory serii 6800
Przykładowe operacje:
ANDA (kod 1000 01002=8416): wykonać operację AND na bajcie drugiej części instrukcji i zawartości akumulatora A, wynik umieścić w A;
ANDB (kod 1100 01002=C416): wykonać operację AND na bajcie drugiej części instrukcji i zawartości akumulatora B, wynik umieścić w B.
Załóżmy, że akumulatory A, B zawierają odpowiednio 0110 0111 oraz 1001 1101 i przeanalizujmy fragment programu:
Adres (szesnastkowy) |
Zawartość pamięci binarnie |
Zawartość pamięci szesnastkowo |
... |
... |
... |
1016 |
1000 0100 |
8416 |
1116 |
1101 0101 |
|
1216 |
1100 0100 |
C416 |
1316 |
1010 0101 |
|
1416 |
... |
... |
... |
... |
... |
Wykonanie instrukcji pod adresem 1016 spowoduje załadowanie do akumulatora A wartości
1101 0101 AND 0110 0111=0100 0101, a instrukcji pod adresem 1216 załadowanie do akumulatora B wartości 1010 0101 AND 1001 1101=1000 0101.
Przykład
Procesor PDP-11
Przykładowa operacja:
Operacja ADD o kodzie 0110 w trybie adresowania natychmiastowego ma postać:
0110 |
010 111 |
000 011 |
Kod ADD |
Źródło |
Adres docelowy |
W tym przypadku wartość 010 111 w części źródłowej stanowi uzupełnienie kodu instrukcji sygnalizując tryb adresowania natychmiastowego.
Załóżmy, że rejestr R4 zawiera 0000618 w momencie rozpoczęcia realizacji fragmentu programu:
Adresy (dziesiętnie) |
Zawartość pamięci (ósemkowo) |
Zawartość pamięci (binarnie) |
... |
... |
... |
1020 - 1021 |
0627048 |
0110 010111 000100 |
1022 - 1023 |
0000128 |
|
1024 |
... |
... |
Rezultatem wykonania instrukcji umieszczonej pod adresami 1020 - 1021 spowoduje dodanie do rejestru R4 wartości 0000128, co spowoduje, że jego nową zawartością stanie się 0000738.
Adresowanie względne (Relative Addressing)
Sposób ten charakteryzuje się tym, że część adresowa instrukcji podaje liczbę (w kodzie dopełnieniowym), która ma być dodana do adresu następnej instrukcji i ta wartość staje się faktycznym adresem wykonywanej następnie instrukcji.
Przykład
Procesory serii 6800
Przykładowa operacja:
BRA (kod 0010 00002=2016): wykonać skok pod wskazany adres.
Oto fragment programu:
Adres (dziesiętnie) |
Zawartość pamięci binarnie |
Komentarz |
... |
... |
... |
10 |
0010 0000 |
BRA |
11 |
0000 0101 |
+5 |
12 |
... |
... |
... |
... |
... |
17 |
0010 0000 |
BRA |
18 |
1111 1001 |
-7 |
... |
... |
... |
Po odczytaniu zawartości komórek pamięci pod adresami 10-11 następna instrukcja zostanie odczytana z komórek o adresach 17-18, po czym program będzie kontynuowany począwszy od adresu 12.
Przykład
Procesor PDP-11
Przykładowa operacja
Adresowanie względne wykorzystuje instrukcja INC (increment) działająca tak samo, jak poprzednio opisana instrukcja BRA. Jej kodem jest 0052278=0000 101010 0101112.
Niech fragment programu ma postać
Adresy (ósemkowe) |
Zawartość pamięci (ósemkowo) |
Komentarz |
... |
... |
... |
10208 - 10218 |
0052278 |
INC |
10228 - 10238 |
0000128 |
+128 |
10248 |
... |
... |
... |
... |
... |
10368 |
... |
... |
... |
... |
... |
Po odczytaniu zawartości komórek pamięci pod adresami 10208 - 10238 program będzie kontynuowany począwszy od adresu 10368.
Adresowanie pośrednie (Indirect Addressing)
Część adresowa instrukcji wskazuje komórkę pamięci, z której należy pobrać potrzebny adres operacji.
Przykład
Przypuśćmy, że hipotetyczny procesor dysponuje instrukcją IAD, która działa tak jak ADD, ale stosuje adresowanie pośrednie. Rozważmy następujący fragment programu:
Adres (dziesiętny) |
Zawartość pamięci |
... |
... |
5 |
IAD 302 |
... |
... |
302 |
495 |
... |
... |
495 |
164 |
... |
... |
W momencie odczytania instrukcji pod adresem 5 liczba 164 (zawartość komórki o adresie 495) zostanie dodana do aktualnej zawartości akumulatora i ta wartość stanie się nową zawartością akumulatora. Gdyby zamiast polecenia IAD zostało użyte „zwykłe” ADD działające w trybie adresowania bezpośredniego, to liczbą dodaną do pierwotnej zawartości akumulatora byłoby 495.
Przykład
Procesor 8080
Oprócz akumulatora procesor wykorzystuje 8-bitowe rejestry o nazwach B, C, D, E, H, L, przy czym czasami łączone są one w pary tworzące rejestry 16-bitowe. Rejestry B, ... , L są kodowane trójkami bitów 000, ... , 101; akumulator trójką 111, a połączony rejestr H+L trójką 110.
Przykładowa operacja
Operacja MOV ładuje zawartość komórki o adresie umieszczonym w rejestrze H+L do rejestru docelowego. Instrukcja realizująca tę operację jest 8-bitowa i ma postać:
01 |
xxx |
110 |
Kod operacji |
Rejestr docelowy |
Rejestr źródłowy H+L |
xxx - kod akumulatora lub jednego z rejestrów B, ... , L.
Jeżeli przykładowo słowem instrukcji jest 01 111 110 oraz zawartościami rejestrów H oraz L są odpowiednio 3716 oraz 4216, to słowo 8-bitowe znajdujące się pod adresem 374216 zostanie załadowane do akumulatora. Podobnie instrukcja 01 001 110 w przypadku, gdy H oraz L zawierają odpowiednio 2316 oraz 7916 spowoduje skopiowanie zawartości komórki pod adresem 237916 do rejestru C.
Adresowanie indeksowane (Indexed Addresing)
Ten system adresowania wykorzystuje jeden lub więcej tzw. rejestrów indeksowych (index registers). W momencie odczytania polecenia posługującego się omawianym typem adresowania do zawartość jego części adresowej dodawana jest zawartość wskazanego rejestru indeksowego i to staje się faktycznym adresem wykonywanej operacji. Konieczność zasygnalizowania faktu użycia adresowania indeksowego i wskazania odpowiedniego rejestru indeksowego powoduje, że instrukcje jednoargumentowe mają postać:
Identyfikator rejestru indeksowego |
Kod operacji |
Adres pamięci |
Przykład
Przypuśćmy, że rejestr indeksowy o identyfikatorze 01 zawiera wartość 350 oraz CAD oznacza polecenie Clear And Add powodujące wyzerowanie akumulatora i załadowanie do niego zawartości wskazanej komórki pamięci. Wtedy instrukcja 01 CAD 200 spowoduje wgranie do akumulatora zawartości komórki pamięci o adresie 200+350=550.
Adresowanie indeksowane znacząco upraszcza realizację iteracji i przetwarzanie danych typu tablicowego. Do obsługi opisywanej techniki adresowanie potrzebna jest instrukcja ładująca potrzebny adres do rejestru indeksowego oraz instrukcja modyfikująca zawartość tego rejestru i realizująca następnie operację skoku. Aby lepiej wyjaśnić te problemy, wprowadźmy komendę SIR (Set Index Register) transferującą swoją część adresową do wskazanego rejestru indeksowego. Jeżeli przykładowo instrukcja ma postać 01 SIR 300, to wartość 300 zostanie załadowana do rejestru adresowego o identyfikatorze 01. Drugą potrzebną nam instrukcją jest BRI (Branch On Index). Powoduje ona zmniejszenie zawartości rejestru indeksowego o 1 w przypadku, gdy jego zawartość jest dodatnia i następnie wykonanie skoku pod wskazany adres. Natomiast w przypadku, gdy zawartość rejestru indeksowego jest zerowa, odczytywana jest zawartość następnej komórki pamięci zgodnie ze zwykłym trybem realizacji programu.
Przykład
Prześledźmy fragment programu realizowanego przez hipotetyczny procesor, który sumuje iteracyjnie zawartość komórek pamięci o adresach 201 - 300 i umieszcza rezultat sumowania w komórce o adresie 301:
Adres pamięci |
Identyfikator rejestru indeksowego |
Kod operacji |
Adres operacji |
0 |
01 |
SIR |
99 |
1 |
01 |
CAD |
201 |
2 |
00 |
ADD |
301 |
3 |
00 |
STO |
301 |
4 |
01 |
BRI |
1 |
5 |
00 |
HLT |
0 |
... |
... |
... |
... |
201 - 300 |
|
|
|
301 |
|
|
|
Skutki wykonania operacji o danym adresie:
0: załadowanie wartości 99 do rejestru indeksowego;
1: wyzerowanie akumulatora i załadowanie do niego zawartości komórki o adresie
201+zawartość rejestru indeksowego (w pierwszym kroku 300);
2: powiększenie zawartości akumulatora o zawartość komórki o adresie 301;
3: wyzerowanie komórki o adresie 301 i załadowanie do niej zawartości akumulatora;
4: zredukowanie o 1 wartości rejestru indeksowego, gdy nie jest on zerowy i kontynuowanie programu od adresu 1; gdy rejestr indeksowy jest wyzerowany przejście do adresu 5.
Przykład
Procesory serii 6800
Wykorzystuje się jeden lub dwa rejestry indeksowe 16-bitowe. Adresowanie indeksowane stosuje instrukcja ADDA, która ma w tym przypadku kod AB16=101010112. Załóżmy, że zawartością rejestru indeksowego jest 010216 i rozważmy fragment programu:
Adres (szesnastkowy) |
Zawartość pamięci (binarna) |
Zawartość pamięci (szesnastowo) |
... |
... |
... |
6816 |
10101011 |
AB16 |
6916 |
00010100 |
1416 |
... |
... |
|
Po odczytaniu zawartości komórek o adresach 6816 oraz 6916 zostanie dodana do akumulatora A zawartość komórki o adresie 010216+001416=011616 (nie uwidoczniona).
8