300 likes | 596 Views
KOMPIUTERIŲ ARCHITEKTŪRA ir OPERACINĖS SISTEMOS. Doc. Stasys Maciulevičius Kompiuterių katedra stasys.maciulevicius@ktu.lt. Š iandien – daugybos modeliavimas Small. Dar kart ą jau nagrin ė tas pavyzdys Kuo J ū s ų u ž duotys skiriasi nuo pavyzd ž io Patarimai:
E N D
KOMPIUTERIŲ ARCHITEKTŪRA ir OPERACINĖS SISTEMOS Doc. Stasys Maciulevičius Kompiuterių katedra stasys.maciulevicius@ktu.lt
Š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 S.Maciulevičius
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 ------------ 011001011001011001 ------------------0111011011 S.Maciulevičius
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 S.Maciulevičius
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. S.Maciulevičius
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"; S.Maciulevičius
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 S.Maciulevičius
Small 2009 langas S.Maciulevičius
Modeliavimas Small • Paspaudus Run, programa prašo įvesti kintamuosius: S.Maciulevičius
Modeliavimas Small • Rezultatai: • Gautasis rezultatas C = 00111011011 = 475 S.Maciulevičius
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; S.Maciulevičius
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 S.Maciulevičius
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ą S.Maciulevičius
Ženklo keitimas priešingu • Tiesioginiame kode: • A[1] = ^A[1] • A[1] = 1 - A[1] • Atvirkštiniamekode: • A = ^A • Papildomajame kode: • A[2:8] = ^A[2:8] + 1 S.Maciulevičius
Veiksmai su skirtingo ilgio žodžiais • Turime A[8], C[15] • Jei rašome C = C + A: • Jei rašome C[1:8] = C[1:8] + A: 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 S.Maciulevičius
Veiksmai su skirtingo ilgio žodžiais • Turime A[8], C[15] • Jei rašome C = C[1:8] + A: • Jei rašome C[1:8] = C + A: 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 00 0 1 1 0 0 1 1 0 0 1 1 0 1 0 S.Maciulevičius
Bendra programos schema (daugumai) • Įvedame duomenis • Jei reikia, keičiame kodus • Dauginame • Jei reikia, koreguojame sandaugą • Jei reikia, keičiame sandaugos kodą S.Maciulevičius
Bendra programos schema (D ir D) • Įvedame duomenis • Nustatome sandaugos ženklą • Jei reikia, keičiame kodus • Dauginame • Jei reikia, keičiame sandaugos kodą S.Maciulevičius
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; Rega[8], c[15]; Regb[8]; Cnt sk[5]; Begin a=input; b=input; if b[1]==1 { b[1]=1-b[1]; a[1]=1-a[1]; } Printa,b; sk=5d; ciklas: if b[8]==1 { c[1:8]=c[1:8]+a; } b=RLS(b); c=RLS(c); sk=sk-1; Printsk,a,b,c; ifsk<>0 { Goto ciklas; } Print c; End S.Maciulevičius
Gautas pavyzdys - rezultatai Unit Daugyba a[1:8]=00011001 b[1:8]=00010011 "Ciklopradzia" 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]=000000111011011Kas negerai? S.Maciulevičius
Kas negerai? • Daugyba turi būti atliekama papildomajame kode, o operandų ir rezultato kodas – tiesioginis. Nematau neigiamo skaičiaus (a) pervedimo į papildomąjį kodą • Neteisingas ciklų skaičius • 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 ciklas: 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; End 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 S.Maciulevičius 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? • Tokio tipo užduotyse veiksmų seka tokia: sandaugos ženklo nustatymas, neigiamų operandų pakeitimas teigiamais, neigiamos sandaugos pervedimas į pradinį kodą • Nematau ženklo nustatymo, neigiamų skaičių (a ir b) pervedimo į teigiamus • 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; Rega[6], c[11]; Regb[6]; Cnt sk[5]; Begin a=input; b=input; Printa,b; sk=5d; ciklas: if b[5]==1 { c[1:5]=c+a; } b=RLS(b); c=RLS(c); sk=sk-1; Printsk,a,c; ifsk<>0 { Goto ciklas; } Print c; End S.Maciulevičius
Gautas pavyzdys - rezultatai Unit Daugyba a[1:6]=011001 b[1:6]=010011 "Ciklopradzia" 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? S.Maciulevičius
Kas negerai? • 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 • c[1:5]=c+a; neteisingai užrašytas veiksmas (žr. paaiškinimus aukščiau) • 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 ... 2013 S.Maciulevičius 30