Assembler - wykład |
20-11-2000 |
Lista rozkazów mikroprocesora 8088 - C.D.
Rozkazy operujące na łańcuchach:
MOVS - przesłanie łańcuchów
CMPS - porównanie łańcuchów
SCAS - wyszukiwanie słowa w łańcuchu
LODS - ładuj akumulator z łańcucha
STOS - zapamiętaj akumulator w łańcuchu
Rozkazy sterujące wykonaniem programu:
CALL - wywołanie podprogramu
RET - powrót z podprogramu
JMP - skok bezwarunkowy
JZ/JNZ - skoki warunkowe
LOOP - iteracja
LOOPNE - iteracja warunkowa
INT - przerwanie
IRET - powrót po INT
Rozkazy sterujące procesora:
CLC/STC - zerowanie/ustawianie znaczników
HLT - zatrzymanie procesora
TRYBY ADRESOWANIA DANYCH
Na rysunku 1 pokazano pewną liczbę instrukcji, z których każda wybiera pewne słowo danych i przesyła do rejestru AX. Instrukcje te ilustrują różne tryby adresowania mikroprocesora 8088.
LP |
Przykład rozkazu |
Tryb adresowania słowa źródłowego |
Działanie |
1. |
mov ax, bx |
Rejestrowy |
|
2. |
mov ax, 5 |
Natychmiastowy |
|
3. |
mov ax, LICZBA |
Bezpośredni |
|
4. |
mov ax, (bx) |
Pośredni |
|
5. |
mov ax, (bx+5) |
Względny bazowy /baza + przesunięcie/ |
|
6. |
mov ax, (bx+si+5) |
Względny bazowy indeksowy /baza+indeks+przesunięcie/ |
|
rys. 1 Przykłady trybów adresowania
Pierwszy przykład jest prostym przykładem przesyłania rejestru do rejestru. Zawartość rejestru BX jest przenoszona do rejestru AX.
Drugi przykład pokazuje adresowanie natychmiastowe. W tym przypadku stała (5) przenoszona do rejestru AX jest określana jako wartość stała wewnątrz samej instrukcji.
Trzeci przykład ilustruje jeden ze sposobów bezpośredniego adresowania pamięci: zawartość pamięci zaadresowanej symbolicznie jako „liczba” jest umieszczana w rejestrze AX.
Pozostałe tryby adresowania są bardziej pożyteczne, ponieważ dopuszczają pośrednie adresowanie pamięci.
W czwartym przykładzie zawartość rejestru BX jest interpretowana jako adres pamięci, zawartość pamięci spod tego adresu jest przenoszona do rejestru AX. Rejestr BX przechowuje adres pamięci także w:
piątym przykładzie; w tym przypadku jednakże wartość przesunięcia względnego 5 jest dodawana, aby uzyskać żądany adres pamięci.
Dowolny z rejestrów: BX, BP, SI lub DI może być użyty w tych pośrednich trybach adresacji.
Szósty przykład adresowania jest najbardziej złożony; zawartość rejestrów BX i SI oraz wartość przesunięcia względnego 5 są razem dodawane dla określenia adresu pamięci zawierającego żądane dane.
UWAGA:
Z wyjątkiem trybu natychmiastowego, każdy z przytoczonych trybów adresowania danych może być zastosowany dla operandów przeznaczenia w instrukcjach typu przesłania danych arytmetycznych i logicznych. Tak więc, na przykład, instrukcja:
ADD [BX], DX
będzie oznaczać dodanie zawartości rejestru DX do wartości spod adresu zawartego wewnątrz rejestru BX i umieszczenie wyniku ponownie w tej samej komórce pamięci.
Dla wszystkich przytoczonych przykładów, gdy tryb adresowania określa operand w pamięci, procesor zakłada, że jest to w segmencie danych i wybiera rejestr DS. dla obliczenia adresu fizycznego.
Jedynym wyjątkiem jest przypadek, gdy rejestr BP jest używany jako rejestr bazowy. W tym przypadku segment stosu jest adresowany poprzez rejestr SS. Załóżmy, że musimy dotrzeć do danych w różnych segmentach, jak to rozwiązać ?
Można to rozwiązać poprzez poprzedzenie adresu informacją o segmencie przekrywającym przez umieszczenie w instrukcji odpowiedniego kodu. Możemy poinstruować assembler, aby użył segmentu przekrywającego przez wyspecyfikowanie żądanego rejestru segmentowego po którym następuje dwukropek. Tak więc instrukcja:
MOV AX, ES:[BX]
spowoduje, że adres fizyczny będzie obliczany przy użyciu rejestru segmentowego ES i zawartości rejestru BX jako adresu przesunięcia. Słowo spod tego adresu pamięci, który jest oczywiście w segmencie dodatkowym będzie przenoszony do rejestru AX.
OPERACJE NA STOSIE
Instrukcje PUSH i POP są szczególnego rodzaju instrukcjami przesyłania danych, które implementują strukturę pamięci: „Last-In-First-Out” znaną jako STOS. Działanie tych indtrukcji pokazane jest na rysunku 2. Stos zawsze rezyduje w segmencie stosu, tak więc rejestr SS jest zawsze używany przy odwoływaniu się do stosu; nie jest możliwe jakiekolwiek przekrywanie tego segmentu. Rejestr wskaźnika stosu, SP jest używany we wszystkich operacjach na stosie jako adres pamięci.
Instrukcja PUSH zmniejsza zawartość SP o dwa, a następnie zapamiętuje wartość wskazanego operanda pod adresem pamięci określonym przez SP.
Instrukcja POP pobiera dane spod adresu pamięci określonego przez SP i umieszcza w swoim operandzie, a następnie zwiększa zawartość SP o dwa.
Zauważmy, że instrukcje PUSH i POP zawsze przesyłają słowo danych. Kontrastuje to z bnardziej ogólną instrukcją MOV, która może przesłać bajt lub słowo. Instrukcje PUSH i POP dostarczają mechanizmu, który może być używany do zachowania kilku różnych wartości danych, a następnie odtwarzaniu ich w odwrotnej kolejności do tej, w której były zachowywane.
TUTAJ MA BYĆ RYSUNEK .cdr KTÓRY JEST W OSOBNYM PLIKU (Rys 2 - operacje na stosie.cdr)
rys. 2
Pierwsza wartość, która będzie zdejmowana (w żargonie POP-owana) ze stosu będzie zawsze tą wartością, która była ostatnio składowana (PUSH-owana) na stosie. Opisane własności stosu czynią z niego idealne miejsce do tymczasowego przechowywania wartości danych, gdy nie chcemy wiązać z zadaniem żadnych konkretnych komórek pamięci. Załóżmy, na przykład, że piszemy program, w którym wykorzystujemy i zmieniamy zawartość rejestru CX. Jeżeli bieżąca wartość tego rejestru ma być wykorzystana w dalszych fragmentach programu, musimy zachować go na stosie, a następnie odtworzyć :
PUSH CX ; zachowanie zawartości CX na stosie
..................;
..................; fragment programu zmieniający wartość CX
..................;
POP CX ; odtworzenie wartości początkowej
Operandy instrukcji PUSH i POP mogą być adresowane przy pomocy dowolnego z opisanych trybów adresowania danych. Zawartość rejestru znaczników może być również PUSH-owana i POP-owana ze stosu.
Ze względu na charakter LIFO, stos może być wykorzystywany przez instrukcje współpracy z podprogramami CALL i RET-urn.