Kierunek INOMATYKA Specjalność "Informatyka morska" Przedmiot Architektura Systemów Komputerowych Wstęp w pracy laboratoryjne Architektura mikrokomputera SimpSim, programowanie na Asemblerze i kompilacja na język maszynowy Prof. zw. dr hab. Evgeny Ochin 1 Szczecin, 2016 1 Dydaktyka E.Ochina http://goo.gl/swlzjr Praca naukowa E.Ochina http://goo.gl/jvjix
Spis treści Niektóre notacji i definicje... 3 Architektura mikrokomputera SimpSim... 4 Zasada sterowania programowego... 5 Wejście i dodawanie dwóch liczb całkowitych... 5 Wejście, dodawanie i odejmowanie dwóch liczb całkowitych... 7 Organizacja cyklów za pomocy operacji jmple... 8 Organizacja przesunięcia cyklicznego w prawo za pomocy operacji ror... 10 Symulator mikrokomputera SimpSim... 13 Kod maszynowy do MK SimpSim... 13 Kod Asemblera do MK SimpSim... 13 Dodawanie dwóch liczb na Asemblerze... 14 Mnożenie przez dodawanie na Asemblerze... 14 Lądowanie operandów mikrokomputera SimpSim... 15 Asembler mikrokomputera SimpSim (szczegółowy opis)... 16 Przykłady programowania na Asemblerze mikrokomputera SimpSim... 21 Program Hello world... 21 Program dodawania liczb całkowitych... 22 Program dodawania liczb zmiennoprzecinkowych... 22 Program odwracania kolejności danych... 23 Program sortowania danych z najmniejszych do największych... 24 Krótko o mikroprogramowaniu mikrokomputera SimpSim... 26 Literatura... 28 Strona 2
Niektóre notacji i definicje Bit b (ang. bit = binary digit) jest to najmniejsza jednostka pamięci komputerowej. Bit przyjmuje dwa znaczenia bє{0,1}. Bajt B (ang. Byte) jest to ciąg 8 bitów, numerowanych od prawej do lewej B[7:0] lub od lewej do prawej B[0:7]. Tabela 1. Definicja bajtu 1B=8b, bity numerowane od prawej do lewej 1B=8b, bity numerowane od lewej do prawej Słowo W (ang. Word) jest to ciąg 16 bitów, numerowanych od prawej do lewej W[15:0] lub od lewej do prawej W[0:15]. Słowo podwójne WW jest to ciąg 32 bitów, numerowanych od prawej do lewej WW[31:0] lub od lewej do prawej WW[0:31]. Kilobajt KB jest to ciąg 2 10 =1024 bajtów, numerowanych od lewej do prawej KB(0:2 10-1)[7:0]. Megabyte MB jest to ciąg 2 20 =1024x1024 bajtów, numerowanych od lewej do prawej MB(0: 2 20-1)[7:0]. Gigabyte GB jest to ciąg 2 30 =1024x1024x1024 bajtów, numerowanych od lewej do prawej GB(0: 2 30-1)[7:0]. Dalej są jednostki informacyjne terabyte, petabyte, exabyte i inne. SL Systemy Liczbowe SL 2 SL dwójkowy SL 16 SL szesnastkowy SL 10 SL dziesiętny SL 2-10 SL dwójkowo-dziesiętny MK Mikro Komputer Mikroprogramowalny układ sterujący to układ o stałej strukturze sprzętowej, którego działanie jest opisane tzw. mikroprogramem. Program ten zapisywany jest w pamięci układu (OM (ys.21), POM lub EPOM) zwanej pamięcią sterowania. Mikrooperacją nazywa się elementarną czynność możliwą do wykonania w danym układzie w jednym takcie jego pracy. Mikrorozkazem nazywa się słowo dwójkowe określające sygnały wyjściowe w układzie sterującym. Słowo to jest przechowywane w pamięci (OM (ys.21), POM lub EPOM) i powoduje wykonanie jednej lub kilku mikrooperacji. Mikroinstrukcją nazywa się sformalizowany zapis opisujący czynności wykonywane przez układ sterujący w jednym elementarnym takcie jego pracy. Mikroprogramem nazywa się sekwencję mikroinstrukcji (słów sterujących). Mikroprogramowaniem poziomym nazywać będziemy taki sposób pracy układu sterującego, w którym generowanie sygnałów sterujących, wykonaniem mikrooperacji jest takie, że każdy bit mikrorozkazu reprezentuje niezależny sygnał sterujący. Przy takim sposobie mikroprogramowania każdy rozkaz ma od razu format mikrorozkazu. Mikrooperacje są kodowane w kodzie 1 z N. Mikroprogramowaniem pionowym nazywać będziemy taki sposób pracy układu sterującego, w którym wykonanie rozkazu polega na zainicjowaniu odpowiedniej sekwencji mikrorozkazów reprezentujących mikroprogram a kody mikrorozkazów tworzą sektory przyporządkowane wykonywanym funkcjom sterującym (mikrooperacjom). Mikrooperacje są kodowane dowolnym kodem (ys.21). Mikro Komputer = Procesor + Pamięć rejestrowa () + Pamięć główna () + Układy Wejścia/Wyjścia danych + Magistrale danych, adresowa i sterująca ys. 1. Architektura najprostszego mikrokomputera Procesor = Jednostka Arytmetyczno-Logiczna (ALU) + Licznik programowy (PC) + ejestr rozkazów (I) Strona 3
Architektura mikrokomputera SimpSim Mikrokomputer SimpSim (MK SimpSim) nie istnieje w sprzęcie. aczej jest to symulacja sprzętu przy użyciu programów uruchamianych na komputerach z systemem Windows i Linux. SimpSim reprezentuje wielu z rzeczywistych cech prawdziwych komputerów. Architektura mikrokomputera SimpSim została opracowana w holenderskim Uniwersytecie Twente 2 wyłącznie do celów edukacyjnych. Kierownik projektu dr Anne-Gert Bultena potwierdziła, że Akademia Morska w Szczecinie mogą korzystać Symulator Mikrokomputera SimpSim bez ograniczeń 3. ys. 2. Architektura mikrokomputera SimpSim adresacjia pamęci rejestrowej (Asembler SimpSim) adresacjia pamęci glównej (Asembler SimpSim) ALU(addi, addf, and, or, xor, ror) o[7:0]=db[0].db[6:0] 4 PC[7:0] I[15:0] Pamięć rejestrowa (0:15)[7:0] organizowana jako zestaw 16 rejestrów jednobajtowych z umożliwia jednoczesnego odczytu pary operandów. Pamięć główna (0:255)[7:0] organizowana jako zestaw 256 komórek jednobajtowych. 2 HTTP://WWW.UTWENTE.NL/EN/?GCLID=CJWKEAJWXMETBDJX6SZ2P7DSQ0SJADJHAQNEAOS-NUYVC8MJXXXBUBIIWD5CQ_CNXTJYY_9INISOC37W_WCB 3 HTTPS://SITES.GOOGLE.COM/SITE/TECHNOLOGIESIECIOWEAM/HOME/ZADANIE-DOMOWE-N1/LICENSE-SIMPSIM 4 TUTAJ KOPKA (.) OZNACZA KONKATENACJI, TZN POŁĄCZENIE DWÓCH CIĄGÓW BITOWYCH Strona 4
Zasada sterowania programowego Begin [00:) 0; PC:=0; [0:] 0 I:=[PC].[PC+1] PC:=PC+2 I 3 =C (halt) 0 1 End Deczyfracja kodu rozkazu I3 Wykonanie operacji I3 ys. 3. Zasada sterowania programowego Wejście i dodawanie dwóch liczb całkowitych ys. 4. Program wejścia (load) i dodawania dwóch liczb całkowitych B=B +B (addi skrót od addition integer) Strona 5
ys. 5. Dump (treśći) pamęci mikrokomputera SimpSim po wykonaniu operacji B=B +B ys. 6. Struktura mikrokomputera SimpSim: wykonanie pozkazu Addi 321 Strona 6
Wejście, dodawanie i odejmowanie dwóch liczb całkowitych ys. 7. Program wejścia, dodawania i odejmowanie dwóch liczb całkowitych (B=B +B i B=B -B ) ys, 8. Dump (treści) pamięci mikrokomputera SimpSim po wykonaniu operacji B=B +B (halt perwszy) Strona 7
ys. 9. Dump (treści) pamięci mikrokomputera SimpSim po wykonaniu operacji B=B -B (halt drugi) Organizacja cyklów za pomocy operacji jmple ys. 10. Aplikacja operacji jmple Strona 8
ys. 11. Dump (treści) pamięci mikrokomputera SimpSim po wykonaniu operacji Cicle jmple ys. 12. Struktura mikrokomputera SimpSim: wykonanie pozkazu jmple A<=0, 06 Strona 9
Organizacja przesunięcia cyklicznego w prawo za pomocy operacji ror ys. 13. Aplikacja operacji przesunięcia cyklicznego w prawo na 3 bity ys. 14. Dump (treści) pamięci mikrokomputera SimpSim po wykonaniu operacji przesunięcia cyklicznego w prawo na 3 bity Strona 10
ys. 15. Struktura mikrokomputera SimpSim: wykonanie przesunięcia cyklicznego w prawo na 3 bity ys. 16. Przesunięcie cykliczne w prawo na 1 bit Strona 11
ys. 17. Dump (treści) pamięci mikrokomputera SimpSim po wykonaniu przesunięcia cyklicznego w prawo na 1 bit Strona 12
Symulator mikrokomputera SimpSim Kod maszynowy do MK SimpSim MK SimpSim pozwala programom do wykonania tylko na poziomie kodów maszynowych. Kod maszynowy jest na najniższym poziomie abstrakcji. Użytkownik nie musi myśleć o takich rzeczach jak PC, I lub szczegóły cyklu maszyny. Wszystkie instrukcje komputerowe składa się z kodu operacji i pola argumentu. Dla MK SimpSim kod operacji składa się z 4 bitów (jest to możliwe mieć do 16 różnych instrukcji). Pole argument ma dwa formaty (Tab. 2). Tabela 2. ormaty instrukcji 4 bit 4 bit 4 bit 4 bit ormat I KOP L M N ormat II KOP L Adres Adding two numbers using machine code: Adres Kod maszynowy Wyjaśnienie 00 01 10 0A 0:=(OA) 02 03 11 0B 1:=(OB 04 05 52 01 2:=0+1 (dodawanie całkowite) 06 07 32 0C (0C):=2 08 C0 09 00 wstrzymanie komputera 0A 12 komórka ma wartość 12 hex, który jest 18 w systemie dziesiętnym 0B AC komórka ma wartość AC hex, która jest 172 w systemie dziesiętnym 0C 00 komórka dostaje odpowiedź od dodania Kod Asemblera do MK SimpSim Assembly code is the next level up in abstraction from machine code. The assembly code is run through the assembler (a kind of software) that converts the code to machine code that the machine recognizes. Assembly code is a level down in abstraction from high level code such as Python. It is easier to write assembly code than machine code but not as easy as high level code. Assembly code is specific to a particular machine architecture. The assembly code for an Intel processor is different than that for say a Motorola processor. This is a disadvantage of assembly code since most high level languages can be recompiled for a new architecture with very few changes. Send me email telling me you read this so I can see if students are taking advantage of this. Please do not tell friends - no grade is involved here. This is for information purposes only. The advantages of assembly code are that it creates very fast machine code - faster in many cases than high level code. It also allows access to specific hardware devices with their own characteristics. Kod Asemblera jest wyższy poziom abstrakcji od koda maszynowego. Asembler (oprogramowanie) konwertuje kod Asemblera do kodu maszynowego, że urządzenie rozpoznaje. Łatwiej jest napisać kod Asemblera niż kod maszynowy, ale nie jest tak proste jak kod na języku wysokiego poziomu, na przykład na Paskale. Kod Asemblera jest specyficzne dla każdej innej architektury maszyny - kod Asemblera do procesora Intel jest inny niż do procesora Motorola. To jest wadą Asemblera, ponieważ większość kodu Asemblera powinna być ponownie skompilowana dla nowej architektury. Korzyści z kodem Asemblera jest to, że tworzy bardzo szybki kod maszynowy - szybciej niż w wielu przypadkach kodu wysokiego poziomu. Strona 13
Dodawanie dwóch liczb na Asemblerze Etykieta Kod operacji Argument Wyjaśnienie load 0, [val1] 0:= (vol1)= (OA) load 1, [val2] 1:= (vol2) = (OB) addi 2, 1, 0 2:=0+1 (dodawanie całkowite) store 2, [ans] (ans)= (0C):=2 halt val1: db 18 val2: db 172 wstrzymanie komputera komórka ma wartość 12 hex, który jest 18 w systemie dziesiętnym komórka ma wartość AC hex, która jest 172 w systemie dziesiętnym val3: db 0, [val1] komórka dostaje odpowiedź od dodania Mnożenie przez dodawanie na Asemblerze Etykieta Kod operacji, gdzie B mnożna, B mnożnik, B iloczyn. Argument Wyjaśnienie load 1, [val1] mnożna load 0, [val2] mnożnik load 2, [zero] Iloczyn 2:=0 load 3, [one] 3:=1 move 4, 3 4:=3=1 loop: addi 2, 1, 2 2:=2+1 addi 4, 4, 3 4:=4+1 jmple 4<=0, loop If 4<=0 then goto loop store 2, [ans] (ans):=2 halt wstrzymanie komputera val1: db 3 komórka ma wartość 3 val2 db 7 komórka ma wartość 7 zero: db 0 komórka ma wartość 0 one: db 1 komórka ma wartość 1 ans: db 0 komórka dostaje odpowiedź od mnożenia (ans)= (vol1)*(vol2) Strona 14
16 rejestrów 0 Licznik programowy PC:=0 256 komórek pamięci głównej [00] [] ejestr rozkazów [01]= 0110 0000 Wyniki kompilacji []= 0000 0000 Otworzyć program w asemblerze Uruchomić program Uruchomić program krokami Pisać program w asemblerze Wyczyścić, i, PC ys. 18. Główne okno symulatora SimpSim Lądowanie operandów mikrokomputera SimpSim a) b) c) Program ładowania pary operandów B' i B" i operacji B=B +B. a) ładowanie pary operandów B' i B" w systemie dziesiętnym; b) ładowanie pary operandów B' i B" w systemie dwójkowym; c) ładowanie pary operandów B' i B" w systemie szesnastkowym. Strona 15
Asembler mikrokomputera SimpSim (szczegółowy opis) Kod operacji 2 ozkaz asemblera i kompilacja w kod maszynowy (=>) load N,XY=> 2N,XY N:=XY; load 3,9 ;=> 23,09 Przykład (opis) load 3,9 ;=> 23,09 00 0010 0011 0 01 0000 1001 1 02 2 03 3 0000 1001 E E I 0010 0011 0000 1001 3 store N, [XY]=>3N,XY [XY]:=N; load 3,9 ;=> 23,09 store 3,[Eh];=>33,E; PC 0000 0000 PC:=PC+2 load 3,9 ;=> 23,09 store 3,[Eh];=>33,E; 00 0010 0011 0 01 0000 1001 1 02 0011 0011 2 03 1111 1110 3 0000 1001 E 0000 1001 E I 0011 0011 1111 1110 1 load N,[XY]=>1N,XY N:=[XY]; load 1,[02h];=>11,02 PC 0000 0010 PC:=PC+2 load 1,[02h] ;=>11,02 00 0001 0001 0 01 0000 0010 1 1111 1111 02 1111 1111 2 03 3 0000 1001 E E I 0001 0001 0000 0010 4 move N, M=>4N,M0 N:= M; load 2,09;=>22,09 move 0,2;=>40,20 PC 0000 0000 PC:=PC+2 load 2,09 ;=>22,09 move 0,2 ;=>40,20 00 0100 0000 0 0000 1001 01 0010 0000 1 02 2 0000 1001 03 3 E E I 0100 0000 0010 0000 PC 0000 0000 PC:=PC+2 Strona 16
addi L, M, N=>5L,MN L:=M+N; 0=1+ 2 ALU addi 5 load 1,18 ;=>21,18 load 2,09 ;=>22,09 addi 0,1,2;=> 50,12 00 0101 0000 0 0001 0001 01 0001 0010 1 0000 1000 02 2 0000 1001 03 3 E E I 0101 0000 0001 0010 addf L, M, N=>6L,MN; L:=M+N; PC 0000 0000 PC:=PC+2 0=1+ 2 ALU addf 6 load 1,18 ;=>21,18 load 2,09 ;=>22,09 addf 0,1,2;=> 60,12 00 0110 0000 0 0001 1100 01 0001 0010 1 0001 1000 02 2 0000 1001 03 3 E E I 0110 0000 0001 0010 or L, M, N=>7L,MN L:=M or N; PC 0000 0000 PC:=PC+2 0=1v 2 ALU or 7 load 1,00011000b;=>21,18 load 2, 00001001b;=>22,09 or 0,1,2;=> 70,12 00 0111 0000 0 0001 1001 01 0001 0010 1 0001 1000 02 2 0000 1001 03 3 E E I 0111 0000 0001 0010 PC 0000 0000 PC:=PC+2 Strona 17
and L, M, N=>7L,MN L:=M and N; 0=1 & 2 ALU and 8 load 1,00011000b;=>21,18 load 2, 00001001b;=>22,09 and 0,1,2;=> 70,12 00 1000 0000 0 0000 1000 01 0001 0010 1 0001 1000 02 2 0000 1001 03 3 E E I 1000 0000 0001 0010 xor L, M, N=>7L,MN L:=M xor N; PC 0000 0000 PC:=PC+2 0=1 2 ALU xor 9 A load 1,00011000b;=>21,18 load 2, 00001001b;=>22,09 xor 0,1,2;=> 70,12 Cykliczne przesunięcie w prawo (ror rotate to the right) ror N,M=>AN,M0 N= cykliczne przesunięcie N w prawo o K pozycjach bitowych. load 2,00011000b; =>21,18 move 1, 2; =>41,20 ror 1,2; =>A1,02; cykliczne przesunięcie zawartości rejestru 1 w prawo o 2 pozycjach bitowych, 1:= 1[1:0].1[7:2] 00 1001 0000 0 0001 0001 01 0001 0010 1 0001 1000 02 2 0000 1001 03 3 E E I 1001 0000 0001 0010 PC 0000 0000 PC:=PC+2 load 2,00011000b; =>21,18 move 1, 2; =>41,20 ror 1,2; =>A1,02; 00 1010 0001 0 01 0000 0010 1 00000110 02 2 00011000 03 3 E E I 1010 0001 0000 0010 PC 0000 0000 PC:=PC+2 1= b' 7 b' 6 b' 5 b' 4 b' 3 b' 2 b' 1 b' 0 1= b" 1 b" 0 b" 7 b" 6 b" 5 b" 4 b" 3 b" 2 Strona 18
jmpeq N=>0, XY if N=0 then PC:=XY (skok warunkowy) jmpeq 2=0, 14=> B2,0E; if 2=0 then PC:=14 jmpeq 2=0,14 ALU = 00 1011 0010 0 0001 0001 01 0000 1110 1 02 2 0000 0001 03 3 E E I 1011 0010 0000 1110 PC 0000 1110 PC:=PC+2 jmpeq 2=0,14 ALU = B jmpeq N=0, etykieta if N=0 then PC:= etykieta (skok warunkowy) jmpeq 2=0, End=> B2,0E; if 2=0 then PC:=End; {End=0E} jmp XY jmpeq 0=0, XY PC := XY; (skok bezwarunkowy) jmp 12=> B0,0C; PC := 12; 00 1011 0010 0 0001 0001 01 0000 1110 1 02 2 0000 0001 03 3 E E I 1011 0010 0000 1110 PC 0000 1110 PC:=PC+2 jmp 12 ALU = 00 1011 0000 0 0001 0001 01 0000 1110 1 02 2 03 3 E E I 1011 0000 0000 1110 PC 0000 1110 PC:=PC+2 Strona 19
D load N, [M]=>DN,[M] N := [M] load 1, [2]=> D0,12; 1 := [2] load 1, [2]; =>D0,12; 1 := [2] 00 1101 0000 0 01 0001 0010 1 0000 1111 02 2 1111 1110 03 3 E 0000 1111 E I 1101 0000 0001 0010 PC 0000 0000 PC:=PC+2 E store N, [M]=>EN,M [M] := N store 1, [2]; =>E0,12 [1] := 2 jmple N<=0, XY=>N,XY if N<=0 then PC:=XY (skok warunkowy) jmple 2<=0,14=> 2,0E; if 2<=0 then PC:=14 store 1, [2]; =>E0,12; [1] := 2 00 1110 0000 0 01 0001 0010 1 1000 1111 02 2 1111 1110 03 3 E 1000 1111 E I 1110 0000 0001 0010 PC 0000 0000 PC:=PC+2 jmple 2<=0,14 ALU <= 00 1011 0010 0 0000 0001 01 0000 1110 1 02 2 0000 1001 03 3 E E I 1011 0010 0000 1110 C halt Pseudo-Operacji db N db M,N,.. db "string",0 org addr PC 0000 1110 PC:=PC+2 Pseudo-Operacji mikrokomputera SimpSim Opis DATA BYTE: umieszczenie określonej wartości (s) w kolejnej lokalizacji pamięci (s). Bajty danych może być określony pojedynczo, na liście oddzielone przecinkami, lub jako ciąg znaków (zamknięty w cudzysłowie). Przykłady: db 1,4,9,16,25,36 db "Hello, world",10,0 (ciąg zakończony zerem, ze znakiem nowego wiersza następujące znaki druku) OIGIN: Umieść następną instrukcję lub bajt danych na adres pamięci addr. Pozwala to program lub informacje być umieszczone w dowolnych miejscach w pamięci. Strona 20
Przykłady programowania na Asemblerze mikrokomputera SimpSim Program Hello world ; Hello world.asm ; Ten program w asemblerze SimpSim drukuje prostą wiadomość. ; To pokazuje: ; asemblowanie na język maszynowy ; Segmenty programu i danych w pamięci ; drukowanie (z wykorzystaniem ) ; bezpośrednie, natychmiastowe, jak i pośrednie ładowanie danych ; labels warunkowe i bezwarunkowe skoki z etykietami ; dodawanie całkowite ; zatrzymanie ; bajty danych całkowite i tekstowe load 1,Text ; początek tekstu load 2,1 ; wzrost load 0,0 ;tekst-terminator NextChar:load,[1] ; uzyskać znak i wydrukować go na ekranie addi 1,1,2 ; wzrost adresu jmpeq =0,eady ; kiedy tekst-terminator, gotowe jmp NextChar ; następny znak eady: halt org 20h ;; Zaczyna się segment danych 0x20 Text: db 10 db "Hello world!!",10 db " from the",10 db " Simple Simulator",10 db 0 ; tekst-terminator Strona 21
Program dodawania liczb całkowitych load A,87d ; Konwersja D'10 => B'2= ; =Z' b'6 b'5 b'4 b'3 b'2 b'1 b'0 ; i zapisywanie w rejestr N10 (A) load B,-92d ; Konwersja D''10 => B''2= ; Z'' b''6 b''5 b''4 b''3 b''2 b''1 b''0 ; i zapisywanie w rejestr N11 (B) addi C,A,B ; Wykonanie operacji B=B'+B''=87-92=-5 ; i zapisywanie sumy (B) w rejestr N12 (C) halt ; Stop programu B=11111011b=-5 Program dodawania liczb zmiennoprzecinkowych load 0,10010011b ; 0:=-(3/16)*2^(1-4)=-3/128 load 1,00110010b ; 1:=(2/16)*2^(3-4)=1/16 addf 2,1,0 ; 2:=1+2 jako loat halt ; -3/128+1/16=5/128 OA=00001010b=10/16*2^(0-4)=5/128 Strona 22
Program odwracania kolejności danych ; Ten program w asemblerze SimpSim odwraca kolejność danych. ; Dane wejściowe: 1,12,23,34,45,56 ; Dane wyjściowe: 56, 45, 34, 23, 12, 1 ;; 1. Załaduj wskaźniki Lo i Hi, jako początek i koniec danych load 1,Data ; Lo wskaźnik (początek danych) load 2,EndOfData ; Hi wskaźnik (koniec danych) load 3,1 ; zwiększyć wskaźnik Lo load 4,-1 ; zmniejszyć wskaźnik Hi addi 2,2,4 ; zmniejszanie wskaźniku Hi do ostatniego elementu danych Loop: ;; 2. Sprawdź, czy skończyliśmy (if Hi <= Lo) move 0,1 ; Kopiowanie wskaźniku Lo w 1 do 0 jmple 2<=0,Done ; If (Hi <= Lo) skocz do Done ;; 3. Wymiana [Hi] i [Lo] load 5,[1] ; Załaduj [Lo] do 5 load 6,[2] ; Załaduj [Hi] do 6 store 5,[2] ; Załaduj 5 ([Lo]) do [Hi] store 6,[1] ; Załaduj 6 ([Hi]) do [Lo] ;; 4. Przesuń Lo wyższej jednym i Hi niżej jednym addi 1,1,3 ; Dodaj jeden do Lo addi 2,2,4 ; Odejmij jeden z Hi ;; 5. Kontynuuj pętli jmp Loop Done: ;; 6. Halt -- Skończyliśmy! halt org 20h ; rozpocząć segment danych w pamięci (lokalizacja 20h) Data: db 1h,12h,23h,34h,45h,56h,67h,78h,89h,9Ah EndOfData: db 0 ; Terminator danych Dane wejściowe: 1,12,23,34,45,56 Dane wyjściowe: 56,45,34,23,12,1 Strona 23
Program sortowania danych z najmniejszych do największych ; Ten program w asemblerze SimpSim sortuje dane z najmniejszych do największych. ; Dane wejściowe: 2,77,3,66,4,55,5,44,6,33,7,22,8,11,9 ; Dane wyjściowe: 2,3,4,5,6,7,8,9,11,22,33,44,55,66,77 ;; 1. Załaduj wskaźniki Lo i Hi, jako początek i koniec danych load 1,Data ; Lo wskaźnik (początek danych) load 2,EndOfData ; Hi wskaźnik (koniec danych) load 3,1 ; zwiększyć wskaźnik Lo load 4,-1 ; zmniejszyć wskaźnik Hi addi 2,2,4 ; zmniejszanie wskaźniku Hi do ostatniego elementu danych OuterLoop: ;; 2. Sprawdź, czy skończyliśmy (if Hi <= Lo) move 0,1 ; 0 Kopiowanie wskaźniku Lo w 1 do 0 jmple 2<=0,Done ; If (Hi <= Lo) skocz do Done ;; 3. Ustaw lowestemainingpointer (5) na bieżący wskaźnik Lo (1) move 5,1 ;; 4. Ustaw lowestemaining (6) do M[bieżący wskaźnik Lo] load 6,[1] ;; 5. Ustaw nextcheckpointer (7) do wskaźniku Lo + 1 move 7,1 ;; 7 <- 1 (wskaźnik Lo) addi 7,7,3 ;; 7 <- 7 + 1 (wskaźniku Lo + 1) InnerLoop: ;; 6. Jeśli HiPointer < nextcheckpointer, iść do inishinnerloop move 0,7 ;; 0 <- 7 (nextcheckpointer) addi 0,0,4 ;; 0 <- nextcheckpointer - 1 jmple 2<=0,ContinueOuterLoop ;; 2 jest HiPointer ;; 7. Jeśli wartość w M[nextCheckPointer] <= M[lowestemainingPointer] ;; ustaw lowestemainingpointer i lowestemaining w nextcheck move 0,6 ;; 0 <- lowestemaining (= M[lowestemainingPointer]) load 8,[7] ;; 8 <- M(nextCheckPointer) jmple 8<=0,oundLower ;; Znaleziony dolna, więc przechowywać go jmp ContinueInnerLoop ;; Jeśli nie znaleźliśmy jedną, część przechowującą pominąć oundlower: move 5,7 ;; lowestemainingpointer <- nextcheckpointer; move 6,8 ;; lowestemaining <- M[nextCheckPointer]; ContinueInnerLoop: ;; 8. wzrost nextcheckpointer i kontynuować z InnerLoop addi 7,7,3 ;; nextcheckpointer <- nextcheckpointer + 1; jmp InnerLoop ContinueOuterLoop: ;; 9. Znaleźliśmy lowestemaining numer i jego wskaźnik ;; Więc zamienić M[Lo Pointer] z M[lowestemainingPointer] load 9,[1] ;; 9 <- M[Lo Pointer] store 6,[1] ;; M[Lo Pointer] = M[lowestemainingPointer] store 9,[5] ;; M[lowestemainingPointer] = stary M[Lo Pointer] ;; 10. zwiększyć Lo Pointer i kontynuować z OuterLoop addi 1,1,3 ;; LoPointer = LoPointer + 1; jmp OuterLoop Done: ;; 11. Halt -- Skończyliśmy! halt org 0x40 ; rozpocząć segment danych w pamięci (lokalizacja 40h) Data: db 2h,77h,3h,66h,4h,55h,5h,44h,6h,33h db 7h,22h,8h,11h,9h EndOfData: db 0 ; Terminator danych Strona 24
Dane wejściowe: 2,77,3,66,4,55,5,44,6,33,7,22,8,11,9 Dane wejściowe: 2,3,4,5,6,7,8,9,11,22,33,44,55,66,77 Strona 25
Krótko o mikroprogramowaniu mikrokomputera SimpSim ysunek 19. Zasada sterowania programowego mikrokomputera SimpSim Strona 26
ys. 20. Zasada sterowania mikroprogramowego i struktura mikroprogramy mikrokomputera SimpSim Strona 27
ys. 21. Struktura automatu mikroprogramowego mikrokomputera SimpSim Literatura 1. Ochin E. Systemy Liczbowe Wykład 03, http://youtu.be/zjugpl-pwh4 2. Ochin E. Systemy liczbowe. Lulu Publishing, aleigh, North Carolina, USA, 2010 3. Ochin E. Akademia Morska, wydz. Nawigacyjny, kier. "TANSPOT", przedm. "IT", http://youtu.be/27u6r_z38 4. Wałaszek J 5. Systemy liczenia. http://edu.i-lo.tarnow.pl/inf/utils/012_2012/0102.php 5. Wałaszek J. Zapis w systemie uzupełnień do 2 - U2, http://edu.i-lo.tarnow.pl/inf/alg/006_bin/0018.php 6. Wałaszek J. System U2. http://edu.i-lo.tarnow.pl/inf/utils/012_2012/0103.php 7. Wałaszek J. Algorytmy. http://edu.i-lo.tarnow.pl/inf/utils/012_2012/0104.php 8. Wałaszek J. Informacja w komputerze. http://edu.i-lo.tarnow.pl/inf/utils/012_2012/0002.php 9. Wałaszek J. Sieci komputerowe. http://edu.i-lo.tarnow.pl/inf/utils/012_2012/0003.php 10. Dydaktyka E.Ochina http://goo.gl/swlzjr 11.Praca naukowa E.Ochina http://goo.gl/jvjix Linki wideo 1. Ochin E. Systemy Liczbowe Wykład 03, http://youtu.be/zjugpl-pwh4 2. System ósemkowy - Jak przeliczać liczby na system oktalny? [holicy.pl] http://www.youtube.com/watch?feature=fvwp&v=0acvnbqz9we&n=1 3. System hexadecymalny - zamiana liczb na system szesnastkowy [holicy.pl] http://www.youtube.com/watch?v=_t393utga98 4. Pozycyjny system liczbowy: wprowadzenie http://www.youtube.com/watch?v=k5kijxwnn2q 5. [Systemy liczbowe] Całkowite liczby binarne i dziesiętne - przeliczanie [helpbay.org] http://www.youtube.com/watch?v=evq6e85p50 5 I LICEUM OGÓLNOKSZTAŁCĄCE IM. KAZIMIEZA BODZIŃSKIEGO W TANOWIE MG JEZY WAŁASZEK, HTTP://EDU.I-LO.TANOW.PL/ Strona 28