220 likes | 493 Views
KOMPIUTERIŲ ARCHITEKTŪRA (SMALL – nauja versija ). Doc. Stasys Maciulevičius Kompiuterių katedra sta sys @ ecdl .lt. S. A. 1 2 6. Algoritmo aprašo pavyzdys.
E N D
KOMPIUTERIŲ ARCHITEKTŪRA(SMALL – nauja versija) Doc. Stasys Maciulevičius Kompiuterių katedra stasys@ecdl.lt
S A 1 2 6 Algoritmo aprašo pavyzdys • Tarkime, reikia sudaryti struktūros, realizuojančios teigiamų sveikųjų skaičių daugybos operaciją, aprašą algoritmo lygiu • Operandai bus 6 bitų, skaičių formatas toks: • S - skaičiaus ženklas,A - skaičiaus reikšmės laukas, užimantis 5 skiltis.
Daugyba stumiant dauginamąjį (nuo žem.skilčių) • Sudauginkime skaičius 25 ir 19 : 25 × 19 = 475 • Dvejetainiais skaičiais: 0.11001× 0.10011 = 0.0111011011 • Jei daugintume rankomis: 0.11001 × 0.10011 ------------ 011001 011001 011001 ------------------ 0111011011
Daugyba stumiant dauginamąjį (nuo žem.skilčių) • Dauginsime nuo žemiausiųjų skilčių, stumdami dauginamąjį • Todėl dauginamąjį (A) išplečiame iki dvigubo ilgio, kairėje prirašydami nulius: A B 0.0000011001 0.10011
Daugyba stumiant dauginamąjį (nuo žem. skilčių) A B C0.0000011001 0.10011 0.0000000000 +0.00000110010.0000110010 0.01001 0.0000011001+0.00001100100.0001100100 0.00100 0.00010010110.0011001000 0.00010 0.00010010110.0110010000 0.00001 0.0001001011+0.01100100000.1100100000 0.00000 0.0111011011
Daugyba stumiant dauginamąjį (nuo žem.skilčių) • Kaip matome, dauginamąjį palaipsniui stumiame į kairę, o daugiklį (B) – į dešinę • Jei žemiausioji B skiltis lygi 1, prie dalinių sandaugų sumos (C) pridedame dauginamąjį (A) • Ciklas vykdomas tiek kartų, koks dauginamųjų ilgis (be ženklo skilties) • Dauginant skaičius reikės atlikti 5 sumavimo ir postūmio ciklus • Daugybos ciklams skaičiuoti panaudosime 3 skilčių skaitiklį
Daugyba stumiant dauginamąjį (nuo žem.skilčių) • Dauginant skaičius reikės atlikti 5 sumavimo ir postūmio ciklus. Daugybos ciklams skaičiuoti panaudosime 3 skilčių skaitiklį • Įvertinę šias aplinkybes, sudarome tokį algoritmą: • Įvedame daugiklio ir dauginamojo reikšmes • Dalinių sandaugų sumą prilyginame nuliui, o ciklų skaitiklį - 5 • Tikriname žemiausiąją daugiklio skiltį. Jei ji lygi 1, prie dalinių sandaugų sumos pridedame dauginamąjį • Dauginamąjį pastumiame į kairę, o daugiklį - į dešinę • Sumažiname skaitiklio turinį. Jei skaitiklio turinys nelygus 0 (t.y., atlikta mažiau nei 5 ciklai), grįžtame į 3 žingsnį • Pabaiga.
Small • Algoritmams užrašyti naudojama paprasta, kiek panaši į C, aparatūros aprašymo kalba • Pagrindiniai jos elementai Bekus-Nauro forma aprašyti faile Naujoji Small.doc • Žemiau pateiksime pagrindinius jos elementus pavyzdžiais
Small • Skaičiai: 181d =10110101 = 0B5h • Dvejetainiams skaičiams sistemos nuoroda nereikalinga
Small • Vardai: A, A1, a1 • Varduose skiriamos mažosios ir didžiosios raidės • Kaip įprasta, vardai negali sutapti su kalbos žodžiais • Kalbos žodžius reikia pradėti didžiąja raide (su nedidelėmis išimtimis, pvz., if)
Small • Struktūros elementai: Reg - registras, Cnt - skaitiklis, Trg – trigeris • Pavyzdžiai: • Reg A[8], B[8], c[16], z[1]; - čia aprašyti 8 skilčių registrai A ir B, 16 skilčių registras c ir 1 skilties registras z (ekvivalentiška aprašui Trg z;) • Cnt Sk[3]; - čia aprašytas 3 skilčių skaitiklis Sk (jis gali skaičiuoti nuo 0 iki 7 arba atvirkščiai)
Small • Kintamųjų pavyzdžiai (elementų aprašai buvo pateikti aukščiau): • A- 8 skilčių registras A (visas) • A[8] - aštuntoji registro A skiltis • B[5:8] - keturios dešiniosios registro B skiltys • A.B - žodis, sudarytas apjungus registrus A ir B (sudėtingas kintamasis)
Small • Loginių operacijų ženklai: & - log. sandauga, | - log. suma, # - suma moduliu 2 • Reiškinių pavyzdžiai (elementų aprašai buvo pateikti aukščiau): • A + B - dviejų 8 skilčių registrų A ir B turinių suma • c[1:8] + A - prie aukštesniųjų registro c skilčių pridėtas A • c[1:8] + ^A + 1 - prie aukštesniųjų registro c skilčių pridėtas A su priešingu ženklu (papild. kode) • A | B - dviejų 8 skilčių registrų A ir B turinių loginė suma • A[1] #B[1] - registrų A ir B pirmųjų skilčių (ženklo sklilčių) turinių suma moduliu 2
Small • Postūmio operatoriai: RLS - log. postūmis į dešinę, LLS - log. postūmis į kairę, RCS - ciklinis postūmis į dešinę, LCS - ciklinis postūmis į kairę, RAS - aritmetinis postūmis į dešinę • Postūmio operacijų pavyzdžiai (elementų aprašai buvo pateikti aukščiau): • RLS(A) arba A := 0.A[1:7] - registro A turinio loginis postūmis į dešinę • LLS(A.B) arba A.B := A[1:7].B.0 - registrų A ir B turinių loginis postūmis į kairę, kai išstumta aukščiausioji B skiltis bus “įstumta” į A
Small • Sąlygos sakinių sintaksė: <sąlygos sakinys> ::= if <loginis reiškinys> { <sakinių seka> }[else { <sakinių seka> }] • Sąlygos sakinio pavyzdys: if b[6]==1 { c=c+a; }
Small • Kiekvienas sakinys baigiamas kabliataškiu (;) • Po Begin ir End kabliataškis nededamas! • Vartotojo įvesti struktūros elementų vardai turi būti tekste rašomi taip, kaip jie buvo užrašyti struktūros elemento apraše
Daugybos algoritmas - Small Šis daugybos algoritmas gali būti šitaip užrašytas kaip daugybos įtaiso aprašas: Unit daugyba; Reg a[11], c[11]; Reg b[6]; Cnt sk[3]; Begin a=input; b=input; Print a,b; sk=5d; Print "Ciklo pradzia";
Daugybos algoritmas - Small ciklas: if b[6]==1 { c=c+a; } a = LLS(a); b = RLS(b); sk = sk-1; Print sk, a, c; if sk<>0 { Goto ciklas; } Print c; End
Modeliavimas Small • Paspaudus Run, programa prašo įvesti kintamuosius:
Modeliavimas Small • Rezultatai: • Gautasis rezultatas C = 00111011011 = 475
Modeliavimas Small • Programoje yra kontrolė, ar sumuojant neatsiranda pernaša iš aukščiausiosios skilties. Jei ši pernaša turi būti ignoruojama, patartina daryti taip: aprašykite vieno bito registrą ir į jį nukreipkite pernašą • Pavyzdžiui: c=c+a davė: c[1:17]=11111111111100111 a[1:17]=11111111110011100 Calculation result is too big to save it to `c` at line 27 Tada pataisoma taip: Reg x[1]; x.c = c + a;