Arhitektura računara/Septembar 2020

Izvor: SI Wiki
< Архитектура рачунара
Datum izmene: 18. jun 2023. u 13:01; autor: Ilija (razgovor | doprinosi) (→‎Решење)
(razl) ← Starija izmena | Trenutna verzija (razl) | Novija izmena → (razl)
Pređi na navigaciju Pređi na pretragu

1. zadatak

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Postavka

[5p] Kontroler izlazne periferije i izlazna periferija za međusobno povezivanje koriste paralelni interfejs koji se sastoji od linija podataka, jedne statusne linije i jedne upravljačke linije. Statusnom linijom izlazna periferija daje indikaciju kontroleru periferije da li je spremna da primi podatak koji je dostupan na linijama podataka, dok kontroler periferije upravljačkom linijom obezbeđuje čitanje podataka sa linija podataka u svoj interni registar. Navesti po kom redosledu se navedene linije koriste za sinhronizaciju i slanje podataka iz kontrolera periferije na periferiju. Odgovor dati tabelarno. Naznačiti koja je početna vrednost na ovim linijama.

Redosled
Linija (statusna/upravljačka/podaci) Vrednost Značenje
Ko postavlja

2. zadatak

Postavka

[5p] Napisati optimalnu sekvencu instrukcija neophodnih za sračunavanje izraza:

int *a, *b, c, i;
...
i = c-1;
while (i >= 0) {
    if (b[i] > 0) a[i] = 1;
    else a[i] = 0;
    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
        ! ...
        SUB Ri, Rc, #1
        STORE Ri, i
        
        AND R0, R0, #0
        ADD R1, R0, #1
        
loop:   CMP Ri, #0
        JLS end

        LOAD Rtemp0, (Ri, Rb)0
        CMP Rtemp0, #0
        JLE else
        STORE R1, (Ri, Ra)0
        JMP skip
        
else:   STORE R0, (Ri, Ra)0
        
skip:   SUB 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 pronalazi prvo pojavljivanje karaktera c u prvih n bajta niza str;

void *memchr(const void *str, int c, int n);

Funkcija kao rezultat vraća pokazivač na pronađeni karakter ili 0 u slučaju da karakter nije pronađen. Formati instrukcija i podataka su kao u zadatku 2. Na raspolaganju stoje i složene instrukcije.


Rešenje

;void *memchr (const void *str, int c, int n)
;https://en.cppreference.com/w/c/string/byte/memchr
;izgled steka:
;|   n   |
;|   c   |
;|  str  |
;| retPC |
;|  BP   |
;|  R1   | <--- BP nakon mov BP, SP
;|  R2   |

memchr:
	push BP
	mov BP, SP
	
	push R1
	push R2
	
	load R0, (BP)3 ; str
	load R1, (BP)4 ; c
	load R2, (BP)5 ; n
	
	locc R2, R0, R1 ; locc len, addr, char
	jnz skip
	load R0, #0 ; ako nije nadjen karakter vrati null
skip:	
	pop R2
	pop R1
	pop BP
	ret

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 do PERN. Smatrati da je[sic] broj N pripada skupu od 0h do FFh i da može da se koristi kao neposredna vrednost u programu (#N). 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. Svi podaci i adrese su širine 16 bita. Ulazno-izlazni adresni prostor i memorijski adresni prostor su mapirani. Adrese relevantnih registara se formiraju na sledeći način:

PERXX_CONTROL FXX0h
PERXX_STATUS FXX1h
PERXX_DATA FXX2h

gde XX pripada skupu od 0h do N. Npr. za periferiju PER5 adresa kontrolnog, statusnog i registra podataka bile bi F050h, F051h i F052h, respektivno. U upravljačkim registrima bit 0 je Start kojim se dozvoljava početak operacije, bit 1 određuju tip prenosa podataka (1 - ulaz (input), 0 - izlaz (output)), bit 2 je Enable kojim se dozvoljava prekid, a u statusnim registrima bit 0 je Ready koji signalizira spremnost kontrolera periferije. Napisati glavni program, odgovarajući potprogram i prekidne rutine kojima se obavlja sledeći prenos. Periferija PERN šalje beskonačan niz podataka koji se smešta u kružni bafer veličine 100h u memoriju počev od adrese 1000h. Prijem podataka od periferije PERN prestaje kada se napuni bafer i počinje opet kada se u istom oslobodi prostor. U paraleli sa primanjem podataka sa periferije PERN, iz kružnog bafera je potrebno slati podatke na periferije PER0 do PERN-1. Podatke treba slati tako da sve periferije prime tekući podatak pre slanja sledećeg podatka iz bafera. Npr. podatak na adresi 1000h treba poslati periferijama PER0 do PERN-1 pre slanja podataka na adresi 1001h. Periferije PER0 do PERN-1 prestaju sa radom kada se isprazan[sic] bafer, a počinju opet kada se u istom pojavi novi podatak. Primanje podataka sa periferije PERN realizovati korišćenjem mehanizma prekida. Slanje podataka sa periferija PER0 do PERN-1 realizovati ispitivanjem bita spremnosti. Za slanje jednog podatka iz bafera na periferiju XX, XX pripada skupu od 0 do N-1, potrebno realizovati potprogram

bool sendDataToPERX(int value, int x)

koji kroz akumulator vraća jedinicu ako argument value jeste poslat na periferiju PERX, gde argument x odgovara rednom broju periferije na koju se šalje podatak. U suprotnom vraća nulu. Argumenti value i x se prilikom poziva potprograma prenosi[sic] putem steka i pozivalac potprograma je dužan da argument skine sa steka nakon izvršavanja. Smatrati da su dostupni registri BP i SP prilikom pisanja potprograma. Procesor 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

Rešenje

; CR: | ... | en | I/O | start |
; SR: | ... | ready |

; PERN  salje beskonacan niz podataka
; primanje podataka mehanizmom prekida
; slanje podataka ispitivanjem bita spremnosti
; mapiran UI prostor

;-----glavni program-------
load #100h
store spaceAvailable ; semafor
load #0
store itemsAvailable ; semafor
load #1000h
store head
store tail


load #N
asl
add #f000
store pern_control ; adresa pern control registra
add #2
store pern_data ; adresa pern data registra
load #7 
store (pern_control) ; start pern


mainLoop:
	load #N
	sub #1 ; salje se n-1 periferija
	store current_peripheral

	waitForItems:
		load itemsAvailable
		jz waitForItems
	
	sendOneItem: ; posalji head bafera jednoj periferiji (izvrsava se N puta)
	load current_peripheral
	push ; push x
	load (head)
	push ; push value
	call sendDataToPERX
	pop ; ocisti stek
	pop ; ocisti stek
	
	load head
	inc
	mod #100
	store head; head = (head+1) % buff_size
	
	load spaceAvailable
	inc
	store spaceAvailable
	
	load itemsAvailable
	dec
	store itemsAvailable
	
	load current_peripheral
	dec
	jnz sendOneItem ; nije jos poslato svim periferijama
	
	jmp mainLoop ; beskonacna petlja
	
	halt


;------- prekidna rutina periferije n
interruptPERN:
	push ; push acc
	load spaceAvailable
	jz exit ;ignorisi vrednost ako nema mesta u baferu
	
	load (pern_data)
	store (tail) ; buff[tail] = pern.data
	load tail
	inc
	mod #100h
	store tail ; tail = (tail+1) % buff_size
	
	load itemsAvailable
	inc
	store itemsAvailable
	
	load spaceAvailable
	dec
	store spaceAvailable
	
	pop ; pop acc
 exit: rti

; bool sendDataToPERX (int value, int x)
sendDataToPERX:
;|   x   |
;| value |
;| retPC |
;|  BP   |
	load BP
	push
	load SP 
	store BP ; mov BP, SP
	load (BP)3 ; load x
	asl
	add #f000
	store perx_control
	add #1
	store perx_status
	add #1 
    store perx_data
	load #1
	store (perx_control); perx start
	
	waitReady:
		load (perx_status)
		and #1
		jz waitReady
		
	load (BP)2 ; load value
	
	store (perx_data)
	load #0
	store (perx_control) ; ugasi perx
	
	load #1 ; return true
	rts

Napomena:

U zadatku je dato da funkcija sendDataToPERX(int value, int x) vraća boolean što najverovatnije znači da je bilo potrebno u njoj pokušati slanje pa ako periferija nije spremna onda vratiti false. U gornjem rešenju funkcija uvek vraća true zato što uposleno čeka na periferiju u funkciji, što verovatno nije traženo rešenje.