Arhitektura računara/Februar 2020
1. zadatak
- Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.
Postavka
[5p] U posmatranom računarskom sistemu procesor ima 3 para linija po kojima ulazno/izlazni uređaji mogu procesoru da šalju zahteve za prekid i od procesora dobijaju signale potvrda. U datom sistemu ima 9 ulazno/izlaznih uređaja koje treba nekako povezati pomoću ta 3 para linija na procesor i omogućiti za svaki ulazno/izlazni uređaj skok na odgovarajuću prekidnu rutinu vektorisanim mehanizmom prekida.
- Nacrtati kako tih 9 ulazno/izlaznih uređaja treba povezati pomoću ta 3 para linija na procesor.
- Objasniti kako tih 9 ulazno/izlaznih uređaja šalju zahteve za prekid i dobijaju dozvole, i kako se realizuje skok na odgovarajuću prekidnu rutinu.
2. zadatak
Postavka
[5p] Napisati optimalnu sekvencu instrukcija neophodnih za sračunavanje izraza:
int *a, *b, c, i;
...
i = 0;
while (i < c) {
if (a[i] > 0) b[i] = 0;
else b[i] = 1;
i += 1;
}
...
Na raspolaganju je procesor kod koga aritmetičke, logičke i pomeračke instrukcije imaju format: OC reg, reg, reg/imm gde je OC kod operacije, odredišni operand i prvi operand moraju biti u registru (reg), dok drugi može biti ili u registru ili dat neposredno (reg/imm). Instrukcija LOAD ima format: LOAD reg, mem gde je prvim operandom dat odredišni registar (reg), a drugim izvorište. Instrukcija STORE ima format: STORE reg, mem gde je prvim operandom dat izvorišni registar (reg), a drugim odredište. A, B, C i I su globalne promenljive koje odgovaraju simboličkim oznakama adresa memorijskih lokacija u kojima se nalaze operandi. Sadržaj memorijskih lokacija označenih adresama A, B i C treba da ostane nepromenjen, sadržaj odgovarajućih registara je dozvoljeno menjati. Na raspolaganju stoji 8 registara opšte namene. Pretpostaviti da su svi podaci i adrese iste dužine koja je jednaka adresibilnoj jedinici.
Rešenje
LOAD Ra, a
LOAD Rb, b
LOAD Rc, c
! ...
AND Ri, Ri, #0
STORE Ri, i
AND R0, R0, #0
ADD R1, R0, #1
loop: CMP Ri, Ri, Rc
JGE end
CMP (Ri, Ra)0, #0
JLE else
STORE (Ri, Rb)0, R0
JMP skip
else: STORE (Ri, Rb)0, R1
skip: ADD Ri, Ri, #1
STORE Ri, i
JMP loop
end: ! ...
3. zadatak
Postavka
[5p] Napisati optimalnu sekvencu instrukcija koja odgovara sledećoj standardnoj bibliotečkoj C funkciji koja kopira karakter c u prvih n karaktera niza str.
void *memset(void *str, int c, int n);
Funkcija kao rezultat vraća pokazivač na rezultujući niz str. Formati instrukcija i podataka su kao u zadatku 2. Na raspolaganju stoje i složene instrukcije.
Rešenje
;void *memset(void *str, int c, int n);
;https://cplusplus.com/reference/cstring/memset/
;izgled steka:
;| n |
;| c |
;| str |
;| retPC |
;| BP |
;| R1 | <--- BP nakon mov BP, SP
;| R2 |
memset:
push BP
mov BP, SP
push R1
push R2
load R0, (BP)2 ; str
load R1, (BP)3 ; c
load R2, (BP)4 ; n
movc #0, #0 , R1, R2, R0 ; movc srclen, srcadr, fill, dstlen, dstAdr
mov R0, (BP)2 ; str ; funkcija vraca parametar str a on se inkrementirao u movc
pop R2
pop R1
pop BP
rts
4. zadatak
- Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.
Postavka
[25p] U računarskom sistemu se nalazi jednoadresni procesor, memorija i periferije PER0, PER1 i PER2. Sve komponente računara su povezane sistemskom magistralom sa 16 bitnom adresnom i 16 bitnom magistralom podataka. Adresiranje je na nivou 16 bitnih reči. Adresni prostor ovog računara i ulazno/izlazni adresni prostor su razdvojeni. Svi podaci i adrese su širine 16 bita. Adrese relevantnih registara su:
PER0_CONTROL | FF00h | PER1_CONTROL | FF10h | PER2_CONTROL FF20h |
PER0_STATUS | FF01h | PER1_STATUS | FF11h | PER2_STATUS FF21h |
PER0_DATA | FF02h | PER1_DATA | FF12h | PER2_DATA FF22h |
U upravljačkim registrima bit 0 je Start kojim se dozvoljava početak operacije, bit 1 određuju tip prenosa podataka (0 - ulaz (input), 1 - izlaz (output)), bit 7 je Enable kojim se dozvoljava prekid, a u statusnim registrima bit 0 je Ready koji signalizira spremnost kontrolera periferije. Moguće je upisivati i čitati iz svih registara. Napisati glavni program i odgovarajuću prekidnu rutinu kojima se obavlja sledeći prenos. Sa periferije PER0 se prihvata niz A(i) (i=0..99h). Niz A(i) se smešta u memoriju počev od lokacije 1000h. Takođe, sa prijemom ovog niza uporedo se obavlja i njegovo slanje tako što se elementi niza čija je vrednost neparna šalju periferiji PER1, a elementi niza čija je vrednost parna šalju periferiji PER2. Potrebno je realizovati i iskoristiti na odgovarajućim mestima sledeće potprograme:
- Neblokirajući potprogram
int receiveFromPER0()
, ovaj potprogram vraća primljenu vrednost sa PER0 bez provere da li je PER0 uopšte spremila podatak za slanje. - Blokirajući potprogram
void sendToPER1(int value)
, ovaj potprogram šalje argument value na periferiju PER1 pri čemu prvo proverava da li je PER1 spremna da primi podatak i kada bude spremna, onda argument šalje periferiji. - Neblokirajući potprogram
void sendToPER2(int value), ovaj potprogram šalje argument value na periferiju PER2 bez provere da li je PER2 spremna da primi podatak, već odmah šalje argument periferiji.
Prihvatanje niza sa periferije PER0 realizovati korišćenjem mehanizma prekida, slanje odgovarajućih elemenata na PER1 realizovati ispitivanjem bita spremnosti, a slanje odgovarajućih elemenata na periferiju PER2 realizovati korišćenjem mehanizma prekida. Voditi računa da svi transferi teku uporedo. Program treba da radi ciklično (prima se nov niz A(i) i na prethodno opisan način prosleđuje odgovarajućim periferijama).
Procesor poseduje akumulator dužine 16 bita i ne poseduje registre opšte namene. Stek raste od viših ka nižim lokacijama, a SP ukazuje na poslednju zauzetu lokaciju. Dozvoljeno je koristiti dodatne promenljive, ali njihove nazive treba pisati opisno i semantički ispravno. Obavezno je pisanje konciznih komentara nad semantičkim celinama