Model programowy komputera I: format rozkazów - XP
Transkrypt
Model programowy komputera I: format rozkazów - XP
Wykład Temat: Model programowy komputera I: format rozkazów, lista rozkazów, tryby adresowania, cykl rozkazowy, realizacja programu w komputerze. Zawartość wykładu: 1. Pojęcie modelu programowego procesora 2. Format słowa rozkazu wewnętrznego 3. Lista rozkazów wewnętrznych komputera 4. Tryby adresowania danych i rozkazów 5. Przykład formatu słowa rozkazowego współczesnego procesora 6. Cykl rozkazowy i jego realizacja w komputerze 7. Realizacja programu w komputerze Pojęcie modelu programowego procesora Model programowy komputera wyjaśnia sposób wykonywania programu w komputerze. Jest to zbiór informacji o komputerze, który jest potrzebny do zrozumienia działania programów użytkowych w języku wewnętrznym komputera ( tym samym napisania takich programów). Model programowy komputera, który obejmuje sposób działania wszystkich rozkazów wewnętrznych komputera (całą listę rozkazów) jest równoważny architekturze komputera. Model programowy komputera obejmuje model programowy procesora i model współpracy z urządzeniami zewnętrznymi. Model programowy komputera opiera się o znajomość podstawowego schematu blokowego procesora oraz schematu podłączenia do procesora pamięci operacyjnej i układów wejścia/wyjścia. Znajomość podstawowego schematu blokowego procesora i komputera jest niezbędna dla zrozumienia formatu i listy rozkazów wewnętrznych. Uproszczony schemat blokowy mikroprocesora 8-bitowego Rejestr rozkazów (RR) Zespół rejestrów uniwersalnych i specjalnych Sprzężenie z szynami zewnętrznymi Wewnętrzna szyna danych Zewnętrzna szyna danych Selektor rejestru Rejestr danych (B) Dekoder rozkazów Układ arytmetyczno – logiczny (ALU) Rejestr buforowy danych (RBD) Układ sterowania Rej. adresowy Rej. stanu proc. Rej. wsk. proc. Licznik rozk. (LR) Akumulator (A) ALU Taktowanie Układ nastêpnika Rejestr warunków Wewnętrzna szyna adresowa Wewnętrzna szyna sterowania Rejestr buforowy adresu (RBA) Przerwania Generator sygnałów sterujących Zewnętrzna szyna adresowa Zewnętrzna szyna sterowania Na schemacie blokowym procesora (mikroprocesora) wyróżnione są cztery podstawowe podzespoły: • układ sterowania, • zespół rejestrów uniwersalnych i specjalizowanych, • układ arytmetyczno-logiczny • układ sprzężenia z zewnętrzną szyną systemową. Te podzespoły podłączone są do trzech szyn procesora: wewnętrznej szyny danych, szyny adresowej i szyny sterującej. Poprzez rejestr buforowy danych i rejestr buforowy adresów, szyna danych i szyna adresowa wraz z szyną sterującą wychodzą na zewnątrz procesora by stworzyć tam zewnętrzne szyny, do których podłącza się bloki pamięci operacyjnej i układy wejścia/wyjścia. Na schemacie występuje jeden wykonawczy układ arytmetyczno-logiczny z rejestrem bitów warunków, wytwarzanych przez testy wyniku operacji arytmetycznej: wynik zerowy, wynik z nadmiarem, wynik z przeniesieniem, wynik ujemny, wynik w podwójnej precyzji, itp. W bardziej rozbudowanych procesorach występuje więcej układów wykonawczych, identycznych lub wyspecjalizowanych dla określonych operacji np. przesuwanie, porównywanie, mnożenie, dzielenie, operacje zmiennoprzecinkowe, operacje na adresach itp., które są równolegle podłączone do szyn wewnętrznych. Zespół rejestrów uniwersalnych liczy pewną liczbę rejestrów wykorzystywanych dla przechowywania danych. Rejestry specjalne zawierają rejestry adresowe, rejestr wskaźnika stosu i rejestr stanu. Zespół rejestrów adresowych jest wykorzystywany w operacjach modyfikacji adresu zawartego w rozkazie. Rejestr rozkazów należący do układu sterowania przechowuje słowo rozkazu wewnętrznego podczas wykonania. Słowo rozkazu jest dekodowane przez dekoder rozkazu. W wyniku dekodowania, kody binarne operacji zawarte w słowie rozkazu zostają zamienione na sygnały logiczne, które podawane są do generatora sygnałów sterujących. Generator sygnałów sterujących realizuje kombinacje logiczne tych sygnałów z innymi sygnałami, takimi jak sygnały taktujące, wartości warunków i stany przerwań. W wyniku tych kombinacji logicznej powstają sygnały sterujące, które są rozprowadzane poprzez szynę sterującą do wszystkich elementów wykonawczych komputera. Format słowa rozkazu wewnętrznego Budowę słowa rozkazu wewnętrznego i sposób dekodowania określa tzw . format rozkazu (ang. instruction format). Format rozkazu podaje długość słowa rozkazu, podział na pola bitowe oraz sposób interpretacji (traktowania) poszczególnych pól. Pola bitowe słowa rozkazowego służą do: • zakodowania w nich operacji do wykonania w rozkazie • zakodowania sposobu dekodowania rozkazu • umieszczenia bitów danych. Najprostszy format rozkazu składa się z dwu pól: • pola części operacyjnej • pola części adresowej. Część operacyjna Część adresowa Bity określające operacje podzespołów mikroprocesora Bity określające adres podzespołów mikroprocesora Najprostszy format rozkazu Słowo rozkazowe w komputerze może mieć stałą lub zmienną długość. Długość słowa rozkazowego zależy od jego części operacyjnej i może być określona dopiero po jej zdekodowaniu. 7 0 7 0 Kod operacyjny 7 Operand 0 Kod operacyjny 7 0 Kod operacyjny 7 0 Adres operandu 7 0 Adres operandu 7 0 Adres operandu Stała i zmienna długość słowa rozkazu. Część operacyjna może składać się z jednego lub wielu pól. W każdym polu zakodowano binarnie wykluczające się operacje, które mają być wykonane w ramach danego rozkazu. W polu części adresowej umieszczone być mogą adresy argumentów operacji z części operacyjnej ( binarne numery komórek pamięci albo rejestrów) albo też tzw. argumenty natychmiastowe czyli dane binarne, bezpośrednio użyteczne dla operacji rozkazu. Część operacyjna Pole A Pole B Pole C Część adresowa Ciąg bitów Budowa słowa rozkazowego Format rozkazu może być stały lub zmienny. Przy stałym formacie, długość i podział na pola jest identyczny dla wszystkich rozkazów wewnętrznych komputera. Dekodowanie wszystkich pól słowa rozkazowego może odbywać się jednocześnie, tzn. wszystkie bity są podane na wejścia wszystkich dekoderów pól. Strukturę dekodera rozkazu stanowi wiele dekoderów pól pracujących równolegle (każde wytwarza jeden sygnał aktywujący jakąś operację w komputerze). Sposób dekodowania rozkazu o stałym formacie Część operacyjna Pole A Pole B Pole C DekC DekA DekB Część adresowa Ciąg bitów Przy zmiennym formacie rozkazu, zarówno długość słowa rozkazu jak i sposób podziału na pola są różne dla różnych rozkazów. Przy zmiennym formacie rozkazu, dekodowanie rozkazu następuje stopniowo, jedna faza dekodowania po drugiej. W każdej fazie dekoduje się ustalone pola rozkazu. Wartości kodu w tych polach decydują o tym jakie pola dekodować w następnej fazie, a więc na wejścia jakich dekoderów dopuścić bity kolejne dekodowane w następnej fazie. Przy stwierdzeniu odpowiednich kodów w odpowiednich polach, dekodowanie bieżącego rozkazu ustaje i pobierany jest nowy rozkaz (poprzez odpowiednie sygnały z generatora sygnałów sterujących). Strukturę dekodera stanowi drzewo dekoderów z bramkami dopuszczającymi odpowiednie bity do odpowiednich dekoderów. Sposób dekodowania rozkazu o zmiennym formacie Część operacyjna Faza I Faza II Część adresowa Faza III Ciąg bitów Faza I Selektor Selektor Selektor Faza II Selektor Faza III Faza II Faza III Lista rozkazów komputera W komputerze o modelu von Neumana, wykonanie wszelkich programów (nawet napisanych w językach wysokiego poziomu) sprowadza się do wykonania ciągu rozkazów wewnętrznych składających się na program. Rozkazy wewnętrzne wyrażają prawie wszystkie operacje, które komputer może wykonać. Nie dotyczy to operacji, które nie są programowalne przez użytkownika komputera, tzn. jak to się mówi „są zaszyte lub zrealizowane w sprzęcie (ang. hardwired)”, np. obsługa przerwań, obsługa pamięci podręcznej. Zbiór wszystkich rozkazów wewnętrznych, w które wyposażono dany komputer , rozumiany jako zbiór operacji tych rozkazów, nazywamy listą rozkazów komputera (ang. computer instruction list lub computer instruction set). Typy rozkazów wewnętrznych komputera Ze względu na rodzaj operacji wykonywanej w rozkazie wyróżniamy następujące typy rozkazów wewnętrznych komputera: • rozkazy arytmetyczno-logiczne • rozkazy przesyłania danych • rozkazy operacji na bitach • rozkazy sterujące programem • rozkazy systemowe. W rozkazie wewnętrznym jest zawsze określona operacja, która ma być wykonana. W zależności od konkretnego rozkazu mogą tam być też podane: • adresy argumentów operacji, • sposób wyliczenia finalnego adresu argumentów operacji (tzw. tryb adresowania) na podstawie adresu zawartego w rozkazie (możliwa jest modyfikacja adresu przy użyciu informacji zapamiętanych w komputerze danych), • dane natychmiastowe. Rozkazy wewnętrzne mają postać bardzo niewygodną dla człowieka. Aby ułatwić pisanie programów niskiego poziomu przez programistów wprowadzono symboliczne języki programowania tzw. języki asemblerowe. W językach asemblerowych program wyraża się w postaci instrukcji odpowiadających rozkazom języka wewnętrznego zapisanych symbolicznie. Rozkaz asemblera zawiera: • symbol operacji wykonywanej przez rozkaz (skróty – mnemoniki), • symbol trybu adresowania, wartości i symboli adresów używanych przez rozkaz (etykiety) • symbole i wartości danych (stałe i zmienne). Wartości adresów i danych mogą być zapisywane w różnych zapisach: dziesiętnym, szesnastkowym, ósemkowym lub binarnym. lecz zawsze z określeniem rodzaju użytego zapisu (identyfikator). Typy rozkazów wewnętrznych na przykładzie komputerów personalnych typu IBM PC. Rozkazy arytmetyczno-logiczne Rozkazy arytmetyczno logiczne składają się trzech podstawowych grup rozkazów: • rozkazy arytmetyczne, • logiczne • przesunięć. Rozkazy arytmetyczne ADD Obliczenie sumy argumentów (od ang. addition). SUB Obliczenie różnicy argumentów (od ang. subtraction). MUL Obliczanie iloczynu z podwójną lub pojedynczą dokładnością (od ang. multiplication). DIV Obliczenie ilorazu (od ang. division). ABS Obliczenie wartości bezwzględnej (od ang. absolute value). NEG Zmiana znaku liczby (od ang. negate sign). INC Zwiększ o 1 (od ang. increment). DEC Zmniejsz o 1 (od ang. decrement). Rozkazy logiczne AND Wykonanie operacji AND na argumentach. OR Wykonanie operacji OR na argumentach. EXOR Wykonanie operacji EXOR na argumentach. NOT Wykonanie operacji NOT na argumentach. Rozkazy przesunięć SHL/SHR Przesunięcie logiczne w lewo / w prawo. (od ang. shift left / shift right). SAL/SAR Przesunięcie arytmetyczne w lewo / w prawo. (od ang. shift arithmetical left / shift arithmetical right). ROL/ROR Wykonanie rotacji w lewo / w prawo. (od ang. rotate left / rotate right). Rozkazy przesyłania danych MOV STR Przesłanie danych między rejestrami lub między pamięcią a rejestrem (od ang. move). Przesłanie danych między rejestrem a pamięcią. (od ang. store). MOVSX Przesłanie bajtu, słowa, podwójnego słowa z rozszerzeniem znaku. (od ang. move single/double). LEA Ładowanie adresu efektywnego z pamięci do rejestru (od ang. load efective address).. PUSH PUSHA IN, OUT Umieszczenie danych z rejestru na stosie. (wepchnij) Umieszczenie zawartości wszystkich rejestrów na stosie (wepchnij wszystkie). Wejście, wyjście danych z urządzeń wejścia-wyjścia Rozkazy operacji na bitach BTS Testowanie i ustawienie bitu. Kopiowana jest bieżąca wartość bitu do znacznika CF, a bit jest ustawiany na l. (od ang. bit test). BSP Sprawdzanie bitów w przód. Sprawdzane jest słowo lub podwójne słowo w poszukiwaniu bitu l a numer pierwszego bitu l jest zapisywany w rejestrze (od ang. bit set prime). CLR Wyzeruj zawartość rejestru. (od ang. clear). SET Wstaw same jedynki do rejestru.(ustaw na 1). Rozkazy sterujące programem JMP Skok bezwarunkowy (od ang. jump). JE/JZ Skok warunkowy, jeśli równy (lub jeśli zero) (od ang. jump if equal, jump if zero). CALL Wywołanie podprogramu (wywołaj). RET Powrót z podprogramu (od ang. return). LOOPE/ LOOPZ Wykonanie pętli, jeśli równy /jeśli zero, skok warunkowy z badaniem zawartości w rejestru ECX po dekrementacji. (od ang. loop if equal, loop if zero). INT / INTO Przerwanie programowane / przerwanie w razie nadmiaru. (od ang. interrupt, interrupt if overflow). SKIP Pominięcie wykonania następnego rozkazu (przeskocz). HALT Zatrzymaj wykonywanie programu Rozkazy systemowe LMSW Ładowanie słowa stanu procesora do rejestru stanu z pamięci lub rejestru, przełącz do trybu systemu operacyjnego. (od ang. SGDT LGDT LSL LDS load machine status word register). Zapisanie wskaźnika globalnej tablicy deskryptorów w pamięci (od ang. store global descriptor table register). Ładowanie wskaźnika globalnej tablicy deskryptorów z pamięci (od ang. load global descriptor table register). Ładowanie granicy segmentu do rejestru. (od ang. load segment limit). Ładowanie z pamięci rejestru wskaźnika segmentu DS (od ang. load DS). ENTER Utworzenie w stosie ramki dla parametrów procedury z języka wysokiego poziomu. ESC Skierowanie programu do koprocesora numerycznego (od ang. escape). WAIT Czekaj na zmianę stanu wejścia BUSY (czekaj). Tryby adresowania danych i rozkazów Bardzo często zawartość pola adresowego rozkazu nie jest bezpośrednio użyta jako adres danej lub rozkazu lecz procesor wykonuje na nim tzw. operacje adresujące (ang. addressing operations), które przekształcają zawartość pola adresowego zanim zostanie wykorzystana jako ostateczny adres argumentu rozkazu. Rodzaj operacji, którą procesor wykonuje na zawartości pola adresowego rozkazu jest nazywany trybem adresowania (ang. addressing mode). Tryb adresowania dla rozkazu jest zwykle określony w jednym lub kilku polach należących do pola kodu operacji rozkazu. W niektórych przypadkach rozkazów, tryb adresowania wynika bezpośrednio z kodu operacji rozkazu. Podstawowe tryby adresowania Adresowanie natychmiastowe Kod operacji Operand W trybie natychmiastowym pole adresowe zawiera bezpośrednio operand (ang. operand) czyli daną dla rozkazu. Długość operandu zależy od kodu operacji lub od kodu operacji i dodatkowego pola sterującego w rozkazie. Ten tryb adresowania stosujemy, gdy np. chcemy bezpośrednio z rozkazu ( bez odwoływania się do pamięci) załadować do rejestru prostą daną – bajt lub parę bajtów. Adresowanie bezpośrednie (bezwzględne) Kod operacji Adres Pamięć Operand Adresowanie bezpośrednie jest najbardziej podstawowym trybem adresowania. W tym trybie zawartość pola adresowego stanowi już finalny adres argumentu rozkazu w pamięci operacyjnej i nie podlega przekształceniu. Ten tryb stosujemy, gdy nie zależy nam na tym, aby nasz program był przesuwalny w pamięci operacyjnej, lecz jest przeznaczony do wykonania przy zapisie w ściśle określone miejsce w pamięci. Adresowanie pośrednie Kod operacji Adres pośredni Pamięć Adres Operand Przy adresowaniu pośrednim rozkaz zawiera adres komórki pamięci operacyjnej, w której zawarty jest finalny adres operandu rozkazu. W tym przypadku komórka pamięci wskazana przez adres rozkazu pośredniczy w określeniu finalnego adresu. Tryb pośredni stosujemy, gdy chcemy, aby finalny adres operandu rozkazu mógł być dynamicznie wstawiony do komórki pośredniczącej w adresowaniu w czasie wykonywania programu. Może tak być, gdy ten adres zależy od jakichś testów na wyniku operacji poprzedzającego rozkazu. Adresowanie indeksowe Kod operacji Adres bazowy Pamięć Rejestr indeksowy Przesunięcie Przesunięcie Operand Adresowanie indeksowe jest inaczej nazywane modyfikacją adresu przez indeksowanie. W tym trybie wykorzystuje się specjalne rejestry procesora tzw. rejestry indeksowe (ang. index registers), które zawierają przesunięcie, który trzeba dodać do adresu istniejącego w rozkazie aby wyliczyć adres finalny operandu. Ten tryb adresowania pozwala przesunąć adres zawarty w rozkazie o wartość rejestru indeksowego. Używając tego trybu we wszystkich rozkazach programu, można osiągnąć możliwość wykonania programu przy załadowaniu w dowolne miejsce pamięci. W tym celu należy napisać program wstawiając do rozkazów programu adresy, które odpowiadają umieszczeniu pierwszej instrukcji programu pod adresem zerowym w pamięci. Następnie wiedząc, pod jakim finalnym adresem jest umieszczony pierwszy rozkaz programu, umieszczamy ten adres w rejestrze indeksowym. Dzięki operacji indeksowania rozkazów programu, wszystkie adresy operandów zostaną przesunięte o tę samą wartość – stąd nazwa zawartości rejestru indeksowego: przesunięcie. Taka organizacja przesuwalności programu w pamięci nosi nazwę dynamicznej relokacji programu w pamięci. Rejestrów indeksowych w procesorze jest zwykle wiele, gdyż mogą one być przydzielone różnym programom lub fragmentom programów, które są wykonywane w tym samym okresie czasu. Rejestr indeksowy do użycia, może być określony przy pomocy specjalnego pola wspomagającego kodowanie trybu adresowania w innym polu rozkazu. Adresowanie względne Kod operacji Licznik rozkazów Następna instrukcja Operand Przesunięcie Przesunięcie Adresowanie względne polega na modyfikacji adresu zawartego w rozkazie przez aktualną zawartość licznika rozkazów. Ten tryb adresowania dostarcza innego sposobu osiągnięcia dynamicznej przesuwalności adresów dostępu do danych, tj. gdy nie chcemy lub nie możemy znać przesunięcia całości programu w stosunku do adresu zerowego. Przy adresowaniu względnym, finalny adres danej jest wyliczany względem bieżącej zawartości licznika rozkazów, a więc do rozkazu wstawiamy przesunięcie danej w programie względem adresu następnego rozkazu, np. n komórek w przód lub w tył. Musimy tylko zapewnić, aby dana została umieszczona w spodziewanym miejscu pamięci, a ściślej w spodziewanej odległości od rozkazu, który z tej danej korzysta. Można to osiągnąć przez zaplanowanie w jakiej odległości od danego rozkazu, będzie umieszczony obszar danych programu. Adresowanie pośrednie indeksowe Kod operacji Adres pośredni Pamięć Adres bazowy Rejestr indeksowy Operand Adresowanie pośrednie indeksowe zapewnia jednoczesną możliwość zastosowania w programie adresowania pośredniego z modyfikacją adresu odczytanego z komórki pośredniczącej poprzez zawartość rejestru indeksowego. Umieszczony w rozkazie adres wskazuje na komórkę przechowującą adres danej, który może być tam wstawiany dynamicznie jako wynik obliczeń programu. Do tego adresu stosowane jest następnie indeksowanie poprzez zawartość rejestru indeksowego. Zawartość rejestru indeksowego może też być wstawiona dynamicznie w wyniku działania innej części programu. W zależności od zawartości rejestru indeksowego trafiamy zatem do innej komórki zawierającej operand. Adresowanie pośrednie indeksowe pozwala na dwupoziomowe dynamiczne określanie adresu danych w wyniku obliczeń wykonanych w poprzedzających fragmentach programu, metodą wpisania pewnego adresu bazowego a następnie modyfikacji tego adresu bazowego przez rejestr indeksowy. Adresowanie indeksowe pośrednie Kod operacji Adres bazowy Pamięć Rejestr indeksowy Przesunięcie Adres Operand Adresowanie indeksowe pośrednie zapewnia najpierw modyfikację adresu zawartego w rozkazie przez zawartość rejestru indeksowego a następnie tak otrzymany adres jest stosowany do wskazania komórki pamięci, w której jest przechowywany finalny adres operandu rozkazu. Adresowanie indeksowe pośrednie pozwala na dynamiczne określanie adresów danych w programie w czasie wykonania programu, przy zapewnieniu przesuwalności w pamięci całego programu. Dla dynamicznego określanie adresów danych w programie, program piszemy począwszy od adresu zerowego w pamięci stosując adresowanie indeksowe do wszystkich rozkazów z wyjątkiem tych, które działają na danych wybieranych dynamicznie. Te rozkazy adresujemy poprzez użycie adresowania pośredniego indeksowego, umieszczając adres komórki pośredniczącej (względem adresu zero) w bieżącym rozkazie. Po załadowaniu programu do pamięci, wpisywana jest do rejestru indeksowego wartość przesunięcia początku programu w stosunku do adresu zerowego ( robi to program ładujący). W trakcie wykonywania programu wszystkie adresy programu, łącznie z tymi, gdzie zastosowano adresowanie pośrednie oraz tymi. które wpisują adres danej do komórki pośredniczącej, zostaną zmodyfikowane. Adresowanie rejestrowe Mikroprocesor Kod operacji Numer rejestru Zespół rejestrów Operand Adresowanie rejestrowe stosuje się, gdy dana dla rozkazu jest przechowywana w rejestrze. Część adresowa rejestru zawiera wtedy jedno lub więcej pól, w których znajdują się identyfikatory rejestrów. Adresowanie rejestrowe jest często stosowane w tym samym rozkazie razem z innymi trybami adresowania dotyczącymi pamięci operacyjnej. Wówczas rozkaz dotyczy zarówno pamięci operacyjnej jak i rejestrów procesora. Adresowanie pośrednie rejestrowe Kod operacji Numer rejestru Pamięć Mikroprocesor Zespół rejestrów Operand Adres Adresowanie pośrednie rejestrowe polega na tym, że jako miejsce pobrania finalnego adresu operandu rozkazu stosuje się rejestr procesora, którego identyfikator umieszczony jest w polu adresowym rozkazu. Przy pomocy trybu adresowania pośredniego rejestrowego można dynamicznie określić finalny adres operandu poprzez odpowiednie załadowanie zawartości rejestru, w zależności od przebiegu obliczeń w programie. Przykład formatu słowa rozkazu wewnętrznego procesora Pentium Bajty 1 lub 2 0 lub 1 0 lub 1 0, 1, 2 lub 4 0, 1, 2 lub 4 Kod operacji MOD/RM Sterowanie modyfikacją Przesunięcie Natychmiastowy Modyfikacja Rejestr/Operacja 7 6 5 4 Skala Rejestr/Operacja 3 2 1 0 7 6 Rejestr indeksowy Rejestr bazowy 5 2 4 3 1 0 Pole „Kod operacji” o długości 1-2 bajtów określa operację podstawowa wykonywaną w rozkazie. Pola „MOD/RM” oraz „ Sterowanie modyfikacją” , o długości 0-1 bajt każde, określają tryb i szczegóły modyfikacji adresu wykonywanej na adresach argumentu (ów). Pole „Przesunięcie” zawiera przesunięcie adresu, o ile pola związane z modyfikacją wskazują na użycie przesunięcia dla określenia adresu argumentu (ów). Pole „Natychmiastowy” zawiera dane o długości 1-4 bajtów, o ile pola związane z modyfikacją wskazują na użycie argumentu natychmiastowego. Cykl rozkazowy i jego realizacja w komputerze Rozkazy wewnętrzne komputera są wykonywane w procesorze w ramach tzw. cyklu wykonania rozkazu, który składa się z dwu faz: pobrania rozkazu i wykonania rozkazu. Start Pobranie następnego rozkazu Faza pobierania Wykonanie rozkazu Faza wykonania Stop 2 Wprowadzenie adresu rozkazu Następny rozkaz Pobranie rozkazu Faza pobierania 1 3 Dekodowanie kodu operacji rozkazu 4 Obliczenie adresu argumentu wiele argumentów 6 7 Pobranie argumentu Operacja na danych Faza wykonania 5 Łańcuch lub wektor Obliczenie adresu wyniku wiele wyników 8 Zapisanie wyniku Składniki faz w cyklu wykonania rozkazu. Fazy należące do cyklu wykonania rozkazu mają długości czasowe określone przez sygnały taktujące pochodzące z zegara. W każdej fazie generator sygnałów sterujących dostarcza odpowiednich sygnałów, które powodują realizację operacji przewidzianych w tych fazach. Odbywa się to metodą otwarcia odpowiednich dróg przesyłania informacji w komputerze (np. szyn) i aktywacji odpowiednich działań w układach wykonawczych (np. ALU – dodanie/ odjęcie, układ następnika licznika rozkazów, itp.). Realizacja programu w komputerze Realizację wykonania prostego programu rozważymy w uproszczonym komputerze składającym się mikroprocesora i pamięci operacyjnej podłączonej do niego za pomocą szyny systemowej ( szyna danych, szyna adresowa i szyna sterująca). Program, którego wykonanie rozpatrzymy składa się z 4 rozkazów zapisanych pod kolejnymi adresami w pamięci od 0 do 3 oraz z 3 danych dla których przeznaczono komórki o adresach od 4 do 6. Program składa się z następujących rozkazów, (rozkazy zapisujemy za pomocą typowch skrótów języka asemblera) : move 4 - pobierz daną z pamięci spod adresu 4 do rejestru akumulatora, add 5 - dodaj do akumulatora daną spod adresu 5, store 6 - zapamiętaj zawartość akumulatora w pamięci pod adresem 6, stop - zatrzymaj wykonanie programu. Po wykonaniu programu wynik obliczeń znajduje się w komórce pamięci operacyjnej o adresie 6. Podłączenie mikroprocesora do pamięci operacyjnej zawierającej program. Szyna danych Mikroprocesor Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Szyna adresowa Szyna sterowania Pamięć operacyjna Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią Założona struktura blokowa procesora. Szyna danych Pamięć operacyjna 0 Kod Adres RR operacji Taktowanie Dekoder Selektor LR 0 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Szyna adresowa Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Szyna sterowania RR – rejestr rozkazów A – rejestr akumulatora RBD – rejestr buforowy danych LR – licznik rozkazów Warunki – rejestr warunków (flagi) RBA – rejestr buforowy adresu Pamięć operacyjna zawiera komórki, które symbolicznie są przedstawione w postaci wierszy składających się z numeru komórki i pola zawartości komórki. W rzeczywistości komórka zawiera tylko pole zawartości. Adres jest podawany do pamięci z zewnątrz (z procesora prze szynę adresów) i po zdekodowaniu przez dekoder adresu, powoduje uaktywnienie (wybranie) komórki o podanym adresie. Może być wykonany odczyt lub zapis zawartości (rodzaj operacji zależy od sygnału podanego przez szynę sterującą do układu sterowania pamięci). Sposób wykonania kolejnych rozkazów komputera można omawiać wykorzystując symboliczny zapis operacji, czyli : tzw. język przesłań między-rejestrowych (ang. register transfer language). Nazwa języka pochodzi od tego, że podstawową operacją wyrażalną w tym języku są przesłania informacji między rejestrami, komórkami pamięci i blokami funkcjonalnymi (obliczeniowymi) w komputerze. Języki takie należą do większej grupy języków służących do opisu sprzętu komputera i sposobu jego działania, tzw. języków opisu sprzętu (ang. hardware description languages). Język przesłań między-rejestrowych wykorzystuje reprezentacje elementów pamięciowych lub bloków obliczeniowych komputera (rejestrów, pamięci operacyjnej, pamięci pomocniczej, jednostki arytmetyczno-logicznej) w postaci ich nazw, np. A, RR , LR, pamięć, P, ALU, itp.. Zawartość elementów pamięciowych lub wyjściowe dane z bloku obliczeniowego (rozumiane jako ciąg bitów) symbolizuje nazwa elementu wzięta w nawias prostokątny, np. [A], [RR], [RBD], [ALU]. Adresowanie informacji wewnątrz elementu pamięciowego lub słowa wyjścia z bloku obliczeniowego opisuje się za pomocą nazwy elementu, po którym występuje specyfikacja wybranego fragmentu zawartości w nawiasie okrągłym. Przykłady: RR (Kod Operacji) – pole rejestru RR o nazwie Kod Operacji, RR (Adres) – pole rejestru RR o nazwie Adres, ALU (bity 10 – 24) – bity od 10 do 24 słowa stanowiącego wynik operacji ALU. Komórki pamięci mogą być opisane przy pomocy nazwy całej pamięci np. P dla pamięci operacyjnej oraz specyfikacji adresu w nawiasie okrągłym Przykłady P (999) – komórka pamięci P o adresie 999, P (RBA) – komórka pamięci P o adresie zawartym w rejestrze RBA, P (LR) ( Kod Operacji) – pole Kod Operacji w komórce pamięci P o adresie zawartym w rejestrze LR. Na zawartościach elementów pamięciowych można wykonać operacje, które symbolizowane są operatorami, np. → prześlij, + dodaj, - odejmij, itp. Przykłady [A] → P (1024) – oznacza prześlij zawartość rejestru A do komórki pamięci o adresie 1024, [RR (Adres)] → LR – prześlij zawartość pola Adres rejestru RR do rejestru LR, [A (0-15)] + [LR] → LR – dodaj zawartość bitów od 0 do 15 rejestru A do zawartości LR i wynik zapisz do LR. Przesyłanie zawartości bitowej odbywa się z wpisywaniem bitów na te same pozycje w elemencie docelowym ( bit na pozycji zero elementu źródłowego wpisuje się na pozycje zero w elemencie docelowym), chyba, że jest to określone inaczej. Przykład [RR (Adres)] → LR (14 –31) – przesłanie pola Adres z rejestru RR na bity 14-31 rejestru LR. Wykonanie przykładowego programu opisane za pomocą języka przesłań między-rejestrowych • Dla prezentacji użyty będzie schemat blokowy komputera • Elementy komputera, które biorą udział w opisywanej operacji zaznaczać będziemy na czerwono. • Pod schematem blokowym podany jest opis operacji w języku przesłań międzyrejestrowych Faza pobrania rozkazu Przed wykonaniem każdego programu, adres komórki pamięci operacyjnej, która zawiera pierwszy rozkaz programu musi być wprowadzony do licznika rozkazów LR. Wykonuje to system operacyjny na podstawie odpowiedniej dyrektywy użytkownika np.„ Wykonaj program o nazwie alfa.”. We współczesnych komputerach taka dyrektywa jest nazwa zbioru zawierającego wykonywalny kod binarny programu, a więc alfa.exe. Nazwa jest zamieniana na adres pierwszego rozkazu programu o nazwie alfa. W przypadku naszego przykładowego programu jest to adres 0. Jest on wprowadzony do rejestru LR przed wykonaniem programu. 0 Kod Adres RR operacji Taktowanie Dekoder Selektor LR 0 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Operacja [LR] →RBA W tej operacji zawartość licznika rozkazów LR jest przesłana do rejestru buforowego pamięci operacyjnej RBA. Odbywa się to pod wpływem sygnałów sterujących wysyłanych z układu sterującego, a ściślej jego generatora sygnałów. 0 Kod Adres RR operacji Taktowanie Dekoder Selektor LR 1 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Operacja [LR] + 1 → LR Jako następna operacja jest wykonany następnik na zawartości licznika rozkazów LR. W ten sposób LR zawiera adres potencjalnego następnego rozkazu do wykonania. O ile pobrany rozkaz nie zmieni zawartości LR, to zawartość LR postała w wyniku operacji następnika będzie adresem następnego rozkazu. W naszym przypadku będzie to adres 1. Operacja następnika na LR w fazie pobierania rozkazu jest charakterystyczną cechą komputera o modelu von Neumana. Move 4 Kod Adres RR operacji Taktowanie Dekoder Selektor LR 1 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Operacja [P (RBA)] →RBD Kolejna operacja w fazie pobrania rozkazu jest odczyt komórki pamięci o adresie zawartym w RBA do rejestru buforowego RBD. Generator sygnałów sterujących podaje wtedy do układu sterowania pamięcią sygnał „odczyt pamięci” (ang. memory read). Po odczycie, rejestr RBD zawiera rozkaz „move 4”. Move 4 Move 4 Taktowanie Dekoder RR Selektor LR 1 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Operacja [RBD] → RR Następna operacja polega na przepisaniu zawartości rejestru RBD do rejestru rozkazów RR. Pole „Kod operacji” rejestru RR zawiera kod binarny rozkazu „move” a pole adresowe „Adres” zawiera liczbę binarną 4. Ta operacja kończy fazę pobrania pierwszego rozkazu naszego programu. Następna faza cyklu rozkazu to faza wykonania. Move 4 Faza wykonania rozkazu Move 4 Taktowanie Dekoder Selektor RR 1 LR 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Dekodowanie rozkazu „move 4” Faza wykonania rozkazu rozpoczyna się od zdekodowania rozkazu a ściślej od zdekodowania pola „Kod operacji” rejestru RR. Generator sygnałów sterujących wysyła sygnały, który otwierają: 1) drogę z pola „kod operacji rejestru RR do Dekodera rozkazów 2) drogę z Dekodera rozkazów do Generatora sygnałów sterujących Te dwie drogi w układzie sterującym pozostaną otwarte już do końca wykonania rozkazu. Dekoder rozkazów podaje na wejście Generatora sygnałów sygnały odpowiadające kodowi „move”. Sygnały z dekodera są kombinowane logicznie w Generatorze sygnałów z sygnałami zegarowymi Taktowanie. W wyniku kombinacji logicznej powstają sygnały sterujące, które w kolejnych chwilach czasowych są wysyłane do wszystkich układów komputera, aby umożliwić tam wykonanie odpowiednich operacji składających się na wykonanie rozkazu „move”. Część tych sygnałów jest wysyłana z powrotem do układu zegarowego, aby wytwarzał sygnały „Taktowanie” odpowiednie dla rozkazu „move”. Move 4 Move 4 Taktowanie Dekoder RR Selektor LR 1 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 4 [RR (Adres)] → RBA Następuje obecnie przesłanie zawartości pola adresowego „Adres” rejestru rozkazów RR do rejestru buforowego adresu pamięci RBA. Liczba binarna 4 znajdzie się w RBA aby posłużyć w następnym takcie czasowym do wybrania komórki pamięci dla odczytu określonego w rozkazie „move”. Przy przesłaniu zawartości pola „Adres” z rejestru RR następuje wykorzystanie tylko części linii wewnętrznej szyny danych. Na wyjściu z wewnętrznej szyny danych do zespołu rejestrów znajduje się układ Selektor, który otwiera drogę do potrzebnego rejestru, w tym przypadku rejestru RBA. Operacją sterują odpowiednie sygnały z Generatora sygnałów sterujących. W przypadku np. rozkazu „jump” lub „call” układ Selektor otworzyłby drogę z pola „Adres” rejestru RR do licznika rozkazów LR. 10 Move 4 Taktowanie Dekoder RR Selektor LR 1 0 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 4 Operacja [P (RBA)] → RBD Nastepuje taraz odczyt z pamięci słowa o adresie 4 wskazanym przez rejestr buforowy adresu RBA i wpisanie tego słowa do rejestru buforowego danych pamięci RBD. Generator sygnałów sterujących wysyła do pamięci sygnał „odczyt pamięci” oraz sygnał otwierający zewnętrzną szynę danych do rejestru RBD. W ten sposób dana binarna 10 znajdzie się w rejestrze RBD. 10 Move 4 Taktowanie Dekoder RR Selektor LR 1 10 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 0 Operacja [RBD] → A Następna operacja to przesłanie poprzez wewnetrzną szynę danych zawartości rejestru RBD do rejestru akumulatora A. Ta operacja kończy wykonanie rozkazu „move 4”. Generator sygnałów sterujących wyśle teraz sygnały sterujące, które spowodują pobranie do rejestru rozkazów RR następnego rozkazu do wykonania. Jest to rozkaz „add 5”. Jego adres 1 czeka już w liczniku rozkazów LR. Pobranie składać się będzie z takich samych operacji jak pobranie rozkazu „move 4” ale dotyczyć będzie innego adresu pobranego z licznika rozkazów LR. Operacje te są następujące: [LR] → RBA [LR] + 1 → LR [P (RBA)] → RBD [RBD] → RR Po odczycie z pamięci rozkaz „add 5” znajdzie się w rejestrze rozkazów RR. Pole „Kod operacji” rozkazu „add 5” zawiera więc kod binarny „add” Pole „Adres” zawiera liczbę binarną 5. Jednocześnie w liczniku rozkazów LR mamy adres następnego rozkazu do wykonania, liczbę binarną 2. Wykonanie rozkazu „add 5” Pomijamy rysunek przedstawiający otwarcie dekodera na dekodowanie części operacyjnej rozkazu „add 5”. Rozkaz „add 5” ma dodać zawartość rejestru akumulatora do zawartości komórki pamięci o adresie 5 i zapisać wynik w akumulatorze. Add 5 Add 5 Taktowanie Dekoder RR Selektor 2 LR 10 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 5 Operacja [RR(Adres)] → RBA Rysunek przedstawia pierwszą po zdekodowaniu rozkazu operację, która składa się na wykonanie „add 5”. Jest to przesłanie adresu 5 z pola „Adres” rejestru rozkazów RR do rejestru buforowego adresu RBA. 20 Add 5 Taktowanie Dekoder RR Selektor LR 2 10 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 5 Operacja [P(5)] → RBD Kolejna operacja to odczyt słowa pamięci spod adresu 5 do rejestru buforowego danych RBD przez zewnętrzną .szynę danych. Generator sygnałów sterujących generuje sygnał „odczyt pamięci” i otwiera wyjście z pamięci na szynę i wyjście z szyny do rejestru RBD. RBD zawiera po tej operacji dana binarną 20. 20 Add 5 Taktowanie Dekoder RR Selektor LR 2 10 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 5 Operacja {[A], [RBD]} → ALU Następuje teraz dodanie danych w jednostce arytmetyczno-logicznej ALU. Zauważmy, że akumulator zawiera daną 10 pobrana w poprzednim rozkazie. Generator sygnałów sterujących wysyła sygnały, które otwierają wyjście z rejestru A oraz wyjście z RBD na wewnętrzną szynę danych i wejścia ALU. Sygnały te trwają tak długo, jak długo trwa operacja dodawania w sumatorze ALU. 20 Add 5 Taktowanie Dekoder RR Selektor LR 2 30 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 5 Operacja [ALU] → A i wpisanie warunków Gdy wynik dodawania jest gotowy, następuje zamknięcie dostępu do wejść ALU ze strony wyjścia z rejestru A i wewnętrznej szyny danych oraz zamknięcie wyjścia z rejestru RBD na wewnętrzną szynę danych. W tej samej chwili następuje otwarcie wyjścia ALU na wewnętrzną szynę danych i wejścia z tej szyny do rejestru akumulatora A. Otwarcie wejścia do A trwa tylko tak długo jak to jest potrzebne do zapisania w nim wyniku z ALU. Wynik z ALU utrzymuje się jeszcze stabilnie przez ten czas, ze względu na opóźnienie reakcji ALU na stan swoich wejść spowodowane propagacją sygnałów w układach logicznych. Jednocześnie z wpisaniem wyniku z ALU do A, zostają wpisane wyniki testów wyniku ALU do rejestru warunków - Warunki. Ta operacja kończy wykonanie rozkazu „add 5”. Przed pobraniem następnego rozkazu, bit „Nadmiar ALU” rejestru warunków jest analizowany w Generatorze sygnałów sterujących. • Jeśli wystąpił nadmiar ALU, wykonywanie programu jest przerywane i pobierany jest rozkaz programu obsługi przerwania wewnętrznego (wyjątku), który sygnalizuje użytkownikowi błąd arytmetyczny. Generator sygnałów sterujących emituje niezbędne dla tego sygnały sterujące. • Jeśli nadmiar ALU nie wystąpił, następuje pobranie następnego rozkazu naszego programu. Jest to rozkaz „store 6” zapisany w pamięci pod adresem 2. Pobranie zostaje dokonane w znany już nam sposób, zgodnie z zawartością licznika rozkazów LR równą 2. Wykonanie rozkazu „store 6” Podobnie jak przy poprzednim rozkazie nie rysujemy rysunku dekodowania rozkazu. Po pobraniu rozkazu pole „kod operacji rejestru RR zawiera kod „store” a pole „Adres” RR zawiera liczbę 6. Rozkaz „store 6” ma zapisać do komórki pamięci o adresie 6 zawartość rejestru akumulatora A. Store 6 Store 6 Taktowanie Dekoder RR Selektor LR 3 30 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 6 Operacja [RR (Adres)] → RBA Pierwszą operacją po zdekodowaniu rozkazu jest przesłanie zawartości pola „Adres” rejestru RR do rejestru buforowego adresu RBA. W ten sposób adres binarny 6 potrzebny dla wykonania rozkazu „store” znajdzie się w RBA. 30 Store 6 Taktowanie Dekoder RR Selektor LR 2 30 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 0 Sterowanie pamięcią 6 Operacja [A] → RBD Następna operacja jest przesłanie zawartości rejestru A do rejestru buforowego danych RBD, aby można było wyprowadzić te zawartość na zewnętrzna szynę danych wiodąca do pamięci operacyjnej. W ten sposób liczba 30 znajdzie się w RBD. 30 Store 6 Taktowanie Dekoder RR Selektor LR 2 30 A RBD ALU ±1 Generator sygnałów Warunki RBA Nr komórki 0 1 2 3 4 5 6 Dekoder adresu Zawartość move 4 add 5 store 6 stop 10 20 30 Sterowanie pamięcią 6 Operacja [RBD] → P (RBA) Ostatnią operacją składową rozkazu „store 6” jest zapis danej 30 z rejestru buforowego danych do komórki pamięci o adresie 6 wskazywanej przez zawartość rejestru RBA. Generator sygnałów sterujących podaje do układu sterowania pamięcią sygnał „zapisz pamięć” oraz otwiera drogi (szynę adresową i danych) dla przesłania adresu z rejestru RBA oraz danych z rejestru RBD.