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;