You are on page 1of 18

Informacijski i računalni sustavi – Simulator ARM procesora

Upute za laboratorijske vježbe iz

Informacijskih i računalnih sustava


Asembler za simulator procesora ARM

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Sadržaj

Sadržaj ........................................................................................................................................ 2
Uvod ........................................................................................................................................... 3
1. Sat vježbi u praktikumu ...................................................................................................... 4
2. Sat vježbi u praktikumu ...................................................................................................... 9
3. Sat vježbi u praktikumu .................................................................................................... 10
4. Sat vježbi u praktikumu .................................................................................................... 11
5. Sat vježbi u praktikumu .................................................................................................... 13
6. Sat vježbi u praktikumu .................................................................................................... 15
7. Sat vježbi u praktikumu .................................................................................................... 17

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Uvod
 Simulator ArmSim je simulator RISC procesora ARM (Advanced RISC Machine).
 ArmSim omogućava pokretanje programa za procesor ARM na osobnom računalu.
 Može se skinuti na stranicama predmeta ili sa stranice:
https://webhome.cs.uvic.ca/~nigelh/ARMSim-V2.1/index.html

Instalacija i dijelovi simulatora ARMSim (sa stranica predmeta):

 Raspakirajte arhivu ARMSim.zip


 U arhivi se nalazi datoteka ARMSim.exe, nekoliko datoteka s ekstenzijom .dll te
nekoliko datoteka s ekstenzijom .s
 ARMSim.exe – simulator za simuliranje izvršavanja asemblerskih programa za
procesor ARM
 Simulator ARMSim zahtjeva da na računalu bude instalirana .NET platforma
(uobičajeno već instalirana na Windows 10 operacijskom sustavu)
 Postoje dvije verzije simulatora ARMSim: 1.9 i 2.1. Mi ćemo koristiti noviju verziju
2.1.

Ove upute su napravljene za prvih šest sati vježbi iz asemblera. Sedmi i osmi sat vježbi je
predviđen za ponavljanje i vježbanje za test. Deveti i deseti sat je predviđen za test iz asemblera.

Priprema za test iz zbirnog jezika.

Veći dio testa iz zbirnog jezika odnosi se na prepoznavanje mnemonika i značenja instrukcija
u zbirnom jeziku. Studenti trebaju znati funkciju pojedine asemblerske instrukcije te predvidjeti
rezultat izvođenja nekoliko povezanih instrukcija. Manji dio testa iz zbirnog jezika odnosi se
na dopisivanje instrukcije u zbirnom jeziku u svrhu ostvarivanja određene funkcionalnosti.
Studenti ne trebaju učiti instrukcije napamet i bit će im dostupni svi primjeri i kompletna
dokumentacija. Test će biti vremenski ograničen. Zadaci za vježbu bit će objavljeni na
stranicama predmeta.

Poznati bugovi simulatora:


 Simulator javlja pogrešku kod učitavanja datoteka koje u svojem nazivu imaju hrvatske
znakove „č“ i „ć“

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

1. Sat vježbi u praktikumu


Upoznavanje sa simulatorom i pokretanje prvog primjera
Ishod učenja: Upotrebljavati alat simulator procesora ARM.

Pokrenite izvršnu datoteku ARMSim.exe. Otvara se prozor kao što je prikazano na slici 1.

Slika 1. Simulator ARMSim

U izborniku File izaberite Load i odaberite datoteku Primjer 1. Prve instrukcije.s. Sadržaj
datoteke se otvara u prozoru CodeView. Izvršite program odabirom Run u izborniku Debug.
Dobit ćete rezultat kao što je prikazano na slici 2.

VAŽNO:
Ako ne vidite rezultat 20 u donjem prozoru tada trebate u izborniku File->Preferences odabrati
karticu Plugins i označite LegacySWIInstructions kao što je prikazano na slici 5. I uvijek kada
koristite stdout za ispis provjerite da li je navedeni plugin uključen.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Slika 2. Rezultat izvršavanja prvog primjera

U središnjem dijelu prozora (CodeView) nalazi se učitani program iz datoteke. Prva kolona
označava adrese memorijskih lokacija na kojima se nalazi sadržaj programa u radnoj memoriji.
Druga kolona označava sadržaj memorijskih lokacija tj. strojni kod programa zapisan u radnoj
memoriji. Treća kolona sadržava mnemonike strojnog jezika.
U simulatoru se program ne može mijenjati i za promjenu je potrebno koristiti neki drugi editor
npr. Notepad ili Notepad++. Kad je program promijenjen u vanjskom editoru i promjene su
snimljene na čvrsti disk, moguće je učitati izmijenjenu verziju programa pritiskom na ikonu

Reload .

U lijevom dijelu simulatora se nalaze pogledi na sadržaje registara. Procesor ARM ima 16
cjelobrojnih 32-bitni registara opće namjene. Registar R15 ima funkciju programskog brojila.
Možete birati između tri reprezentacije vrijednosti sadržaja u registrima: heksadecimalnu,
nepredznačni dekadski brojevi i predznačni dekadski brojevi kao što je prikazano na slici 3.
U donjem dijelu prozora imate pogled na vrijednosti zastavica u procesoru: Negative(N),
Zero(Z), Carry(C) i Overflov (V).

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Slika 3. Pogled na sadržaje cjelobrojnih registara i zastavica u procesoru

U izborniku View izaberite Memory i otvorit će vam se novi prozor s pogledom na sadržaj
radne memorije. Unesite adresu 00001000 i pritisnite Enter. Otvorit će vam se dio memorije
gdje se nalazi učitani program kao što je prikazano na slici 4. Možete provjeriti u prozoru
CodeView da se radi o istim podacima.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Slika 4. Pogled na sadržaje radne memorije

U donjem dijelu simulatora nalazi se prozor OutputView gdje se nalazi pogled na


stdin/stdout/stderr. Program je u ovom prozoru ispisao broj 20. Ako ne vidite broj 20 tada
provjerite da li je uključen plugin u izborniku File->Preferences. Odaberite karticu Plugins i
označite LegacySWIInstructions kao što je prikazano na slici 5.

Slika 5. Pogled na plugin-ove

Nekoliko je načina pokretanja programa:

 Pokretanje cijelog programa

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Za pokretanje programa izaberite Run sa izbornika Debug, pritisnite F5 ili kliknite na


ikonu .

Izvršavanje programa počinje na specificiranoj lokaciji programskog brojila


(predefinirano 00001000). Program će se nastavljati izvršavati dok se ne dogodi jedno
od sljedećeg::
- Program dolazi do STOP instrukcije.
- Program dolazi do točke prekida (Break-Point)
- Korisnik stavlja program u pauzu.
- Korisnik resetira simulator.
- Dogodi se iznimka.

 Izvršavanje korak po korak - Step Into

Izvršava trenutnu instrukciju i pozicionira programsko brojilo na sljedeću instrukciju


koja se treba izvršiti.

Za izvršavanje izaberite Step Into iz izbornika Debug ili pritisnite F11 ili kliknite na
ikonu .

Ovo je preporučeni način izvršavanja programa za studente.

 Izvršavanje korak po korak bez pozivanja podprograma - Step Over

Izvršava trenutnu instrukciju i pozicionira programsko brojilo na instrukciju u


slijedećoj liniji. Ukoliko je trenutna instrukcija BL, tj. poziv potprograma, potprogram
je kompletno izvršen i programsko brojilo je postavljeno na instrukciju koja slijedi iza
BL. Za izvršavanje izaberite Step Over iz izbornika Debug ili pritisnite F10 ili
kliknite na ikonu .

Za zaustavljanje izvršavanja programa odaberite Stop u izborniku Debug ili kliknite na ikonu
.

Za ponovno izvršavanje programa odaberite Restart u izborniku Debug ili kliknite na ikonu
.

Zadaci za studente:

 Upoznajte se sa simulatorom i njegovim dijelovima


 Učitajte Primjer 1 i pokrenite ga na različite načine: Run, Step Into, Step Over. Pratite
promjene sadržaja registara. Promijenite način prezentacije sadržaja registara:
hexadecimal, unsigned integer, signed integer.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

2. Sat vježbi u praktikumu


Načini adresiranja i premještanja podataka

Ishod učenja:
 Prepoznati osnovne instrukcije za premještanje podataka u zbirnom jeziku.
 Primijeniti osnovne instrukcije za premještanje podataka u svrhu modificiranja
postojećih programa.

Učitajte „Primjer 2. Pregled nekih načina naslovljavanja.s“ u simulator. Primjer koristi tri
strojne instrukcije:
 MOV - Instrukcija MOV kopira vrijednost „Operand2“ u registar „Rd“ : MOV Rd,
Operand2
 LDR i STR – učitavaju i spremaju vrijednosti u registar.

Opisi svih instrukcija dostupni su u dokumentaciji na poveznici


https://developer.arm.com/documentation/dui0068/b/arm-instruction-reference.

U programu je u komentarima opisano značenje pojedinih instrukcija i načina adresiranja.

Zadaci za studente:

 Izvršite program u modu Step Into (instrukciju po instrukciju) i promatrajte promjene


koje instrukcija izvrši u skupu registara i u radnoj memoriji.
 Potražite u dokumentaciji opis i primjere ovih naredbi.
 Napišite novi program koji će:
a. Učitati vrijednost 20 u registar r3.
b. Kopirati vrijednost iz registra r3 u registar r5
c. Spremiti adresu 00002000 (heksadecimalno) u registar r7
d. Spremiti vrijednost iz registra r5 (4 bajta) u radnu memoriju na adresu koja je
pohranjena u registru r7
e. Pročitati vrijednost iz radne memorije (4 bajta) s adrese koja se nalazi u
registru r7 i spremiti je u registar r0
f. Spremiti vrijednost iz registra r5 (1 bajta) u radnu memoriju na adresu koja je
pohranjena u registru r7
g. Pročitati vrijednost iz radne memorije (1 bajta) s adrese koja se nalazi u
registru r7 i spremiti je u registar r0 i nakon toga uvećati sadržaj registra r7 za
1

Studenti neka probaju samostalno riješiti ovaj zadatak i zatim usporediti rješenje s
rješenjem ponuđenim u datoteci „Primjer 3. Rješenje druge vježbe.s“.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

3. Sat vježbi u praktikumu


Aritmetičke i logičke instrukcije

Ishod učenja:
 Prepoznati aritmetičke i logičke instrukcije u zbirnom jeziku.
 Primijeniti aritmetičke i logičke instrukcije u svrhu modificiranja postojećih programa.

Učitajte „Primjer 4. Aritmetičke i logičke instrukcije.s“ u simulator.

Primjer koristi sljedeće strojne instrukcije:


 ADD – zbrajanje
 SUB – oduzimanje
 MUL – množenje
 ASR – aritmetički pomak udesno
 LSR – logički pomak udesno
 LSL – logički pomak ulijevo
 AND – logička operacija I
 OR – logička operacija ILI
 EOR – logička operacija isključivo ILI
Opisi svih instrukcija dostupni su u dokumentaciji na poveznici
https://developer.arm.com/documentation/dui0068/b/arm-instruction-reference.

Primijetite da ne postoji instrukcija za dijeljenje i u ovoj verziji procesora (verzija 5) dijeljenje


je potrebno implementirati uzastopnim oduzimanjem (nije predmet ovih laboratorijskih vježbi).

Zadaci za studente:
 Učitajte primjer u simulator i pokrenite ga u modu Step Into. Potražite promjene
sadržaja u skupu registara. Mijenjajte prezentaciju vrijednosti registara iz
„Hexadecimal“ u „Signed Decimal“ i obrnuto.
 Napišite novi program koji će:
 Izračunati funkciju a=b+c*d-e, pri čemu je b=10, c=2, d=3 i e=12
 Spremite 10 u R0, 2 u R1, 3 u R2 i 12 u R3
 Pomnožite sadržaj R1*R2 i rezultat spremite u R4
 Dodajte u registra R4 sadržaj registra R0
 Oduzmite od sadržaja registra R4 sadržaj registra R3
 Studenti neka probaju samostalno riješiti ovaj zadatak i zatim usporediti rješenje s
rješenjem ponuđenim u datoteci „Primjer 4. Rješenje treće vježbe.s“.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

4. Sat vježbi u praktikumu


Instrukcije grananja i poziva potprograma

Ishod učenja:
 Prepoznati instrukcije grananja i poziva potprograma u zbirnom jeziku.
 Primijeniti instrukcije grananja i poziva potprograma u svrhu modificiranja postojećih
programa.

Učitajte „Primjer 6. Instrukcije grananja1.s“ u simulator. U primjeru je prikazana moguća


implementacija programske strukture IF-THEN-ELSE. Izvršite program instrukciju po
instrukciju i pratite slijed izvršavanja instrukcija. Promijenite u programu početne vrijednosti u
registrima R0 i R1 te ponovno učitajte i pokrenite program.

Učitajte „Primjer 7. Instrukcije grananja2.s“ u simulator. U primjeru je prikazana moguća


implementacija programske strukture petlje npr. FOR ili REPEAT-UNTIL. Izvršite program
instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.

Učitajte „Primjer 8. Poziv podprograma.s“ u simulator. U primjeru je prikazana implementacija


poziva podprograma (u zbirnom jeziku podprogram se češće naziva subrutina). Izvršite
program instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.

Slijedi detaljniji opis instrukcije B (Branch) i njezinih varijacija te vrijednosti postavljenih


zastavica:
B – granaj uvijek
BAL – granaj uvijek
BEQ – granaj ako je jednako (Z=1)
BNE – granaj ako nije jednako (Z=0)
BCS i BHS – granaj ako je postavljena zastavica C (C=1)
BCC i BLO – granaj ako je nije postavljena zastavica C (C=0)
BMI – granaj ako je rezultat negativan (N=1)
BPL – granaj ako je rezultat pozitivan (N=0)
BVS – granaj ako je došlo do preljeva (V=1)
BVC – granaj ako nije došlo do preljeva (V=0)
BHI – granaj ako je broj nepredznačno veći (C=1 i Z=0)
BLS – granaj ako je broj nepredznačno manji ili jednak (C=0 i Z=1)
BGE – granaj ako je predznačni broj veći ili jednak (N=V)
BLT – granaj ako je predznačni broj manji (N<>V)
BGT – granaj ako je predznačni broj veći (Z=0 i N=V)
BLE – granaj ako je predznačni broj manji ili jednak (Z=1 ili N<>V)

BL – (branch and link) granaj i kopiraj adresu sljedeće instrukcije u registar R14 (registar R14
naziva se još i povezni ili link regisar i oznčava se i s „lr“. Instrukcija se koristi za pozivanje
potprograma, npr. BL labela.

BX – (branch and exchage) granaj na adresu koja se nalazi u navedenom registru. Koristi se za
povratak iz potprograma, npr. BX lr (pročitaj adresu u poveznom registru r14 i stavi ju u
programsko brojilo).

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Zadaci za studente:
 Izvršite primjere instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.
 Proučite dokumentaciju za instrukcije CMP i B.
 Napišite novi program koji će:
a. Upisati vrijednosti cijelih brojeva u registre r1 i r2
b. Pozvati potprogram pod nazivom usporedi
c. Ako je sadržaj registra r1 manji od sadržaja registra r2 potprogram treba u
registar r0 upisati -1
d. Ako je sadržaj registra r1 jednak sadržaju registra r2 potprogram treba u registar
r0 upisati 0
e. Ako je sadržaj registra r1 veći od sadržaja registra r2 potprogram treba u registar
r0 upisati 1
f. Potprogram pozovite tri puta za različite vrijednosti registara r1 i r2
g. Studenti neka probaju samostalno riješiti ovaj zadatak i zatim usporediti rješenje
s rješenjem ponuđenim u datoteci „Primjer 9. Rješenje četvrte vježbe.s“.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

5. Sat vježbi u praktikumu


Direktive ili pseudonaredbe

Ishod učenja:
 Prepoznati ključne riječi za definiranje direktiva u zbirnom jeziku.
 Primijeniti direktive u svrhu modificiranja postojećih programa.

Direktive ili pseudonaredbe su upute koje programer daje prevodiocu zbirnog jezika u strojni
kod i služe za ostvarivanje određenih funkcionalnosti. Direktive nisu strojne instrukcije
podržane od strane procesora.

Slijedi značenje nekih od direktiva koje će se koristiti u primjerima. Detaljniju sintaksu možete
pronaći na https://developer.arm.com/documentation/den0042/a/Introduction-to-Assembly-
Language/Introduction-to-the-GNU-Assembler/Assembler-directives?lang=en . Radi se u
GNU-ovim zbirnim pseudonaredbama (engl. GNU assembler directives):
 .ALIGN - engl. align -> poravnava adresu koda
 .ASCII - engl. ASCII -> postavlja ASCII-jev znakovni niz u kod
 .ASCIZ - engl. ASCII zero -> postavlja ASCII-jev znakovni niz završen ništicom na
adresu u kodu
 .DATA - engl. data -> određuje da je sljedeći dio koda i za čitanje i za pisanje
 .END - engl. end -> određuje završetak koda
 .EQU - engl. equal -> određuje makroe
 .EXTERN - engl. external -> određuje eksterne labele
 .GLOBAL - engl. global -> određuje globalne labele
 .SKIP - engl. skip -> alocira dio memorije
 .TEXT - engl. text -> određuje da je sljedeći dio koda samo za čitanje

Učitajte „Primjer 10. Direktive.s“ u simulator. U primjeru je prikazano niz direktiva i njihovo
značenje. Izvršite program instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.
Otvorite prozor s pogledom na memoriju i postavite Word Size na 8bit kao na slici 6.

Slika 6. Pogled na sadržaj radne memorije s veličinom riječi od 8 bita

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

Zadaci za studente:
 Izvršite primjere instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.
Napišite novi program koji će:
a. Postaviti tekstualnu konstantu „Asembler je bas zanimljiv“ u kod
b. Rezervirati 30 bajta memorije za spremanje podataka
c. Kopirati tekstualnu konstantu u rezervirani prostor
d. Studenti neka probaju samostalno riješiti ovaj zadatak i zatim usporediti rješenje
s rješenjem ponuđenim u datoteci „Primjer 11. Rješenje pete vježbe.s“.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

6. Sat vježbi u praktikumu


Programski prekid, ulazno-izlazni podsustav

Ishod učenja:
 Prepoznati instrukcije za pozivanje programskih prekida u zbirnom jeziku.
 Primijeniti instrukcije za pozivanje programskih prekida za ostvarivanje ulazno-izlazne
komunikacije procesora s vanjskim jedinicama.

VAŽNO:
Provjerite da li je uključen plugin u izborniku File->Preferences. Odaberite karticu Plugins i
označite LegacySWIInstructions kao što je prikazano na slici 7.

Slika 7. Pogled na plugin-ove

Mnemonik instrukcije za pozivanje programskih prekida je SWI (Software Interrupt) i zahtjeva


kod koji određuje ulazno-izlaznu operaciju. U novijim verzijama ARM procesora koristi se
mnemonic SVC (Supervisor Call). U primjerima će se koristiti sljedeće operacije i pripadajući
kodovi:
 SWI 0x00 - Piši znak na standardni izlaz. U registru R0 treba biti znak.
 SWI 0x02- Piši znakovni niz na standardni izlaz. U registru R0 treba biti adresa
memorijske lokacije na kojoj se nalazi ASCII-jev znakovni niz završen ništicom.
 SWI 0x11 - Završi program.
 SWI 0x66 - Otvori datoteku. U registru R0 treba biti adresa memorijske lokacije na
kojoj se nalazi ASCII-jev znakovni niz završen ništicom u kojem piše naziv datoteke.
U registru R1 treba biti 0 ako se iz datoteke čita, 1 ako se u datoteku piše i 2 ako se u
datoteku dodaje. U registru će R0 poslije biti datotečna ručica ako se datoteka
uspješno otvori, -1 inače.
 SWI 0x68- Zatvori datoteku. U registru R0 treba biti dotična datotečna ručica.

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

 SWI 0x69 - Piši znakovni niz u datoteku ili na standardni izlaz. U registru R0 treba
biti datotečna ručica ako se piše u datoteku, 1 ako se piše na standardni izlaz. U
registru R1 treba biti dotični ASCII-jev znakovni niz završen ništicom.
 SWI 0x6A - Čitaj znakovni niz iz datoteke. U registru R0 treba biti dotična datotečna
ručica. U registru R1 treba biti memorijsko mjesto kamo će se staviti pročitani niz. U
registru R2 treba biti najveća moguća njegova veličina. U registru će R0 poslije biti
broj nepročitanih bajtova.
 SWI 0x6B - Piši cijeli broj u datoteku ili na standardni izlaz. U registru R0 treba biti
datotečna ručica ako se piše u datoteku, 1 ako se piše na standardni izlaz. U registru
R1 treba biti dotični cijeli broj.
 SWI 0x6C - Čitaj cijeli broj iz datoteke. U registru R0 treba biti dotična datotečna
ručica. U registru će R0 poslije biti pročitani cijeli broj.
Detaljnije o instrukciji SWI i primjere korištenja možete naći na poveznici:
https://www.lri.fr/~de/ARM-Tutorial.pdf .

Učitajte „Primjer 12. Ispis na standardni izlaz.s“ u simulator. Izvršite program instrukciju po
instrukciju i pratite slijed izvršavanja instrukcija.

Učitajte „Primjer 13. Otvaranje datoteke i čitanje iz nje.s“ u simulator. Izvršite program
instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.

Zadaci za studente:
 Izvršite primjere instrukciju po instrukciju i pratite slijed izvršavanja instrukcija.
Napišite novi program koji će:
a. Otvoriti datoteku pod nazivom „a.txt“ i pročitati sadržaj u radnu memoriju i
zatim ga ispisati na standardni izlaz.
b. Studenti neka probaju samostalno riješiti ovaj zadatak i zatim usporediti rješenje

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

7. Sat vježbi u praktikumu


Izrada samostalnog zadataka

Ishod učenja:
 Osmisliti rješenje problema i ostvariti ga u zbirnom jeziku.
 Sinteza svih dosadašnjih vježbi.

VAŽNO:
Provjerite da li je uključen plugin u izborniku File->Preferences. Odaberite karticu Plugins i
označite LegacySWIInstructions kao što je prikazano na slici 7.

Slika 7. Pogled na plugin-ove

Zadatak za studente:

 Napišite novi program koji će:


a. U tekstualnom editoru (npr. notepad ili notepad++) unesite u jednom redu
rečenicu koja završava s točkom npr.

Volim rjesavati zadatke iz asemblera.

Datoteku spremite pod nazivom stdin.txt.

b. Otvoriti datoteku pod nazivom „stdin.txt“ i pročitati u njoj sadržaj u radnu


memoriju i zatim ga ispisati na standardni izlaz.
c. Odrediti i ispisati broj rijeci u rečenici.
 Usporediti rješenje s prijedlogom rješenja koje se nalazi u datoteci
„Primjer 15. Broj rijeci u recenici.s“

FOI
Informacijski i računalni sustavi – Simulator ARM procesora

8. Sat vježbi u praktikumu


Priprema za kolokvij

Ishod učenja:
 Upoznati se s načinom polaganja kolokvija i tipovima zadataka

Studenti trebaju riješiti test „Vježba 8 - primjer kolokvija iz asemblera“ dostupan na stranicama
predmeta. Kolokvij će biti podijeljen na dva dijela i vremenski ograničen. U prvom dijelu će
biti pitanja s uparivanjem odgovora i jednostrukim odabirom, a u drugom dijelu će biti zadatak
s dopisivanjem instrukcija.

Studenti trebaju ostvariti minimalno 3 boda od mogućih 7 na ovom kolokviju.

FOI

You might also like