Bezwarunkowe przejścia. Podstawy programowania urządzeń MP (wykład) Sterowanie poleceniami przesyłu

  • 10.01.2024

Oprócz środków obliczeń arytmetycznych, system instrukcji mikroprocesorowych posiada także środki logicznej konwersji danych. Przez logiczne rozumiemy takie przekształcenia danych, na których się opierają reguły logiki formalnej.

Logika formalna działa na poziomie zdań prawdziwych i fałszywych. W przypadku mikroprocesora oznacza to zwykle odpowiednio 1 i 0. Komputer posługuje się językiem zer i jedynek, ale najmniejszą jednostką danych, na której operują instrukcje maszynowe, jest bajt. Jednak na poziomie systemu często konieczna jest możliwość działania na bardzo niskim poziomie — poziomie bitowym.

Ryż. 29. Narzędzia logicznego przetwarzania danych


Do środków logicznej transformacji danych zaliczają się polecenia logiczne i operacje logiczne. Operand instrukcji asemblera może ogólnie być wyrażeniem, które z kolei jest kombinacją operatorów i operandów. Wśród tych operatorów mogą znajdować się również operatory realizujące operacje logiczne na obiektach wyrażeń.

Zanim szczegółowo przyjrzymy się tym narzędziom, zastanówmy się, czym są same dane logiczne i jakie operacje są na nich wykonywane.

Dane logiczne

Teoretyczną podstawą logicznego przetwarzania danych jest logika formalna. Istnieje kilka systemów logiki. Jednym z najbardziej znanych jest rachunek zdań. Stwierdzenie to dowolne stwierdzenie, o którym można powiedzieć którekolwiek z nich PRAWDA, Lub FAŁSZ.

Rachunek zdań to zbiór reguł służących do określenia prawdziwości lub fałszywości jakiejś kombinacji stwierdzeń.

Rachunek zdań bardzo harmonijnie łączy się z zasadami działania komputera i podstawowymi metodami jego programowania. Wszystkie elementy sprzętu komputerowego zbudowane są na układach logicznych. System reprezentacji informacji w komputerze na najniższym poziomie opiera się na koncepcji bitu. Bit, mający tylko dwa stany (0 (fałsz) i 1 (prawda)), w naturalny sposób pasuje do rachunku zdań.

Zgodnie z teorią na instrukcjach (na bitach) można wykonywać następujące operacje logiczne.


1. Negacja (logiczna NIE) - operacja logiczna na jednym operandze, której wynikiem jest odwrotność pierwotnego operandu.

Operację tę charakteryzuje poniższa tabela prawdy (Tabela 12).

Tabela 12. Tabela prawdy dla negacji logicznej

2. Dodatek logiczny (włącznie logiczny LUB) - operacja logiczna na dwóch operandach, której wynikiem jest prawda (1), jeśli jeden lub oba operandy są prawdziwe (1), i fałsz (0), jeśli oba operandy są fałszywe (0).

Operację tę opisano za pomocą poniższej tabeli prawdy (Tabela 13).

Tabela 13. Tabela prawdy dla logicznego OR włącznie

3. Mnożenie logiczne (logiczne I) - operacja logiczna na dwóch operandach, która ma wartość true (1) tylko wtedy, gdy oba operandy mają wartość true (1). We wszystkich pozostałych przypadkach wartość operacji jest fałszywa (0).

Operację tę opisano za pomocą poniższej tabeli prawdy (Tabela 14).

Tabela 14. Tabela prawdy dla logicznego AND

4. Ekskluzywny dodatek logiczny (wyłączność logiczna LUB) - operacja logiczna na dwóch operandach, której wynikiem jest prawda (1), jeśli tylko jeden z dwóch operandów jest prawdą (1), i fałsz (0), jeśli oba operandy są fałszywe (0) lub „prawda” (1). Operację tę opisano za pomocą poniższej tabeli prawdy (Tabela 15).

Tabela 15. Tabela prawdy dla logicznego wyłącznego OR

System instrukcji mikroprocesora zawiera pięć instrukcji obsługujących te operacje. Instrukcje te wykonują operacje logiczne na bitach operandów. Wymiary operandów muszą być oczywiście takie same. Przykładowo, jeżeli rozmiar operandów wynosi słowo (16 bitów), wówczas operacja logiczna wykonywana jest najpierw na bitach zerowych operandów, a jej wynik zapisywany jest w miejsce bitu 0 wyniku. Następnie polecenie powtarza te czynności sekwencyjnie na wszystkich bitach od pierwszego do piętnastego.

Polecenia logiczne

System instrukcji mikroprocesora posiada następujący zestaw poleceń wspomagających pracę z danymi logicznymi:

1) i operand_1, operand_2 – operacja mnożenia logicznego. Polecenie wykonuje bitową operację logiczną AND (sprzężenie) na bitach operandów operand_1 i operand_2. Wynik jest zapisywany do operandu_1;

2) og operand_1, operand_2 – operacja dodawania logicznego. Polecenie wykonuje bitową operację logiczną OR (rozłączenie) na bitach operandów operand_1 i operand_2. Wynik jest zapisywany do operandu_1;

3) hog operand_1, operand_2 – logiczna operacja dodawania wyłącznego. Instrukcja wykonuje bitową logiczną operację wyłączną OR na bitach operandów operand_1 i operand_2. Wynik jest zapisywany w miejsce operandu;

4) test operand_1, operand_2 – operacja „sprawdź” (za pomocą mnożenia logicznego). Polecenie wykonuje bitową operację logiczną AND na bitach operandów operand_1 i operand_2. Stan operandów pozostaje taki sam, zmieniają się jedynie flagi zf, sf i pf, co pozwala na analizę stanu poszczególnych bitów operandu bez zmiany ich stanu;

5) brak argumentu – logiczna operacja negacji. Polecenie wykonuje inwersję bitową (zastąpienie wartości przeciwną) każdego bitu operandu. Wynik jest zapisywany w miejsce operandu.

Aby zrozumieć rolę instrukcji logicznych w systemie rozkazów mikroprocesora, bardzo ważne jest zrozumienie zakresu ich zastosowania oraz typowych technik ich wykorzystania w programowaniu.

Za pomocą poleceń logicznych jest to możliwe przydział poszczególnych bitów w operandzie w celu ustawianie, resetowanie, odwracanie lub po prostu sprawdzanie określonej wartości.

Aby zorganizować taką pracę z bitami, operand_2 zwykle pełni rolę maski. Używając bitów ustawionych w 1 bicie tej maski, określane są bity operand_1 potrzebne do określonej operacji. Pokażmy, jakie polecenia logiczne można w tym celu wykorzystać:

1) aby ustawić niektóre bity na 1, użyj polecenia og operand_1, operand_2.

W tej instrukcji operand_2, który pełni rolę maski, musi zawierać jeden bit w miejscu bitów, które w operand_1 powinny być ustawione na 1;

2) aby zresetować niektóre bity do wartości 0, użyj polecenia i argumentu_1, argumentu_2.

W tej instrukcji operand_2, który pełni rolę maski, musi zawierać bity zerowe zamiast bitów, które w operand_1 powinny być ustawione na 0;

3) stosowana jest komenda hog operand_1, operand_2:

a) aby dowiedzieć się, które bity w operand_1 i operandzie są różne;

b) odwrócić stan określonych bitów w operand_1.

Podczas wykonywania polecenia hog interesujące nas bity maski (operand_2) muszą wynosić jeden, reszta musi wynosić zero;

Aby sprawdzić stan określonych bitów, użyj polecenia test operand_1, operand_2 (sprawdź operand_1).

Zaznaczone bity operand_1 w masce (operand_2) muszą mieć wartość jeden. Działanie polecenia test jest podobne do algorytmu polecenia i, jednak nie powoduje zmiany wartości argumentu_1. Wynikiem polecenia jest ustawienie wartości flagi zerowej zf:

1) jeżeli zf = 0, to mnożenie logiczne dało wynik zerowy, czyli jeden bit jednostkowy maski, który nie pasował do odpowiadającego mu jednego bitu operandu;

2) jeżeli zf = 1, to mnożenie logiczne dało wynik niezerowy, tj. przynajmniej jeden jeden bit maski odpowiada odpowiadającemu mu bitowi operandu_1.

Aby zareagować na wynik polecenia test, zaleca się użycie polecenia skoku jnz label (Skok, jeśli nie jest zerem) - skok, jeśli flaga zerowa zf jest niezerowa, lub polecenia o działaniu odwrotnym - jz label (Skok if Zero) - skok jeśli flaga zerowa zf = 0.

Następne dwa polecenia wyszukują pierwszy bit argumentu ustawiony na 1. Możesz wyszukiwać od początku lub od końca operandu:

1) bsf operand_1, operand_2 (Bit Scanning Forward) – skanowanie bitów do przodu. Instrukcja skanuje bity operandu_2 od najmniej znaczącego do najbardziej znaczącego (od bitu 0 do najbardziej znaczącego bitu) w poszukiwaniu pierwszego bitu ustawionego na 1. Jeśli takowy zostanie znaleziony, numer tego bitu jest wprowadzany do operandu_1 jako wartość całkowita. Jeśli wszystkie bity operand_2 mają wartość 0, wówczas flaga zerowa zf jest ustawiana na 1, w przeciwnym razie flaga zf jest resetowana na 0;

2) bsr operand_1, operand_2 (Bit Scanning Reset) – skanowanie bitów w odwrotnej kolejności. Instrukcja przeszukuje (skanuje) bity operandu_2 od najbardziej znaczącego do najmniej znaczącego (od najbardziej znaczącego bitu do bitu 0), szukając pierwszego bitu ustawionego na 1. Jeśli takowy zostanie znaleziony, numer tego bitu jest wprowadzany do operand_1 jako wartość całkowita. Ważne jest, aby pozycja pierwszego bitu z lewej strony była nadal liczona względem bitu 0. Jeśli wszystkie bity operandu_2 są równe 0, wówczas flaga zerowa zf jest ustawiana na 1, w przeciwnym razie flaga zf jest resetowana na 0 .

W najnowszych modelach mikroprocesorów Intela w grupie poleceń logicznych, umożliwiających dostęp do jednego konkretnego bitu operandu, pojawiło się kilka kolejnych poleceń. Operand może znajdować się albo w pamięci, albo w rejestrze ogólnego przeznaczenia. Pozycja bitu jest określona przez przesunięcie bitu względem najmniej znaczącego bitu operandu. Wartość offsetu można określić albo jako wartość bezpośrednią, albo zawartą w rejestrze ogólnego przeznaczenia. Jako wartości przesunięcia można użyć wyników poleceń bsr i bsf. Wszystkie instrukcje przypisują wartość wybranego bitu do flagi CE

1) argument bt, przesunięcie bitu (Bit Test) – sprawdź bit. Polecenie przekazuje wartość bitową do flagi cf;

2) operand bts, offset bitu (Bit Test and Set) – sprawdzenie i ustawienie bitu. Instrukcja przekazuje wartość bitu do flagi CF, a następnie ustawia testowany bit na 1;

3) btr sprawny, bit offset (Bit Test and Reset) – sprawdzanie i resetowanie bitu. Instrukcja przekazuje wartość bitu do flagi CF, a następnie ustawia ten bit na 0;

4) operand btc, przesunięcie bitowe (Bit Test i Convert) – sprawdź i odwróć bit. Instrukcja przekazuje wartość bitu do flagi cf, a następnie odwraca wartość tego bitu.

Polecenia zmiany

Instrukcje z tej grupy również umożliwiają manipulację pojedynczymi bitami operandów, ale w inny sposób niż omówione powyżej instrukcje logiczne.

Wszystkie instrukcje przesunięcia przesuwają bity w polu argumentu w lewo lub w prawo, w zależności od kodu operacji. Wszystkie instrukcje shift mają tę samą strukturę – operand policjanta, licznik_przesunięć.

Liczba przesuniętych bitów – licznik_przesunięć – znajduje się w miejscu drugiego operandu i można go określić na dwa sposoby:

1) statycznie, co polega na określeniu stałej wartości za pomocą bezpośredniego operandu;

2) dynamicznie, co oznacza zapisanie wartości licznika przesunięcia w rejestrze cl przed wykonaniem instrukcji przesunięcia.

Na podstawie rozmiaru rejestru cl jasne jest, że wartość licznika przesunięcia może wynosić od 0 do 255. Ale w rzeczywistości nie jest to do końca prawdą. W celach optymalizacji mikroprocesor akceptuje jedynie wartość pięć najmniej znaczących bitów licznik, czyli wartość mieści się w przedziale od 0 do 31.

Wszystkie polecenia shift ustawiają flagę przeniesienia, por.

Gdy bity są przesuwane poza operand, najpierw uderzają w flagę przeniesienia, ustawiając ją na wartość następnego bitu, który kończy się poza operandem. To, gdzie ten bit pójdzie dalej, zależy od rodzaju instrukcji przesunięcia i algorytmu programu.

Ze względu na zasadę działania polecenia zmiany biegów można podzielić na dwa typy:

1) polecenia przesunięcia liniowego;

2) polecenia przesunięcia cyklicznego.

Polecenia przesunięcia liniowego

Do poleceń tego typu zaliczają się polecenia wykonujące przesunięcie według następującego algorytmu:

1) następny „wciśnięty” bit ustawia flagę CF;

2) bit wprowadzony do operandu z drugiego końca ma wartość 0;

3) gdy następny bit zostanie przesunięty, przechodzi do flagi CF, a wartość poprzedniego przesuniętego bitu zostaje utracona! Polecenia przesunięcia liniowego dzielą się na dwa podtypy:

1) logiczne polecenia przesunięcia liniowego;

2) polecenia arytmetycznego przesunięcia liniowego.

Polecenia logicznego przesunięcia liniowego obejmują:

1) operand shl, licznik_przesunięcia (Shift Logical Left) – logiczne przesunięcie w lewo. Zawartość operandu jest przesuwana w lewo o liczbę bitów określoną przez wartość shift_count. Po prawej stronie (w miejscu najmniej znaczącego bitu) wprowadzane są zera;

2) operand shr, licznik_przesunięcia (Shift Logical Right) – logiczne przesunięcie w prawo. Zawartość operandu jest przesuwana w prawo o liczbę bitów określoną przez wartość shift_count. Po lewej stronie (w miejscu najbardziej znaczącego bitu znaku) wprowadzane są zera.

Rysunek 30 pokazuje, jak działają te polecenia.

Ryż. 30. Schemat działania poleceń liniowego przesunięcia logicznego


Instrukcje arytmetycznego przesunięcia liniowego różnią się od instrukcji przesunięcia logicznego tym, że działają w specjalny sposób na bicie znaku operandu.

1) sal operand, shift_counter (Shift Arithmetic Left) – arytmetyczne przesunięcie w lewo. Zawartość operandu jest przesuwana w lewo o liczbę bitów określoną przez wartość shift_count. Po prawej stronie (w pozycji najmniej znaczącego bitu) znajdują się zera. Polecenie sal nie zachowuje znaku, ale ustawia flagę z/w przypadku zmiany znaku kolejny wysuwany element. W przeciwnym razie polecenie sal jest całkowicie podobne do polecenia shl;

2) sar operand, shift_counter (Shift Arithmetic Right) – arytmetyczne przesunięcie w prawo. Zawartość operandu jest przesuwana w prawo o liczbę bitów określoną przez wartość licznik_przesunięć. Po lewej stronie do operandu wprowadzane są zera. Komenda sar zachowuje znak i przywraca go po przesunięciu każdego kolejnego bitu.

Rysunek 31 pokazuje, jak działają instrukcje liniowego przesunięcia arytmetycznego.


Ryż. 31. Schemat działania poleceń przesunięcia arytmetycznego liniowego

Obróć polecenia

Polecenia przesunięcia obrotowego to polecenia przechowujące wartości przesuwanych bitów. Istnieją dwa typy poleceń obrotu:

1) proste polecenia przesunięcia cyklicznego;

2) polecenia przesunięcia cyklicznego poprzez flagę przeniesienia por.

Do drużyn prosty cykliczny zmiany obejmują:

1) operand rol, licznik_przesunięcia (Obróć w lewo) – cykliczne przesunięcie w lewo. Zawartość operandu jest przesuwana w lewo o liczbę bitów określoną przez operand licznik_przesunięć. Bity przesunięte w lewo są zapisywane do tego samego operandu po prawej stronie;

2) operand gog, licznik_przesunięć (Obróć w prawo) – cykliczne przesunięcie w prawo. Zawartość operandu jest przesuwana w prawo o liczbę bitów określoną przez operand licznik_przesunięć. Bity przesunięte w prawo są zapisywane do tego samego operandu po lewej stronie.

Ryż. 32. Schemat działania prostych poleceń przesunięcia cyklicznego


Jak widać na rysunku 32, proste instrukcje przesunięcia cyklicznego wykonują podczas swojego działania jedną użyteczną czynność, a mianowicie: bit przesunięty cyklicznie jest nie tylko wpychany do operandu z drugiego końca, ale jednocześnie jego wartość staje się wartością Flaga CE

Obróć polecenia poprzez flagę przenoszenia CF różnią się od prostych poleceń przesunięcia cyklicznego tym, że przesuwany bit nie trafia natychmiast do operandu z drugiego końca, ale jest najpierw zapisywany do flagi przeniesienia CE Dopiero kolejne wykonanie tej instrukcji przesunięcia (zakładając, że jest wykonywane w pętli) powoduje umieszczenie poprzednio przesuniętego bitu na drugim końcu operandu(ryc. 33).

Do poleceń przesunięcia cyklicznego poprzez flagę przenoszenia powiązane są następujące kwestie:

1) operand rcl, shift_counter (Obróć poprzez przeniesienie w lewo) – cykliczne przesunięcie w lewo poprzez przeniesienie.

Zawartość operandu jest przesuwana w lewo o liczbę bitów określoną przez operand licznik_przesunięć. Przesunięte bity stają się na przemian wartością flagi przeniesienia, por.

2) operand rcg, licznik_przesunięć (Obróć poprzez przeniesienie w prawo) – cykliczne przesunięcie w prawo poprzez przeniesienie.

Zawartość operandu jest przesuwana w prawo o liczbę bitów określoną przez operand licznik_przesunięć. Przesunięte bity na przemian stają się wartością flagi przeniesienia CF.

Ryż. 33. Polecenia zmiany cyklicznej poprzez flagę przeniesienia CF


Z rysunku 33 jasno wynika, że ​​podczas przesuwania flagi przeniesienia pojawia się element pośredni, za pomocą którego w szczególności możliwa jest zamiana bitów przesuwanych cyklicznie, w szczególności niedopasowanie sekwencje bitów.

Przez niedopasowanie sekwencji bitów w dalszej części opisu rozumiemy działanie, które pozwala nam w jakiś sposób zlokalizować i wyodrębnić niezbędne sekcje tej sekwencji oraz zapisać je w innym miejscu.

Dodatkowe polecenia zmiany

System poleceń najnowszych modeli mikroprocesorów Intela, począwszy od i80386, zawiera dodatkowe polecenia zmiany biegów, które rozszerzają możliwości omówione wcześniej. To są polecenia zmiany podwójna precyzja: 1) shld operand_1, operand_2, shift_counter – przesunięcie w lewo o podwójnej precyzji. Polecenie shld dokonuje zamiany poprzez przesunięcie bitów operand_1 w lewo, wypełniając jego bity po prawej stronie wartościami bitów przesuniętych z operand_2 zgodnie ze schematem na ryc. 34. Liczba bitów do przesunięcia jest określona przez wartość licznik_przesunięć, operand_2 nie zmienia.


Ryż. 34. Schemat polecenia shld


2) shrd operand_1, operand_2, shift_counter – przesunięcie w prawo o podwójnej precyzji. Instrukcja dokonuje zamiany przesuwając bity operandu_1 w prawo, wypełniając jego bity po lewej stronie wartościami bitów przesuniętych z operandu_2 zgodnie ze schematem na rysunku 35. Liczba przesuniętych bitów jest określona przez wartość licznik_przesunięć, który może należeć do zakresu 0... 31. Wartość ta może być podana jako bezpośredni operand lub zawarta w rejestrze cl. Oznaczający operand_2 nie zmienia.

Ryż. 35. Schemat polecenia shrd


Jak zauważyliśmy, polecenia shld i shrd wykonują przesunięcia do 32 bitów, ale ze względu na specyfikę określania operandów i algorytmu operacyjnego, poleceń tych można używać do pracy z polami o długości do 64 bitów.

2. Polecenia przeniesienia kontroli

Poznaliśmy kilka tworzących się zespołów liniowy sekcje programu. Każdy z nich na ogół wykonuje pewne czynności w celu konwersji lub przesłania danych, po czym mikroprocesor przekazuje kontrolę do następnego polecenia. Jednak bardzo niewiele programów działa w tak spójny sposób. Zwykle w programie są punkty, w których należy podjąć decyzję, które polecenie zostanie wykonane jako następne. Rozwiązaniem może być:

1) bezwarunkowy - w tym momencie konieczne jest przekazanie kontroli nie następnemu poleceniu, ale innemu, który znajduje się w pewnej odległości od bieżącego polecenia;

2) warunkowy - decyzja o tym, które polecenie zostanie wykonane jako następne, podejmowana jest na podstawie analizy niektórych warunków lub danych.

Program to sekwencja poleceń i danych zajmujących określoną ilość miejsca w pamięci RAM. Ta przestrzeń pamięci może być ciągła lub składać się z wielu fragmentów.

Mikroprocesor wie, która instrukcja programu powinna zostać wykonana jako następna, na podstawie zawartości pary rejestrów cs:(e)ip:

1) cs – rejestr kodu segmentu, który zawiera adres fizyczny (bazowy) bieżącego segmentu kodu;

2) eip/ip – rejestr wskaźników instrukcji, który zawiera wartość reprezentującą przesunięcie pamięci następnej instrukcji do wykonania względem początku bieżącego segmentu kodu.

To, który konkretny rejestr będzie używany, zależy od tego, czy tryb adresowania jest ustawiony na use16 czy use32. Jeśli określono użycie 16, zostanie użyte ip, jeśli zostanie określone użycie 32, zostanie użyte eip.

Zatem instrukcje przekazania sterowania zmieniają zawartość rejestrów cs i eip/ip, w wyniku czego mikroprocesor wybiera do wykonania nie kolejne polecenie programu w kolejności, ale polecenie z innej części programu. Przenośnik wewnątrz mikroprocesora jest resetowany.

Ze względu na zasadę działania polecenia mikroprocesora zapewniające organizację przejść w programie można podzielić na 3 grupy:

1. Polecenia bezwarunkowego przekazania kontroli:

1) polecenie bezwarunkowego skoku;

2) polecenie wywołania procedury i powrotu z procedury;

3) polecenie wywołania przerwań programowych i powrotu z przerwań programowych.

2. Warunkowe przekazanie poleceń sterujących:

1) polecenia skoku na podstawie wyniku polecenia porównania stron;

2) polecenia przejścia w oparciu o stan określonej flagi;

3) polecenia umożliwiające poruszanie się po zawartości rejestru ecx/cx.

3. Polecenia sterujące cyklem:

1) polecenie zorganizowania cyklu z licznikiem ecx/cx;

2) polecenie zorganizowania cyklu z licznikiem ecx/cx z możliwością wcześniejszego wyjścia z cyklu pod dodatkowym warunkiem.

Bezwarunkowe skoki

Poprzednia dyskusja ujawniła pewne szczegóły mechanizmu przejścia. Instrukcje skoku modyfikują rejestr wskaźników instrukcji eip/ip i ewentualnie rejestr segmentów kodu cs. To, co dokładnie należy zmodyfikować, zależy od:

1) od rodzaju argumentu w poleceniu bezwarunkowego skoku (blisko lub daleko);

2) ze wskazania przed adresem skoku (w poleceniu skoku) modyfikator; w tym przypadku sam adres skoku może być umieszczony albo bezpośrednio w poleceniu (skok bezpośredni), albo w rejestrze lub komórce pamięci (skok pośredni).

Modyfikator może przyjmować następujące wartości:

1) Near ptr – bezpośrednie przejście do etykiety w bieżącym segmencie kodu. Modyfikowany jest jedynie rejestr eip/ip (w zależności od określonego typu segmentu kodu use16 lub use32) na podstawie adresu (etykiety) podanego w poleceniu lub wyrażenia wykorzystującego znak ekstrakcji wartości - $;

2) far ptr – bezpośrednie przejście do etykiety w innym segmencie kodu. Adres skoku jest określony jako bezpośredni operand lub adres (etykieta) i składa się z 16-bitowego selektora i 16/32-bitowego przesunięcia, które są ładowane odpowiednio do rejestrów cs i ip/eip;

3) słowo ptr – pośrednie przejście do etykiety w bieżącym segmencie kodu. Modyfikowane jest tylko eip/ip (o wartość przesunięcia z pamięci pod adresem podanym w poleceniu lub z rejestru). Rozmiar przesunięcia 16 lub 32 bity;

4) dword ptr – pośrednie przejście do etykiety w innym segmencie kodu. Obydwa rejestry – cs i eip/ip – podlegają modyfikacji (o wartość z pamięci - i tylko z pamięci, z rejestru). Pierwsze słowo/dword tego adresu reprezentuje przesunięcie i jest ładowane do ip/eip; drugie/trzecie słowo jest ładowane do cs. jmp polecenie bezwarunkowego skoku

Składnia polecenia bezwarunkowego skoku to jmp [modyfikator] adres_skoku - skok bezwarunkowy bez przechowywania informacji o punkcie powrotu.

Adres skoku jest albo adresem etykiety, albo adresem obszaru pamięci, w którym znajduje się wskaźnik skoku.

W sumie system instrukcji mikroprocesora zawiera kilka kodów instrukcji maszyny bezwarunkowego skoku jmp.

O ich różnicach decyduje odległość przejścia oraz sposób określenia adresu docelowego. Zakres przejście jest określane przez lokalizację operandu adres_przejścia. Adres ten może znajdować się w bieżącym segmencie kodu lub w innym segmencie. W pierwszym przypadku przejście nazywa się wewnątrzsegmentowy, Lub ukochani, w sekundę - międzysegmentowy, Lub odległy Skok wewnątrzsegmentowy zakłada, że ​​zmieniana jest tylko zawartość rejestru eip/ip.

Istnieją trzy możliwości użycia polecenia jmp wewnątrz segmentu:

1) proste krótkie;

2) proste;

3) pośrednie.


Procedury

Język asemblera posiada kilka narzędzi, które rozwiązują problem powielania sekcji kodu programu. Obejmują one:

1) mechanizm procedur;

2) asembler makr;

3) mechanizm przerwań.

Procedura, często nazywana podprogram - jest to podstawowa jednostka funkcjonalna rozkładu (podziału na kilka części) jakiegoś zadania. Procedura to grupa poleceń służących do rozwiązania określonego podzadania i posiada środki umożliwiające przejęcie kontroli od momentu wywołania zadania wyższego poziomu i przywrócenia kontroli do tego momentu.

W najprostszym przypadku program może składać się z jednej procedury. Innymi słowy, procedurę można zdefiniować jako poprawnie sformatowany zestaw poleceń, który po opisaniu można w razie potrzeby wywołać w dowolnym miejscu programu.

Aby opisać sekwencję poleceń jako procedurę, język asemblera używa dwóch dyrektyw: PROC i ENDP.

Składnia opisująca procedurę jest następująca (ryc. 36).


Ryż. 36. Składnia opisu procedury w programie


Z rysunku 36 widać, że w nagłówku procedury (dyrektywa PROC) wymagana jest tylko nazwa procedury. Wśród dużej liczby argumentów dyrektywy PROC na szczególną uwagę zasługuje [odległość]. Atrybut ten może przyjmować wartości bliskie lub dalekie i charakteryzuje możliwość wywołania procedury z innego segmentu kodu. Domyślnie atrybut [odległość] jest ustawiony na blisko.

Procedurę można umieścić w dowolnym miejscu programu, jednak w taki sposób, aby kontrola nie spadła na nią przypadkowo. Jeśli procedura zostanie po prostu wstawiona do ogólnego strumienia poleceń, mikroprocesor potraktuje polecenia procedury jako część tego przepływu i odpowiednio wykona polecenia procedury.

Skoki warunkowe

Mikroprocesor posiada 18 instrukcji skoku warunkowego. Polecenia te pozwalają sprawdzić:

1) związek pomiędzy podpisanymi operandami („więcej – mniej”);

2) relację pomiędzy operandami bez znaku („powyżej – poniżej”);

3) stany flag arytmetycznych ZF, SF, CF, OF, PF (ale nie AF).

Polecenia skoku warunkowego mają tę samą składnię:

jcc przejście_label

Jak widać, kod mnemoniczny wszystkich poleceń zaczyna się od „j” - od słowa skok(odbić się), jej - definiuje konkretny stan analizowany przez polecenie.

Odnośnie opery etykieta_przejściowa, wówczas tę etykietę można umieścić tylko w bieżącym segmencie kodu; międzysegmentowe przeniesienie kontroli w przejściach warunkowych jest niedozwolone. W związku z tym znika kwestia modyfikatora, który był obecny w składni poleceń skoku bezwarunkowego. We wczesnych modelach mikroprocesorów (i8086, i80186 i i80286) instrukcje skoku warunkowego mogły wykonywać tylko krótkie skoki - odległość od -128 do +127 bajtów od instrukcji następującej po instrukcji skoku warunkowego. Począwszy od modelu mikroprocesora 80386, to ograniczenie zostało usunięte, ale jak widać, tylko w obrębie bieżącego segmentu kodu.

Aby za pomocą komendy skoku warunkowego podjąć decyzję o tym, gdzie zostanie przekazane sterowanie, należy najpierw wygenerować warunek, na podstawie którego zostanie podjęta decyzja o przekazaniu sterowania.

Źródłami takiego stanu mogą być:

1) dowolne polecenie zmieniające stan flag arytmetycznych;

2) strona poleceń porównania, która porównuje wartości dwóch operandów;

3) stan rejestru ecx/cx.


cmp Porównaj polecenie

Polecenie porównania strony ma interesującą zasadę działania. Jest to całkowicie to samo, co polecenie odejmowania - podoperand, operand_2.

Polecenie page, podobnie jak polecenie podrzędne, odejmuje argumenty i ustawia flagi. Jedyne, czego nie robi, to zapisuje wynik odejmowania w miejscu pierwszego operandu.

Składnia polecenia page to page operand_1, operand_2 (porównaj) – porównuje dwa operandy i ustawia flagi na podstawie wyników porównania.

Flagi ustawione poleceniem page można analizować za pomocą specjalnych poleceń rozgałęzień warunkowych. Zanim się im przyjrzymy, zwróćmy uwagę na mnemoniki tych poleceń skoku warunkowego (Tabela 16). Zrozumienie zapisu przy tworzeniu nazw komend skoku warunkowego (element w nazwie komendy jcc, oznaczony przez nas) ułatwi ich zapamiętanie i dalsze praktyczne wykorzystanie.

Tabela 16. Znaczenie skrótów w nazwie polecenia jcc
Tabela 17. Lista poleceń skoku warunkowego dla strony poleceń operand_1, operand_2

Nie zdziw się, że tym samym wartościom flag odpowiada kilka różnych kodów mnemonicznych poleceń skoku warunkowego (oddzielone są one od siebie ukośnikiem w tabeli 17). Różnica w nazwie wynika z chęci projektantów mikroprocesorów, aby ułatwić stosowanie instrukcji skoku warunkowego w połączeniu z pewnymi grupami instrukcji. Dlatego różne nazwy odzwierciedlają raczej różne orientacje funkcjonalne. Jednak fakt, że polecenia te odpowiadają na te same flagi, czyni je absolutnie równoważnymi i równymi w programie. Dlatego w tabeli 17 pogrupowano je nie według nazwy, ale według wartości flag (warunków), na które reagują.


Instrukcje i flagi rozgałęzień warunkowych

Notacja mnemoniczna niektórych poleceń skoku warunkowego odzwierciedla nazwę flagi, na której działają, i ma następującą strukturę: znak „j” jest pierwszy. (Skok, przejście), drugi to albo oznaczenie flagi, albo symbol negacji „n”, po którym następuje nazwa flagi. Ta struktura zespołu odzwierciedla jego cel. Jeżeli nie ma znaku „n”, to sprawdzany jest stan flagi, jeżeli jest równy 1, następuje przejście do etykiety skoku. Jeśli występuje znak „n”, wówczas sprawdzany jest stan flagi pod kątem równości 0 i jeśli się powiedzie, wykonywany jest skok do etykiety skoku.

Kody mnemoniczne poleceń, nazwy flag i warunki przejścia podano w Tabeli 18. Polecenia te mogą być użyte po wszelkich poleceniach zmieniających określone flagi.

Tabela 18. Komendy i flagi skoku warunkowego

Jeśli przyjrzysz się uważnie tabelom 17 i 18, zobaczysz, że wiele zawartych w nich poleceń skoku warunkowego jest równoważnych, ponieważ oba opierają się na analizie tych samych flag.


Instrukcje skoku warunkowego i rejestr ecx/cx

Architektura mikroprocesora wiąże się ze specyficznym wykorzystaniem wielu rejestrów. Na przykład rejestr EAX/AX/AL służy jako akumulator, a rejestry BP i SP służą do pracy ze stosem. Rejestr ESH/CX ma także określony cel funkcjonalny: pełni swoją rolę lada w poleceniach sterujących pętlą i podczas pracy z ciągami znaków. Możliwe, że funkcjonalnie polecenie skoku warunkowego powiązane z rejestrem ecx/cx byłoby bardziej poprawnie sklasyfikowane jako ta grupa poleceń.

Składnia tego polecenia rozgałęzienia warunkowego jest następująca:

1) jcxz jump_label (Skok, jeśli ex wynosi zero) – skok, jeśli cx wynosi zero;

2) jecxz jump_label (Jump Equal exx Zero) – skok jeśli exx wynosi zero.

Polecenia te są bardzo wygodne w użyciu podczas organizowania pętli i pracy z ciągami znaków.

Należy zauważyć, że komenda jcxz/jecxz ma pewne ograniczenia. W przeciwieństwie do innych instrukcji warunkowego transferu sterowania, instrukcja jcxz/jecxz może adresować tylko krótkie skoki - przy -128 bajtach lub +127 bajtach od następnej instrukcji.

Organizowanie cykli

Jak wiadomo, cykl jest ważną strukturą algorytmiczną, bez której prawdopodobnie nie obejdzie się żaden program. Możesz zorganizować cykliczne wykonywanie określonej sekcji programu, na przykład za pomocą poleceń przesyłania warunkowego lub polecenia bezwarunkowego skoku jmp. Przy tego typu organizacji cyklu wszystkie operacje związane z jego organizacją wykonywane są ręcznie. Biorąc jednak pod uwagę znaczenie takiego elementu algorytmicznego, jak cykl, twórcy mikroprocesorów wprowadzili do systemu poleceń grupę trzech poleceń, aby ułatwić programowanie cykli. W tych poleceniach używany jest również rejestr ecx/cx jako licznik cykli.

Podajmy krótki opis tych poleceń: 1) pętla jump_label (Loop) – powtórz cykl. Polecenie pozwala organizować pętle podobne do pętli for w językach wysokiego poziomu z automatycznym zmniejszaniem licznika pętli. Zadaniem zespołu jest wykonanie następujących czynności:

b) porównanie rejestru ESX/CX z zerem: jeżeli (ECX/CX) = 0, to sterowanie przekazywane jest do następnego polecenia po pętli;

2) etykieta przejścia pętli/pętli

Polecenia Loope i Loopz są absolutnymi synonimami. Działanie poleceń polega na wykonywaniu następujących czynności:

a) zmniejszenie rejestru ESH/CX;

c) analiza stanu flagi zerowej ZF, jeśli (ECX/CX) = 0 lub XF = 0, sterowanie przekazywane jest do następnego polecenia po pętli.

3) pętla/loopnz etykieta przejścia

Polecenia Loopne i Loopnz są również absolutnymi synonimami. Działanie poleceń polega na wykonywaniu następujących czynności:

a) zmniejszenie rejestru ESH/CX;

b) porównanie rejestru ESX/CX z zerem;

c) analiza stanu flagi zerowej ZF: jeżeli (ECX/CX) = 0 lub ZF = 1, sterowanie przekazywane jest do następnego polecenia po pętli.

Polecenia Loope/loopz i Loopne/loopnz mają odwrotną zasadę działania. Rozszerzają działanie polecenia pętli o dodatkową analizę flagi zf, co umożliwia zorganizowanie wcześniejszego wyjścia z pętli, wykorzystując tę ​​flagę jako wskaźnik.

Wadą poleceń pętli, pętli/loopz i pętli/loopnz jest to, że realizują one jedynie krótkie skoki (od -128 do +127 bajtów). Aby pracować z długimi pętlami, będziesz musiał użyć poleceń rozgałęzień warunkowych i polecenia jmp, więc spróbuj opanować obie metody organizowania pętli.

Podstawy programowania urządzeń MP (wykład)

PLAN WYKŁADU

1. Klasyfikacja poleceń mikroprocesorowych

2. Rodzaje adresowania

3. Struktura i formaty poleceń MP KR580VM80

1. Klasyfikacja poleceń mikroprocesorowych

Jak już wspomniano, podstawową zaletą MP jest programowalność. Oznacza to, że podając polecenia na wejście MP, można zapewnić pożądaną sekwencję działań, tj. implementacja określonego algorytmu. Algorytm rozwiązywanego problemu może być dowolnie złożony, konieczne jest jedynie podzielenie tego algorytmu na etapy zgodnie z systemem dowodzenia MP. Dlatego też system dowodzenia jest ważny, a nie tylko z punktu widzenia tego, co MP może zrobić, ale także tego, jak algorytm jest wykonywany. Obecność lub brak jakiegokolwiek polecenia lub grupy poleceń może znacząco wpłynąć na wybór MP dla konkretnego zastosowania.

Klasyfikację poleceń MP przedstawiono na rysunku 8.

Na podstawie liczby komórek pamięci potrzebnych do umieszczenia jednego polecenia rozróżnia się polecenia o długości jednego, dwóch lub trzech słów. Instrukcje o długości dwóch lub trzech słów wymagają odpowiednio dwóch lub trzech cykli dostępu do pamięci, aby je pobrać.

W wielu przypadkach, szczególnie przy porównywaniu MP o podobnej architekturze, przydatne jest klasyfikowanie poleceń zgodnie z charakterystyką architektury MP.

Z funkcjonalnego punktu widzenia zespoły dzielą się na trzy duże grupy: transmisja, zarządzanie i przetwarzanie danych. Rozważmy szczegółowo główne polecenia używane w MP, stosując klasyfikację według cech funkcjonalnych. Nazwy poleceń będą oznaczone rosyjskimi słowami wskazującymi znaczenie wykonywanych operacji.

Polecenia przesyłania danych zapewniają proste przekazywanie informacji bez wykonywania jakichkolwiek operacji przetwarzania. Polecenia w tej grupie dzielą się na polecenia związane z dostępem do pamięci, polecenia dostępu do rejestrów oraz polecenia wejścia/wyjścia.

Polecenia związane z dostępem do pamięci obejmują:

PAMIĘTAĆ(ZAPIS), za pomocą którego zawartość rejestru przesyłana jest do komórki pamięci.

Polecenia związane z przesłaniem bajtu lub słowa muszą wskazywać numer konkretnego rejestru, adres komórki pamięci oraz, w razie potrzeby, numer modułu pamięci.

Polecenia związane z dostępem do rejestrów muszą wskazywać numer źródła informacji oraz numer rejestru wynikowego. Do tej podgrupy poleceń przesyłania danych zaliczają się polecenia:

POBIERZ BEZPOŚREDNIO, w którym do rejestru zostaje wpisana stała określona w kodzie rozkazu;

DO PRZODU, za pośrednictwem którego zawartość jednego rejestru przesyłana jest do drugiego.

Polecenia wejścia/wyjścia obejmują:

WCHODZIĆ, za pomocą którego zawartość urządzenia wejściowego przesyłana jest do rejestru wewnętrznego MP;

WNIOSEK, w którym zawartość wewnętrznego rejestru MP (zwykle akumulatora) jest przesyłana do urządzenia wyjściowego.

Polecenia sterujące zwane często poleceniami przejścia, pozwalają na wykonanie różnorodnych działań w zależności od wartości sygnałów zewnętrznych lub warunków generowanych w systemie.Wszystkie polecenia sterujące dzielą się na polecenia przejścia bezwarunkowego i warunkowego.

Polecenia bezwarunkowego skoku obejmują:

BEZWARUNKOWY SKOK(BP), zgodnie z którym zawartość pola adresowego polecenia BP jest zapisywana do licznika programu, tj. zapewnia przejście w programie na adres podany w poleceniu;

BEZWARUNKOWY PRZELEW ZE ZWROTEM(przejście do podprogramu), zgodnie z którym do licznika programu (adres pierwszego polecenia podprogramu) zapisywana jest nowa treść, ale w odróżnieniu od polecenia BP, stan licznika programu i niektórych innych rejestrów zapisywany jest w pamięci . Kiedy podprogram jest wykonywany z ostatnim poleceniem RETURN, przywracana jest zawartość licznika programu i wszystkich rejestrów.

Instrukcje skoku warunkowego sprawdzają stan bitu rejestru, przerzutnika flagi lub innego parametru. Wynik sprawdzenia decyduje o tym, czy przejście zostanie wykonane, czy nie. Zwykle przejście jest przeprowadzane, jeśli wynik sprawdzenia odpowiada warunkom określonym w poleceniu. Do tej podgrupy poleceń sterujących zalicza się:

SKOK WARUNKOWY(UP) według adresu Kod komendy UP musi wskazywać sprawdzany warunek, dla którego MT wykorzystuje wartość zerową lub niezerową wyniku, znak dodatni lub ujemny wyniku, obecność lub brak przeniesienia sygnały, przepełnienia itp. Gdy warunek jest spełniony, zawartość licznika adresów jest zapisywana do licznika programu. Pola poleceń UE, czyli tzw. zapewnia przejście w programie na adres podany w poleceniu. Jeżeli warunek nie jest spełniony, sterowanie przekazywane jest do następnego polecenia programu;

PRZEJŚCIE WARUNKOWE Z POWROTEM, która różni się od polecenia BEZWARUNKOWY SKOK Z POWROTEM tym, że przejście do podprogramu następuje dopiero po spełnieniu określonego warunku.

Zazwyczaj w systemie poleceń MP znajduje się kilka dodatkowych poleceń pomocniczych, które pozwalają kontrolować stan rejestrów lub wyzwalaczy mających wpływ na wykonanie przejść warunkowych, na przykład: SET FLAG, RESET FLAG, SET BATTERY HIGH BIT, RESET BATTERY HIGH BIT itp. .

Polecenia przetwarzania danych dzielą się na arytmetyczne i logiczne. Do arytmetycznych należą:

ZGINAĆ zawartość dwóch rejestrów lub rejestru i komórki pamięci;

ODEJMOWAĆ z zawartości komórki pamięci lub rejestru, zawartość rejestru;

ZWIĘKSZ O 1(WZROST) zawartość komórki pamięci lub rejestru (wskaźnik stosu, rejestr indeksowy, akumulator);

ZMNIEJSZ O 1(DECREMENT) zawartość komórki pamięci lub rejestru;

DODAJ Z WYKONANIEM, dzięki któremu następuje dodawanie z uwzględnieniem stanu wyzwalacza przeniesienia. Ułatwia to organizację przetwarzania dużych liczb;

ODEJMIJ ODLICZENIE POŻYCZKI;

ZMIANA zawartość komórki pamięci lub rejestru (zwykle jeden bit).

Podgrupa poleceń logicznych obejmuje następujące polecenia:

I(MNOŻENIE LOGICZNE), za pomocą którego wykonywana jest operacja koniunkcji pomiędzy zawartością dwóch rejestrów lub komórki pamięci a rejestrem;

LUB(DODAWANIE LOGICZNE), za pomocą którego wykonywana jest operacja rozłączenia pomiędzy zawartością dwóch rejestrów lub komórki pamięci a rejestrem;

NIEWAŻNOŚĆ, który dokonuje bitowego porównania zawartości dwóch rejestrów lub komórki pamięci i rejestru;

INWERSJA zawartość komórki pamięci lub rejestru.

2. Rodzaje adresowania

Jedną z najważniejszych cech architektury MP jest lista możliwych metod dostępu do pamięci lub rodzajów adresowania. Możliwości adresowania MP są istotne z dwóch punktów widzenia.

Po pierwsze, duża ilość pamięci wymaga dużej długości adresu, ponieważ n-bitowy adres umożliwia dostęp do pamięci o pojemności 2n słów. Typowe 8-bitowe słowa MP umożliwiają bezpośredni dostęp tylko do 256 komórek pamięci, co zdecydowanie nie wystarczy. Jeśli weźmiemy pod uwagę, że dostęp do pamięci jest najczęstszą operacją, to oczywistym jest, że o efektywności wykorzystania MP w dużej mierze decydują metody adresowania dużej objętości pamięci przy małej pojemności bitowej MP.

Po drugie, dla ułatwienia programowania pożądany jest prosty system generowania adresów danych podczas pracy z tablicami, tabelami i wskaźnikami. Przyjrzyjmy się sposobom rozwiązania tych problemów.

Jeżeli pole adresowe polecenia jest ograniczone i niewystarczające do bezpośredniego dostępu do jakiejkolwiek komórki pamięci, wówczas pamięć w takim przypadku jest dzielona na strony, przy czym za stronę uważa się 2n komórek pamięci.

Aby dopasować pole adresowe polecenia małobitowego do pamięci o dużej pojemności (aby rozwiązać problem „strony”), w MP stosowane są różne typy adresowania:

Bezpośrednie adresowanie do bieżącej strony . Przy takim adresowaniu licznik programu jest podzielony na dwa pola: bity o wyższym znaczeniu wskazują numer strony, a bity o niższym znaczeniu wskazują adres komórki na stronie. Pole adresowe polecenia zawiera adres komórki na stronie, a adres strony należy ustawić w inny sposób, np. za pomocą specjalnego polecenia.

Adresowanie bezpośrednie za pomocą rejestru stron. MP musi mieć programowo dostępny rejestr stron załadowany specjalnym poleceniem. Rejestr ten dodaje kilka bitów do pola adresowego instrukcji, niezbędnych do adresowania całej pamięci.

Adresowanie bezpośrednie przy użyciu podwójnych słów. Aby zwiększyć długość pola adresowego polecenia, na adres przydzielane jest dodatkowe słowo (i jeśli to konieczne, dwa).

Adresowanie względem licznika programu. Pole adresu instrukcji jest traktowane jako liczba całkowita ze znakiem, która jest dodawana do zawartości licznika programu w celu utworzenia adresu wykonania. Ta metoda adresowania względnego tworzy pływającą stronę i ułatwia przenoszenie programów w pamięci.

Adresowanie względem rejestru indeksowego. Adres wykonania powstaje poprzez zsumowanie zawartości rejestru indeksowego i pola adresowego polecenia, traktowanego jako liczba całkowita ze znakiem. Rejestr indeksowy jest ładowany specjalnymi poleceniami.

Adresowanie pośrednie . Gdy używane jest adresowanie pośrednie, pole adresowe polecenia określa adres na bieżącej stronie, na której przechowywany jest adres wykonawczy. W takim przypadku wymagany jest dodatkowy bit w polu poleceń - znak adresowania pośredniego. Adres wykonawczy można przechowywać nie w komórce pamięci, ale w rejestrze ogólnego przeznaczenia. W tym przypadku adresowanie pośrednie nazywane jest adresowaniem rejestrowym.

3. Struktura i formaty poleceń MP KR580VM80

System poleceń MP serii KR580VM80 zawiera polecenia w trzech formatach: jednobajtowe, dwubajtowe i trzybajtowe.

Zawartość pierwszego bajtu wskazuje format polecenia, kod operacji, rodzaj adresowania oraz rejestry lub pary rejestrów, jeśli biorą udział w operacji.Nie jest jednak możliwe określenie konkretnych bitów, które są przydzielone pierwszym trzem z nich. określone elementy polecenia, ponieważ mogą one znajdować się w dowolnych bitach polecenia. Ale mimo to założymy, że są one kodowane jako jedno pole, które nazywa się polem kodu operacji. Warianty formatów pierwszego bajtu polecenia pokazano na rysunku 9.

Jeżeli w operacji biorą udział rejestry, to w pierwszym bajcie polecenia można podać jeden lub dwa z nich. W tym przypadku do numerów rejestrów w polu rozkazowym przypisane są dość specyficzne bity: trzy bity młodszego rzędu (b2 – b0) kodują numer rejestru źródłowego zawierającego operand, a trzy środkowe (b5 – b3) – numer rejestru docelowego, do którego wysyłany jest wynik operacji.W przypadku, gdy oba lub jeden z tych rejestrów nie biorą udziału w wykonaniu operacji, w kodzie operacji wykorzystywane są odpowiednie bity.

Akceptowane jest następujące kodowanie rejestrów:

000 – rejestr B, 100 – rejestr H,

001 – rejestr C, 101 – rejestr L,

010 – rejestr D, 110 – komórka pamięci,

011 – rejestr E, 111 – bateria A.

Kod 100 jest oznaką pośredniego adresowania pamięci przy użyciu 16-bitowego adresu umieszczonego w rejestrach H i L. W zależności od umiejscowienia tego kodu w poleceniu, dostęp do odpowiedniej komórki pamięci następuje albo w celu podania argumentu, albo w celu zapisania wyników operacja.

Szereg poleceń MP umożliwia przetwarzanie lub przesyłanie liczb o podwójnej długości. W takich przypadkach pary rejestrów B i C, D i E lub H i L są łączone w 16-bitowe rejestry o numerach odpowiednio 00, 01 i 10. Numery par rejestrów w rozkazach przypisane są do bitów b2 i b1 (rejestr źródłowy), b5 i b4 (rejestr docelowy), a bity b0 i b3 służą do wskazania kodu operacji.

Polecenia dwubajtowe w MP obejmują polecenia z adresowaniem bezpośrednim oraz polecenia wejścia/wyjścia.W związku z tym drugi bajt polecenia z tej grupy zawiera 8-bitowy operand lub 8-bitowy adres urządzenia wejściowego lub wyjściowego.

W instrukcjach trzybajtowych drugi i trzeci bajt zawierają 16-bitowe adresy (w instrukcjach adresowania bezpośredniego) lub 16-bitowe operandy (w instrukcjach ładowania par rejestrów i wskaźnika stosu).

Po wykonaniu każdej operacji ALU generowane jest pięć znaków, których wartości mogą mieć wpływ na wykonanie kolejnych poleceń przetwarzania informacji i warunkowego przekazania sterowania, przy czym należy mieć na uwadze, że różne polecenia mają różny wpływ na poszczególne znaki.

Dla wygody zapisywania i przywracania stanu MP podczas przerw i przejść do podprogramów, wszystkie określone charakterystyki przechowywane są w specjalnym rejestrze - rejestrze charakterystyk. Położenie znaków w bitach rejestru pokazano w tabeli.

gdzie S jest atrybutem „znaku” (przyjmuje wartość najbardziej znaczącego bitu

wynik);

Z – znak wyniku zerowego;

AC jest znakiem transferu pomocniczego (jeśli jest transfer

pomiędzy tetradami bajtów, wówczas AC=1, w przeciwnym wypadku AC=0;

P – znak parzystości wyniku (jeżeli liczba jedynek w bajcie

wynik jest parzysty, to P=1, w przeciwnym wypadku P=0);

C – znak przekazania lub wypożyczenia (jeżeli przy wykonywaniu poleceń

Kiedy doszło do przeniesienia ze stanowiska wyższego szczebla lub pożyczki na stanowisko starszego-

Najwyższa cyfra to C=1, w przeciwnym razie C=0).

Notatka: W przypadku poleceń mnożenia logicznego pomocniczy znak przeniesienia AC przyjmuje wartość czwartego bitu wyniku.

Kompletny system poleceń serii MP KR580VM80 znajduje się w załączniku podręcznika „Mikroprocesory i systemy mikroprocesorowe”. Tam dla każdego polecenia wskazane jest, jak po jego wykonaniu zmienia się wartość każdego atrybutu: jest ustawiana zgodnie z wynikiem operacji (+), nie zmienia się (–), jest resetowana do zera (0 ) lub ustaw na jeden (1).

Generalnie polecenie powinno zawierać następujące informacje:

–kod operacji wskazujący operację, którą musi wykonać PZ;

–adresy dwóch operandów (dodawanie, odejmowanie itp.). Jeżeli którykolwiek z operandów jest stałą, to zamiast jego adresu można w poleceniu podać wartość samego operandu. Jednakże okoliczność ta musi zostać odzwierciedlona w kodzie operacji, aby MP użył odpowiedniej części polecenia zgodnie z jej przeznaczeniem;

–adres komórki pamięci, w której należy umieścić wynik operacji;

–adres następnego polecenia.

Te. polecenie ma zazwyczaj cztery adresy, jednak ta struktura poleceń prowadzi do dłuższego formatu polecenia, co z kolei wiąże się z bardziej złożonym procesem przetwarzania i strukturą procesora. Dlatego w technologii MP najbardziej rozpowszechnione są polecenia bezadresowe i unicastowe, umożliwiające zbudowanie prostego procesora, jednak przy wykonywaniu skomplikowanych operacji stosowane są różne formaty poleceń.

System instrukcji MP serii 580 zawiera instrukcje jednobajtowe, dwubajtowe i trzybajtowe.

Informacja o sposobie adresowania polecenia zawarta jest w kodzie operacji pierwszego bajtu polecenia.

Aby przyspieszyć obliczenia, niektóre argumenty są przechowywane w bloku RON. Instrukcje operujące na tych argumentach używają skróconych kodów adresowych (adresowanie rejestrów).

Polecenia te pozwalają wyeliminować stosunkowo długi cykl dostępu do pamięci RAM, a tym samym znacznie zwiększyć szybkość operacji. Ze względu na ograniczoną pojemność RON i podczas pracy z dużą tablicą danych stosuje się inne metody adresowania, które umożliwiają dostęp do argumentów znajdujących się w pamięci zewnętrznej w stosunku do MP. Najbardziej powszechnym jest adresowanie pośrednie rejestrów, które wykorzystuje parę rejestrów HL.

W grupie poleceń przekazania kontroli wyróżniamy cztery typy poleceń: gałęzie bezwarunkowe, gałęzie warunkowe, pętle i przerwania .

Bezwarunkowe polecenia skoku. Zawiera trzy kody mnemoniczne: JMP (skok bezwarunkowy), CALL (wywołanie podprogramu) i RET (powrót z podprogramu).

Polecenie JMP pozwala na skok do dowolnego punktu programu, znajdującego się zarówno w bieżącym segmencie programu, jak i w innym segmencie. Podczas przeskakiwania w obrębie bieżącego segmentu programu używane są pierwsze trzy formaty instrukcji JMP.

Pierwszy format zapewnia przejście do dowolnego punktu programu w bieżącym segmencie programu, dla którego do treści IP w kodzie uzupełnienia do dwóch dodawane jest 16-bitowe przesunięcie, którego najbardziej znaczący bit jest podpisany. Drugi, skrócony format pozwala na skok do punktu w programie nie dalej niż -128-f-127 adresów z instrukcji JMP. Wreszcie trzeci format ładuje wskaźnik instrukcji 16-bitową liczbą, która znajduje się pod adresem wykonawczym EA, określonym przez postbajt. To przejście nazywa się pośrednim, ponieważ stosowane jest adresowanie pośrednie.

Aby zaimplementować bezwarunkowy skok do punktu programu znajdującego się poza bieżącym segmentem programu, gdy wymagane jest przeładowanie rejestru segmentu CS, stosuje się czwarty i piąty format instrukcji JMP.

Czwarty format definiuje bezpośrednie przejście międzysegmentowe, w którym drugi i trzeci bajt formatu wskazują względny adres punktu przejścia, a czwarty i piąty bajt wskazują nową wartość CS. Piąty format, wykorzystujący postbajt, pozwala na określenie adresu wykonawczego EA, pod którym znajduje się względny adres punktu przejścia (w bajtach pamięci o adresach EA, EA+1) oraz nowej wartości CS (w bajtach pamięci EA+2, EA+3).

Polecenie CALL umożliwia wywołanie podprogramu znajdującego się albo w bieżącym segmencie programu, albo w innym obszarze pamięci. Ma taki sam format jak polecenie JMP, z tą różnicą, że jest krótszy. W przeciwieństwie do polecenia JMP o podobnym formacie, polecenie CALL przed zmianą wartości IP lub IP i CS automatycznie zapisuje na stos aktualne wartości tych rejestrów, co gwarantuje zapamiętanie punktu powrotu z podprogramu.

Aby powrócić z podprogramu, należy użyć polecenia RET, które przekazuje kontrolę na adres zwrotny wypychany na stos podczas wykonywania poprzedniego polecenia CALL. Przy powrocie z podprogramów znajdujących się w bieżącym segmencie programu stosowane są dwa pierwsze formaty instrukcji RET, przy czym format drugi różni się od pierwszego tym, że do zawartości instrukcji dodawana jest stała zapisana w 2. i 3. bajcie instrukcji. wskaźnik stosu. Pozwala to jednocześnie z powrotem z podprogramu zresetować parametry zapisane na stosie podczas wykonywania tego podprogramu i nieużywane w przyszłości.

W przypadku zwrotu międzysegmentowego stosowane są trzeci i czwarty format RET, które zapewniają odtworzenie zawartości zarówno wskaźnika instrukcji, jak i segmentu programu.

Polecenia skoku warunkowego. Kontrola transferu w zależności od wyników poprzednich operacji. Istnieją trzy typy skoków warunkowych używanych do ustalenia relacji między liczbami ze znakiem, liczbami bez znaku i liczbami arbitralnymi. W pierwszych dwóch odmianach wybierane są różne kody mnemoniczne poleceń dla tych samych relacji między liczbami, ponieważ różne wartości flag odpowiadają tym samym relacjom między liczbami ze znakiem i bez znaku.

W kodach mnemonicznych poleceń skoku warunkowego, podczas porównywania liczb ze znakiem, litera służy do wskazania warunku „większego niż” G (Większy- więcej) i wyznaczyć - literę „mniej”. L (Mniej- mniej). W podobnych warunkach przy porównywaniu liczb bez znaku stosuje się odpowiednio litery A (powyżej- powyżej) i Poniżej- pod). Warunek równości jest oznaczony literą E (równe- jest równe), a niespełnienie jakiegoś warunku - pisemnie N(Nie- Nie). Należy zaznaczyć, że dla każdego polecenia dozwolone jest użycie dwóch różnych kodów mnemonicznych; na przykład kody mnemoniczne JL i JNGF są równoważne, ponieważ warunki „mniejszy niż” i „nie większy lub równy” są identyczne.

Pełną listę kodów mnemonicznych poleceń, sprawdzanych warunków, a także odpowiednich kombinacji logicznych flag i ich wartości podano w tabeli. 1.4.

Tabela 1.4

Kod mnemoniczny polecenia Stan Znaczenie flag
Dla podpisanych numerów
JL/JNGE Mniej/nie więcej niż lub równo SF + OF = l
JNL/JGE Nie mniejsze/większe lub równe SF + OF = 0
JG/JNLE Więcej niż/nie mniej niż lub równo (SF + OF) V ZF = 0
JNG/JLE Nie większe/mniejsze niż lub równe Dla liczb bez znaku (SF + OF) V ZF = l
JB/JNAE Mniej/nie więcej niż lub równo CF=1
JNB/JAE Nie mniejsze/większe lub równe CF=0
JA/JNBE Więcej CF V ZF = 0
JNA/JBE Nigdy więcej Dla innych danych CF V ZF = 1
JE/JZ Równe/zero ZF = 1
JNE/JNZ Nierówne/zero ZF = 0
JS Przez minus SF = 1
JNS Na plus SF = 0
JO Przelewowy OF = l
JNO Przez brak przepełnienia OF = 0
JP/JPE Przez równy parytet PF = 1
JNP/JPO Według dziwnej parytetu PF = 0

Wszystkie instrukcje skoku warunkowego mają ten sam format dwubajtowy, z których pierwszy bajt to kod operacji (OPC), a drugi to 8-bitowe przesunięcie, które jest traktowane jako liczba ze znakiem i dlatego umożliwia zmianę adresu w zakresie od -128 do + 127. Jeśli wymagane jest bardziej odległe („dalekie”) przejście, gdy warunek jest spełniony, używane jest dodatkowe bezwarunkowe polecenie przejścia.

Czas wykonania każdej z instrukcji skoku warunkowego podawany jest dla dwóch przypadków: 1) warunek jest spełniony i sterowanie faktycznie zostaje przekazane zgodnie z offsetem, 2) warunek nie jest spełniony i sterowanie przekazywane jest do kolejnej instrukcji.

Zespoły do ​​organizacji cykli. Wprowadzono do procesora dla wygody wykonywania cykli obliczeniowych. Należą do nich następujące kody mnemoniczne: LOOP (pętla aż (CX) nie będzie równa 0), LOOPNZ/LOOPNE (pętla aż do zera/nie będzie równa), LOOPZ/LOOPE (pętla do zera/równa) i JCXZ (wskok zero w SH). Każde z tych poleceń ma format dwubajtowy, którego drugi bajt określa 8-bitowe przesunięcie używane do zorganizowania skoku. To przesunięcie jest traktowane jako liczba ze znakiem i jest przedłużane ze znakiem do 16 bitów przed obliczeniem adresu skoku.

Używając poleceń pętli wraz z poleceniami manipulującymi elementami ciągów, można tworzyć dość złożone programy do konwersji ciągów. Rozważmy przykład skomponowania programu konwertującego ciąg danych zapisany w systemie szesnastkowym na jakiś kod, dla którego tablica konwersji znajduje się w pamięci od adresu początkowego określonego w BX, zgodnie z wymaganiami użycia polecenia konwersji tabeli dla XLAT kody. Załóżmy dalej, że ciąg źródłowy zawiera 80 elementów i znajduje się w pamięci od względnego adresu początkowego 100, a ciąg wynikowy należy umieścić od względnego adresu 200. Program konwertujący ciąg źródłowy na ciąg wynikowy, z wartość flagi kierunku DF=0, będzie miała postać:

MOVSI, 100
MOV DI,200
MOV CX, 80

Stosowane jest tutaj polecenie konwersji tabeli XLAT opisane w 1.2.

Polecenia przerywania. Zawiera trzy mnemoniki: INT (przerwanie), INTO (przerwanie w przypadku przepełnienia) i IRET (powrót do przerwania).

Polecenie przerwania INT o godz v=1 ma format dwubajtowy, którego drugi bajt zawiera 8-bitową liczbę określającą typ (typ) lub poziom przerwania. Za pomocą polecenia INT typ Procesor przystępuje do wykonania programu obsługi przerwania określonego poziomu, a działania niezbędne do zapewnienia powrotu do punktu przerwania są wykonywane automatycznie. Działania te są następujące: zapisanie zawartości rejestru flag F na stos (PUSHF), zresetowanie flag IF i TF, zapisanie na stos bieżących wartości rejestru CS i wskaźnika instrukcji IP.

Aby określić adres początkowy programu serwisowego zgodnie z wartością typ Używana jest tabela poziomów przerwań. Dla każdego z 256 poziomów przerwań w tej tablicy przydzielane są cztery bajty: pierwsze dwa bajty określają wartość wskaźnika instrukcji IP, drugi - wartość rejestru segmentowego CS. Te cztery bajty określają adresy początkowe programów serwisowych (pary wartości CS, IP), które należy najpierw zapisać do komórek pamięci pod adresami bezwzględnymi 0-3FFH. Adres tabeli odpowiadający podanemu w poleceniu INT typ poziom przerwań jest określany w CPU w następujący sposób. Po zapisaniu na stosie aktualnych wartości CS i GR następuje ładowanie: CS= typ X 4 + 2 i IP = typ X 4. Nowe wartości CS i IP pobrane odpowiednio z komórek adresowych typ X 4 + 2 I typ X 4, określić adres początkowy wymaganego programu konserwacji.

Polecenie przerwania INT omówione powyżej, gdy wartość pola wynosi v=0 ma format jednobajtowy, tzn. nie wymaga specjalnego wskazania poziomu przerwania. Polecenie to jest automatycznie postrzegane przez procesor jako przerwanie poziomu 3. (typ=3) i jest powszechnie używany w programach jako punkt kontrolny.

Komenda przerwania przepełnienia INTO powoduje przejście do obsługi przerwania czwartego poziomu (typ = 4) w przypadku gdy wartość flagi przepełnienia OF = 1. Polecenie INTO jest zwykle używane po podpisanych poleceniach arytmetycznych. Zazwyczaj kilka pierwszych poziomów przerwań (do 32) jest zarezerwowanych do przetwarzania szeregu określonych sytuacji, takich jak próba dzielenia przez zero, przepełnienie i tym podobne.

Osobliwością przetwarzania przerwań o zarezerwowanych poziomach jest to, że procesor przystępuje do ich obsługi niezależnie od wartości flagi zezwolenia na przerwanie IF.

Jednobajtowa instrukcja IRET jest umieszczana na końcu każdej procedury obsługi przerwania i zapewnia powrót przerwania. Za pomocą tego polecenia procesor pobiera ze stosu wartość wskaźnika instrukcji IP i segmentu programu CS, a także przywraca poprzednią zawartość rejestru flag F (tak jak w przypadku polecenia POPF). W razie potrzeby zawartość pozostałych rejestrów procesora odpowiadających przerwanemu programowi może zostać zachowana na stosie podczas przejścia do programu serwisowego, a następnie przywrócona po powrocie z niego za pomocą instrukcji dostępu do stosu.

Przez adres pośredni

PCHL – adres skoku zapisany jest w parze rejestrów HL. Kiedy jest wykonywany (HL) → PC.

Polecenia skoku warunkowego

Jcon @, gdzie con jest mnemonikiem warunku pochodzącym z angielskiego słowa warunek.

Wcześniej zauważono, że stan bitów (flag) RgP (F) jest używany jako warunek przejścia. Mnemoniki odpowiadające tym stanom przedstawiono na rys. 6.18.

Przykładowo: JC 8BFE – gdy C=1 trafia na adres 8BFE, gdy C=0 wykonywane jest kolejne polecenie pod adresem.

Polecenia wywołania PP i powrotu

Wcześniej zauważono, że adres zwrotny jest automatycznie zapisywany na stosie, tj. (PC) ® stos.

Polecenia bezwarunkowe

CALL @ – wywołanie podprogramu;

RET – powrót z podprogramu.

Polecenia warunkowe

Ccon @ – wywołanie podprogramu;

Rcon – powrót z podprogramu.

Działanie poleceń jest podobne do działania poleceń skoku warunkowego, tj. jeśli warunek jest spełniony, zadzwoń lub wróć. Jeśli nie, wykonywane są następujące polecenia.

Inne polecenia sterujące

RST n, gdzie n = 0,1,...,7 – restart zgodnie z wektorem przerwania n.

Po wykonaniu tego polecenia sterowanie zostaje przekazane do podprogramu obsługującego to przerwanie. Podczas wykonywania instrukcji RST zawartość licznika programu PC jest przechowywana na stosie, a adres odpowiedniego wektora przerwania jest zapisywany w komputerze PC.

Adres ten jest ustawiany w następujący sposób. Polecenie RST ma strukturę 11NN N111, tj. jeden bajt. Trzybitowa kombinacja NNN jest określona przez wartość n (n = 0...7). Wartość 0000 0000 00NN N000 jest wprowadzana do licznika poleceń komputera PC, który służy jako adres odpowiedniego wektora przerwania.

Zatem ustawiając pewną wartość n, można wygenerować adres jednego z 8 wektorów przerwań. Adresy te znajdują się w strefie od 0000H do 0038H przestrzeni adresowej i zajmują 8 bajtów, tj. Zarezerwowane są dla nich pierwsze 64 komórki pamięci (każdy z 8 wektorów ma przydzielone 8 bajtów). W tych strefach (każda po 8 bajtów) zapisywane są wyłącznie polecenia umożliwiające skoki do odpowiednich podprogramów (procedur obsługi), które znajdują się w innych obszarach pamięci.

Przerywanie podprogramów (podobnie jak normalne podprogramy) musi kończyć się poleceniem RET. Podczas wykonywania tego polecenia wybierany jest ze stosu adres głównego polecenia programu, przed którym nastąpiło przerwanie, przekazywany do rejestru adresowego PA, a do licznika programu wprowadzana jest wartość zwiększona o 1.

EI – włączenie przerwania. Polecenie to umieszcza się na początku części programu, w której włączona jest funkcja przerywania. Za pomocą tego polecenia wyzwalacz włączający przerwanie w jednostce sterującej MP jest ustawiany w stan 1.

DI – wyłączenie przerwania. Polecenie to umieszcza się na końcu sekcji programu, w której włączono przerwanie, i resetuje wyzwalacz do stanu 0.

NOP jest poleceniem „pustym”. Pomija 4 takty. Zmienia się tylko komputer.

HLT – przestań. Powoduje zatrzymanie wykonywania programu i przejście do stanu zatrzymania. MP jest odłączony od zewnętrznych szyn adresowych i danych (tzn. ich bufory przechodzą w stan Z). Wyjście WAIT (oczekiwanie) ustawione jest na poziom 1. Stan ten można przerwać sygnałami startu MP lub wprowadzić w stan przerwania.

PYTANIA DO AUTOTESTU

1. Jakie urządzenia są potrzebne do stworzenia prostego mikrokomputera?

2. Wymień 5 opcji struktur mikrokomputerów.

3. Korzystanie z interfejsu pośredniego.

4. Co obejmuje pojęcie „kontrolera PU”?

5. Wymień cechy procesora I8080.

6. Rejestry danych. Ich cel.

7. Podpisz rejestry. Jakie atrybuty przechowywane są w tych rejestrach?

8. Opisać zasadę dwukierunkowej wymiany danych pomiędzy wewnętrznym i zewnętrznym SD.

9. Z jakich rejestrów może korzystać programista?

10. Podaj schemat blokowy mikrokomputera opartego na MP KR580VM80.

11. Z jakich cykli składa się cykl maszynowy?

12. Wymień formaty danych MP KR580VM80.

13. Wymień formaty poleceń MP KR580VM80.

14. Jakie metody adresowania są stosowane w MP KR580VM80?

15. Na jakie grupy można podzielić zespoły MP KR580VM80?

16. Transfery jednobajtowe. Podaj przykłady poleceń z tej grupy.

17. Transfery dwubajtowe. Podaj przykłady poleceń z tej grupy.

18. Jakie znasz działanie baterii?

19. Operacje na RON i pamięć. Jakie operacje obejmują?

20. Wypisz polecenia sterujące.

ZADANIA KONTROLNE

1. Na arkuszach odpowiedzi należy wskazać numer grupy, nazwisko studenta oraz numer jego opcji.

2. Numery pytań student wybiera zgodnie z jego dwiema ostatnimi cyframi w dzienniku ocen. W tabeli 6.1 n-1 jest przedostatnią cyfrą liczby, a n jest ostatnią cyfrą. W komórkach tabeli podane są numery pytań, na które należy udzielić pisemnej odpowiedzi.

Numery pytań Tabela 6.1

i n-1
1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18
3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17
2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18
3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18
1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17
3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16
1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19
4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19
1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19
3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19

Bezwarunkowa operacja przejścia (BP) odnosi się do operacji bezwarunkowego przekazania kontroli i składa się z następujących elementów. Na początku operacji zawartość CC, wskazująca polecenie następujące po BP (adres zwrotny), jest wysyłana do P1 AU, jeśli program przewiduje powrót; pozwala to na zapisanie adresu zwrotnego poprzez dalsze przeniesienie zawartości P1 (na przykład za pomocą operacji 3G) do pamięci. Aby to zrobić, pierwsze polecenia sekcji programu, do której następuje przejście, muszą zawierać odpowiednią operację. W kolejnym etapie operacji z komórki RAM lub ROM o adresie podanym w poleceniu BP w SchK odczytywana jest zawartość 1-14 bitów, czyli adres przejścia. Pod tym adresem wysyłane jest następnie żądanie do pamięci ROM o polecenie, do którego następuje przejście.

Praca zmianowa

W formacie przesunięcia (FSD) kodowane są operacje „Przesunięcie arytmetyczne w prawo (w lewo)” i „Przesunięcie logiczne w prawo (w lewo)”. Po ich wykonaniu akcje są wykonywane na numerze znajdującym się w AC. W poleceniu określone są atrybuty: kierunek przesunięcia (5 r), rodzaje przesunięć (8,9 r) i ich liczba (1-4 r). Podczas operacji przesuwane są bity rejestru P2, wynik zapisywany jest w rejestrach P2 i РСм, a przesunięcie w prawo odbywa się o 3 bity jednocześnie, przesunięcie w lewo wynosi 1 bit. Wartość piątego bitu równa „1” określa przesunięcie w lewo, równa „0” - w prawo.

Operacje mają charakter cykliczny. Liczba cykli zmiany jest zliczana przez licznik cykli (CC). Przed wykonaniem części cyklicznej operacji do centrum przesyłana jest zawartość 1-5 bitów polecenia zawierających stałą i znak przesunięcia. Następnie zawartość P2 przesyłana jest do RSM. Samo przesunięcie odbywa się poprzez „ukośne” kopiowanie zawartości rejestrów P2 i Pcm odpowiednio do P2’ i Pcm’. Następnie wynik przejścia z PCm' i P2' poprzez SM1 i SM2 jest przepisywany do P2 i PSM. Zakończenie operacji sygnalizowane jest wartością SchT =0.

W zależności od rodzaju przesunięcia (L lub A) przesuwanych jest albo wszystkie 16 bitów (L), albo tylko 15 bitów (mantysa) bez znaku (A). Kiedy A przesunie się w prawo, puste bity wyższego rzędu są wypełniane znakiem, a podczas przesunięcia w lewo wolne bity młodszego rzędu są wypełniane zerami. Podczas logicznego przesunięcia w prawo lub w lewo puste bity są wypełniane zerami.

Można także programowo zmienić stałą przesunięcia.

32 Interakcja węzłów i elementów schematu blokowego procesora CB podczas wykonywania operacji skoku warunkowego.

Operacje skoków warunkowych



Wykonanie operacji rozpoczyna się od sprawdzenia wykonalności warunku przejścia poprzez porównanie wartości atrybutu wyniku poprzedniej operacji z kodem „maski” w poleceniu. Jeżeli warunek jest spełniony, następuje przejście do wykonania polecenia, którego adres znajduje się w części adresowo-operandowej formatu PFU. Jeżeli warunek przejścia nie jest spełniony, to wykonywane jest polecenie następujące po poleceniu „Skok warunkowy” w programie.

Polecenie „Skok warunkowy” (JJ) zajmuje dwie sąsiadujące komórki ROM. Pierwsza komórka zawiera polecenie, druga komórka zawiera adres skoku. Skok warunkowy jest określony przez kombinację 7-9 bitów polecenia, warunek umieszczenia adresu zwrotnego jest określony przez 6-ty bit.

Gdy warunek jest spełniony, adres przejścia jest wpisywany do licznika programu, dzięki czemu z komórki zawierającej ten adres zostanie odczytany kod kolejnego polecenia. Adres zwrotny wprowadza się w P1, jeśli 6. bit jest równy 0 i w Pcm, jeśli wartość tego bitu jest równa jeden.

Jeżeli warunek przejścia nie jest spełniony, następna instrukcja wybierana jest z komórki o kodzie adresowym i+2. W tym przypadku podany kod (adres zwrotny) jest wpisywany do P1 niezależnie od wartości 6. bitu polecenia. To ostatnie jest określane przez algorytm działania procesora SV podczas odszyfrowywania kodu operacyjnego UE.

Wpisanie adresu zwrotnego do PCM wynika z faktu, że wyjście na szynę kodową z AC ma tylko określony rejestr.

Osobliwością wykonania operacji NC jest to, że jeśli w bitach „maski” polecenia znajduje się kod 111 lub 000, przejście warunkowe przekształca się odpowiednio w przejście bezwarunkowe lub operację wysyłania do rejestrów bazowych. W takich przypadkach adresy skoku lub adresy wysłania do rejestrów bazowych są zawartością części instrukcji zawierającej adres i argument (AOC).

Podczas wykonywania operacji wysłania do BR zawartość AOC wysyłana jest jednocześnie do jednego lub kilku BR, w zależności od zawartości 15-17 bitów polecenia. Adres zwrotny w tym przypadku nie jest wysyłany do P1 i RSM.



Wykonanie operacji NC jako operacji TCU może być użyte w przerwaniach w celu przeskoczenia do programów przerywających. W tym celu w 5. bicie polecenia ustawiany jest atrybut zaprogramowanego przejścia (PNT). W tym przypadku polecenie jest wczytywane do procesora z pamięci ROM poprzez sygnał przerwania (ISR). W tym przypadku adres dostępu do pamięci ROM (adres przerwania) jest generowany przez obwód przerwania procesora.

Osobliwością operacji w tym przypadku jest to, że adresem zwrotnym dla przerwań nie jest adres polecenia następującego po poleceniu w formacie FUP, ale adres polecenia, przed którym nastąpiło przerwanie. Sygnał NPP jest przetwarzany w następujący sposób. Na podstawie tego sygnału obwód przerwania procesora generuje adres przerwania (APr), równy adresowi pierwszej komórki instrukcji skoku w formacie FUP(i). Adres ten jest przesyłany do pamięci poprzez przełącznik i rejestr adresowy ROM. Adresy przerwań dobierane są w taki sposób, aby adres pierwszej komórki polecenia (i) był parzysty, a adres drugiej komórki (i+1) był nieparzysty. Drugi adres uzyskuje się poprzez zmianę (sprzętową) najmniej znaczącej cyfry bez udziału CC z zera na jeden. W procesie odczytywania polecenia z pamięci ROM i jego wykonywania zawartość SchK (K+1) jest przechowywana w rejestrze P1 AC, a zawartość drugiej komórki polecenia (i+1), będący adresem przejścia do polecenia o adresie j, wpisuje się do SchK. Do ROM złożono żądanie dotyczące nowej zawartości CC. Zatem adres następnej instrukcji w momencie przerwania (K+1) jest przechowywany w rejestrze P1. Po przetworzeniu przerwania adres ten służy do powrotu do przerwanego programu.

33 Interakcja węzłów i elementów schematu blokowego procesora SV podczas wykonywania operacji sterowania procesorem i systemem.