3.Lista rozkazów, rozkaz przesyłania, metody adresowania pamięci
Lista rozkazów
Program dla wszystkich standardowych mikrokomputerów jest w pełni uporządkowanym zbiorem rozkazów, które będą wykonane w porządku sekwencyjnym (z wyjątkiem tych rozkazów, które celowo zmieniają tę kolejność wykonania). Adres komórki pamięci obecnie wykonywanego rozkazu jest zawarty w liczniku rozkazów (PC) - jednym z rejestrów adresowych (często jedynym).
Rozkaz typowych mikrokomputerów składa się z dwóch części: kodu operacji, określającego jego działanie, i adresu (lub adresów) argumentów, przy czym każdy adres określa położenie w pamięci argumentów, na których mają być wykonywane operacje.
Na ogół w mikrokomputerach są realizowane trzy typy rozkazów:
1) manipulacji danymi;
2) wejścia/wyjścia;
3) sterowania wykonaniem programu.
l. Rozkazy manipulacji danymi:
MOV X, Y [Rejestr (X)] ← Rejestr (Y)]
MOV X, AdrPam [Rejestr (X)] ← [Pamięć (Z)]
MOV AdrPam, X [Pamięć (Z)] ← [Rejestr (X)]
MOV X,='17' [Rejestr (X)] ← Dana
MOV AdrPam,= ' 17' [Pamięć (Z)] ← Dana
ADD X, Y [Rejestr (X)] ←[Rejestr (X)] + [Rejestr (Y)]
ADD X, AdrPam [Rejestr (X)] ← [Rejestr (X)] + [Pamięć (Z)]
ADD X,= ' 17' [Rejestr (X)] ← [Rejestr (X)] + Dana
2. Rozkazy wejścia/wyjścia
IN X, Urządzenie nr 3 [Rejestr (X)] ← [Urządzenie (3)]
3. Rozkazy sterujące wykonywaniem programu
JMP TAM [PC] ← AdrPam TAM
JMPZ TUTAJ Jeśli (ostatni wynik = 0),
to [PC] ← AdrPam TUTAJ
Jeśli nie, [PC] ←[PC] + 1
Dla dyskusji postaci rozkazów procesora Intel 8086 bedziemy używać ogólnej postaci rozkazu przesunięcia MOV.
Rozkaz przesyłania
Rozważmy rozkaz
MOV CX, DX
który umieszcza 16-bitową zawartość rejestru DX w rejestrze CX, i rozkaz
MOV CH,DL
który umieszcza 8-bitową zawartość rejestru DL w rejestrze CH. Format tych rozkazów operujących na rejestrach pokazano na rys poniżej
Bajt 1 |
Bajt 2 |
||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kod operacji |
D |
W |
MOD |
Rejestr |
R/M |
Możliwe są różne formaty rozkazu przesunięcia MOV układu I8086 z użvciem wariantów wprowadzonych do rozkazu przez projektanta układu.Należą do nich:
W: Argumenty o długości słowa lub bajtu (W=0 - bajt, W=1 - słowo)
D: Wyniki w pamieci lub w rejestrze (Kierunek: D=0 - z rejestru do pamięci, R/M←Rej,
D=1 - z pamięci do rejestru, Rej→R/M).
MOD: Argument w rejestrach lub w pamięci bez przesunięcia lub z przesunieciem ze znakiem o długości bajtu lub z przesunieciem bez znaku o długości słowa.
Adresowanie pamięć rejestr: 11 - adresowanie rejestr do rejestru
10 - adresowanie pamięci, przesunięcie bez znaku o długości slowa
01 - adresowanie pamięci, przesunięcie ze znakiem o długości słowa
00 - adresowanie pamięci, bez przesunięcia
REJ: Argument : identyfikator rejestru.
R/M: Jeśli R, to argument w jednym z rejestrów. Jeśli M, to oblicza się efektywny adres argumentu, używając jednego z ośmiu trybów adresowania.
Istnieje więc przynajmniej 2 (bajt/słowo) x 3 (przesunięcie) x 8 (trybów adresowania) x 3 (pam _ rej/rej _- pam/rej _ rej) =144 różnych formatów zawartych w jednej ogólnej postaci rozkazu dodawania ADD.
Należy tu podkreślić, że wszystkie rozkazy z dwoma wskazanymi argumentami, takie jak rozkaz przesunięcia MOV układu I8086, mogą być jedynie trzech typów:
[rejestr 1] ← [rejestr 2]
[rejestr] ← [komórka pamięci]
[komórka pamięci] ← [rejestr]
Zauważmy, że rozkazy typu "pamięć do pamięci" nie są przewidziane dla układu I8086. Korzystając z rys. poniżej można określić 72 odmiany rozkazu przesunięcia MOV słów i 72 odmiany rozkazu przesunięcia bajtów.
Format różnych wariantów rozkazu przesunięcia:
Wskazanie rejestru
Operacje na słowie (W=1)
000 AX
001 CX
010 DX
011 BX
100 SP
101 BP
110 SI
111 DI
Operacje na bajcie (W=0)
000 AL
001 CL
010 DL
011 BL
100 AH
101 CH
110 DH
111 BH
|
Bez przesunięcia |
Przesunięcie ze znakiem o długości bajtu |
Przesunięcie bez znaku o długości bajtu |
Nie dotyczy pamięci |
R/M= |
Tryb = 00 |
Tryb=01 |
Tryb=10 |
Tryb=11 |
000 |
Indeksowy względem rejestru bazowego BX+SI |
Indeksowy względem rejestru bazowego BX+SI+DISP |
Indeksowy bezpośredni względem rejestru bazowego BX+SI+DISP |
Wskazuje rejestr przy operacjach między rejestrami |
001 |
Indeksowy względem rejestru bazowego BX+DI |
Indeksowy względem rejestru bazowego BX+DI+DISP |
Indeksowy bezpośredni względem rejestru bazowego BX+DI+DISP |
|
010 |
Indeksowy względem rejestru bazowego Dotyczy stosu BP+SI |
Indeksowy bezpośredni względem rejestru bazowego Dotyczy stosu BP+SI+DISP |
Indeksowy bezpośredni względem rejestru bazowego Dotyczy stosu BX+SI+DISP |
|
011 |
Indeksowy względem rejestru bazowego Dotyczy stosu BP+DI |
Indeksowy bezpośredni względem rejestru bazowego Dotyczy stosu BP+DI+DISP |
Indeksowy bezpośredni względem rejestru bazowego Dotyczy stosu BX+DI+DISP |
|
100 |
Domniemany SI |
Indeksowy bezpośredni SI+DISP |
Indeksowy bezpośredni SI+DISP |
|
101 |
Domniemany DI |
Indeksowy bezpośredni DI+DISP |
Indeksowy bezpośredni DI+DISP |
|
110 |
Bezpośredni adres |
Bezpośredni względem rejestru bazowego Dotyczy stosu BP+DISP |
Bezpośredni względem rejestru bazowego Dotyczy stosu BP+DISP |
|
111 |
Względem rejestru bazowego BX |
Bezpośredni względem rejestru bazowego BX+DISP |
Bezpośredni względem rejestru bazowego BX+DISP |
|
Formaty rozkazu przesunięcia MOV z argumentem natychmiastowym do pamięci lub do rejestru pokazano na rys. poniżej.
Formaty rozkazu przesunięcia z argumentem natychamiastowym
Bajt 1 |
|
|
Bajt 2 |
Bajt 3 |
Bajt 4 |
Bajt 5 |
Bajt 6 |
|||||||
7 |
2 |
1 |
0 |
7 |
|
0 |
7 |
0 |
7 |
0 |
7 |
0 |
7 |
0 |
Kod operacji |
D |
W |
MOD |
Rej |
R/M |
Przesunięcie |
Przesunięcie |
Dane |
Dane dla DW=01 |
Przesunięcie natychmiastowe do rejestru
MOV CH,20H Przesuń w trybie natychmiastowym bajt do rejestru bajtowego
Użyto bajtów 1,2 i 5 rozkazu
D=0, W=0, MOD=11, R/M i Rej=przeznaczenie
MOV CX,2A39H Przesuń w trybie natychmiastowym słowo do rejestru
Użyto bajtów 1,2,5 i 6 rozkazu
D=0, W=1, MOD=11, R/M i Rej przeznaczenie
Przesunięcie natychmiastowe do pamięci Pam←Dana
Przesunięcie natychmiastowe do akumulatora
AX←Dana(16b)
AL←Dana(8b)
7 |
4 |
3 |
2 |
1 |
0 |
7 |
|
|
0 |
7 |
|
|
0 |
Kod operacji |
W |
Rej |
Dane |
Dane dla W=1 |
MOV AL,20H Przesuń natychmiastowo bajt do akumulatora bajtowego
MOV AX,2A39H Przesuń natychmiastowo słowo do akumulatora
Z tego rysunku można określić 51 odmian rozkazu MOV przy operacji na bajtach i 26 odmian przy operacji na słowach. W sumie otrzymujemy więc 221 odmian rozkazu przesunięcia MOV.
Metody adresowania pamięci
Klasyfikacja trybów adresowania
W języku asemblerowym przewidziano co najmniej 19 różnych metod obliczania adresu efektywnego argumentów źródła i przeznaczenia. Dla wygody i ułatwienia zrozumienia podzielono te 19 trybów adresowania na 5 grup. Rysunki mają ułatwić zrozumienie tych trybów adresowania. Ich skrótowe wyjaśnienie podajemy poniżej.
Adresowanie bezpośrednie
- Adresowanie bezpośrednie rejestru: zawartość rejestru AX.
Przykład: AX
- Adresowanie bezpośrednie pamięci: zawartość komórki pamięci głównej wskazanej przez identyfikator TAM, z przesunięciem lub bez. Może być indeksowane.
Przykłady:
TAM
TAM + 17
Adresowanie pośrednie
- Adresowanie pośrednie z rejestru: zawartość komórki pamięci głównej, której adres jest zawarty w rejestrze SI (w przypadku I8086 ograniczone do rejestru indeksowego lub bazowego; może mieć przesunięcie).
- Adresowanie pośrednie z pamięci (układ I8086 nie ma tego trybu adresowania:zawartość komórki pamięci głównej, której adres jegt zawarty w innej komórce pamięci głównej wskazanej przez identyfkator argumentu.
Często jest dopuszczalne także przesunięcie.
Adresowanie względne
- Adresowanie względem rejestru bazowego: zawartość komórki pamięci głównej, której adres jest obliczany jako suma adresu w rejestrze bazowym i przesunięcia podanego jako argument w rozkazie. Przesunięcie może być bezwzględne lub strukturalne.
Przykłady:
$BX IEEE
(BX) I8086
(BP + 3) I8086
(BP)-coś I8086
- Adresowanie względem licznika adresów (układ I8086 nie ma tego trybu adresowania): zawartość kómórki pamięci głównej, której adres jest obliczany jako suma adresu w liczniku rozkazów PC (adresu wykonywanego rozkazu) i przesunięcia podanego jako argument w rozkazie. Bardzo podobne do omówionego powyżej trybu adresowania względem rejestru bazowego.
- Adresowanie natychmiastowe: wartość pola argumentu w rozkazie jest używana jako dane. Adres danej jest więc wskazywany przez licznik rozkaz6w PC przy przesunięciu równym zeru. Zauważmy, że wartość nie może zaczynać się cyframi szesnastkowymi od A do F.
Przykłady:
123H I8086
OAlH I8086
# 123H IEEE
#AlH IEEE
- Adresowanie względem rozkazu bieżącego: stosowane w rozkazach skoku JUMP dla wskazania, że następny wykonywany rozkaz znajduje się o pewną liczbę rozkazów w przód lub wstecz od obecnego. Ten sposób adresowania nie jest zalecany, gdyż późniejsze dodanie lub usunięcie rozkazów w czasie uruchamiania lub konserwacji programu spowodują potrzebę zmiany wartości przesunięcia w rozkazie skoku JUMP, a jeśli o tym się zapomni, to wyniki będą katastrofalne.
Przykłady:
*+7
*-7
Adresowanie bezwzględne
Ten tryb adresowania niejest stosowany w układzie I8086, a normalnie oznacza, że wartość argumentu jest użyta jako adres w pamięci dla otrzymania żądanych danych. Adresowanie ,bezwzględne może być uważane za adresowanie od początku pamięci głównej z przesunięciem. Adresowanie segmentowe układu I8086 (opisane w rozdz. 2) czyni ten tryb adresowania zbędnym.
Adresowanie indeksowane
- Adresowanie bezpośrednie indeksowane z pamigci: zawartość komórki pamięci wskazanej przez sumę adresu identyfkatora TAM i zawartość rejestru indeksowego SI, z przesunięciem lub bez niego.
Przykłady:
TAM(SI)
TAM(SI + 3)
TAM(SI) + 3
- Adresowanie indeksowane pośrednie
l. Adresowanie indeksowane pośrednie z rejestru bazowego: zawartość komórki pamięci wskazanej przez rejestr bazowy BX modyfikowanv zawartością rejestru indeksowego SI. Ostatni przykład pokazuje użycie przesunięcia o pewną liczbę bajtów w zdefiniowanej strukturze wskazane identyfkatorem TEN.
Przykłady:
(BX) (SI) I8086
$BX (SI) IEEE
(BP). TEN (SI) I8086
2. Adresowanie indeksowane pośrednio z pamięci:
a. Postindeksowane (w układzie I8086 nie ma tego trybu adresowania):
zawartość komórki pamięci głównej wskazywanej przez zawartość komórki TAM modyfkowanej zawartością rejestru indeksowego SI.
b. Preindeksowane (w układzie I8086 nie ma tego trybu adresowania):
modyfkuje się adres identyfkatora TAM zawartością rejestru indeksowego SI i używa zawartości tak wskazanej komórki pamięci jako adresu danej.
Adresowanie pośrednie z rejestru z automatyczną inkrementacją/dekrementacją
Żaden z omówionych poniżej trybów nie jest dostępny w układzie I8086.
- Adresowanie pośrednie z rejestru z automatyczną postinkrementacją:
zawartość komórki pamięci głównej, której adres jest zawarty w rejestrze;
zawartość tego rejestru jest zwiększana o tyle, ile bajtów mają dane po każdym ich pobraniu.
- Adresowanie pośrednie z rejestru z automatyczną postdekrementacją:
zawartość komórki pamięci głównej, której adres jest zawarty w rejestrze;
zawartość tego rejestru jest zmniejszana o tyle, ile bajtów mają dane po każdym ich pobraniu.
- Adresowanie pośrednie z rejestru z automatyczną preinkrementacją:
zawartość komórki pamięci głównej, której adres jest zawarty w rejestrze;
zawartość tego rejestru została zwiększona przed pobraniem danych.
- Adresowanie pośrednie z rejestru z automatyczncł predekrementacją:
zawartość komórki pamięci głównej, której adres jest zawarty w rejestrze;
zawartość tego rejestru została zmniejszona przed pobraniem danych.
Obliczanie efektywnego adresu argumentu
Można powiedzieć, że efektywny adres argumentu jest adresem danej. W układzie I8086/8088 występuje pięć klas efektywnych adresów argumentu (i wiele podklas).
Adresowanie rejestru
Dana (wartość argumentu) znajduje się we wskazanym rejestrze. Jeśli argument ma długość 16 bitów, to dana znajduje się w rejestrach AX, BX, CX lub DX; jeśli argument ma długość 8 bitów, to dana znajduje się w rejestrach AL, AH, BL, BH, CL, CH, DL lub DH.
Adresowanie natychmiastowe
Dana (wartość drugiego argumentu źródłowego) jest częścią rozkazu, tzn. znajduje się w komórce pamięci tuż za rozkazem. Adres argumentu przeznaczenia może dotyczyć jednego z rejestrów lub dowolnego miejsca w pamięci.
Adresowanie pamięci
Dana (wartość argumentu) znajduje się w komórce pamięci, której adres można wyliczyć na wiele sposobów.
Bezpośrednie adresowanie pamięci. Efektywny adres argumentu (EAA) w pamięci jest przesunięty od początku segmentu o wartość określoną w rozkazie
AF = [RejSegm] * 16+Przesunięcie
gdzie AF oznacza adres fizyczny argumentu w przestrzeni adresowej o pojemności 1 MB, a [RejSegm] oznacza zawartość odpowiedniego rejestru segrńentu, którą należy pomnożyć przez 16, aby otrzymać adres początkowy
segmentu.
Indeksowane adresowanie bezpośrednie. Efektywny adres argumentu w pamięci jest przesunięty w stosunku do początku segmentu o przesunięcie i o zawartość podanego rejestru indeksowego
AF = [Rej Segm] * 16 + Przesunięcie + [Rej Indeksowy]
Adresowanie bezpośrednie poprzez rejestr bazowy. Efektywny adres argumentu w pamięci jest przesunięty w stosunku do początku segmentu o przesunięcie i o zawartość podanego rejestru bazowego
AF = [Rej Segm] * 16 + Przesunięcie + [Rej Bazowy]
Zauważmy, że ten tryb adresowania jest zbliżony do poprzedniego.
Indeksowane adresowanie bezpośrednie poprzez rejestr bazowy. Efektywny adres argumentu w pamięci jest przesunięty w stosunku do początku segmentu o przesunięcie, zawartość podanego rejestru indeksowego i zawartość podanego rejestru bazowego..
AF = [Rej Segm] * 16 + Przesunięcie + [Rej Indeksowy) + [Rej Bazowy]
Zauważmy, że ten tryb jest zbliżony do trybu adresowania z podwójnym indeksowaniem, stosowanego w niektórych komputerach.
Adresowanie pośrednie poprzez rejestr. Efektywny adres argumentu w pamięci jest przesunięty w stosunku do początku segmentu o zawartość wskazanego rejestru
AF = [Rej Segm] * 16 + [Rej]
Przy tym trybie adresowania można wskazać tylko jeden z rejestrów bazowych lub indeksowych. Dostęp do różnych elementów tablicy odbywa się z pomocą rozkazów, które zwiększają lub zmniejszają zawartość rejestru adresu pośredniego przed lub po pobraniu danej.
Zauważmy, że adresowanie pośrednie z rejestrem bazowym i adresowanie pośrednie indeksowane nie są dostępne w układzie Intel 8086/8088. Ten brak jest nieco złagodzony przez specjalną możliwość tworzenia pętli i zwykle nieprzedstawia specjalnych trudności w programowaniu.
SYSTEMY KOMPUTEROWE ROZDZIAŁ 3
10