operacijų modeliavimo algoritmo lygiu naudojant Small ypatumai
Download
Report
Transcript operacijų modeliavimo algoritmo lygiu naudojant Small ypatumai
KOMPIUTERIŲ
ARCHITEKTŪRA ir
OPERACINĖS SISTEMOS
Doc. Stasys Maciulevičius
Kompiuterių katedra
[email protected]
Šiandien – daugybos modeliavimas
Small
Dar kartą jau nagrinėtas pavyzdys
Kuo Jūsų užduotys skiriasi nuo pavyzdžio
Patarimai:
Ženklo keitimas priešingu
Veiksmai su skirtingo ilgio žodžiais
Bendra programos schema
Jūsų atsiųsti pavyzdžiai
2013
S.Maciulevičius
2
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
2013
S.Maciulevičius
3
Daugyba stumiant dauginamąjį (nuo žem.
skilčių)
A
B
C
0.0000011001 0.10011 0.0000000000
+0.0000011001
0.0000110010 0.01001 0.0000011001
+0.0000110010
0.0001100100 0.00100 0.0001001011
0.0011001000 0.00010 0.0001001011
0.0110010000 0.00001 0.0001001011
+0.0110010000
0.1100100000 0.00000 0.0111011011
2013
S.Maciulevičius
4
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.
2013
S.Maciulevičius
5
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";
2013
S.Maciulevičius
6
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
2013
S.Maciulevičius
7
Small 2009 langas
2013
S.Maciulevičius
8
Modeliavimas Small
Paspaudus Run, programa prašo įvesti
kintamuosius:
2013
S.Maciulevičius
9
Modeliavimas Small
Rezultatai:
Gautasis rezultatas C = 00111011011 = 475
2013
S.Maciulevičius
10
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;
2013
S.Maciulevičius
11
Pavyzdžio ypatumai
Operandų ilgis – 6 bitai, Jūsų užduotyse - 8
Modulių daugyba, Jūsų užduotyse
(išskyrus Daniel ir Donatą) –
papildomajame kode
Jokių korekcijų, Jūsų užduotyse (išskyrus
Daniel ir Donatą) – kai kuriais atvejais gali
būti reikalingos korekcijos
2013
S.Maciulevičius
12
Pavyzdžio ypatumai
Jokių kodo pertvarkymų, Jūsų užduotyse
(išskyrus Daniel ir Donatą) – neigiamų
operandų pervedimas į papildomąjį kodą,
neigiamos sandaugos pervedimas į pradinį
kodą
Daniel ir Donatos užduotyse – sandaugos
ženklo nustatymas, neigiamų operandų
pakeitimas teigiamais, neigiamos
sandaugos pervedimas į pradinį kodą
2013
S.Maciulevičius
13
Ženklo keitimas priešingu
Kodas
Tiesioginis
Atvirkštinis
Papildomasis
A≥0
0.A
0.A
0.A
A<0
1.A
1.A
1.A+1
Kodas
+108
-108
Tiesioginis
0.1101100
1.1101100
Atvirkštinis
0.1101100
1.0010011
Papildomasis 0.1101100
1.0010100
2013
Tiesioginiame kode:
• A[1] = ^A[1]
• A[1] = 1 - A[1]
Atvirkštiniame kode:
• A = ^A
Papildomajame kode:
• A[2:8] = ^A[2:8] + 1
S.Maciulevičius
14
Veiksmai su skirtingo ilgio žodžiais
Turime A[8], C[15]
Jei rašome C = C + A:
010101000000000
11001110
010101011001110
Jei rašome C[1:8] = C[1:8] + A:
000000000101010
11001110
110011100101010
2013
S.Maciulevičius
15
Veiksmai su skirtingo ilgio žodžiais
Turime A[8], C[15]
Jei rašome C = C[1:8] + A:
000100110011001
00010011
00000001
00000001
000100100010100
00010100
Jei rašome C[1:8] = C + A:
2013
000100110011001
10011001
00000001
00000001
100110100011001
10011010
S.Maciulevičius
16
Bendra programos schema (daugumai)
1.
2.
3.
4.
5.
Įvedame duomenis
Jei reikia, keičiame kodus
Dauginame
Jei reikia, koreguojame sandaugą
Jei reikia, keičiame sandaugos kodą
2013
S.Maciulevičius
17
Bendra programos schema (D ir D)
1.
2.
3.
4.
5.
Įvedame duomenis
Nustatome sandaugos ženklą
Jei reikia, keičiame kodus
Dauginame
Jei reikia, keičiame sandaugos kodą
2013
S.Maciulevičius
18
Gautas pavyzdys
Variantas - daugyba Robertsono 2 metodu
nuo žemiausiųjų skilčių stumiant dalinių
sandaugų sumą, A>0. Principas man kaip ir
aiškus, bet …
Operandų ir rezultato kodas - tiesioginis
2013
S.Maciulevičius
19
Gautas pavyzdys
Unit Daugyba;
Reg a[8], c[15];
Reg b[8];
Cnt sk[5];
Begin
a=input;
b=input;
if b[1]==1 {
b[1]=1-b[1];
a[1]=1-a[1];
}
Print a,b;
sk=5d;
2013
ciklas:
if b[8]==1 {
c[1:8]=c[1:8]+a;
}
b=RLS(b);
c=RLS(c);
sk=sk-1;
Print sk,a,b,c;
if sk<>0 {
Goto ciklas;
}
Print c;
End
S.Maciulevičius
20
Gautas pavyzdys - rezultatai
Unit Daugyba
a[1:8]=00011001 b[1:8]=00010011
"Ciklo pradzia"
sk[1:5]=00100 a[1:8]=00011001 b[1:8]=00001001 c[1:15]=000011001000000
sk[1:5]=00011 a[1:8]=00011001 b[1:8]=00000100 c[1:15]=000100101100000
sk[1:5]=00010 a[1:8]=00011001 b[1:8]=00000010 c[1:15]=000010010110000
sk[1:5]=00001 a[1:8]=00011001 b[1:8]=00000001 c[1:15]=000001001011000
sk[1:5]=00000 a[1:8]=00011001 b[1:8]=00000000 c[1:15]=000011101101100
c[1:15]=000011101101100
Turėtume gauti: c[1:15]=000000111011011
2013
S.Maciulevičius
Kas negerai?
21
Kas negerai?
1. Daugyba turi būti atliekama papildomajame
kode, o operandų ir rezultato kodas –
tiesioginis. Nematau neigiamo skaičiaus (a)
pervedimo į papildomąjį kodą
2. Neteisingas ciklų skaičius
3. Kadangi rezultato kodas – tiesioginis, nematau
sandaugos, jei ji neigiama, pervedimo į
tiesioginį kodą
2013
S.Maciulevičius
22
Gautas pavyzdys
Daugyba nuo aukšč. skilčių, stumiant
dalinių sandaugų sumą.
Operandų ir rezultato kodas - atvirkštinis
2013
S.Maciulevičius
23
Kitas gautas pavyzdys
Unit daugyba;
Reg a[8], b[8];
Reg c[15];
Cnt sk[4];
Begin
a = input;
b = input;
Print a,b;
a=^a;
b=^b;
c = 0;
sk=7d;
2013
ciklas:
End
S.Maciulevičius
sk=sk-1;
c = LLS (c);
b = LLS(b);
if b[1]==1 {
c=c+a;
}
Print a, b, c;
if sk<>0 {
Goto ciklas;
}
c=^c;
a=^a;
Print a, c;
24
Kitas gautas pavyzdys - rezultatai
Unit daugyba
a[1:8]=00011001 b[1:8]=00010011
a[1:8]=11100110 b[1:8]=11011000 c[1:15]=000000011100110
a[1:8]=11100110 b[1:8]=10110000 c[1:15]=000001010110010
a[1:8]=11100110 b[1:8]=01100000 c[1:15]=000010101100100
a[1:8]=11100110 b[1:8]=11000000 c[1:15]=000101110101110
a[1:8]=11100110 b[1:8]=10000000 c[1:15]=001100001000010
a[1:8]=11100110 b[1:8]=00000000 c[1:15]=011000010000100
a[1:8]=11100110 b[1:8]=00000000 c[1:15]=110000100001000
a[1:8]=00011001 c[1:15]=001111011110111
2013
S.Maciulevičius
25
Kas negerai?
1. Tokio tipo užduotyse veiksmų seka tokia: sandaugos
ženklo nustatymas, neigiamų operandų pakeitimas
teigiamais, neigiamos sandaugos pervedimas į pradinį
kodą
2. Nematau ženklo nustatymo, neigiamų skaičių (a ir b)
pervedimo į teigiamus
3. Kadangi rezultato kodas – atvirkštinis, nematau
sandaugos, jei ji neigiama, pervedimo į atvirkštinį kodą
2013
S.Maciulevičius
26
Gautas pavyzdys
Daugyba nuo žemiausiųjų skilčių, stumiant
dalinių sandaugų sumą.
Operandų ir rezultato kodas - ????
2013
S.Maciulevičius
27
Kitas gautas pavyzdys
Unit Daugyba;
Reg a[6], c[11];
Reg b[6];
Cnt sk[5];
Begin
a=input;
b=input;
Print a,b;
sk=5d;
2013
ciklas:
if b[5]==1 {
c[1:5]=c+a;
}
b=RLS(b);
c=RLS(c);
sk=sk-1;
Print sk,a,c;
if sk<>0 {
Goto ciklas;
}
Print c;
End
S.Maciulevičius
28
Gautas pavyzdys - rezultatai
Unit Daugyba
a[1:6]=011001 b[1:6]=010011
"Ciklo pradzia"
sk[1:5]=00100 a[1:6]=011001 c[1:11]=01100100000
sk[1:5]=00011 a[1:6]=011001 c[1:11]=00110010000
sk[1:5]=00010 a[1:6]=011001 c[1:11]=00011001000
Calculation result is too big to save it to `c[1:5]` at line 15
Kas negerai?
2013
S.Maciulevičius
29
Kas negerai?
1.
2.
3.
Atsiprašau, nežinau iš kur šis pavyzdys
Operandų ilgis – 6 bitai, turi būti - 8
Nematau ženklo nustatymo, neigiamų skaičių (a ir b)
pervedimo į teigiamus arba kodų keitimo
4.
c[1:5]=c+a; neteisingai užrašytas veiksmas (žr.
paaiškinimus aukščiau)
5.
6.
2013
Calculation result is too big to save it to `c[1:5]` at line 15 –
pernaša iš aukšč. skilties (žr. paaiškinimus aukščiau)
Ir dar kažko trūksta ...
S.Maciulevičius
30