MARIE A Machine Architecture that is Really Intuitive and Easy http://computerscience.jbpub.com/ecoa Słowo 16b Dane: notacja dwójkowa, zapis w kodzie dopełnieniowym od 8000h (- 32,768 = -2^15) do 7FFFh (32,767= 2^15-1) kod dopełnieniowy:negujemy bity liczby bez znaku i dodajemy 1 Np. 23 ->17h->00010111 stąd 23->11101001->E9h Rozkaz: 4b kod operacji, 12b - adres wszystkie operandy rozkazów są adresami Pamięć: 4096 słów = 4K słów= 16*4096b=8kB
MARIE - dane i rozkazy 0 1 15 Dane Bit znaku 0 3 4 5 6 15 Kod operacji Adres Rozkaz Kod warunku
Rejestry 16-bitowe Akumulator (AC) przechowuje dane Rejestr rozkazów (IR) następny rozkaz do wykonania Rejestr buforowy pamięci (MBR) dane z/do pamięci 12-bitowe Licznik rozkazów (PC) adres następnej instrukcji Rejestr adresowy pamięci (MAR) adres danych w pamięci 8-bitowe (to błąd w książce) Rejestr wejściowy (InREG) dane z urządzenia we/wy Rejestr wyjściowy (OutREG) dane do urządzenia we/wy
Rejestry 16-bitowe Akumulator (AC) przechowuje dane Rejestr rozkazów (IR) następny rozkaz do wykonania Rejestr buforowy pamięci (MBR) dane z/do pamięci Rejestr wejściowy (InREG) dane z urządzenia we/wy Rejestr wyjściowy (OutREG) dane do urządzenia we/wy 12-bitowe Licznik rozkazów (PC) adres następnej instrukcji Rejestr adresowy pamięci (MAR) adres danych w pamięci
Lista rozkazów Kod hex Asembler 0000 0 JnS X 0001 1 Load X 0010 2 Store X 0011 3 Add X 0100 4 Subt X 0101 5 Input 0110 6 Output 0111 7 Halt 1000 8 Skipcond 1001 9 Jump X 1010 A Clear 1011 B AddI X 1100 C JumpI X
Opis rozkazów JnS X - ustaw PC na X i skocz do X+1 pozwala wywoływać procedury i podprogramy Load X załaduj M(X) do AC Store X - przechowaj zawartość AC pod adresem X Add X dodaj zawartość M(X) do AC i przechowaj wynik w AC Subt X odejmij M(X) od AC i przechowaj wynik w AC Input wprowadź wartość z klawiatury do AC Output wyprowadź zawartość AC na ekran Halt zakończ program
Opis rozkazów (c.d.) Skipcond pomiń następny rozkaz (PC<-PC+1) jeśli: (IR(4:5) = 00 & AC<0) (IR(4:5)=01 & AC=0) (IR(4:5)=10 & AC>0) IR(4:5) = 11 - błąd zastosowanie w pętlach while i wyrażeniach if Jump X załaduj M(X, 4:15) do PC i wykonaj skok Clear wyzeruj AC AddI X dodaj M(M(X)) do AC i przechowaj w AC JumpI X - załaduj M(M(X,4:15), 4:15) do PC i wykonaj skok
Asembler (kompilator) dokonuje konwersji z kodu źródłowego w języku asemblera (*.mas) na kod maszynowy (wykonywalny) (*.mex) Adres (hex) 100 101 102 103 104 105 106 Load 104 Add 105 Store 106 Halt 0023 FFE9 0000 Instrukcja Zawartość pamięci (hex) 1104 3105 2106 7000 0023 FFE9 0000 Program dodający dwie liczby (bez i z etykietami) Adres (hex) 100 101 102 103 X, 104 Y, 105 Z, 106 Instrukcja Load X Add Y Store Z Halt 0023 FFE9 0000
Asembler ma dwa przebiegi w pierwszym konstruuje tablicę symboli (*.map) X Y Z 104 105 106 w drugim wstawia dane z tablicy symboli Adres (hex) 100 101 102 Instrukcja Load X Add Y Store Z Zawartość pamięci (hex) 1104 3105 2106
Dyrektywy asemblera: ORG, OCT, DEC, HEX Adres (hex) 100 101 102 103 X, 104 Y, 105 Z, 106 Instrukcja Org 100 Load X Add Y Store Z Halt /koniec OCT 43 DEC -23 HEX 0000
Symulator MARIE v1.2 (v1.3.01) Instalacja wymagana java 1.4 (1.4.2) sdk jar xvf MarieSim.jar set CLASSPATH=C:\j2sdk1.4.0_01\marie kod źródłowy: MarieSource.jar Działanie symulatora edycja (edit) kodu źródłowego (*.mas) asemblacja do pliku *.mex; listing z asemblacji w pliku *.lst ładowanie (load) z pliku *.mex wykonanie (run): praca krokowa (step), punkty przerwań (breakpoints) tablica symboli (symbol map) w pliku *.map zrzut pamięci (core dump) do pliku *.dmp
Symulator MARIE (1)
Symulator MARIE (2)
Przykład 1 ORG 100 /Przykład 4.1 - sumowanie pięciu liczb Load Addr /Wczytaj adres pierwszej dodawanej liczby Store Next /Zachowaj ten adres jako nasz wskaźnik Next Load Num /Wczytaj liczbę elementów do zsumowania Subt One /Zmniejsz wartość o 1 Store Ctr /Zachowaj ten adres w Ctr. Będzie ona kontrolowała pętlę Clear /Wyczyść AC Loop, Load Sum /Wczytaj Sum do AC AddI Next /Dodaj wartość, na którą wskazuje lokalizacja Next Store Sum /Zachowaj tę sumę Load Next /Wczytaj Next Add One /Zwiększ ją o 1, tak aby wskazywała na następny adres Store Next /Zachowaj ją w naszym wskaźniku Next Load Ctr /Wczytaj zmienną sterującą pętli Subt One /Odejmij jeden od zmiennej sterującej pętli Store Ctr /Zapisz tę nową wartość w zmiennej sterującej pętli Skipcond 000 /Jeśli zmienna sterująca < 0, pomiń następną instrukcję Jump Loop /W przeciwnym przypadku przejdź do Loop Halt /Zakończ program Addr, Hex 118 /Liczby, które mają być zsumowane zaczynają się od adresu 118 Next, Hex 0 /Wskaźnik do następnej liczby do zsumowania Num, Dec 5 /Liczba wartości, które trzeba dodać Sum, Dec 0 /Suma Ctr, Hex 0 /Zmienna sterująca pętli One, Dec 1 /Wykorzystywana do zwiększania i zmniejszania wartości o 1 Dec 10 /Wartości, które mają być zsumowane Dec 15 Dec 20 Dec 25
Przykład 2 ORG 100 /Przykład 4.2 - Konstrukcja if/else If, Load X /Wczytaj pierwszą wartość Subt Y /Odejmij wartość Y i zachowaj wynik w AC Skipcond 400 /Jeśli AC=0, pomiń następną instrukcję Jump Else /Jeśli AC nie jest równe 0, skocz do części Else Then, Load X /Ponownie wczytaj X, aby można było podwoić jego wartość Add X /Podwój wartość X Store X /Zapisz nową wartość Jump Endif /Przeskocz nad częścią Else do końca If Else, Load Y /Rozpocznij część Else, wczytując Y Subt X /Odejmij X od Y Store Y /Zapisz w Y wartość Y-X Endif, Halt /Zakończ program X, Dec 12 /Wartość X Y, Dec 20 /Wartość Y
Przykład 3 Loop, ORG Load Store JnS Store Load Store 100 /Przykład 4.3 - procedura X /Wczytaj pierwszą liczbę, którą należy podwoić Temp /Użyj Temp w charakterze parametru, za pośrednictwem /którego zostanie przekazana wartość do Subr Subr /Zachowaj adres powrotny, skocz do procedury X /Zapisz pierwszą podwojoną liczbę Y /Wczytaj drugą liczbę, którą należy podwoić Temp /Użyj Temp w charakterze parametru, za pośrednictwem /którego zostanie przekazana wartość do Subr Subr /Zachowaj adres powrotny, skocz do procedury JnS Store Y /Zapisz drugą podwojoną liczbę Halt /Zakończ program X, DEC 20 /Wartość X Y, DEC 48 /Wartość Y Temp, DEC 0 /Obszar roboczy Subr, HEX 0 /Przechowaj adres powrotny w tym miejscu Clear Load Add JumpI END /Wyczyść AC, ponieważ był on zmodyfikowany przez JnS Temp /Podprocedura podwajająca liczby Temp /AC przechowuje teraz podwojoną wartość Temp Subr /Wróć do wywołującego kodu