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