You are on page 1of 38

Uvod u arhitekturu racunara

Zadaci sa vezbi
Ivana Tanasijevic, ivana@math.rs
May 21, 2013

Digitalna logika
1
Cas
1. Neka je A prekidac koji ukljucuje svetlo i neka je B prekidac koji menja vrednost za A.
Odnosno, ako je svetlo ukljuceno, iskljucuje ga, a ako je iskljuceno, ukljucuje ga. C ima ulogu
da razdvaja prekidace A i B. Ako je ukljucen prekidac C, onda B nema uticaja na A. Napisati
logicku funkciju na osnovu prethodno opisanog, kojom je prikazano da li je svetlo ukljuceno
ili ne u zavisnosi od prekidaca A, B i C, a zatim napraviti odgovarajuce logicko kolo koristeci
kapije AND, OR i NOT. Nakon toga napraviti novo logicko na osnovu opisa situacije, uz
mogu cnost koriscenja i drugih kapija.
Resenje: Ako je C ukljucen, onda je A. Ako C nije ukljucen, onda je A ako nije B, u suprotnom
B menja A.
F = CA + C(BA + BA)
2. Neka je su A, B i C prekidaci takvi da je protok moguc ako je ukljucen prekidac A ili oba
prekidaca B i C (nije ekskluzivno ili), s tim sto ako su B i C u istom stanju, mogu da
nadjacaju uticaj prekidaca A, odnosno ako su oba iskljucena, protok nije moguc. Napisati
logicku funkciju koja daje indikaciju da li je protok moguc, na osnovu prethodno opisanog, a
zatim napraviti odgovarajuce logicko kolo.
Resenje: Ako su B i C ukljuceni, onda u svakom slucaju ima protoka. Protoka jos ima i kada
je A ukljuceno, a B i C razliciti.
F = BC + A(BC + BC)
moze i
F = BC + A(B + C)
3. Neka su A, B, C i D biti 4-bitnog binarnog broja, pocevsi od bita najmanje tezine ka bitu
najvece tezine. Napisati logicku funkciju koja daje indikaciju da li je broj na ulazu deljiv sa
3. Uociti zavisnost vrednosti parova susednih bita (prvi i poslednji su takodje susedni) i na
osnovu toga formirati logicku funkciju. Napraviti logicko kolo na osnovu dobijene funkcije.
Resenje: Ako posmatramo parove susednih, zakljucujemo da funkcija ima vrednost 1 akko su
bitovi parova susednih (AB i CD, ili AD i CB) jednaki medju sobom.
F = (AB + AB)(CD + CD) + (AD + AD)(CB + CB)
uraditi i
F = (A B)(C D) + (A D)(B C)
1

2
Cas
1. Neka su tri trase aviona a, b, c i mesto gde se trase susrecu kriticno mesto P. Neka su A, B i C
tacke na kriticnom mestu za tri trase aviona a, b i c, redom. Trase se na kriticnom mestu ne
presecaju, vec idu paralelno, ali treba voditi racuna o smeru prolaska aviona u istom trenutku
na sve tri trase. D je indikator da su meteoroloski uslovi nepovoljni. Smerovi na trasama u
datim tackama su 0 i 1, a pravila koja treba da se postuju su sledeca: a) Sredisnji avion ne
sme uporedo da leti u istom smeru sa oba aviona, ali moze sa jednim; b) Ako su vremenski
uslovi nepovoljni, sredisnji avion ne sme uporedo da leti u istom smeru ni sa jednim avionom.
Napisati logicku funkciju od A, B, C i D, tako da ima vrednost 1 ako je kombinacija smerova
aviona na trasama dozvoljena, u suprotnom ima vrednost 0. Napisati logicko kolo na osnovu
dobijene funkcije.
Resenje: Dozvoljeni rasporedi bez obzira na vreme su ABC +ABC. Dozvoljeni rasporedi
samo kada je vreme povoljno su: ABC + ABC + ABC + ABC.
Dakle,
F = ABC + ABC + D(ABC + ABC + ABC + ABC)
= ABC + ABC + D(AC + AC)
.
2

2. Napraviti logicko kolo za polusabirac i sabirac.


3. Napraviti logicko kolo koje implementira funkciju sledbenik, f (x) = (x + 1)mod16, gde x
predstavlja 4-bitni binarni broj.
4. Napraviti logicko kolo koje sabira dva 4-bitna binarna broja.

3
Cas
1. Minimizacija funkcija sedmo-segmentnog indikatora metodama: Karnoove mape i Kvin Mekklaski.

4
Cas
1. Dekoderi, primer 2-na-4 dekodera.
2. Multiplekseri, primer 2-na-1 i 4-na-1 multipleksera.
4

3. Uvezivanje dva 4-na-1 i jednog 2-na-1 multipleksera kako bi se dobio 8-na-1 multiplekser.
4. Demultiplekser, samo primer 1-na-4 demultipleksera.
5. Konstrukcija 8-bitne shift-left operacije uz pomoc tri 2-na-1 multipleksera sa 8-bitnom sirinom
ulaza.
6. Formirati 16-na-1 multiplekser koriscenjem ponudjenih komponenti.
7. Formirati shift-right operacije: (a) za 4-bitni operand, (b) za 8-bitni operand

5
Cas
1. Reze: SR, D, JK, T.
2. Flip flopovi: D, JK.
3. Pomeracki registar sa serijskim ulazom i paralelnim izlazom.
4. Modifikovati prethodni registar tako da omoguci paralelno ucitavanje.
5. Formiranje 16-bitnog pomerackog registra od 4 4-bitna.

6
Cas
1. 4-bitni talasasti brojac izradjen pomocu JK flip-flop-ova.
2. 4-bit sinhroni brojac 0-15 izradjen pomocu JK flip-flop-ova.
3. Sinhroni decimalni brojac. Promene u odnosu na binarni: dodatna logika za vracanje na 0.
4. Sinhroni brojac 0-5.
5. Kontrolni ulaz potreban za ulancavanje brojaca.
6. Kompletan brojac sekundi (0-59) pomocu dva brojaca.
Za vezbu:
7. Brojac za sate (0-11).
8. Dekoder za cifre sati.
9. Konstruisati kompletan digitalni casovnik pomocu datih komponenti, napraviti prikaz preko
6 7-segmentnih prikaza.
10. Napraviti kolo ciji izlazi pri svakoj uzlaznoj ivici takta casovnika formiraju 3-bitni Grejov
kod. Grejov kod je niz takav da se svaki sledeci element razlikuje od prethodnog u tacno
jednom bitu. Primer Grejovog koda: 000 001 011 010 110 111 101 100 000.

7
Cas
1. Konstruisati sledece sinhrone brojace koristeci JK flip-flopove:
0-1-2-3-4-8-9-10-11-12-0
0-1-2-4-5-6-8-9-10-12-13-14-0
0-7-6-5-4-3-2-1-0
2. Koristeci cetiri D flip-flopa napraviti cetvorobitni pomeracki registar koji vrsi pomeranje
udesno. Implementirati i brojac koji ce brojati koliko se puta na izlazu pojavila sekvenca
0110.
3. Nacrtati logicko kolo koje za cetvorobitni operand x i jednobitni kod operacije y implementira
pomeracki registar koji radi sledece:
Ako je kod operacije 0, ciklicki siftuje operand x za jedno mesto u levo
Ako je kod operacije 1, aritmeticki siftuje operand x za jedno mesto u desno
4. Nacrtati logicko kolo koje za cetvorobitni operand x i jednobitni kod operacije y implementira
pomeracki registar koji radi sledece:
Ako je kod operacije 0, siftuje operand x za jedno mesto u levo
Ako je kod operacije 1, ciklicki siftuje operand x za jedno mesto u desno
5. Konstruisati jedinicu za ciklicno siftovanje u levo prvog operanda od 4 bita za broj bita
odredjenim drugim operandom od 2 bita. Napraviti dekoder za cifre izlaza.
6. Napisati tablicu za poluoduzimac, a zatim za puni oduzimac. Ulazi su puni oduzimac su
jednobitni umanjenik A, umanjilac B i prethodna pozajmica P in, dok su izlazi razlika R i
tekuca pozajmica P out. Napraviti logicko kolo za oduzimanje dva dvobitna broja. Na izlazu
prikazati rezultat i prenos.
7. Napraviti logicko kolo koje za 4-bitni broj na ulazu racuna ostatak pri deljenju sa 3. Izlaz
treba da se sastoji od jednog 2-bitnog broja.
8. Kako bi se moglo napraviti logicko kolo koje odgovara funkciji f : {0, 1}3 {0, 1} koristeci
samo jedan multilpeksor 4-na-1?

10

Ma
sinski jezik i asembler
8
Cas
Napisati sledece u SIM-u:
1. Program koji sabira dva broja.
2. Program koji vrsi oduzimanje drugog broja od prvog.
3. Program koji sabira dva dvobajtna broja.
4. Program koji vrsi bitsku negaciju.
5. Program koji realizuje bitsku disjunkciju prema formuli A | B == ~(~A & ~B).
6. Program koji demonstrira bezuslovni skok. Na pocetku rada izvrsava se skok na dogovorenu
lokaciju npr. A0. Tamo se jednostavno upisuje broj npr. 0x01 na dogovorenu lokaciju
rezultata.
7. Program koji poredi vrednosti dve memorijske lokacije i upisuje na dogovorenu lokaciju 0x01
ako su njihovi sadrzaji jednaki, a 0x00 ako nisu. Brojevi su nasumice izabrani.
8. Program koji testira pojavu prekoracenja pri oznacenom sabiranju. Na dogovorenu adresu se
upisuje overflow flag.
9. Program koji poredi vrednosti dve memorijske lokacije i upisuje na dogovorenu lokaciju 0x01
ako je prvi operand manji od drugog, a 0x10 ako je prvi veci ili jednak drugom.
- Resenja:
1.
@ Program koji sabira dva broja
@ Podaci
FD 00
FE 11
FF 07

@ Inicijalizujemo lokaciju rezultata


@ Prvi broj
@ Drugi broj

@ Program
00 00FF

@ Uzimamo prvi broj iz memorije


11

02 20FE
04 10FD
06 80

@ Sabiramo ga sa drugim brojem


@ Smestamo na lokaciju za rezultat
@ Zavrsavamo program

2.
@ Program koji vrsi oduzimanje drugog broja od prvog
@ Podaci
FD 00
FE 11
FF 07

@ Inicijalizujemo lokaciju rezultata


@ Prvi broj
@ Drugi broj

@ Program
00 00FF
02 30
03 20FE

05 10FD
07 80

@
@
@
@
@
@
@
@
@

Uzimamo drugi broj iz memorije. Redosled je bitan kada se radi o


oduzimanju
Vrsimo komplementiranje, odnosno promenu znaka
Dodajemo prvi broj, odnosno izracunavamo -0x07+0x11 = 0x11-0x07
Potrebno je paziti na sledecu adresu na koju smestamo naredbu
Posto komplementiranje trazi jedan bajt sabiranje smestamo na 03,
a ne na 04
Smestamo rezultat na dogovorenu lokaciju
Zaustavljamo izvrsavanje programa

3.
@ Program koji sabira dva dvobajtna broja
@ Podaci
FA 0000
FC 20F1
FE 10F2

@ Inicijalizujemo lokaciju rezultata


@ Prvi sabirak
@ Drugi sabirak

@ Program
00 00FD

@ Sabiramo bajtove manje tezine i zbir ostavljamo na predvidjenu


@ adresu

02 20FF
04 10FB
12

06 00FC
08 A0FE
0A 10FA
0C 80

@
@
@
@
@

Uzimamo bajt vece tezine prvog sabirka sa adrese FC


Instrukcijom ADDC sabiramo bajtove vece tezine uzimajuci u obzir
prenos prethodnog sabiranja
Rezultat ostavljamo na predvidjenu adresu
Zaustavljamo izvrsavanje programa

4.
@ Program koji vrsi bitsku negaciju
@ Podaci
FE 00
FF 1A

@ Inicijalizujemo lokaciju za rezultat


@ Operand koji treba negirati

@ Program
00 00FF
02 51FF

@
@
@
@
@
@

04 10FE
06 80

Uzimamo operand sa adrese FF


Vrsimo xor vrednosti akumulatora sa brojem FF sto cini negaciju
Posto znamo da uvek koristimo konstantu FF, dajemo je u drugom
bajtu neposrednim adresiranjem
Ostavljamo rezultat na dogovorenu lokaciju
Zaustavljamo izvrsavanje programa

5.
@ Program koji realizuje bitsku disjunkciju prema formuli
@ A | B == ~(~A & ~B)
@ Podaci
FD 00
FE 55
FF AA

@ Inicijalizujemo lokaciju za rezultat


@ Prvi disjunkt
@ Drugi disjunkt

@ Program
00 00FE
02 51FF
04 10FD
06 00FF

@
@
@
@
@

Uzimamo prvi disjunkt iz memorije,...


...negiramo ga...
...i smestamo na privremenu lokaciju da bismo mogli da
negiramo drugi disjunkt
Uzimamo drugi disjunkt ...
13

08 51FF
0A 40FD
0C 51FF
0E 10FD
10 80

@
@
@
@
@
@

... i negiramo ga
Vrsimo konjunkciju sa medjurezultatom koji smo privremeno
smestili na FD
Negiramo celu konjunkciju
Smestamo rezultat na dogovorenu lokaciju
Zaustavljamo izvrsavanje programa

6.
@ Program koji demonstrira bezuslovni skok. Na pocetku rada izvrsava
@ se skok na dogovorenu lokaciju, npr. A0. Tamo se jednostavno upisuje
@ broj npr. 0x01 u dogovorenu lokaciju rezultata.
@ Podaci
FF 00

@ Inicijalizujemo lokaciju rezultata

@ Program
00 0100
02 91A0
A0 0101
A2 10FF
A4 80

@
@
@
@
@
@
@
@

Anuliramo akumulator da bi instrukcija JZ izvrsila skok.


Moglo je i npr. 4100
Posto je adresa na koju prenosimo izvrsavanje prema dogovoru
konstantna, dajemo je neposredno
Upisujemo 0x01 u akumulator da bismo mogli da upisemo u
memoriju pomocu AUM
Upisujemo sadrzaj akumulatora na dogovorenu adresu
Zaustavljamo izvrsavanje programa

7.
@ Program koji poredi vrednosti dve memorijske lokacije i upisuje na
@ dogovorenu lokaciju 0x01 ako su njihovi sadrzaji jednaki, a 0x00 ako
@ nisu. Brojevi su nasumice izabrani.
@ Podaci
FD 00
FE A1
FF A2

@ Inicijalizujemo lokaciju za rezultat


@ Prvi operand
@ Drugi operand

@ Program

14

00 00FE
02 50FF
04 9150
06 0100

08 10FD
0A 80
50 0101
52 10FD
54 80

@
@
@
@
@
@
@
@
@
@

Uzimamo jedan operand iz memorije i stavljamo ga u akumulator


Brojevi A i B su jednaki akko A^B==0. Ovo se moglo
proveriti i oduzimanjem
Ako su brojevi jednaki skacemo na adresu 50 koju smo
unapred dogovorili, pa je dajemo neposredno
Ako nije bilo skoka, vec je izvrsavanje nastavljeno linearno,
to znaci da brojevi nisu bili jednaki pa u akumulator
upisujemo dogovorenu konstantu 0x00 koju dajemo neposredno
Sadrzaj akumulatora upisujemo na dogovorenu lokaciju za rezultat
Zaustavljamo izvrsavanje ove grane programa

@
@
@
@

Ako je bilo skoka, brojevi su bili jednaki, pa u akumulator


upisujemo konstantu 0x01, prema dogovoru
Sadrzaj akumulatora upisujemo na dogovorenu lokaciju za rezultat
Zaustavljamo izvrsavanje ove grane programa

8.
@ Program koji testira pojavu prekoracenja pri oznacenom sabiranju.
@ Na dogovorenu adresu upisujemo overflow flag
@ Podaci
FC
FD
FE
FF

5F
77
00
00

@
@
@
@

Prvi sabirak
Drugi sabirak
Inicijalizujemo lokaciju za overflow signal
Inicijalizujemo lokaciju za zbir

@ Program
00
02
04
06
07

00FC
20FD
10FF
B0
7103

09 10FE
0B 80

@ Izracunavamo zbir i smestamo ga na lokaciju FD

@
@
@
@

Smestamo
Pomeramo
najmanje
Smestamo

flag-ove u akumulator
bitove 3 bita u desno, tako da V bude na mestu
tezine
signal za prekoracenje na dogovorenu lokaciju

9.
@ Program koji poredi vrednosti dve memorijske lokacije i upisuje na
15

@ dogovorenu lokaciju 0x01 ako je prvi operand manji od drugog,


@ a 0x10 ako je prvi veci ili jednak drugom
@ Podaci
FD 00
FE FB
FF FB

@ Inicijalizujemo lokaciju za rezultat


@ Prvi operand
@ Drugi operand

@ Program
00
02
03
05
06
08

00FF
30
20FE
B0
4104
9130

@ Oduzimamo drugi operand od prvog

0A 0101
0C 10FD
0E 80

@
@
@
@
@
@
@

Upisujemo flags regisar u akumulator


Anuliramo sve flag-ove osim eventualno S flag-a
Ako S nije postavljen onda je sadrzaj akumulatora 0 i
skacemo na adresu 30
Upisujemo 0x01 u akumulator
pa u memoriju
Zaustavljamo izvrsavanje ove grane programa

30 0110
32 10FD
34 80

@ Upisujemo 0x10 u akumulator


@ pa u memoriju
@ Zaustavljamo izvrsavanje ove grane programa

9
Cas
Napisati programe u SIM-u koji racunaju:
1. Vrednost aritmetickog izraza 8*(4*a-2*b+1)+c/4. Pretpostaviti da su vrednosti promenljivih
date u memoriji. Deljenje je celobrojno.
2. Zbir prvih n prirodnih brojeva.
3. Sumu prvih n stepena dvojke

Pn

i
i=1 2 .

4. Sumu elemenata niza.


- Resenja:
16

1.
@ Program koji izracunava vrednost aritmetickog
@ izraza 8*(4*a-2*b+1)+c/4. Pretpostaviti da su vrednosti
@ promenljivih date u memoriji. Deljenje je celobrojno.
FA
FB
FC
FD

02
04
08
00

@ Program
00
02
04
05
07
09
0B
0D
0F
11
13
15
17
19
1B

00FB
6101
30
2101
10FD
00FA
6102
20FD
6103
10FD
00FC
7102
20FD
10FD
80

@
@
@
@
@
@
@
@
@
@
@
@
@
@
@

Uzimamo b
Mnozimo sa 2 i dobijamo 2b
Komplementiramo, sto daje -2b
Dodajemo 1, sto daje -2b+1
To privremeno cuvamo na FD
Uzimamo a
Mnozimo sa 4 i dobijamo 4a
Dodajemo -2b+1 i dobijamo 4a-2b+1
Mnozimo to sa 8
i cuvamo na FD
Uzmimamo c
Delimo sa 4 i dobijamo c/4
Dodajemo 8(4a-2b+1)
Rezultat smestamo na FD
Kraj

2.
@ Program izracunava zbir prvih n prirodnih brojeva.
@
@
@
@
@
@
@
@
@

C implementacija
int n=5,s=0;
while(n!=0)
{
s+=n;
n--;
}
17

@
@ Nasa implementacija kopira datu iz C-a.
@ Podaci
FE 05
FF 00

@ n=5
@ s=0

@ Program
00 00FE @
02 9150 @
@
04 20FF @
06 10FF @
08 00FE @
0A 21FF @
0C 10FE @
0E 0100 @
10 9100 @
50 80

Uzimamo n
Ako je n==0 (nije ispunjen uslov petlje n!=0),
onda se izlazi iz petlje
n je vec u akumulatoru pa na njega dodajemo s
Smestamo s u memoriju cime realizujemo liniju s+=n
Uzimamo n
Umanjujemo ga za 1...
...i smestamo u memoriju cime realizujemo liniju n-Smestamo 0 u akumulator kako bi skok bio bezuslovan
Skacemo na pocetak petlje da ponovo testiramo uslov

@ Kraj

3.
@ Suma prvih n stepena dvojke \sum_{i=1}^{n} 2^{i}.
FE 03
FF 00

@ n
@ Suma

@ Program
00
02
04
06
08
0A
0C
0E
10

00FE
9150
0101
60FE
20FF
10FF
00FE
21FF
10FE

@
@
@
@
@

Ako je brojac dosao do 0, prekidamo


Upisujemo 1 u akumulator...
...i mnozimo sa 2 sto daje 2^1
Dodajemo tekucu sumu na to...
...i cuvamo novu sumu u memoriji

@ Umanjujemo brojac

18

12 0100
14 9100

@ Bezuslovni skok na pocetak

50 80

@ Kraj

4.
@ Suma elemenata niza.
A0
A1
A2
A3
A4

01
02
03
04
05

FD A0
FE 05
FF 00

@ Pocetna adresa niza


@ Broj elemenata niza
@ Suma

@ Program
00
02
04
06
08
0A
0C
0E
10
12
14
16
18

00FE
9150
00FF
22FD
10FF
00FD
2101
10FD
00FE
21FF
10FE
0100
9100

50 80

@ Ako je n doslo do 0, kraj


@ Dodajemo trenutni element niza na sumu
@ Prelazimo na sledeci element niza

@ Smanjujemo brojac

@ Skok na pocetak

@ Kraj

19

10
Cas
Napisati sledece u ASM-u:
1. Program koji racuna n-ti neparan broj po formuli 2*n - 1
2. Program koji racuna apsolutnu vrednost broja
3. Program koji racuna proizvod dva pozitivna broja na sledeci nacin m*n = n + n + ... + n
4. Program koji racuna n-ti Fibonacijev broj gde su fibonacijevi brojevi 1, 1, 2, 3, 5, ... sa
indeksima koji pocinju od jedan
- Resenja:
1.
@ Program racuna n-ti neparan broj po
@ formuli 2*n - 1
.data 160
4
@ n
0
@ rezultat
.prg 0
mua 160
shl #1
add #-1
aum 161
halt

@
@
@
@
@

Smestamo n u akumulator
Mnozimo n sa dva
Sabiramo sa -1
Smestamo rezultat u memoriju
Kraj

2.
@ Program koji racuna apsolutnu vrednost broja
.data 160
-5
@ x
0
@ Rezultat
.prg 0
mua 160
shr #7
jz #20

@ Smestamo x u akumulator
@ Popunjavamo akumulator znakom
@ Ako je pozitivan prelazimo na 20
20

mua 160
cpl
aum 161
halt
.prg 20
mua 160
aum 161
halt

@ Smestamo x u akumulator
@ Menjamo mu znak
@ Smestamo ga na rezultat

@ Smestamo x u akumulator
@ Smestamo ga na rezultat
@ Kraj

3.
@ Program racuna proizvod dva pozitivna broja
@ na sledeci nacin m*n = n + n + ... + n
.data 160
6
@ n
2
@ m
0
@ Rezultat
.prg 0
mua 161
jz #20
add #-1
aum 161
aum 160
add 162
aum 162
mua #0
jz #0
.prg 20
halt

@
@
@
@
@
@
@
@

Smestamo m u akumulator
Ako je nula izadji iz petlje
Smanjujemo m za jedan
Vracamo ga u memoriju
Smestamo n u akumulator
Sabiramo ga sa rezultatom
Smestamo na rezultat
Skacemo na pocetak petlje

@ Kraj

4.
@ Program racuna n-ti Fibonacijev
@ broj gde su fibonacijevi brojevi
@ 1, 1, 2, 3, 5, ...
@ sa indeksima koji pocinju od jedan
.data 200
21

7
1
1
0
.prg 0
mua 200
add #-1
jz #50
add #-1
jz #50
aum 200
mua 200
jz #50
add #-1
aum 200
mua 201
aum 203
mua 202
aum 201
add 203
aum 202
mua #0
jz #12
.prg 50
halt

@
@
@
@

Redni broj fibonacijevog niza


F(i)
F(i+1)
Pomocna promenljiva

@ Ubacimo n u akumulator
@ Proverimo da li je n==1
@ Provera da li je n==2
@ Smestamo n-2 na n
@ Ubacimo n u akumulator
@ Ako je nula iskacemo iz petlje
@
@
@
@
@
@
@

Smanjimo n za jedan
Uzmemo i-ti broj
Smestimo na pomocnu lokaciju
Uzmemo i+1 broj
Smestimo ga na i-ti broj
Saberemo i-ti i i+1-vi
Smestimo na i+1-vi

@ Skacemo na pocetak petlje

@ Kraj

11
Cas
Napisati sledece u ASM-u:
1. Program koji racuna kolicnik i ostatak pri deljenju dva broja.
2. Program koji racuna duzinu niza karaktera. Argument je adresa koda prvog karaktera.
3. Program koji poredi dva niza cije su adrese date na lokacijama 160 i 161 i pri tome vraca 0
ako su oba jednaka, manje od nule ako je prvi leksikografski manji od drugog, vece od nule
ako je prvi leksikografski veci od drugog.

22

- Resenja:
1.
@ Program koji racuna duzinu niza karaktera. Argument je
@ adresa koda prvog karaktera.
@ Niz kodova karaktera
.data 160
25
35
61
36
0
.data 192
160
0

@ Argument, adresa prvog karaktera


@ Rezultat - duzina niza

.prg 0
mua [192]
jz #50
mua 192
add #1
aum 192
mua 193
add #1
aum 193
mua #0
jz #0

@
@
@
@
@
@
@
@
@
@

.prg 50
halt

@ Kraj programa

Uzimamo kod prvog karaktera


Ako je 0 treba da zavrsimo brojanje
Ako nije 0, uzimamo adresu karaktera kojeg posmatramo
Povecavamo je
Vracamo je na njeno mesto
Uzimamo brojac
Povecavamo ga za 1 posto smo videli karakter
Vracamo ga
Stavljamo 0 u akumulator
Skacemo na pocetak petlje

2.
@ Program racuna kolicnik i ostatak
@ pri deljenju dva broja
.data 160
15
@ Deljenik i ostatak
4
@ Delilac
23

0
0

@ Delilac sa promenjenim znakom


@ Kolicnik

.prg 0
mua 161
cpl
aum 162 @ Komplementiramo delilac, da bismo umesto
@ oduzimanja vrsili sabiranje
mua 160
add 162
aum 160
fua
and #4
jz #50
mua 160
add 161
aum 160
halt
.prg 50
mua 163
add #1
aum 163
mua #0
jz #5

@
@
@
@
@
@
@
@
@

Uzimamo deljenik
Oduzimamo delilac
Vracamo ga
Uzimamo flag-ove
Proveravamo da li je rezultat negativan
Ako nije skacemo na 50
Ako jeste negativan, uzimamo deljenik
Dodajemo delilac da bismo vratili znak
na pozitivan

@ Uzimamo rezultat
@ Posto je oduzimanje bilu uspesno, povecavamo kolicnik
@ za jedan
@ Skacemo na pocetak petlje

3.
@ Program koji poredi dva niza cije su adrese date na lokacijama
@ 160 i 161 i pri tome vraca 0 ako su jednaka, <0 ako je prvi
@ leksikografski manji od drugog, >0 ako je prvo leksikografski
@ veci od drugog
.data 160
170
180
0

@ Adresa prvog niza


@ Adresa drugog niza
@ Odgovor

.data 170
2 43 5 7 0
24

.data 180
2 43 8 7 0
.prg 0
mua [160]
add [161]
jz #100
mua [161]
cpl
add [160]
jz #50
aum 162
halt
.prg 50
mua 160
add #1
aum 160
mua 161
add #1
aum 161
mua #0
jz #0

.prg 100
halt

@ Ako je zbir tekucih elemenata nula, onda se doslo


@ do kraja oba niza i oni su jednaki

@ Oduzimamo tekuci element drugog niza od tekuceg


@ elementa drugog niza
@ Ako je razlika 0, onda nastavljamo dalje
@ Ako razlika nije 0, onda je ona resenje

@ Prelazimo na sledeci element prvog niza

@ Prelazimo na sledeci element drugog niza

@ Skacemo na pocetak petlje

@ Kraj

Napisati sledece u ASM2:


1. Program racuna apsolutnu vrednost broja.
2. Program koji demonstrira poziv potprograma koji racuna apsolutnu vrednost.
3. Program koji racuna maksimum tri broja tako sto izracuna maksimum prva dva. a zatim
maksimum tog maksimuma i treceg broja.
4. Program koji racuna maksimum niza pozitivnih brojeva.
- Resenja:
25

1.
@ Program racuna apsolutnu vrednost broja
.var
arg -3
abs 0
sign_mask 4
.prg
mua arg
fua
and sign_mask
jz pozitivno
mua arg
cpl
aum abs
halt
pozitivno:
mua arg
aum abs
halt

@ Broj
@ Apsolutna vrednost
@ Maska za sign flag

@ Uzimamo broj
@ Uzimamo flegove
@ Izdvajamo sign flag
@ Ako je negativan broj,
@ menjamo mu znak
@ i smestamo na rezultat

@ Ako je pozitivan
@ njega smestamo na abs

2.
@ Program koji demonstrira poziv potprograma
@ koji racuna apsolutnu vrednost
.var
broj -3 @ broj
abs_br 0

@ Apsolutna vrednost

arg1 0
ap 0
pov_vr 0
sign_mask 4

@
@
@
@

.prg
mua broj
aum arg1
mua povratak

Argument potprograma
Adresa povratka potprograma
Povratna vrednost potprograma
Maska za sign flag

@ Postavimo argument
@ Postavljamo adresu povratka
26

aum ap
mua #0
jz abs
povratak:
mua pov_vr
aum abs_br
halt

@ Pozivamo potprogram

@ Smestamo povratnu vrednost


@ na rezultat

@ Funkcija abs racuna apsolutnu vrednost broja.


@ Bitno je to sto koristi posebne promenljive
@ za argument, povratnu vrednost i adresu povratka.
abs:
mua arg1
fua
and sign_mask
jz pozitivno
mua arg1
cpl
aum pov_vr
mua #0
jz ap
pozitivno:
mua arg1
aum pov_vr
mua #0
jz ap
3.
@ Program koji racuna maksimum tri broja
@ tako sto izracuna maksimum prva dva
@ a zatim maksimum tog maksimuma i treceg
@ broja
.var
x 2
y 7
z 1

@ prvi broj
@ drugi broj
@ treci broj
27

m 0

@ maksimum

arg1 0
arg2 0
ap 0
pov_vr 0
sign_mask 4

@
@
@
@
@

prvi argument potprograma max


drugi argument potprograma max
adresa povratka
povratna vrednost potprograma
maska za sign flag

@
@
@
@
@

Uzimamo prvi broj


Postavljamo ga za prvi argument
Uzimamo drugi broj
Postavljamo ga za drugi argument
Postavljamo adresu povratka

.prg
mua x
aum arg1
mua y
aum arg2
mua pov1
aum ap
mua #0
jz max
pov1:
mua pov_vr
aum arg1
mua z
aum arg2
mua pov2
aum ap
mua #0
jz max
pov2:
mua pov_vr
aum m
halt

@ Pozivamo potprogram

@ Postavljamo max(x, y) na arg1


@ Drugi argument je z
@ Postavljamo adresu povratka
@ Pozivamo potprogram

@ Smestamo povratnu vrednost na rezultat

@ Potprogram oduzima svoje argumente i na osnovu znaka


@ razlike utvrdjuje koji je veci.
max:
mua arg1
cpl
add arg2

@ Smestimo prvi broj u akumulator


@ Komplementiramo
@ Oduzimamo prvi od drugog
28

fua
and sign_mask
jz DrugiVeci
mua arg1
aum pov_vr
mua #0
jz ap
DrugiVeci:
mua arg2
aum pov_vr
mua #0
jz ap

@ Izdvajamo sign flag


@ Proveravamo da li je drugi veci od prvog
@ Ako nije, postavljamo prvi za max
@ Vracamo se

@ Ako jeste, postavljamo njega za max

@ Vracamo se

4.
@ Program koji racuna maksimum niza pozitivnih brojeva
.var
adresa
duzina
m 0

160
6

@ adresa prvog clana niza


@ duzina niza
@ maksimum niza

arg1 0
arg2 0
pov_vr 0
ap 0
sign_mask 4

@
@
@
@
@

prvi argument
drugi argument
povratna vrednost
adresa povratka
maska za sign flag

.data 160
1 2 3 5 4 1

@ niz

.data 170
0

@ adresa tekuceg clana niza

.prg
mua adresa
aum 170

@ Inicijalizujemo pocetnu adresu

petlja:
mua duzina
29

jz kraj
add #-1
aum duzina
mua [170]
aum arg1
mua pov_vr
aum arg2
mua povratak
aum ap
mua #0
jz max
povratak:
mua 170
add #1
aum 170
mua #0
jz petlja
kraj:
mua pov_vr
aum m
halt

@ Ako smo presli sve clanove niza idemo


@ na labelu kraj
@ Smanjujemo broj clanova za jedan

@
@
@
@

Uzimamo jedan clan


postavljamo ga za prvi argument
Uzimamo tekuci maksimum
postavljamo ga za drugi argument

@ Smestamo adresu povratka


@ Pozivamo potprogram

@ Pomeramo pokazivac na sledeci clan niza

@ Vracamo se na pocetak petlje

@ Upisujemo tekuci max na m

@ Potprogram koji racuna maksimum svojih argumenata.


max:
mua arg1
cpl
add arg2
fua
and sign_mask
jz DrugiVeci
mua arg1
aum pov_vr
mua #0
jz ap

@ Smestimo prvi broj u akumulator


@ Komplementiramo
@ Oduzimamo prvi od drugog
@ Izdvajamo sign flag
@ Proveravamo da li je drugi veci od prvog
@ Ako nije, postavljamo prvi za max
@ Vracamo se

30

DrugiVeci:
mua arg2
aum pov_vr
mua #0
jz ap

@ Ako jeste, postavljamo njega za max

@ Vracamo se

12
Cas
Napisati sledece u ASM2:
1. Potprogram koji racuna sumu bitova i program koji ga poziva
2. Potprogram koji iz niza brojeva izdvaja nenegativne u novi niz i program koji ga poziva
3. Program koji izracunava stepen xy
- Resenja:
1.
@ Potprogram koji racuna sumu bitova i
@ program koji ga poziva
.var
x 7
s 0
maska 1

@ Broj
@ Suma bitova
@ Maska za izdvajanje poslednjeg bita

arg1 0
pov_vr 0
ap 0

@ Argument funkcija
@ Povratna vrednost
@ Adresa povratka

.prg
mua x
@ Postavimo x za prvi argument
aum arg1
mua povratak
@ Postavimo adresu povratka
aum ap
mua #0
jz suma_bitova @ pozivamo funkciju
povratak:
mua pov_vr
31

aum s
halt

@ Postavljamo rezultat

suma_bitova:
mua arg1
jz ap
and maska
add pov_vr
aum pov_vr
mua arg1
shr #1
aum arg1
mua #0
jz suma_bitova

@ Ako nema vise jedinica vracamo se


@ Izdvajamo poslednji bit
@ Sabiramo ga sa sumom

@ Siftujemo broj za jedno mesto u desno

@ Vracamo se na pocetak petlje

2.
@ Potprogram koji iz niza brojeva izdvaja
@ nenegativne u novi niz i program koji ga poziva
.var
adresa1
duzina1
adresa2
duzina2

160
6
170
0

arg1 0
arg2 0
arg3 0
pov_vr 0
ap 0

@
@
@
@

aderesa pocetka prvog niza


duzina prvog niza
adresa pocetka drugog niza
duzina drugog niza

@
@
@
@
@

adresa
duzina
adresa
duzina
adresa

prvog niza
prvog niza
drugog niza
drugog niza
povratka

@ Prvi niz
.data 160
3 -3 5 -7 1 -2
.prg
mua adresa1
aum arg1
mua duzina1
aum arg2

@ Postavljamo prvi argument


@ Postavljamo drugi argument
32

mua adresa2
aum arg3
@ Postavljamo treci argument
mua povratak
aum ap
@ Postavljamo adresu povratka
mua #0
jz nenegativni @ Pozivamo potprogram
povratak:
mua pov_vr
aum duzina2

@ Postavljamo povratnu
@ vrednost za rezultat

halt
nenegativni:
mua arg1
aum 180
mua arg3
aum 181
petlja:
mua arg2
jz ap

add #-1
aum arg2

@ Smestamo adresu prvog clana prvog niza na 180


@ Smestamo adresu prvog clana drugog niza na 181

@ Duzina prvog niza


@ Ako nije ostao ni jedan clan,
@ izlazimo iz potprograma

@ Smanjujemo broj preostalih clanova za jedan

mua [180]
shr #7
jz pozitivan

@
@
@
@

mua #0
jz negativan

@ Inace je negativan

pozitivan:
mua [180]
aum [181]
mua pov_vr
add #1

Smestamo tekuci clan


Popunjavamo bitovima
Ako je u akumulatoru
znaci da je broj bio

u akumulator
znaka
nula
pozitivan

@ Smestimo taj clan u drugi niz


@ Povecamo broj pozitivnih

33

aum pov_vr
mua 181
add #1
aum 181
negativan:
mua 180
add #1
aum 180
mua #0
jz petlja

@ Prelazimo na sledeci u drugom nizu

@ Prelazimo na sledeci u prvom nizu


@ Skok na pocetak petlje

3.
@ Stepenovanje x^y
.var
x 3
y 4
s 0
arg1 0
arg2 0
ap 0
pov_vr 0

t 0
ts 0

@ Osnova
@ Stepen
@ Ovde ce se u svakom koraku cuvati
@ parcijalni proizvodi x*x*...*x
@ Privremena promenljiva za x
@ Privremena promenljiva za pov_vr*x

.prg
mua x
aum arg1
mua y
aum arg2
mua povratak
aum ap
mua #0
jz stepenovanje @ Pozivamo potprogram

34

povratak:
mua pov_vr
aum s
halt
stepenovanje:
mua #1
aum pov_vr
petlja:
mua arg2
jz ap
add #-1
aum arg2
mua
aum
mua
aum

arg1
t
#0
ts

mnozenje:
mua t
jz krajmnozenja
add #-1
aum t
mua ts
add pov_vr
aum ts
mua #0
jz mnozenje
krajmnozenja:
mua ts
aum pov_vr
mua #0
jz petlja

@ Inicijalizujemo stepen

@ Unosimo y

@ Ako y nije nula smanjujemo ga za jedan


@ Inicijalizujemo brojac za x
@ Inicijalizujemo sumu u kojoj cemo sabirati
@ prethodni stepen da bismo dobili novi

@ Ako smo prosli x puta unutrasnju petlju, izlazimo


@ Ako nismo, smanjujemo brojac za jedan
@ Na trenutni zbir dodajemo pov_vr
@ Vracamo ga
@ Skacemo na pocetak petlje

@ Postavljamo novoizracunati stepen

35

13
Cas
1. Napisati program u SIM-u koji izracunava vrednost aritmetickog izraza a/2 + (5b c/4 3).
2. Napisati program u SIM-u koji za dati niz od n elemenata a1 , a2 , a3 , a4 , ..., an , izracunava
vrednosti izraza: a1 a2 + a3 a4 + ...(1)n1 an . Broj elemenata i elementi niza su dati u
memoriji.
3. Napisati program u SIM koji izracunava n-ti clan niza koji je dat rekurentnom formulom
A0 = 1, An = 3 An1 + 2, n >= 1.
4. Napisati program u SIM koji za dati string proverava da li je palindrom.
5. Napisati program u SIM-u koji za date vrednosti kateta x i y izracunava ceo deo
p hipotenuze
z. Formula za izracunavanje hipotenuze z kada su zadate katete x i y glasi z = x2 + y 2 . Za
racunanje celog dela od z treba iskoristiti cinjenicu da je to najveci broj ciji kvadrat nije veci
od z 2 .
6. Napisati program u SIM-u koji za dato n i m izracunava 28nm .
7. Napisati funkciju u ASM2 koja racuna proizvod dva pozitivna broja. Napisati zatim program
koji koristeci prethodnu funkciju izracunava proizvod niza brojeva. Niz i velicina niza su dati
u memoriji.
8. Napisati funkciju u ASM2 koja za dati argument izracunava najmanji stepen dvojke koji je
veci od njega. Napisati zatim program koji koristeci prethodnu funkciju za data tri broja u
memoriji izracunava sumu ovako dobijenih odgovarajucih stepena dvojke.
9. Napisati potprogram u ASM2 koji na osnovu dva niza An i Bn koji su dati svojim duzinama
i pocetnom adresom (pri cemu su im duzine jednake) formira novi niz Cn , pri cemu je Cn =
16 An Bn . Napisati zatim program koji ga poziva.
10. Napisati potprogram u ASM2 koji za dati broj prosledjen kao argument, formira i vraca novi
broj koji nastaje tako sto se invertuju pozicije bitova sa prva cetiri mesta i poslednja cetiri
mesta. Primer: za broj a0 a1 a2 a3 a4 a5 a6 a7 , potprogram treba da vrati broj a3 a2 a1 a0 a7 a6 a5 a4 .
Napisati zatim program koji ga poziva.
11. Napisati program koji za dati niz duzine n (gde je n parno) vraca pozitivnu vrednost ukoliko
je suma elemenata na neparnim pozicijama veca od sume elemenata na parnim, negativnu
ako je manja, a nulu ako su jednake.
12. Napisati potprogram u ASM2 koji vraca 1 ako je broj u intervalu [30, 40], a nulu inace.
Napisati program koji iz niza celih brojeva prepisuje one iz tog intervala za koje prethodni
potprogram vraca 1 u novi niz, ali tako sto im promeni znak.
36

13. Napisati potprograme u ASM2 koji vracaju maksimum, odnosno minimum dva broja. Napisati
program koji za dati niz celih brojeva izracunava razliku izmedju maksimuma i minimuma
svih negativnih brojeva u nizu.
14. Napisati potprograme u ASM2 koji vracaju maksimum, odnosno minimum dva broja. Napisati
program koji od dva niza A i B jednakih duzina formira nizove C i D ciji su clanovi
Cn = max(An , Bn ) i Dn = min(An , Bn ).
15. Za vezbanje uraditi zadatke i u drugim jezicima od onih koji su trazeni u formulaciji zadatka.

37

You might also like