2. Model programowy...5. 2.1. Pamięć operacyjna... 5 2.2. Porty wejściowe i wyjściowe... 6 2.3. Rejestry... 6



Podobne dokumenty
Architektura komputerów

Struktura i działanie jednostki centralnej

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Architektura komputerów. Asembler procesorów rodziny x86

Logiczny model komputera i działanie procesora. Część 1.

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Organizacja typowego mikroprocesora

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Technika mikroprocesorowa I Wykład 2

Mikrokontroler ATmega32. Język symboliczny

Układ wykonawczy, instrukcje i adresowanie. Dariusz Chaberski

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Programowanie niskopoziomowe

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Język FBD w systemie Concept

1. Operacje logiczne A B A OR B

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

ARCHITEKTURA PROCESORA,

organizacja procesora 8086

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Architektura komputera. Cezary Bolek. Uniwersytet Łódzki. Wydział Zarządzania. Katedra Informatyki. System komputerowy

Wstęp do informatyki. System komputerowy. Magistrala systemowa. Architektura komputera. Cezary Bolek

Architektura typu Single-Cycle

Projektowanie. Projektowanie mikroprocesorów

Kodowanie informacji. Kody liczbowe

Pracownia elektryczna i elektroniczna. Elektronika cyfrowa. Ćwiczenie nr 5.

Podstawy działania układów cyfrowych...2 Systemy liczbowe...2 Kodowanie informacji...3 Informacja cyfrowa...4 Bramki logiczne...

Architektura Systemów Komputerowych. Jednostka ALU Przestrzeń adresowa Tryby adresowania

Magistrala systemowa (System Bus)

Wstęp do informatyki. Pojęcie liczebności. Zapis liczb. Liczenie bez liczebników. Podstawy arytmetyki komputerowej. Cezary Bolek

Lista rozkazów mikrokontrolera 8051

Budowa i zasada działania komputera. dr Artur Bartoszewski

Architektura komputera. Dane i rozkazy przechowywane są w tej samej pamięci umożliwiającej zapis i odczyt

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

Programowalne układy logiczne

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Mikroprocesor Operacje wejścia / wyjścia

Układy kombinacyjne. cz.2

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

Wstęp do informatyki. Pojęcie liczebności. Liczenie bez liczebników. Podstawy arytmetyki komputerowej. Cezary Bolek

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Podstawy Informatyki Języki programowania c.d.

Programowanie Niskopoziomowe

Sprzęt i architektura komputerów

Projekt prostego procesora

UKŁADY MIKROPROGRAMOWALNE

Język programowania: Lista instrukcji (IL Instruction List)

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Lista instrukcji mikroprocesora Programowanie w assemblerze

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

LEKCJA TEMAT: Zasada działania komputera.

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Lista Rozkazów: Język komputera

Literatura. adów w cyfrowych. Projektowanie układ. Technika cyfrowa. Technika cyfrowa. Bramki logiczne i przerzutniki.

architektura komputerów w 1 1

A Machine Architecture that is Really Intuitive and Easy. Dane: notacja dwójkowa, zapis w kodzie dopełnieniowym

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Architektura Systemów Komputerowych

Techniki mikroprocesorowe i systemy wbudowane

Jerzy Nawrocki, Wprowadzenie do informatyki

Budowa komputera Komputer computer computare

ARYTMETYKA KOMPUTERA

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Programowanie Niskopoziomowe

Instytut Teleinformatyki

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

Architektura komputerów

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Ćwiczenie 3. Konwersja liczb binarnych

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

CYKL ROZKAZOWY = 1 lub 2(4) cykle maszynowe

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Kurs Zaawansowany S7. Spis treści. Dzień 1

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

dr inż. Rafał Klaus Zajęcia finansowane z projektu "Rozwój i doskonalenie kształcenia i ich zastosowań w przemyśle" POKL

Układ sterowania, magistrale i organizacja pamięci. Dariusz Chaberski

Architektura komputerów

Architektura komputerów

PAMIĘCI. Część 1. Przygotował: Ryszard Kijanka

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

, " _/'--- " ~ n\l f.4e ' v. ,,v P-J.. ~ v v lu J. ... j -:;.",II. ,""", ",,> I->~" re. dr. f It41I r> ~ '<Q., M-c 'le...,,e. b,n '" u /.

Laboratorium przedmiotu Technika Cyfrowa

Architektura systemów komputerowych

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

2. PORTY WEJŚCIA/WYJŚCIA (I/O)

Sprzęt i architektura komputerów

Przykładowe pytania DSP 1

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Wstęp Architektura... 13

Transkrypt:

Spis treści Spis treści...1 1. Wstęp...3 2. Model programowy...5 2.1. Pamięć operacyjna... 5 2.2. Porty wejściowe i wyjściowe... 6 2.3. Rejestry... 6 3. Język asemblera...9 3.1. Rozkazy... 9 3.2. Pseudorozkazy... 15 3.3. Dyrektywy... 16 4. Architektura...21 4.1. Kodowanie rozkazów... 21 4.2. Przykłady asemblacji i deasemblacji... 24 4.3. System przerwań... 27 5. Struktura...29 5.1. Struktura jednoszynowa... 29 5.2. Mikrooperacje... 34 5.3. Sterowanie... 36 5.4. Realizacja sterowania... 42 6. Programy...47 6.1. Obliczanie sumy dwóch liczb 32-bitowych... 47 6.2. Upakowanie dwucyfrowej liczby BCD... 48 6.3. Przepisanie bloku słów w pamięci... 49 6.4. Podprogram mnoŝenia przez stałą... 49 6.5. MnoŜenie liczb dodatnich mniejszych od 256... 50 6.6. Inny program mnoŝenia... 51 6.7. UŜycie dyrektyw... 52 6.8. Zamiana liczby BCD na dwójkową... 53 7. Emulator...57 7.1. Funkcje emulatora... 58 7.2. Edycja i asemblacja programu... 59

7.3. Uruchamianie programu i symulacja... 61 7.4. Uwagi praktyczne... 66 8. Symulacja... 67 8.1. Komunikacja z programem debug... 67 8.2. Polecenia programu debug... 69 8.3. Modelowanie architektury 2K+ za pomocą x86... 74 8.4. Przykład programu... 78 9. Opis formalny architektury... 79 9.1. Reguły formalizmu ISP... 79 9.2. Formalny opis architektury 2K+... 85 10. Literatura... 91

Wstęp Poznanie, choćby fragmentaryczne, szczegółów konkretnej maszyny daje pojęcie o istocie działania kaŝdego komputera, gdyŝ kaŝdy realizuje podobne i - co do zasady - niezbyt skomplikowane operacje opisane w klasycznym modelu von Neumanna sprzed ponad sześćdziesięciu lat. Komputer 2K+ jest modelem prezentującym charakterystyczne cechy architektury CISC (Complex Instruction Set Computer), jaką mają np. procesory rodziny x86, stosowane w komputerach osobistych PC nieprzerwanie od lat 80. Te cechy to m.in. operacje typu rejestr-pamięć wykonywane na zawartości pamięci, wiele sposobów adresowania argumentu, niewielka liczba rejestrów uniwersalnych, zmienna długość słowa rozkazowego. Jest to model dydaktyczny, więc starano się implementować moŝliwie krótką, ale nie trywialną listę rozkazów, a z drugiej strony unikać zbędnych osobliwości występujących w kaŝdym rzeczywistym komputerze. Pewna (ale nie zupełna!) zgodność architektury 2K+ z architekturą procesorów x86, pracujących w 16-bitowym tzw. trybie rzeczywistym (real mode), pozwala na stosunkowo łatwe jej modelowanie z uŝyciem narzędzi dostępnych pod systemem operacyjnym MS DOS (debugger uruchamiany z wiersza polecenia Windows - zob. rozdz. 8). Dla komputera 2K+ zdefiniowano listę rozkazów i system przerwań (rozdz. 4) oraz język prostego asemblera Kass (rozdz. 3) o składni wzorowanej częściowo na asemblerze x86, a częściowo na słynnym swego czasu minikomputerze PDP-11. MoŜliwości operacyjne rozkazów i styl programowania w asemblerze ilustrują krótkie przykłady programów podane w rozdz. 6. Architekturę 2K+ opisano teŝ formalnie w zmodyfikowanej notacji ISP (rozdz. 9). Stosunkowa prostota 2K+ pozwala na pełny opis wstępnego projektu struktury (organizacji logicznej) na poziomie rejestrowym (register-transfer level) i projektu sterowania tą strukturą. Wykaz wszystkich sekwencji mikrooperacji zamieszczono w rozdz. 5. Bardzo atrakcyjne narzędzie do badania architektury modelowego komputera jak i do ćwiczeń w programowaniu w języku asemblera Kass stanowi emulator, będący treścią rozdz. 7. Przedstawienie tego programu, będącego dziełem studenckim, moŝe dodatkowo stanowić zachętę do samodzielnej działalności projektowej. Opisany tutaj model komputera był pierwotnie wprowadzony w ksiąŝce "Krótki kurs architektury i organizacji komputerów" (poz. 7. spisu literatury), która stanowi zwięzły wykład zasad działania komputerów i podstawowych cech ich budowy. Jej treść wyczerpu-

4 1. Wstęp je zakres tematyki przewidziany w przedmiocie architektura komputerów wykładanym na wyŝszych uczelniach technicznych. Niniejszą pracę moŝna traktować jako uzupełnienie omawianej pozycji, gdyŝ dostarcza ona obfitego materiału do ćwiczeń i moŝe inspirować tematy prac studenckich na róŝnych poziomach zaawansowania. Takimi tematami mogą być np. rozbudowa listy rozkazów, zmiana sposobu ich kodowania, alternatywny projekt struktury, realizacja asemblera skrośnego czy symulatora. Z tego powodu opisany tu model powinien być przydatny zarówno dla studentów elektroniki, telekomunikacji i informatyki jak i prowadzących zajęcia na tych kierunkach. Wrocław, maj 2010 r.

Model programowy Na model programowy komputera składają się jego zasoby pamięciowe, ich dostępność, organizacja logiczna i zastosowanie, przy czym chodzi tu tylko o te rejestry i znaczniki, które występują explicite w liście rozkazów i w związku z tym są dostępne programowo. 2K+ jest komputerem 16-bitowym z rozdzieloną przestrzenią pamięci i portów wejścia-wyjścia, tzn. są osobne rozkazy dotyczące miejsc w pamięci i osobne dotyczące tzw. portów (najczęściej rejestrów w jednostkach sterujących urządzeniami zewnętrznymi). Zgodnie z koncepcją architektury CISC, rozkazy dopuszczają działania na słowach zapisanych w pamięci i na zawartości rejestrów programowych, ale ograniczenie polega na tym, Ŝe rozkazy zawierają najwyŝej jeden adres pamięci (są operacje pamięć - rejestr i rejestr - rejestr, ale nie ma operacji pamięć - pamięć ). 2.1. Pamięć operacyjna Pamięć główna ma 2 16 = 64k bajtów, wymaga więc 16-bitowego adresu efektywnego z zakresu 0000h - FFFFh. Transfery do i z pamięci odbywają się zawsze całymi słowami 2-bajtowymi, przy czym adres słowa moŝe być dowolny (nie ma wyrównania adresów do parzystych). Słowa dwubajtowe są zapisywane wg zasady Big Endian, co znaczy, Ŝe adres słowa wskazuje na bajt bardziej znaczący, bajt mniej znaczący ma adres o 1 większy (rys. 2.1). Przyjęto numerację bitów w słowie od zera, zaczynając od bitu bardziej znaczącego.

6 2. Model programowy x-1 Aaa x x+1 x x+1 xr+2 Bbb Bbb Ccc Ccc 0 1... 6 7 8 9... 14 15 Ddd 0 1... 6 7 Rys. 2.1. Rozmieszczenie bajtów słowa o adresie x w pamięci 2.2. Porty wejściowe i wyjściowe Przestrzeń wejścia-wyjścia, obsługiwaną wyłącznie rozkazami IN i OUT, stanowi 256 jednobajtowych portów wejściowych i 256 portów wyjściowych. PoniewaŜ 256 = 2 8, więc adres portu (jego numer) jest 8-bitowy. Porty wejściowe i wyjściowe o tym samym adresie nie muszą układowo odpowiadać temu samemu miejscu - argumenty rozkazów IN i OUT, mimo tych samych wartości liczbowych, dotyczą innych rejestrów. 2.3. Rejestry Procesor dysponuje czterema 16-bitowymi rejestrami uniwersalnymi R0, R1, R2 i R3 uŝywanymi zarówno do adresowania pamięci jak i do przechowywania argumentów. Poza tym są trzy rejestry systemowe: licznik rozkazów IP, wskaźnik stosu SP i rejestr stanu PSW. N Z V C T 0 0 IE 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Rys. 2.2. Słowo stanu PSW Rejestr stanu zawiera cztery znaczniki wyniku operacji: N (bit znakowy), Z (wynik zerowy), V (nadmiar - ustawiany tylko w działaniach dodawania lub odejmowania i wyznaczany według reguł kodu U2), C (przeniesienie) oraz dwa znaczniki sterujące przerwaniami: T (praca krokowa) i IE (maska przerwań).

2. Model programowy 7 0... 7 0... 7 0... 15 0 0 R0 1 1 R1 2 R2. 255 Rejestry uniwersalne Porty wejściowe Licznik rozkazów IP R3 0 Wskaźnik stosu SP 1.. N Z V C T IE (PSW) 65535 255 Znaczniki Pamięć główna Porty wyjściowe Rys. 2.3. Zasoby pamięciowe 2K+ Znaczniki są wzajemnie niezaleŝne i tworzą strukturę PSW (rys. 2.2) tylko przy zapisie do pamięci (rozkazem PUPS); w czasie odczytu (rozkazem POPS) poszczególne bity PSW są przesyłane do odpowiednich znaczników. Wszystkie zasoby pamięciowe 2K+ przedstawiono schematycznie na rys. 2.3, na którym nie zaznaczono jedynie dwóch 1-bitowych znaczników RUN i WAIT. Znacznik RUN steruje głównym stanem komputera stop/praca : jeŝeli RUN = 1 wykonywane są kolejne cykle rozkazowe - komputer działa ; RUN = 0 oznacza stan zatrzymania. Przejście do stanu RUN = 1 moŝe nastąpić tylko przez ręczne włączenie (start) komputera. Przejście do stanu RUN = 0 (wyłączenie komputera) następuje programowo, jako efekt wykonania rozkazu Halt. Znacznik WAIT odpowiada za stan program/oczekiwanie : jeŝeli WAIT = 0 wykonywany jest program (kolejne cykle rozkazowe); jeŝeli natomiast WAIT = 1, wówczas cykle rozkazowe nie są wykonywane, ale są przyjmowane przerwania. Przyjęcie jakiegokolwiek przerwania powoduje automatyczne przejście do stanu WAIT = 0, czyli wznowienie wykonywania programu. Po uruchomieniu komputera znacznik WAIT przyjmuje zawsze wartość 0, przejście do stanu WAIT = 1 następuje tylko na skutek wykonania rozkazu Wait. Działanie znaczników RUN i WAIT moŝna prześledzić w opisie formalnym architektury (rozdz. 9) w sekcji Inicjowanie i Cykl rozkazowy.

Język asemblera Język asemblera 2K+, nazwany Kass, zawiera rozkazy, pseudorozkazy i dyrektywy umoŝliwiając definiowanie stałych oraz pisanie programów i ich alokację w pamięci komputera. Jest to asembler prosty, tzn. nie ma moŝliwości definiowania makrorozkazów. 3.1. Rozkazy Kass udostępnia 43 rozkazy przesłań, wejścia-wyjścia, działań arytmetycznych i logicznych, przesunięć, rozkazy sterujące i zmieniające stan procesora. Składnię wszystkich rozkazów opisano w tab. 3.1. - 3.7. Tabele zawierają postać asemblerową rozkazu, jego nazwę i zwięzły zapis funkcji; precyzyjną definicję podaje opis formalny w notacji ISP (rozdz. 9). Ostatnia kolumna w kaŝdej tabeli wymienia te znaczniki, które są ustawiane przez dany rozkaz. W tabelach przyjęto oznaczenia: r - rejestr (R0, R1, R2 lub R3); src - rejestr, słowo w pamięci lub stała; dst - rejestr lub słowo w pamięci; prt - adres portu we-wy (0-255); adr - adres pamięci (pełny); adr8 - adres pamięci (w zakresie -128, +127); adr10 - adres pamięci (w zakresie -512, +511); M[a] - słowo w pamięci o adresie a; stos - słowo w pamięci o adresie wskazywanym przez SP; przed zapisaniem na stos SP jest zmniejszany o 2, po odczytaniu stosu SP jest zwiększane o 2. Rozkazy przesłań (tab. 3.1), z wyjątkiem POPS, nie zmieniają ustawienia znaczników. Przesłania pomiędzy rejestrami mogą być wykonywane rozkazem ładowania LD Ri,Rj lub rozkazem pamiętania w wersji ST Ri,Rj; tak więc, np. efekt działania rozkazu ld

10 3. Język asemblera r1,r3 oraz st r1,r3 jest taki sam. Zapisanie rejestru do pamięci moŝliwe jest tylko rozkazem ST; nie moŝna tym rozkazem wpisać do pamięci stałej - w takiej sytuacji trzeba uŝyć sekwencji: LD ST Ri, #const adr, Ri Przesłania między pamięcią a rejestrami zawsze dotyczą pełnych, 2-bajtowych słów i odbywają się według zasady big endian, co oznacza, Ŝe np. jeŝeli w rejestrze R2 jest słowo w postaci 3FC7, to rozkaz ST 73A5h,R2 umieści pod adresem 73A5 bajt 3F, a pod adresem 73A6 - bajt C7. Podobnie, jeŝeli w pamięci od adresu 4326h są zapisane bajty: 22, CC, 55, 77, to rozkaz LD R3,4327h wpisze do rejestru R3 słowo CC55h. Uwaga: w architekturze x86 (procesory Intel) stosowana jest zasada little endian dająca odwrotne do opisanego uporządkowanie bajtów w pamięci. Tab. 3.1. Rozkazy przesłań LD r,src Ładowanie rejestru r src ST dst,r Zapamiętanie rejestru dst r PUSH r Przesłanie rejestru na stos stos r POP r Pobranie rejestru ze stosu r stos PUPS Przesłanie PSW na stos stos PSW POPS Pobranie PSW ze stosu PSW stos LDSP r Ładowanie wskaźnika stosu SP r Rozkaz LDSP pozwala ustalić wartość wskaźnika stosu, ładując go z dowolnego rejestru uniwersalnego, podobnie jak w powyŝszym przykładzie naleŝy uŝyć jednego z czterech rejestrów jako pośrednika przekazującego wartość: LD Ri, #const LDSP Ri Rozkaz POPS jest jedynym rozkazem umoŝliwiającym programową zmianę znaczników, gdyŝ pobierając słowo z aktualnego wierzchołka stosu ustawia się nowe wartości znaczników: N (bit <0> słowa), Z (bit <1>), V (bit <2>), C (bit <3>), T (bit <4>) i IE (bit <7>), pozostałe bity słowa nie mają znaczenia. Np. chcąc ustawić N=1, Z=0, V=1 i C=1 trzeba utworzyć słowo 1011 0000 0000 0000b = B000h, posłać je na stos, a na koniec wpisać jako nowe PSW: LD R0,#0B000h PUSH R0 POPS

3. Język asemblera 11 Rozkazy wejścia-wyjścia (tab. 3.2) równieŝ polegają na przesyłaniu zawartości rejestrów, ale ze względu na to, Ŝe porty są 8-bitowe, ich działanie zostało zdefiniowane tak, jak pokazuje rys. 3.1. W czasie pobierania bajta z portu wejściowego rozkazem IN, zmienione zostają tylko mniej znaczące bity rejestru <8:15>; część bardziej znacząca <0:7> nie ulega zmianie. Rozkazy IN i OUT nie zmieniają ustawienia znaczników. Port wejściowy (8b) >> IPT 0 1.. 7 Rejestr procesora 8 9.. 15 OPT << Port wyjściowy (8b) Rys. 3.1. Działanie rozkazów IN i OUT W trakcie wykonywania operacji OUT zawartość rejestru nie ulega zmianie. Tab. 3.2. Rozkazy wejścia-wyjścia IN r,prt Odczytanie portu wejściowego (IPT) R<8:15> IPT[prt] OUT prt,r Zapisanie do portu wyjściowego (OPT) OPT[prt] R<0:7> Rozkazy arytmetyczne wykonują działania dodawania i odejmowania na słowach 16-bitowych traktowanych jako liczby całkowite w kodzie U2 z zakresu 32768, +32767; znaczniki są ustawiane stosownie do wyniku działania. Rozkazy ADC i SBB uwzględniają wartość przeniesienia (poŝyczki) ustawioną w poprzednim rozkazie. Jednoargumentowy rozkaz NEG wykonuje uzupełnienie dwójkowe kodu liczby będącej argumentem. Tab. 3.3. Rozkazy arytmetyczne ADD r,src Dodawanie r r + src NZVC SUB r,src Odejmowanie r r src NZVC ADC r,src Dodawanie z przeniesieniem r r + src + C NZVC SBB r,src Odejmowanie z poŝyczką r r src C NZVC NEG r Zmiana znaku liczby r 0 r NZVC Są tylko dwa rozkazy logiczne (tab. 3.4) działające na poszczególnych bitach argumentów: iloczyn logiczny (AND) i uzupełnienie logiczne (jedynkowe, NOT). Rozkazy te ustawiają tylko znaczniki N i Z.

12 3. Język asemblera Tab. 3.4. Rozkazy logiczne AND r,src Iloczyn logiczny (bitowy) r r and src NZ CPL r Uzupełnienie logiczne (bitowe) r not r NZ Działanie rozkazu AND uŝywanego często do wycinania fragmentów słowa, i róŝnice w działaniu rozkazów NEG i CPL pokazano w przykładzie na rys. 3.2. Działanie Zawartość dwójkowa R0 Postać szesnastkowa R0 1101 1010 1110 0100 DAE4 AND R0,#0FF0H 0000 1010 1110 0000 0AE0 NEG R0 0010 0101 0001 1100 251C CPL R0 0010 0101 0001 1011 251B Rys. 3.2. Przykład działania rozkazów AND, NEG i CPL Przesunięcia (tab. 3.5) dotyczą tylko zawartości wskazanego rejestru i odbywają się o jedną pozycję w lewo lub w prawo. Po przesunięciu, znacznik C przyjmuje wartość bitu wysuniętego poza rejestr. Przy przesunięciach naturalnych na zwolnioną pozycję wstawiane jest 0. Przy przesunięciach cyklicznych (rotacjach) na zwolnioną pozycję w rejestrze wchodzi bit wysunięty. Przy przesunięciu arytmetycznym w prawo bit znakowy (skrajny lewy) jest powielany. Rozkaz SWAP zamienia miejscami bajty w słowie. SHR r SHL r ROR r ROL r SWAP r ASHR r Przesunięcie naturalne w prawo Przesunięcie naturalne w lewo Przesunięcie cykliczne w prawo Przesunięcie cykliczne w lewo Zamiana bajtów Przesunięcie arytmetyczne w prawo Tab. 3.5. Rozkazy przesunięć r<0> 0; r<1:15> r<0:14>; C r<15> C r<0>; r<0:14> r<1:15>; r<15> 0; r<0> r<15>; C r<15>; r<1:15> r<0:14> C r<0>; r<15> r<0>; r<0:14> r<1:15>; r<0:7> r<8:15>; r<8:15> r<0:7>; r<0> r<0>; r<1:15> r<0:14>; C r<15> C C C C C

3. Język asemblera 13 Przykłady działania rozkazów przesunięć pokazano na rys. 3.3. Działanie Zawartość dwójkowa R0 C Postać szesnastkowa R0 1101 1010 1110 0100? DAE4 SHL R0 1011 0101 1100 1000 1 B5C8 ROL R0 1011 0101 1100 1001 1 B5C9 ASHR R0 1110 1101 0111 0010 0 ED72 Rys. 3.3. Przykład działania rozkazów przesunięć Rozkazy sterujące przebieg programu zmieniają zawartość licznika rozkazów IP (tab. 3.6) powodując przejście do wskazanego rozkazu, czyli skok w programie. W asemblerze Kass jest jeden skok bezwarunkowy JMP i cztery skoki warunkowe BZ, BC, BM, BO. Skok warunkowy bada znaczniki N, Z, V lub C i gdy odpowiedni znacznik jest ustawiony na 1 następuje zmiana IP, czyli skok jest efektywny; w przeciwnym przypadku nie ma skoku (tak jak przy rozkazie nic nie rób ) i jest wykonywany następny rozkaz zapisany w programie, czyli skok jest nieefektywny. Skok wyliczany CNT inkrementuje wskazany rejestr i następnie, jeŝeli ten rejestr jest wyzerowany, przenosi sterowanie do adresu adr. Skok taki nadaje się do organizowania pętli programowych, w takich przypadkach rejestr powinien być inicjalizowany liczbą ujemną, zwiększaną po kaŝdym wykonaniu aŝ do osiągnięcia zera. Cztery rozkazy pułapek programowych TRAPi (i=0, 1, 2 lub 3) działają jak przerwanie zewnętrzne o numerze i; sterowanie jest przenoszone do adresu określonego w tablicy wektorów umieszczonej w początkowym obszarze adresów. Efekt rozkazu TRAPi jest taki jak skoku pośredniego - poprzez słowo w pamięci pod adresem 2*i. Rozkazy takie są zwykle stosowane do komunikacji z systemem operacyjnym, wywołując pewne istotne funkcje tego systemu. Rozkaz CMP sam nie powoduje zmiany sekwencji rozkazów, natomiast jest bardzo wygodny do organizacji rozgałęzień w programie. Porównuje on argumenty przez ich odjęcie bez zapisywania wyniku, natomiast ustawia znaczniki N, Z, V i C, badane przez następujące potem rozkazy warunkowe.

14 3. Język asemblera Tab. 3.6. Rozkazy sterujące JMP adr Skok bezwarunkowy IP adr BZ adr8 Skok gdy zero (Z=1) => IP adr BC adr8 Skok gdy przeniesienie (C=1) => IP adr BM adr8 Skok gdy minus (N=1) => IP adr BO adr8 Skok gdy nadmiar (V=1) => IP adr CALL adr Wywołanie podprogramu stos IP; next IP adr RET Powrót z podprogramu IP stos RETI Powrót z przerwania IP, PSW stos NZVC CNT r,adr8 Skok wyliczany r r+1; next (r=0) => IP adr NZC TRAPi Pułapka stos PSW, IP; next IP M[2*i] CMP r,src Porównanie r src NZVC Powroty z podprogramu (RET) i programu obsługi przerwania (RETI) odtwarzają odpowiednie rejestry przechowywane na stosie w tym licznik rozkazów, czyli zmieniają sekwencję rozkazów (skok). Niewielka grupa prostych w działaniu rozkazów zmienia znaczniki, co - w kilku przypadkach - skutkuje istotnymi zmianami stan systemu. Takim rozkazem jest HALT, który zatrzymuje wykonywanie cyklu rozkazowego i uruchomienie procesora wymaga interwencji operatora. WAIT przeprowadza procesor w stan oczekiwania - rozkazy nie są wykonywane, ale są przyjmowane przerwania. Rozkazy EI i DI sterują znacznikiem IE (Interrupt Enable) zezwalającym na przyjmowanie sygnałów przerwań (IE = 1) lub maskującym przerwania (IE = 0). Osobliwością jest rozkaz pusty NOP (ang. No operation), który nie powoduje Ŝadnej akcji; bywa on uŝywany np. w programach uruchomieniowych. Tab. 3.7. Rozkazy zmiany stanu EI Otwarcie przerwań IE 1 DI Zamknięcie przerwań IE 0 CPC Uzupełnienie C C not C C CPZ Uzupełnienie Z Z not Z Z NOP Nic nie rób HALT Zatrzymanie cyklu RUN 0 WAIT Oczekiwanie przerwania WAIT 1 Stałe liczbowe mogą być podane w postaci dziesiętnej, dwójkowej, szesnastkowej albo w postaci nazwy symbolicznej; tym stałym przypisuje się wartości całkowite z zakresu (0, 65535). W zapisie dwójkowym liczby muszą być zakończone znakiem b lub B,

3. Język asemblera 15 w zapisie szesnastkowym liczby muszą być zakończone znakiem h lub H, w przypadku braku oznaczenia przyjmuje się domyślnie, Ŝe liczby są w systemie dziesiętnym. Ze względu na konieczność odróŝnienia stałych szesnastkowych od nazw, asembler wymaga aby kaŝda stała, bez względu na system liczenia w jakim jest zapisana zaczynała się od cyfry dziesiętnej (0... 9). Z tego powodu jeŝeli stała szesnastkowa ma pierwszą cyfrę A, B, C, D, E lub F, to naleŝy ją poprzedzić cyfrą 0; np. liczbę A279h trzeba zapisywać jako 0A279h. Etykiety i nazwy mogą mieć najwyŝej 8 znaków i muszą się zaczynać się od litery; po etykiecie musi być dwukropek (:), małe i duŝe litery nie są rozróŝniane. Argumenty rozkazów są albo podane bezpośrednio (tzw. adresacja natychmiastowa), albo są umieszczone w pamięci i wówczas podawany jest ich adres. Argument bezpośredni - zapisany jako liczba w systemie dziesiętnym, dwójkowym lub szesnastkowym albo w postaci symbolicznej (jako nazwa) - w zapisie asemblerowym musi być poprzedzony znakiem "hash" (#). JeŜeli argument jest w pamięci, to w rozkazie podawany jest jego adres - w postaci liczbowej lub, najczęściej, w postaci symbolicznej - jako etykieta. MoŜliwe jest teŝ adresowanie pośrednie: adres argumentu znajduje się w jednym z rejestrów R0... R3, a w rozkazie podaje się jedynie symbol tego rejestru poprzedzony znakiem "at" (@). W polu adresu są dopuszczalne tylko dwa działania na adresach: dodawanie (+) i odejmowanie ( ); przykłady uŝycia róŝnych sposobów adresowania argumentów zawarto w tab. 3.8. Adresacja natychmiastowa (argument bezpośredni) Tab. 3.8. Przykłady adresowania argumentów Adresacja bezpośrednia Adresacja pośrednia LD R2, #24A7H LD R1, BUBU ADD R3, @R0 ADD R0, #396 ADD R2, WYNIK+3 LD R1, @R2 AND R3, #WS5K BC TAM JMP @R3 3.2. Pseudorozkazy W asemblerze Kass są równieŝ dostępne tzw. pseudorozkazy (rozkazy syntetyczne), które ze względu na czytelną składnię ułatwiają pisanie programów, a w czasie asemblacji są tłumaczone na rozkazy języka maszynowego (tab.3.9). Psudorozkazy nie mają swoich kodów (specyficznych słów rozkazowych), stanowią jedynie sposób skróconego zapisu programu w języku asemblera.

16 3. Język asemblera Tab. 3.9. Pseudorozkazy asemblera Kass Postać asemblerowa Funkcja Sekwencja rozkazów MOV rd, rs Kopiowanie rejestru LD rd, rs INC r Zwiększenie o 1 ADD r, #1 DEC r Zmniejszenie o 1 SUB r, #1 INC2 r Zwiększenie o 2 ADD r, #2 DEC2 r Zmniejszenie o 2 SUB r, #2 CLR r Zerowanie rejestru LD r, #0 LDN r, #D Ładowanie stałej ze zmianą znaku ( Ładuj ujemnie ) BNZ adr10 Skok przy Z=0 ( nie zero ) BNC adr10 Skok przy C=0 ( brak przeniesienia ) LD NEG CPZ BZ CPC BC r,#d r adr10 adr10 3.3. Dyrektywy Dyrektywy asemblera sterują przebiegiem asemblacji, rozmieszczają kod w pamięci i nadają wartości początkowe zmiennym; są one interpretowane w czasie translacji, a nie w czasie wykonywania programu przez procesor. W języku Kass jest sześć dyrektyw, których składnię i znaczenie opisano w tab. 3.10; nawiasy prostokątne oznaczają elementy opcjonalne.

3. Język asemblera 17 Składnia Tab. 3.10. Dyrektywy asemblera Kass Opis nazwa.equ stała Nadanie nazwy stałej [etykieta:].org adres [etykieta:].db lista stałych [etykieta:].dw lista stałych [etykieta:].blk stała.end etykieta Ustalenie adresu początkowego następującej dalej sekcji programu Nadanie wartości kolejnym bajtom Nadanie wartości kolejnym słowom Zarezerwowanie bloku bajtów Koniec tekstu programu i wskazanie etykiety startowej Przyjęto, Ŝe mnemoniki dyrektyw dla wyróŝnienia w tekście programu i ułatwienia asemblacji, zaczynają się znakiem kropki (.). Po mnemoniku następują wymagane parametry. Stałe naleŝące do listy muszą być oddzielone przecinkami a ich wartości muszą być mniejsze od 256 w dyrektywie DB (define byte) i 65536 w dyrektywie DW (define word). Etykiety występujące opcjonalnie przed dyrektywami stają się symbolicznymi nazwami adresów odpowiednich pól. Etykieta w polu parametrów dyrektywy END wskazuje na adres pierwszego rozkazu, jaki będzie wykonany po uruchomieniu programu. W dyrektywie.db jako argument moŝe wystąpić łańcuch znaków ASCII i wówczas umieszczany jest on w apostrofach ('); np. dyrektywa kom_5:.db 'Koniec zakresu!',0,0 umieści w pamięci, od adresu odpowiadającego etykiecie kom_5, 15 bajtów będących kodami ASCII odpowiednich znaków: 4B, 6F, 6E, 69, 65, 63, 20, 7A, 61, 6B, 72, 65, 73, 75, 21, oraz dwa bajty zerowe 00, 00. Definicja nazwy dyrektywą.equ (equal) musi poprzedzać pierwsze uŝycie tej nazwy; np. jeŝeli fragment programu ma postać: wskp.equ 7 adr_we.equ 35h... add r1,#wskp... in r0,adr_we... to rozkaz add r1,#wskp działa identycznie jak add r1,#7 a rozkaz in r0,adr_we jak in r0,35h.

18 3. Język asemblera Dyrektywa.ORG (origin) pozwala na alokację kodu programu w pamięci, musi więc być uŝywana przez programistę przy asemblacji programów w przypadku braku systemu operacyjnego. Np. sekwencja.org 3200h tutu:.dw 2ac6h, 258 lala:.db 33h,33, ab powoduje umieszczenie w pamięci od adresu 3200 ośmiu bajtów: 2A, C6, 01, 02, 33, 21, 61, 62 oraz nadanie etykiecie TUTU wartości 3200h, a etykiecie LALA wartości 3204 (rys. 3.4). Adres (hex) Zawartość (hex) Komentarz 3200 2A TUTU = adres = 3200h; pierwsze słowo 2AC6h zajmuje 2 bajty 2A, C6 3201 C6 3202 01 drugie słowo 258 = 0102h zajmuje 2 bajty 01, 02 3203 02 3204 33 LALA = adres = 3204h; pierwszy bajt 33h 3205 21 drugi bajt 33 = 21h 3206 61 trzeci bajt a = 61h (kod ASCII) 3207 62 czwarty bajt b = 62h (kod ASCII) Rys. 3.4. Przykład działania dyrektyw.org,.dw i.db Dyrektywa.BLK (block) jedynie rezerwuje określoną liczbę kolejnych bajtów, ale nie nadaje im Ŝadnych wartości początkowych (mogą być przypadkowe). Np. sekwencja bibi:.dw 0,0 caca:.blk 4 dada:.db.org 5500h Abba przygotuje fragment pamięci jak na rys. 3.5.

3. Język asemblera 19 Nawa adresu (etykieta) Adres (hex) Zawartość (hex) BIBI 5500 00 5501 00 5502 00 5503 00 CACA 5504?? 5505?? 5506?? 5507?? DADA 5508 41 5509 62 550A 62 550B 61 Rys. 3.5. Przykład działania dyrektywy.blk Dyrektywa.END występuje na końcu tekstu programu i oznacza, Ŝe jeŝeli dalej następuje jakiś fragment - nawet poprawny składniowo - to nie jest on tłumaczony. Dyrektywa.END nie moŝe być poprzedzona Ŝadną etykietą (nie moŝna się do tej dyrektywy odwoływać, gdyŝ nie oznacza ona Ŝadnego adresu pamięci). Etykieta umieszczona jako argument tej dyrektywy jest konieczna do uruchomienia przetłumaczonego (zasemblowanego) programu, gdyŝ wskazuje ona rozkaz, od którego naleŝy rozpocząć wykonywanie programu (zob. przykł. 6.7 w rozdz. 6). W omawianym dalej emulatorze (rozdz. 7) brak etykiety startowej powoduje ustawienie licznika rozkazów (start programu) na adres 0000h.

Architektura Podstawowym atrybutem architektury kaŝdego komputera (Instruction-Set Architecture) jest lista rozkazów opisana z dokładnością do jej reprezentacji binarnej. PoniewaŜ funkcje wszystkich rozkazów 2K+ są opisane w rozdz. 3, poświęconym asemblerowi i w rozdz. 9, zawierającym szczegółowy opis formalny, tutaj podane zostaną tylko zasady kodowania rozkazów, budowa słowa rozkazowego i organizacja systemu przerwań. 4.1. Kodowanie rozkazów 4 4 (a) f op4 4 2 2 (b) f op2 rd 4 2 2 8 (c) f op2 rd ioa/dsp8 4 2 10 (d) f cnd dsp10 4 2 8 (e) f m=00 rd dsp8 4 2 2 1 5 2 (f) f m=11 rd i res rs 4 2 2 16 (g) f m=01 rd adr16 4 2 2 16 (h) f m=10 rd imm Rys. 4.1. Formaty rozkazów 2K+

22 4. Architektura Rozkazy 2K+ są kodowane w słowie rozkazowym, które moŝe mieć jeden z ośmiu formatów i moŝe zajmować 1bajt (formaty a i b), 2 bajty (formaty c, d, e i f) lub 3 bajty (formaty g i h). Na rys. 4.1 pokazano wszystkie formaty i zaznaczono nazwy poszczególnych pól stosowane w dalszym opisie; podano teŝ liczoną w bitach wielkość poszczególnych pól. Pięciobitowe pole res w formacie (f) nie jest dekodowane i moŝe mieć dowolną zawartość. Format słowa rozkazowego jest dostosowany do funkcji kodowanych w danym rozkazie, a szczególnie od liczby i rodzaju argumentów operacji. Osobne formaty przyjęto dla rozkazów: bezadresowych (format a); z argumentem w rejestrze (format b); skoków warunkowych (format d); wejścia-wyjścia (format c); z adresem bezpośrednim (format g); z adresem względnym (format e); z argumentem bezpośrednim (format h); z adresem pośrednim w rejestrze (format f). Podstawowy kod operacyjny jest zapisany w 4-bitowym polu f (bity 0..3 kaŝdego rozkazu); określa on nie tylko typ realizowanej operacji, ale teŝ implikuje format słowa rozkazowego. Dla większości rozkazów rozszerzenie tego kodu jest w polach op4, op2 i cnd. Dwubitowe pola rd i rs słuŝą do kodowania numeru rejestru, biorącego udział w operacji (rs - rejestr źródłowy, rd - rejestr docelowy). Pole cnd występuje tylko w rozkazach skoków warunkowych i koduje jeden z czterech znaczników badanych w danym rozkazie wg reguły: 00 - znacznik Z (rozkaz BZ), 01 - znacznik C (rozkaz BC), 10 - znacznik N (rozkaz BM) i 11 - znacznik V (rozkaz BO). W rozkazach tych adres docelowy skoku jest obliczany względem aktualnego stanu licznika rozkazów. W słowie rozkazowym na zakodowanie adresu względnego (tzw. przesunięcia, ang. displacement) przeznaczono jedynie 10 bitów w polu dsp10, co daje zasięg skoków warunkowych od - 512 do + 511 bajtów, gdyŝ dsp10 jest traktowane jako liczba w kodzie U2: adres = IP + dsp10 Dzięki takiemu kodowaniu (w formacie (d)) rozkazy skoków warunkowych mieszczą się w słowie 2-bajtowym. 2-bajtowy format (c) mają teŝ rozkazy wejścia i wyjścia (IN i OUT), w których kod operacyjny zajmuje 6 bitów (pola f i op2), 2 bity kodują rejestr (pole rd) a 8 bitów pola ioa przeznaczono na adres portu. Taki sam podział słowa jest w rozkazie skoku wyliczanego CNT, z tym, Ŝe 8-bitowe pole dsp8 słuŝy jako adres względny tego skoku, co daje zasięg od - 128 do +127 bajtów od bieŝącego rozkazu (dokładnie: od następnego rozkazu, gdyŝ w czasie wykonywania rozkazu licznik rozkazów IP jest juŝ zaktualizowany i wskazuje rozkaz następny).

4. Architektura 23 Tab. 4.1. Kodowanie rozkazów w 2K+ Bity słowa rozkazowego Kod Format Bity słowa rozkazowego 0..3 4..5 6..7 0..3 4..5 6..7 Kod Format 0000 00 00 NOP (a) 0011 00 rd PUSH (b) 01 HALT (a) 01 rd POP (b) 10 WAIT (a) 10 rd LDSP (b) 11 RET (a) 11-01 00 RETI (a) 0100 m rd LD (e)(f)(g)(h) 01 EI (a) 0101 m rd ST (e)(f)(g) 10 DI (a) 0110 m rd ADD (e)(f)(g)(h) 11 CPC (a) 0111 m rd ADC (e)(f)(g)(h) 10 00 CPZ (a) 1000 00 BZ (d) 01 PUPS (a) 01 BC (d) 10 POPS (a) 10 BM (d) 11-11 BO (d) 11 00 TRAP0 (a) 1001 m rd SUB (e)(f)(g)(h) 01 TRAP1 (a) 1010 m rd SBB (e)(f)(g)(h) 10 TRAP2 (a) 1011 m rd CMP (e)(f)(g)(h) 11 TRAP3 (a) 1100 m rd AND (e)(f)(g)(h) 0001 00 rd NEG (b) 1101 m rd JMP (e)(f)(g) 01 rd CPL (b) 1110 m rd CALL (e)(f)(g) 10 rd SWAP (b) 1111 00-11 rd ASHR (b) 01 IN (c) 0010 00 rd SHR (b) 10 OUT (c) 01 rd SHL (b) 11 rd CNT (c) 10 rd ROR (b) 11 rd ROL (b)

24 4. Architektura Najbardziej złoŝony charakter ma kodowanie dziesięciu tzw. rozkazów adresowych, to jest tych, które mogą wskazywać argument w pamięci operacyjnej; są to rozkazy LD, ST, ADD, ADC, SUB, SBB, CMP, AND, JMP i CALL (f = 4..7 i 9..E). W tych rozkazach sposób wyznaczania adresu jest zakodowany w 2-bitowym polu m i w zaleŝności od zawartości tego pola przyjmowany jest format (e), (f), (g) lub (h): m = 00; adres efektywny = IP + dsp8 m = 01; adres efektywny = adr16 m = 10; argument jest zawarty w rozkazie (argument bezpośredni imm) m = 11; adres zaleŝny od bitu i: gdy i = 1, wówczas adres argumentu jest w pamięci M[rs] (adresacja pośrednia poprzez rejestr rs); gdy i = 0, wówczas argumentem jest bezpośrednio zawartość rejestru rs. Sposób adresacji z argumentem bezpośrednim (m = 10, format (h)) nie ma zastosowania do rozkazów ST, JMP i CALL; w tych rozkazach zawsze musi być określony adres pamięci. Z tego samego powodu nie moŝe pojawić się format (f) z bitem i = 0. W tab. 4.1. pokazano kody wszystkich rozkazów 2K+; jak widać jedyne rezerwy dla ewentualnej rozbudowy listy rozkazów stanowią niewykorzystane kody ins<0:7> = 0000 1011, ins<0:7> = 0011 11xx oraz ins<0:7> = 1111 00xx. 4.2. Przykłady asemblacji i deasemblacji Znając kodowanie rozkazów (tab. 4.1) i strukturę słów rozkazowych (rys. 4.1) moŝna utworzyć obraz binarny programu napisanego w języku asemblera. Tę operację tłumaczenia z języka asemblera na język maszynowy, czyli kod binarny, który moŝe juŝ być interpretowany sprzętowo, wykonuje program zwany asemblerem. W praktyce proces translacji bywa wielostopniowy: asembler (Assembler) tworzy postać obiektową modułów programu, następnie program łączący (Linker) scala wszystkie moduły programu, np. równieŝ moduły biblioteczne i dopiero program ładujący (Loader) umieszcza kod programu w pamięci operacyjnej komputera. Proces asemblacji polega na analizie zapisu kolejnych rozkazów w programie i składaniu (stąd nazwa) elementów kodu tego rozkazu. Dla rozkazów bezadresowych jest to bardzo proste, np. rozkaz CPC ma 1-bajtowy format (a) i wszystkie bity są określone w tabeli kodów - 0000 0111b (07h). Podobnie jest w przypadku rozkazów z jednym argumentem w rejestrze, np. SWAP R3 ma format (b), w którym 6 bitów kodu operacji to 0001 10, a dwa pozostałe bity wskazują numer uŝytego rejestru (11); ostatecznie kod tego rozkazu jest 0001 1011b (1Bh). Rozkazy wejścia-wyjścia składają się z trzech elementów: 6-bitowego kodu operacyjnego (pola f i op2), 2-bitowego numeru rejestru i 8-bitowego numeru portu; np. rozkaz IN R1,53h ma kod operacyjny 1111 01, nr rejestru 01 i adres portu 0101 0011; cały rozkaz jest więc kodowany na 2 bajtach jako 1111 0101 0101 0011b (F5 53h).

4. Architektura 25 W rozkazach adresowych z adresem względnym (rozkazy w formacie (e), wszystkie skoki warunkowe i skok wyliczany) kodowanie rozkazu wymaga znajomości adresu, pod którym dany rozkaz jest umieszczony. JeŜeli, np. rozkaz BC ALEF jest w pamięci pod adresem 3A9Ch, a wartość etykiety ALEF jest 39B7h, to dla obliczenia adresu względnego trzeba odjąć od adresu efektywnego wartość IP, wskazującego następny rozkaz, czyli 3A9E = 3A9C + 2 (rozkaz BC jest 2-bajtowy): dsp10 = adres IP = 39B7 3A9E = FF19 Uzyskany wynik (w kodzie U2) musi być zapisany na 10 bitach, czyli dsp10 = = 11 0001 1001, bo 1111 1111 0001 1001 16b = 11 0001 1001 10b Ostatecznie kod BC ALEF będzie miał postać binarną 1000 01 11 0001 1001, czyli 87 19 szesnastkowo. Przy adresacji względnej moŝe się okazać, Ŝe wyliczone przesunięcie (displacement) jest większe niŝ zakres liczb zapisywanych na 8 (dsp8) lub 10 (dsp10) bitach. W takim przypadku rozkazy skoków warunkowych nie mogą być zakodowane i jest pokazywany błąd kompilacji, natomiast w przypadku rozkazów LD, ST, ADD, ADC, SUB, SBB, CMP, AND, JMP lub CALL asembler automatycznie stosuje mniej oszczędny format (g) z 16-bitowym adresem bezwzględnym. Np. rozkaz SUB R3,BOBOS umieszczony pod adresem B6AFh z argumentem pod etykietą BOBOS = AC55h będzie kodowany na 3 bajtach w formacie (g), dla którego pole m = 01: 1001 01 11 1010 1100 0101 0101b = 97 AC 55h Rozkaz z argumentem bezpośrednim ma zawsze format (h); np. AND r1,#43c7h ma kod f = 1100 m = 10, rd = 01 oraz imm = 43C7h = 0100 0011 1100 0111, ostatecznie kod tego rozkazu jest 1100 10 01 0100 0011 1100 0111b = C9 43 C7h W formacie (f) kodowane są rozkazy z dwoma argumentami w rejestrach lub z argumentem adresowanym poprzez rejestr (adresacja pośrednia). Np. rozkaz LD R2,@R3 ma pole f = 0100, m = 11, rd = 10, rs = 11 oraz i = 1, pozostałym 5 bitom przypisywana jest wartość 0: 0100 11 10 1 00000 11b = 4E 83h Podobnie wyglądający, ale istotnie róŝniący się działaniem rozkaz LD R2,R3 ma kod róŝniący się bitem i = 0: 0100 11 10 0 00000 11b = 4E 03h Niekiedy potrzebne jest uzyskanie z kodu programu jego zapisu symbolicznego, zbli- Ŝonego do postaci asemblerowej; taka moŝliwość jest dostępna np. w programach uruchomieniowych tzw. debuggerach i nazywa się deasemblacją (lub disasemblacją). W tym przypadku postępowanie jest odwrotne niŝ przy kodowaniu i w pewnym sensie symuluje działanie układu sterującego w procesorze, który teŝ musi rozpoznać operację do wyko-

26 4. Architektura nania i argumenty bądź adresy. Zwykle deasemblacja zapisuje symbolicznie tylko mnemoniki rozkazów, nazwy rejestrów i sposoby adresowania; same adresy (jak teŝ stałe) są zapisywane w postaci szesnastkowej. Deasemblacja zaczyna się analizy pierwszych 4 bitów słowa rozkazowego, gdyŝ one określają typ rozkazu i jego długość. Np. sekwencja bajtów 08 2E 9B 5A 27 traktowana jako fragment kodu programu zaczyna sie od bajta 08h, czyli 0000 1000, więc jest to rozkaz w 1-bajtowym formacie (a); kolejne 4 bity pokazują, Ŝe jest to rozkaz CPZ. Następny rozkaz ma pierwszy bajt 2Eh, czyli 0010 1110, co równieŝ wskazuje na rozkaz 1-bajtowy, ale w formacie (b), dokładnie: ROL R2. Kolejny rozkaz to 9Bh, czyli 1001 1011. Kod 1001 jest kodem operacyjnym rozkazu SUB, który moŝe być w formacie (e), (f), (g) lub (h). Następne 2 bity (pole m = 10) określają, Ŝe to 3-bajtowy format (h) i ostatnie 2 bajty zawierają argument bezpośredni; jest to więc rozkaz SUB R3,#5A27. Ostatecznie ciąg 08 2E 9B 5A 27 jest kodem programu CPZ ROL SUB R2 R3,#5A27 W podanych przykładach kod moŝna zdeasemblować nie znając jego połoŝenia w pamięci; nie jest to moŝliwe, jeŝeli w rozkazach występują adresy względne. Np. jeŝeli pod adresem 4AB7h jest umieszczony kod 62 3A 5C..., to dekodując kod operacyjny (6h) 0110 okazuje się, Ŝe jest to rozkaz ADD, a kolejne 2 bity wskazują na tryb adresacji m = 00 (rozkaz 2-bajtowy z adresacją względem licznika rozkazów). 8-bitowe przesunięcie zapisane w drugim bajcie ma wartość równą 3Ah (liczba dodatnia w kodzie U2) i trzeba ją dodać do zaktualizowanego licznika rozkazów IP = 4AB7 + 2 = 4AB9h; adres docelowy wynosi więc adres = IP + dsp8 = 4AB9 + 003A = 4AF3 MoŜna teraz złoŝyć cały rozkaz w postaci jako ADD R2,4AF3. Ostatni przykład pokazuje, Ŝe postać zdeasemblowanego programu zaleŝy od adresu przyjętego za początek pierwszego rozkazu. Na rys. 4.2 pokazano przykład deasemblacji pewnego kodu - najpierw zaczynając od adresu 201Ah, a następnie tego samego kodu zaczynając od adresu 201Bh. W drugim przypadku pierwsze dwa rozkazy SHR R0 i NOP są zdeasemblowanymi fragmentami rozkazu LD R0,#2000. Postaci kodu pokazane na rys. 4.2 pochodzą z emulatora omówionego w rozdz. 7.

4. Architektura 27 4.3. System przerwań Rys. 4.2. Przykłady deasemblacji w emulatorze 2K+ W 2K+ jest wektorowy system przerwań obsługujący 16 przerwań zewnętrznych i wyjątków. Procesor otrzymuje sygnał zgłoszenia int wraz z 4-bitowym numerem (identyfikatorem) in<0:3>. JeŜeli bit IE w słowie stanu ma wartość 1, wówczas przerwanie jest przyjmowane, w przeciwnym przypadku zgłoszenie jest ignorowane. Przyjęcie zgłoszenia polega na zapisaniu na stosie kolejno dwóch słów - PSW i IP, a następnie zablokowaniu przerwań zewnętrznych (IE 0) i wyjątku pracy krokowej (T 0). Przy tak zmienionym słowie stanu, nowa zawartość licznika rozkazów jest ładowana z tablicy wektorów przerwań umieszczonej w obszarze pierwszych 32 adresów pamięci głównej. KaŜda 2-bajtowa pozycja tablicy wektorów przerwań (tab. 4.2) zawiera adres pierwszego rozkazu programu obsługi odpowiedniego przerwania. Numer przerwania jest odwzorowany w adres tablicy przez przesunięcie o jedną pozycję w lewo: IP M[2*in]. Np. zgłoszenie przerwania nr 7 (dwójkowo 0111) wywoła program obsługi zaczynający się od adresu umieszczonego w tablicy wektorów przerwań pod adresem 14 (dwójkowo 1110, szesnastkowo E). Zgłoszenia 0..3 są zarezerwowane dla pułapek programowych TRAPi. Wykonanie rozkazu TRAPi moŝna traktować jako symulację przerwania o numerze i. W rzeczywistych systemach komputerowych tego typu rozkazy są wygodnym sposobem komunikacji programu uŝytkownika z systemem operacyjnym; taką rolę spełniają np. tzw. funkcje BIOS wywoływane rozkazami INTi w procesorach o architekturze i86.

28 4. Architektura Zgłoszenie in = 4 przypisano do obsługi wyjątku T. Ustawienie bitu T = 1 w słowie stanu powoduje przerwanie po wykonaniu kaŝdego rozkazu, co umoŝliwia śledzenie (trace) programu krok po kroku. "Praca krokowa" bywa stosowana w systemach uruchomieniowych, tzw. debuggerach, do wyszukiwania błędów w programach. Zgłoszenie in = 5 obsługuje wyjątek M (błąd adresowania). Wyjątek M jest zgłaszany przez układ sterujący po zdekodowaniu m=10 w rozkazach ST (f=0101), JMP (f=1101) lub CALL (f=1110); w tych trzech rozkazach adresacja natychmiastowa, kodowana w 2-bitowym polu m jako 10, jest niedopuszczalna. Pozostałe dziesięć zgłoszeń od in = 6 do in = 15 pozostawiono dla sygnałów przerwań sprzętowych (zewnętrznych). Obsługa tych przerwań zaleŝy od przypisanych im konkretnych urządzeń i zdarzeń w tych urządzeniach i jest częścią systemu operacyjnego. Tab. 4.2. Tablica wektorów przerwań Adres in Program obsługi Rodzaj 0000h 0000 TRAP 0 Rozkaz 0002h 0001 TRAP 1 Rozkaz 0004h 0010 TRAP 2 Rozkaz 0006h 0011 TRAP 3 Rozkaz 0008h 0100 Praca krokowa (T) Wyjątek 00Ah 0101 Błąd dresu (M) Wyjątek 000Ch 0110 int 6 Przerwanie sprzętowe............ 001Eh 1111 int 15 Przerwanie sprzętowe

Struktura 5.1. Struktura jednoszynowa Na rys. 5.2 pokazano jedną z moŝliwych implementacji architektury 2K+ w postaci tzw. struktury jednoszynowej. Ten typ struktury polega na dołączeniu wszystkich rejestrów i innych bloków funkcjonalnych procesora do jednej, dwukierunkowej szyny danych (toru przesyłowego, magistrali). Szyna ma 16 linii bitowych tak, aby mogła przesyłać jednocześnie całe 16-bitowe słowo. KaŜdy blok funkcjonalny moŝe być nadajnikiem informacji podstawiając słowo na magistralę i kaŝdy moŝe być odbiornikiem informacji z magistrali. Układ sterujący powinien zapewnić, aby zawsze był aktywny tylko jeden nadajnik, natomiast ta sama informacja moŝe być jednocześnie odbierana przez więcej niŝ jeden odbiornik. Przesłania między blokami odbywają się zawsze za pośrednictwem szyny przez aktywację odpowiednich sygnałów bramkujących, które sterują mikrooperacjami zapisu na szynę i sygnałów odczytu z szyny. Np. przesłanie z BLA do BLC (rys. 5.1) nastąpi, gdy będą aktywne sygnały fbla i tblc, natomiast przesłanie z BLC jednocześnie do BLA i BLB wymaga aktywacji sygnałów fblc, tbla i tblb. Rysunek 5.1. Zasada komunikacji poprzez szynę Bramki fblc, tbla i tblb są aktywne ( otwarte ), co skutkuje przesłaniem słowa z BLC do BLA i BLB. Schemat z rys. 5.2 pokazuje strukturę logiczną na poziomie rejestrowym (register transfer level), na którym pokazane są wszystkie rejestry i bloki funkcjonalne bez szczegó-

30 5. Struktura łów realizacji logicznej tych bloków. Nie pokazano teŝ struktury układu sterującego, zakładając, Ŝe musi on realizować sekwencje sygnałów konieczne do wykonania odpowiednich przesłań wymaganych w cyklu kaŝdego rozkazu (zob. pkt. 5.3). wrm rdm tmb wait ss int M Adresator Układ sterowania inc1ip inc2ip sygnały sterujące mikrooperacje IE IR IP AR MB T sie zie fmb tar tip fip fadr tir tsp fsp SP ta2 inc2sp dec2s tr fr R0 R1 R2 R3 wadr radr tain add... shr fain AIN ta1 ALU N Z V C szyna <0:15> faout AOUT <8:15> out Porty we-wy in Rys. 5.2. Struktura 2K+ <0:7> 0 1 255 IR<7:15>

5. Struktura 31 NajwaŜniejsze bloki funkcjonalne komputera 2K+ to: - pamięć operacyjna (M); - pamięć lokalna (zestaw rejestrów uniwersalnych R0...R3); - porty wejścia-wyjścia; - jednostka arytmetyczno-logiczna (ALU); - układ sterowania. Pamięć operacyjna (rys. 5.3) ma 64 kbajty (2 16 bajtów) wymaga więc adresu 16-bitowego, który musi być z zewnątrz (z szyny) podstawiony do rejestru AR. W pamięci są realizowane dwie mikrooperacje: - aktywny sygnał wrm powoduje zapis słowa z rejestru MB do pamięci pod adres wskazany w AR; - aktywny sygnał rdm powoduje odczyt zaadresowanego słowa z pamięci do rejestru MB. I zapis, i odczyt dotyczą zawsze 16-bitowego słowa (dwóch kolejnych bajtów) według zasady big-endian. Np. jeŝeli w rejestrze MB jest słowo o postaci szesnastkowej ABCDh, a w rejestrze AR liczba p, to mikrooperacja wrm spowoduje zapisanie ABh w bajcie o adresie p oraz CDh w bajcie o adresie p+1. wrm rdm M AR MB Rys. 5.3. Struktura pamięci operacyjnej AR - rejestr adresu, MB - rejestr danych. Pamięć lokalną w 2K+ tworzą cztery 16-bitowe rejestry R0, R1, R2 i R3 (rys. 5.4). Są one dołączone do szyny przez multiplekser wejściowy, sterowany 2-bitowym sygnałem wadr i demultiplekser wyjściowy sterowany 2-bitowym sygnałem radr. Taka konstrukcja umoŝliwia zarówno przy zapisie jak i przy odczycie wybranie tylko jednego z czterech rejestrów. Np. ustawienie wadr=2 i tr powoduje wpisanie słowa z szyny do rejestru R2, radr=0 i fr podstawia zawartość R0 na szynę, przy czym R0 nie jest zerowany.

32 5. Struktura tr fr R0 R1 R2 R3 wadr radr Rys. 5.4. Struktura pamięci lokalnej Wejścia wybierające: wadr - numer rejestru, do którego następuje zapis słowa z szyny; radr - numer rejestru, którego zawartość jest podstawiana na szynę, tr, fr - sygnały wykonawcze zapisu i odczytu. Porty wejścia-wyjścia są identyfikowane jako 512 adresów (256 adresów dla mikrooperacji in oraz 256 adresów dla mikrooperacji out); 8-bitowe rejestry, których te adresy dotyczą mogą być fizycznie zlokalizowane poza procesorem, np. w układach sterujących urządzeń zewnętrznych. Porty wyjściowe są dołączone przez demultiplekser aktywowany sygnałem out, do ośmiu bardziej znaczących linii magistrali <0:7>; porty wejściowe mogą podstawiać swoją zawartość na osiem mniej znaczących linii magistrali <8:15> przez multiplekser sterowany mikrooperacją in. Wejścia adresowe multiplekserów są sterowane z pozycji <7:15> rejestru rozkazów IR, gdyŝ w czasie wykonywania zarówno rozkazu IN r,prt jak i OUT prt,r 8-bitowy adres portu jest umieszczony na tych pozycjach. Uwaga: mikrooperacje in i out mają swój sens mnemotechniczny w odniesieniu do rozkazów, a nie w stosunku do portów we-wy. out Porty we-wy in <0:7> 0 1 <8:15> T 255 IR<7:15> Rys. 5.5. Struktura portów we-wy Wejścia adresowe multiplekserów są sterowane z pozycji <7:15> rejestru rozkazów IR.

5. Struktura 33 Jednostka arytmetyczno-logiczna (arithmetic-logic unit, ALU) wykonuje wszystkie operacje arytmetyczne, logiczne i przesunięcia zdefiniowane w liście rozkazów 2K+. W operacjach dwuargumentowych jeden argument pobierany jest bezpośrednio z magistrali (mikrooperacja ta2), a drugi z rejestru buforowego AIN (mikrooperacja ta1); wynik operacji jest zapisywany w rejestrze AOUT, z którego moŝe być przesłany na magistralę. Po kaŝdej operacji zapisywane są cztery 1-bitowe znaczniki (wynik ujemny - N, wynik zerowy - Z, przeniesienie - C, nadmiar przy dodawaniu lub odejmowaniu - V). add... shr AIN ta1 ta2 ALU N Z V C AOUT Rys. 5.6. Struktura jednostki arytmetyczno-logicznej Do rejestru buforowego AIN moŝna wpisywać słowo z magistrali, z rejestru AOUT moŝna przekazywać słowo na magistralę. Rodzaj operacji wykonywanej w ALU jest określony przez ten sygnał sterujący mikrooperacjami, który jest aktywny w danym takcie: add, adc, sub, sbb, and, not, shr, shl, ror, rol, shra, inc lub swap. Operacja ta dokonuje się na argumentach (argumencie), udostępnianych w tym takcie przez mikrooperacje ta1 i ta2. Układ sterowania generuje wszystkie sygnały sterujące mikrooperacjami, konieczne do wykonania rozkazu aktualnie umieszczonego w rejestrze rozkazów IR. Sekwencje mikrooperacji są synchronizowane tzw. zegarem, czyli generatorem wyznaczającym takty pracy procesora. RównieŜ etap wstępny cyklu rozkazowego, czyli pobranie kolejnego rozkazu z pamięci do IR, a takŝe obsługa sytuacji wyjątkowych, czyli przełączanie programów po przyjęciu przerwania, są obsługiwane przez odpowiednie sekwencje mikrooperacji wysyłane z układu sterowania. Ogólnie, działanie układu sterowania zaleŝy od: - kodu rozkazu umieszczonego aktualnie w IR; - stanu znaczników N, Z, V i C; - stanu znaczników IE (maska przerwań) i T (praca krokowa); - sygnału zgłoszenia przerwania int; - sygnału ss (ręczny przełącznik start/stop lub rozkaz HALT);

34 5. Struktura - sygnału wait powodującego wstrzymanie cyklu rozkazowego w oczekiwaniu na zgłoszenie int. Adresator spełnia pomocniczą rolę przy wyznaczaniu adresu argumentu w adresacji względnej przekształcając 8- lub 10-bitowe przesunięcie (displacement) na 16-bitowy adres efektywny. Sposób obliczania tego adresu zaleŝy od kodu operacyjnego aktualnego rozkazu (pola f zapisanego na pozycjach <0:3> rejestru IR): - gdy f = 1000, na wyjściu adresatora pojawia się (IP + dsp10); - gdy f 1000, na wyjściu adresatora pojawia się (IP + dsp8). 5.2. Mikrooperacje Sygnały sterujące wykonaniem mikrooperacji są binarne; przyjęto, Ŝe sygnał jest aktywny (powoduje wykonanie danej mikrooperacji), gdy jego wartość jest równa 1. W dalszym opisie wyjątkiem są oznaczenia wadr i radr, które są wejściami adresowymi multiplekserów. 5.2.1. Mikrooperacje komunikacji z magistralą fadr fip fsp fmb fain faout fpsw tir tip tsp tar tmb tain ta1 ta2 tpsw przesłanie 16-bitowego adresu z wyjścia Adresatora na szynę przesłanie 16-bitowego adresu z licznika rozkazów IP na szynę przesłanie 16-bitowego adresu z wskaźnika stosu SP na szynę przesłanie 16-bitowego słowa z bufora pamięci MB na szynę przesłanie 16-bitowego słowa z rejestru pomocniczego AIN na szynę przesłanie 16-bitowego słowa z rejestru wyjściowego ALU na szynę przesłanie 16-bitowego słowa PSW (zawiera N,Z,V,C, IE, T) na szynę wpisanie 16-bitowego słowa z szyny do rejestru rozkazów IR wpisanie 16-bitowego słowa z szyny do licznika rozkazów IP wpisanie 16-bitowego słowa z szyny do wskaźnika stosu SP wpisanie 16-bitowego adresu z szyny do rejestru adresowego pamięci AR wpisanie 16-bitowego słowa z szyny do rejestru buforowego pamięci MB wpisanie 16-bitowego słowa z szyny do rejestru buforowego AIN podstawienie 16-bitowego słowa z rejestru buforowego AIN na 1. wejście ALU podstawienie 16-bitowego słowa z szyny na 2. wejście ALU wpisanie odpowiednich bitów z szyny do znaczników N (bit 0), Z (bit 1), V (bit 2), C (bit 3), IE (bit 7), T (bit 4) według struktury słowa PSW

5. Struktura 35 5.2.2. Mikrooperacje sterujące ALU add adc sub sbb and not shr shl ror rol shra inc swap dodawanie argumentów z we 1 i we 2; wynik w AOUT dodawanie argumentów z we 1 i we 2 z uwzględnieniem C; wynik w AOUT odejmowanie argumentów z we 1 i we 2; wynik w AOUT odejmowanie argumentów z we 1 i we 2 z uwzględnieniem C; wynik w AOUT iloczyn logiczny (AND) argumentów z we 1 i we 2; wynik w AOUT uzupełnienie logiczne argumentu z we 2; wynik w AOUT przesunięcie w prawo argumentu z we 2; wynik w AOUT przesunięcie w lewo argumentu z we 2; wynik w AOUT przesunięcie cykliczne w prawo argumentu z we 2; wynik w AOUT przesunięcie cykliczne w lewo argumentu z we 2; wynik w AOUT przesunięcie arytmetyczne w prawo argumentu z we 2; wynik w AOUT zwiększenie o 1 argumentu z we 2; wynik w AOUT zamiana bajtów argumentu z we 2; wynik w AOUT 5.2.3. Mikrooperacje działań na IP i SP inc1ip inc2ip inc2sp dec2sp zwiększenie o 1 zawartości rejestru IP zwiększenie o 2 zawartości rejestru IP zwiększenie o 2 zawartości rejestru SP zmniejszenie o 2 zawartości rejestru SP 5.2.4. Mikrooperacje sterujące pamięcią wrm rdm zapis słowa do pamięci odczyt słowa z pamięci 5.2.5. Mikrooperacje sterujące blokiem rejestrów tr fr zapis słowa z magistrali do rejestru wskazanego prze wadr przesłanie na magistralę słowa z rejestru wskazanego przez radr 5.2.6. Mikrooperacje działań na znacznikach sie ustawienie znacznika IE na 1 zie zerowanie znacznika IE cz uzupełnienie logiczne znacznika Z cc uzupełnienie logiczne znacznika C

36 5. Struktura 5.2.7. Mikrooperacje działań wejścia-wyjścia in out przekazanie do wybranego portu bajta z linii <0:7> szyny podstawienie bajta z wybranego portu na linie <8:15> szyny 5.3. Sterowanie Praca komputera jest synchronizowana wspólnym generatorem taktującym (zegarem), wyznaczającym najmniejszą jednostkę czasu - takt. Układ sterowania dostarcza w kaŝdym takcie sygnały sterujące do wybranych punktów struktury logicznej, powodując realizację jednej lub (częściej) kilku mikrooperacji, sekwencja takich działań powoduje wykonanie wszystkich akcji koniecznych dla skompletowania cyklu rozkazowego. PoniŜej podano wykaz takich sekwencji dla podstawowych etapów cyklu rozkazowego, w szczególności dla etapu wykonania wszystkich rozkazów z listy rozkazów 2K+. Sekwencje podają tylko kolejność czynności, a nie uwzględniają rzeczywistych czasów trwania poszczególnych kroków, gdyŝ to zaleŝy od fizycznej realizacji układów, np. szybkości działania pamięci operacyjnej. W cyklu rozkazowym moŝna wyróŝnić trzy podstawowe etapy: - pobranie rozkazu z pamięci do rejestru rozkazów, - dekodowanie pobranego rozkazu i przygotowanie argumentów (lub w niektórych przypadkach - adresów), - wykonanie operacji określonej przez rozkaz. Przed pobraniem następnego rozkazu, czyli rozpoczęciem kolejnego cyklu, sprawdzane jest ewentualne zgłoszenie przerwania i - w przypadku zgłoszenia - następuje - przyjęcie zgłoszenia i powołanie programu obsługi. 5.3.1. Pobranie rozkazu Do rejestru IR przesyłane są dwa początkowe bajty rozkazu (w rozkazach jednobajtowych drugi bajt nie jest dalej analizowany) co wystarcza do dekodowania funkcji (pole f) i sposobu adresowania (pole m) w rozkazach adresowych. PoniewaŜ w pierwszym kroku występuje sygnał odczytu pamięci (rdm), a w drugim odczytana informacja ma być przekazana na magistralę (fmb), to czas między nimi musi wynikać z szybkości działania pamięci (jej czasu dostępu). 1. krok: fip, tar, rdm - zaadresowanie pamięci według IP 2. krok: fmb, tir, inc1ip - przesłanie rozkazu (16 bitów) do hir oraz zwiększenie IP o 1