arch, Studia, Assembler


Lista rozkazów mikroprocesora 8086

Rozkazy mikroprocesora 8086 można podzielić na siedem funkcjonalnych grup:

  1. Rozkazy przesłania danych w pamięci.

  2. Arytmetyczne.

  3. Logiczne.

  4. Operacje blokowe.

  5. Skoki.

  6. Operacje kontroli procesora.

  7. 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:

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:

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:

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: