operacijų modeliavimas algoritmo lygiu naudojant Small
Download
Report
Transcript operacijų modeliavimas algoritmo lygiu naudojant Small
KOMPIUTERIŲ
ARCHITEKTŪRA ir
OPERACINĖS SISTEMOS
(SMALL – modeliavimas algoritmo
lygiu)
Doc. Stasys Maciulevičius
Kompiuterių katedra
[email protected]
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
1
A
2
6
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 – 4 variantai
0.11001
× 0.10011
-----------011001
011001
011001
---------------0111011011
Dauginame nuo Stumiame
žemiausių skilčių
aukščiausių skilčių
dauginamąjį
dalinių sandaugų
sumą
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
0.0000011001
0.0000110010
0.0001100100
0.0011001000
0.0110010000
0.1100100000
B
0.10011
C
0.0000000000
+0.0000011001
0.01001 0.0000011001
+0.0000110010
0.00100 0.0001001011
0.00010 0.0001001011
0.00001 0.0001001011
+0.0110010000
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ą:
1. Įvedame daugiklio ir dauginamojo reikšmes
2. Dalinių sandaugų sumą prilyginame nuliui, o ciklų skaitiklį
-5
3. Tikriname žemiausiąją daugiklio skiltį. Jei ji lygi 1, prie
dalinių sandaugų sumos pridedame dauginamąjį
4. Dauginamąjį pastumiame į kairę, o daugiklį - į dešinę
5. Sumažiname skaitiklio turinį. Jei skaitiklio turinys nelygus
0 (t.y., atlikta mažiau nei 5 ciklai), grįžtame į 3 žingsnį
6. Pabaiga.
Daugyba stumiant dauginamąjį
(nuo aukšč. skilčių)
A
B
C
0.1100100000 0.10011 0.0000000000
0.0110010000 1.00110
+0.0110010000
0.0011001000 0.01100 0.0110010000
0.0001100100 0.11000
0.0000110010 1.10000
+0.0000110010
0.0000011001 1.00000 0.0111000010
+0.0000011001
0.0000011001 0.00000 0.0111011011
Daugyba stumiant dauginamąjį
(nuo aukšč. skilčių)
Atkreipkime dėmesį į pirmąsias dvi pavyzdžio
eilutes:
A
B
C
0.1100100000 0.10011 0.0000000000
0.0110010000 1.00110
Prieš dauginant dauginamąjį A ir daugiklį B
reikia pastumti
Be to, dauginamasis pradžioje yra
aukščiausiose žodžio skiltyse
Daugyba stumiant dalinių sandaugų
sumą (nuo žem. skilčių)
A
0.11001
B
0.10011
0.01001
0.00100
0.00010
0.00001
0.00000
C
0.0000000000
+0.11001
0.1100100000
0.0110010000
+0.11001
1.0010110000
0.1001011000
0.0100101100
0.0010010110
+0.11001
0.1110110110
0.0111011011
Daugyba stumiant dalinių sandaugų
sumą (nuo žem. skilčių)
Atkreipkime dėmesį, kad:
dauginamajam pakanka 6 bitų ilgio
dauginamasis A pridedamas pirmojoje C
pusėje (prie aukščiausiųjų skilčių)
Daugyba stumiant dalinių sandaugų
sumą (nuo aukšč. skilčių)
A
0.11001
B
0.10011
1.00110
0.01100
0.11000
1.10000
1.00000
0.00000
C
00000000000
+011001
00000011001
00000110010
00001100100
00011001000
+011001
00011100001
00111000010
+011001
00111011011
0.0111011011
Daugyba Berkso-Goldsteino-Neimano
metodu stumiant dauginamąjį (nuo žem.
skilčių, A<0, B<0)
A
B
0.0000000111
1.01101
0.0000001110
0.10110
0.0000011100
0.01011
0.0000111000
0.00101
0.0001110000
0.1100100000
0.00010
0.00001
C
0.0000000000
+0.0000000111
0.0000000111
0.0000000111
+0.0000011100
0.0000100011
+0.0000111000
0.0001011011
0.0001011011
0.0001011011
+0.11001
korekcija –A
0.1101111011
+0.10011
korekcija –B
1.0111011011
0.0111011011
Daugyba Berkso-GoldsteinoNeimano metodu
Atkreipkime dėmesį, kad:
daugyba atliekama papildomajame kode
priklausomai nuo operandų ženklų,
reikalinga korekcija:
dauginant šiuo metodu, korekcija tokia:
jei A>0, o B<0, - korekcija “-A”;
jei A<0, o B>0, - korekcija “-B”;
jei A<0 ir B<0, - korekcija “-A” ir “-B”.
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
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ą:
1. Įvedame daugiklio ir dauginamojo reikšmes
2. Dalinių sandaugų sumą prilyginame nuliui, o ciklų
skaitiklį - 5
3. Tikriname žemiausiąją daugiklio skiltį. Jei ji lygi 1,
prie dalinių sandaugų sumos pridedame dauginamąjį
4. Dauginamąjį pastumiame į kairę, o daugiklį - į
dešinę
5. Sumažiname skaitiklio turinį. Jei skaitiklio turinys
nelygus 0 (t.y., atlikta mažiau nei 5 ciklai), grįžtame
į 3 žingsnį
6. Pabaiga.
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
Small 2009 langas
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:15]=111111111100111 a[1:15]=111111110011100
Calculation result is too big to save it to `c` at line 27
Tada pataisoma taip:
Reg x[1];
x.c = c + a;