Lista rozkazów mikroprocesora 8086
Rozkazy mikroprocesora 8086 można podzielić na siedem funkcjonalnych grup:
Rozkazy przesłania danych w pamięci.
Arytmetyczne.
Logiczne.
Operacje blokowe.
Skoki.
Operacje kontroli procesora.
Rozkazy wejścia/wyjścia.
Rozkazy przesyłania danych
Rozkazy przesyłania danych pozwalają działać na danych bajtowych i 16-bitowych (słowa). Specjalnym ich przypadkiem są rozkazy przekazywania danych 32-bitowych, które służą do inicjalizacji rejestru (np. adresowego) i rejestru segmentu pełnym adresem 20-bitowym. Rozkazy przesyłania można podzielić na:
uniwersalne,
przesyłania adresów,
przesyłania rejestru stanu.
Do grupy rozkazów uniwersalnych zalicza się rozkazy:
MOV - przeznaczony do przesyłania słów lub bajtów w operacjach typu rejestr-pamięć z (do) dowolnych rejestrów. Rozkaz ten może też przesyłać do pamięci dane określone w trybie prostym bez pośrednictwa rejestru.
Składnia:
MOV reg, reg - pomiędzy rejestrami
MOV mem,reg - z rejestru do pamięci
MOV reg,mem - z pamięci do rejestru
MOV reg,stała - stałej do rejstru
MOV mem,stała - stałej do pamięci
MOV reg,seg - z rejestru segmentowego do rejestru 16-bitowego
MOV mem,seg - z rejestru segmentowego do pamięci
MOV seg,mem - z pamięci do rejestru segmentowego
PUSH - przesłanie słowa na szczyt stosu.
Składnia:
PUSH reg/mem - prześlij 16-bitową wartość z rejestru lub pamięci na stos
PUSH stała - prześlij stałą na stos
POP - pobranie słowa ze szczytu stosu, a następnie modyfikacja wskaźnika stosu.
Składnia:
POP reg,mem - pobierz daną ze stosu do rejestru lub do pamięci
XCHG - służy do wymiany zawartości rejestrów i pamięci. Argumentem rozkazu nie mogą być rejestry segmentowe.
Składnia:
XCHG reg/mem,mem/reg
LEA - rozkaz przesyłania do rejestru 16-bitowego adresu efektywnego określonego w trybie odwołania do pamięci. Rejestrem wynikowym operacji może być rejestr uniwersalny, wskaźnik lub rejestr indeksowy. Rozkaz jest przeznaczony do pobierania adresu obiektu z pamięci w celu rutynowych działań na adresach.
Składnia:
LEA reg,pamięć - zmienna pamięć jest komórką pamięci, której adres efektywny
będzie wyliczony i przesłany do rejestru reg.
LDS - rozkaz pobrania adresu z jednoczesnym załadowaniem rejestru DS i podanego rejestru.
Składnia:
LDS reg,pamięć - pamięć zawiera adres ładowany do rejestru segmentowego i do
rejestru podanego jako argument.
LES - rozkaz pobrania adresu z jednoczesnym załadowaniem rejestru ES i podanego rejestru.
Składnia:
LES reg,pamięć - pamięć zawiera adres ładowany do rejestru segmentowego i do
rejestru podanego jako argument.
LAHF - rozkaz pobrania do rejestru AH młodszego bajtu rejestru znaczników
Składnia:
LAHF
SAHF - rozkaz przesłania do rejestru znaczników rejestru AH.
Składnia:
SAHF
Ponadto ze stosem współpracują instrukcje POPF i PUSHF:
POPF - pobranie do rejestru znaczników słowa ze stosu.
Składnia:
POPF
PUSHF - odłożenie rejestru znaczników na stos.
Składnia:
PUSHF
Rozkazy arytmetyczne
Rozkazy arytmetyczne mikroprocesora 8086 mogą wykonywać cztery podstawowe działania arytmetyczne: dodawanie, odejmowanie, mnożenie i dzielenie, operując na danych 8- i 16-bitowych. Każde z działań może operować na liczbach przedstawionych na trzy sposoby:
niekodowanych - zwykła reprezentacja dwójkowa liczb (np. 10000000b),
na liczbach kodowanych dziesiętnie (np. 128),
liczbach zapisywanych w postaci HEX (np. 80h).
ADD - dodawanie arytmetyczne dwóch liczb.
Składnia:
ADD reg,reg - dodawanie zawartości dwóch rejestrów
ADD reg,mem - dodawanie do zawartości rejestru danej z pamięci
ADD mem,reg - dodawanie do danej w pamięci zawartości rejestru
ADD reg,stała - dodawanie danej natychmiastowej do rejestru
ADD mem,stała - dodawanie danej natychmiastowej do danej w pamięci
SUB - odejmowanie arytmetyczne dwóch liczb.
Składnia:
SUB reg,reg - dodawanie zawartości dwóch rejestrów
SUB reg,mem - dodawanie do zawartości rejestru danej z pamięci
SUB mem,reg - dodawanie do danej w pamięci zawartości rejestru
SUB reg,stała - dodawanie danej natychmiastowej do rejestru
SUB mem,stała - dodawanie danej natychmiastowej do danej w pamięci
ADC - dodawanie dwóch liczb i znacznika przeniesienia. Instrukcja najczęściej używana przy
dodawaniu liczb wielobajtowych. Pozwala ona bowiem na uwzględnianie przeniesień, powstałych na młodszych bajtach.
Składnia:
ADC reg,reg - dodawanie zawartości dwóch rejestrów
ADC reg,mem - dodawanie do zawartości rejestru danej z pamięci
ADC mem,reg - dodawanie do danej w pamięci zawartości rejestru
ADC reg,stała - dodawanie danej natychmiastowej do rejestru
ADC mem,stała - dodawanie danej natychmiastowej do danej w pamięci
SBB - odejmowanie arytmetyczne dwóch liczb z pożyczką
Składnia:
SBB reg,reg - dodawanie zawartości dwóch rejestrów
SBB reg,mem - dodawanie do zawartości rejestru danej z pamięci
SBB mem,reg - dodawanie do danej w pamięci zawartości rejestru
SBB reg,stała - dodawanie danej natychmiastowej do rejestru
SBB mem,stała - dodawanie danej natychmiastowej do danej w pamięci
INC - zwiększenie bajtu lub słowa o 1 (inkrementacja).
Składnia:
INC reg - inkrementacja rejestru
INC mem - inkrementacja komórki w pamięci
DEC - zmniejszenie bajtu lub słowa o 1 (dekremantacja).
Składnia:
DEC reg - dekrementacja rejestru
DEC mem - dekrementacja komórki w pamięci
AAA - instrukcja AAA używana jest do korekty wyniku po dodaniu dwóch liczb w rozpakowanym kodzie BCD (generalnie 16-bitowych).
Składnia:
AAA - korekcja
Przykład.
mov bx,0207h
mov ax,0405h
add ax,bx teraz ax=060Ch
aaa teraz ax=0702h
AAS - instrukcja AAS używana jest do korekty wyniku po odjęciu dwóch liczb w rozpakowanym kodzie BCD (generalnie 16-bitowych).
Składnia:
AAS - korekcja
Przykład.
mov ax,0505h
mov bx,0207h
sub ax,bx teraz ax=02FEh
aas teraz ax=0108h
DAA, DAS - działają tak jak instrukcje AAA i AAS, tylko na argumentach w upakowanym kodzie BCD (generalnie 8-bitowych).
MUL - mnożenie liczb bez znaku. Operacja 8-bitowa pobiera pierwszy argument z AL., natomiast operacja 16-bitowa pobiera argument z AX. Wynik jest przekazywany w pierwszym przypadku do AX, natomiast w drugim przypadku do pary rejestrów AX i DX.
Składnia:
MUL reg - mnożenie przez rejestr
MUL mem - mnożenie przez zawartość komórki pamięci
IMUL - jak wyżej dla liczb ze znakiem.
Składnia:
IMUL reg - mnożenie przez rejestr
IMUL mem - mnożenie przez zawartość komórki pamięci
DIV - dzielenie liczb bez znaku. Operacja dzielenia przez dzielnik 8-bitowy pobiera pierwszy argument z AX, natomiast operacja dzielenia przez dzielnik 16-bitowy pobiera argument z pary rejestrów AX i DX (DX jest starszym słowem wyniku).
Składnia:
DIV reg - dzielenie przez daną z rejestru
DIV mem - dzielenie przez daną z komórki pamięci
IDIV - jak wyżej dla liczb ze znakiem.
AAD - instrukcja konwersji liczby w rozpakowanym kodzie BCD, znajdującej się w rejestrach AH i AL., na liczbę binarną.
Składnia:
AAD - konwersja
AAM - instrukcja konwersji liczby w binarnej z rejestru AX na rozpakowany kod BCD, do rejestrów AH i AL.
Składnia:
AAM - konwersja
Przykład.
Po wykonaniu instrukcji
mov ax,52h dziesiętnie jest to 82
aam al=2, ah=8
CBW - przekształcenie bajtu w AL na słowo w AX z uwzględnieniem znaku liczby.
Składnia:
CBW - przekształcenie
Przykład.
mov al,80h dziesiętnie jest to -128
cbw ax=FF80h
CWB - przekształcenie słowa w AX na podwójne słowo (zapisane w parze rejestrów AX i DX).
Składnia:
CWD - przekształcenie
Przykład.
mov ax,8000h dziesiętnie jest to -32768
cwd ax=8000h, dx=FFFFh dx jest starszym słowem wyniku
Rozkazy logiczne, przesunięcia i obroty
Rozkazy logiczne obejmują standardowy zbiór operacji: negacji, sumy, iloczynu i różnicy symetrycznej. Przesunięcia i obroty występują w ośmiu wariantach. Mogą być jedno- i wielokrokowe. Wyniki przekazują w rejestrze lub pamięci. Wariant krokowy odwołuje się do rejestru CL, jako źródła licznika przesunięcia.
Do jednoargumentowych rozkazów tej grupy należą:
NOT - negacja każdego bitu liczby.
Składnia:
NOT reg - negacja danej w rejestrze
NOT mem - negacja danej w pamięci
SHL - przesunięcie logiczne w lewo.
Składnia:
SHL mem,1 - przesunięcie logiczne komórki pamięci o 1 w lewo
SHL reg,1 - przesunięcie logiczne zawartości rejestru o 1 w lewo
SHL mem,cl - przesunięcie logiczne komórki pamięci o zawartość CL w lewo
SHL reg,cl - przesunięcie logiczne komórki rejestru o zawartość CL w lewo
SHR - przesunięcie logiczne w prawo. Składnia i argumenty jak dla SHL.
SAL - przesunięcie arytmetyczne w lewo. Operacja równoważna z mnożeniem przez 2.
Składnia:
SAL mem,1 - przesunięcie arytm. komórki pamięci o 1 w lewo
SAL reg,1 - przesunięcie arytm. zawartości rejestru o 1 w lewo
SAL mem,cl - przesunięcie arytm. komórki pamięci o zawartość CL w lewo
SAL reg,cl - przesunięcie arytm. komórki rejestru o zawartość CL w lewo
SAR - przesunięcie arytmetyczne w prawo. Operacja równoważna z dzieleniem przez 2.
Składnia:
SAR mem,1 - przesunięcie arytm. komórki pamięci o 1 w prawo
SAR reg,1 - przesunięcie arytm. zawartości rejestru o 1 w prawo
SAR mem,cl - przesunięcie arytm. komórki pamięci o zawartość CL w prawo
SAR reg,cl - przesunięcie arytm. komórki rejestru o zawartość CL w prawo
ROL - obrót w lewo. Składnia jak dla rozkazów SHL, SHR, SAL, SHR.
ROR - obrót w prawo. Składnia jak dla rozkazów SHL, SHR, SAL, SHR.
RCL - obrót w lewo z uwzględnieniem bity Carry. Składnia jak dla rozkazów SHL, SHR, SAL,
SHR.
RCR - obrót w prawo z uwzględnieniem bity Carry. Składnia jak dla rozkazów SHL, SHR,
SAL, SHR.
Rozkazami dwuargumentowymi są:
AND - Mnożenie logiczne argumentów.
Składnia:
AND reg,reg - mnożenie logiczne zawartości dwóch rejestrów
AND reg,mem - mnożenie logiczne zawartości rejestru i danej w pamięci
AND mem,reg - mnożenie logiczne danej w pamięci i zawartości rejestru
AND reg,stala - mnożenie logiczne zawartości rejestru i stałej
AND mem,stała - mnożenie logiczne danej w pamięci i zawartości rejestru
TEST - testowanie wybranych bitów argumentów. Instrukcja ta wykonuje logiczną operację AND na swoich argumentach. Wynik nie jest nigdzie zapamiętywany, ale na jego podstawie ustawiane są znaczniki.
Składnia:
TEST reg,reg - testowanie zawartości dwóch rejestrów
TEST reg,mem - testowanie zawartości rejestru z daną w pamięci
TEST mem,reg - testowanie danej w pamięci z zawartością rejsetru
TEST reg,stała - testowanie zawartości rejestru z daną natychmiastową
TEST mem,stała - testowanie danej w pamięci z daną natychmiastową
OR - suma logiczna argumentów.
Składnia:
OR reg,reg - suma logiczna zawartości dwóch rejestrów
OR reg,mem - suma logiczna zawartości rejestru i danej w pamięci
OR mem,reg - suma logiczna danej w pamięci zawartością rejestru
OR reg,stała - suma logiczna zawartości rejestru i danej natychmiastowej
OR mem,stała - suma logiczna danej w pamięci z daną natychmiastową
XOR - różnica symetryczna argumentów. Składnia jak dla instrukcji OR.
Rozkazy operacji blokowych
Rozkazy tego typu:
mogą być wykorzystywane w wariancie jedno- i wielokrokowym,
używają rejestrów implicite przypisanych do adresowanie i zliczania kroków: rejestr SI jest źródłem adresu danych, DI - adresu wyniku, a CX licznikiem kroków,
rozkaz wielokrokowy może być przerywany po zakończeniu kroku,
kierunek operacji zależy od stanu bitu DF w rejestrze znaczników (0-zwiększanie, 1-zmniejszanie).
Do rozkazów tych należą (w nawiasach rozkazy bajtowe lub działające na słowach):
MOVS (MOVSB, MOVSW) - przepisanie danych (bajt lub słowo) - instrukcja przepisuje dane wskazywane przez DS:SI pod adres ES:DI, a następnie modyfikują rejestry indeksowe.
CMPS (CMPSB, CMPSW) - porównanie danych (bajt lub słowo) - instrukcja porównuje dane wskazywane przez DS:SI pod adres ES:DI, a następnie modyfikują rejestry indeksowe.
SCAS (SCASB, SCASW) - porównanie danych (bajtu lub słowa) wskazywanych przez parę rejestrów ES:DI z daną która się znajduje w AL lub AX.
LODS (LODSB, LODSW) - załadowanie danych (bajtu lub słowa) - instrukcja ładuje dane z pamięci wskazywane przez DS:SI do AL lub AX.
STOS (STOSB< STOSW) - przesłanie danych (bajtu lub słowa) - instrukcja przesyła dane z AL lub AX do miejsca w pamięci wskazywanego przez ES:DI. Instrukcja ta działa odwrotnie do instrukcji LODS.
Każda z instrukcji blokowych może być poprzedzona instrukcją REP, co spowoduje, że zostanie ona wykonana nie jeden raz, ale CX razy (rejestr CX będzie zawierał liczbę powtórzeń każdej z instrukcji blokowej).
Rozkazy skoków
Rozkazy skoków można podzielić na:
skoki zwykłe i warunkowe,
wywołania podprogramów,
powroty z procedur,
rozkazy tworzenia iteracji,
przerwania programowe.
Mnemoniki |
Opis |
|
JE/JZ |
Skok, gdy równy/zero |
|
JL/JNGE |
Skok, gdy mniejszy/nie równy lub nie większy |
|
JLE/JNG |
Skok, gdy mniejszy lub równy/nie większy |
|
JB/JNAE |
Skok, gdy poniżej/nie powyżej lub nie równo |
|
JBE/JNA |
Skok, gdy poniżej lub równo/nie powyżej |
|
JP/JPE |
Skok, gdy parzystość/parzystość parzysta |
|
JO |
Skok, gdy nadmiar (przepełnienie) |
Skoki |
JS |
Skok, gdy znak ujemny |
Warunkowe |
JNE/JNZ |
Skok, gdy nie równy/nie zero |
|
JNL/JGE |
Skok, gdy nie mniejszy/większy lub równy |
|
JNLE/JG |
Skok, gdy nie mniejszy lub równy/większy |
|
JNB/JAE |
Skok, gdy nie poniżej/powyżej lub równo |
|
JNBE/JA |
Skok, gdy nie poniżej lub równo/powyżej |
|
JNP/JPO |
Skok, gdy nieparzystość/parzystość nieparzysta |
|
JNO |
Skok, gdy nie ma nadmiaru |
|
JNS |
Skok, gdy znak dodatni |
|
CALL |
Skok do podprogramu (wywołanie procedury) |
Wywołanie procedury |
JMP |
Skok bezwarunkowy |
Skok bezwarunkowy |
RET |
Powrót z podprogramu (procedury) |
Powrót z procedury |
Rozkazy kontroli iteracji
LOOP - zmniejsza CX o 1 i wykonuje skok, gdy CX ≠ 0.
Składnia:
LOOP nazwa_etykiety - skok do etykiety, gdy CX ≠ 0
LOOPZ - jak LOOP, tylko może wykonać dodatkowo skok, gdy bit zera jest ustawiony.
LOOPNZ - jak LOOP, tylko może wykonać dodatkowo skok, gdy bit zera nie jest ustawiony.
JCXZ - rozkaz skoku warunkowego, który jest wykonywany, gdy CX jest równy zero.
UWAGA:
Jak widać, rozkazy kontroli iteracji wykorzystują rejestr CX jako licznik iteracji. Należy zatem pamiętać, aby w pętlach (bo do tego głównie będą wykorzystywane tego rodzaju skoki) uważać z modyfikacją rejestru CX. Poza tym zasięg tych skoków to -128÷+127 bajtów. Etykieta, do której wykonywany jest skok powinna się znajdować na ogół powyżej instrukcji kontroli iteracji.
Przykład.
MOV CX,10
Tu:
...............
............... ciąg instrukcji pętli
...............
LOOP Tu
Powyższa pętla zostanie wykonana 10 razy.
Rozkazy przerwań programowych
Procesor 8086 używa tablicy wektorów przerwań przechowującej 256 adresów procedur obsługi przerwania. Lista rozkazów zawiera dwa przerwania programowe:
INT - przerwanie programowe.
Składnia:
INT numer_przerwania - wywołanie przerwania o podanym numerze
INTO - wygenerowanie przerwania nr 4 w przypadku, gdy znacznik nadmiaru jest ustawiony.
Składnia:
INTO
RET - powrót z podprogramu.
Skladnia:
RET
IRET - powrót z podprogramu obsługi przerwania.
Składnia:
IRET
Adresowanie w mikroprocesorze 8086
Pamięć operacyjna mikroprocesora 8086 jest segmentowana. Przez segment rozumie się spójny obszar pamięci o długości 64kB. Schemat tworzenia adresu fizycznego do pamięci przedstawiono poniżej.
Adres logiczny jest określony przez tryb adresowania. Z 16-bitowego adresu logicznego (efektywnego i zawartości odpowiedniego rejestru segmentowego) jest składanych 20-bitowy adres fizyczny. Proces tworzenia adresu fizycznego nie jest sprawą programisty, ponieważ dzięki początkowemu określeniu rejestrów segmentów może on działać na 16-bitowych adresach reprezentujących adresy logiczne. Wybór odpowiedniego rejestru będącego podstawą do określenia początku segmentu następuje na podstawie kodu rozkazu. Rozkazy przesyłania danych pobierają adres początku segmentu z rejestru DS, rozkazu skoków - z rejestru CS, a operacje na stosie - z rejestru SS. Dostęp do segmentu dodatkowego, adresowanego przez ES jest realizowany przez zmianę interpretacji rejestru segmentu, która zostanie opisana dalej.
Segmenty nie muszą być rozłączne. W ogólności program może w każdej chwili mieć jednoczesny dostęp do pamięci o rozmiarach od 64kB (wszystkie segmenty mają wspólne początki w pamięci fizycznej) do 4*64kB (wszystkie segmenty są rozłączne). Podział chwilowego podziału pamięci przy określonej zawartości rejestrów segmentów.
Mikroprocesor ma osiem trybów adresowania. Przemieszczenie wymienione w tabeli dotyczącej trybów adresowania jest stałą 8- lub 16-bitową uzyskiwaną z kodu rozkazu, której długość jest określona przez ten kod. Mikroprocesor 8086 pozwala osiągnąć urządzenia zewnętrzne przez adresy wydzielone z obszaru pamięci. Rozkazy wejścia/wyjścia używają dwóch typów adresów:
adresu 8-bitowego,
adresu 16-bitowego dostarczanego z rejestru DX.
TABELA. Tryby adresowania procesora 8086.
Tryb |
Wyznaczenie adresu efektywnego |
prosty rejestrowy bezpośredni
pośredni rejestrowy
indeksowy
względny
względny z IP
bazowy indeksowy |
adres + segment
SI + segment DI + segment BX + segment BP + segment
SI + przemieszczenie + segment DI + przemieszczenie + segment BP + przemieszczenie + segment BX + przemieszczenie + segment
przemieszczenie + IP
BX + SI + segment BX + DI + segment BP + SI + segment BP + DI + segment |
Wybrany
rejestr
segmentowy
SS, CS, ES, DS
lub żaden dla
WE/WY
19 0
Adres fizyczny
Sumator
Przesunięcie
0000
15 0
15 0
64kB
Segment kodu
Segment stosu
Segment danych
Dodatkowy segment
danych
FFFFFh
CS
SS
DS
ES
Rejestry
segmentowe