Архитектура рачунара/Септембар 2020

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

1. задатак

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

[5п] Контролер излазне периферије и излазна периферија за међусобно повезивање користе паралелни интерфејс који се састоји од линија података, једне статусне линије и једне управљачке линије. Статусном линијом излазна периферија даје индикацију контролеру периферије да ли је спремна да прими податак који је доступан на линијама података, док контролер периферије управљачком линијом обезбеђује читање података са линија података у свој интерни регистар. Навести по ком редоследу се наведене линије користе за синхронизацију и слање података из контролера периферије на периферију. Одговор дати табеларно. Назначити која је почетна вредност на овим линијама.

Редослед
Линија (статусна/управљачка/подаци) Вредност Значење
Ко поставља

2. задатак

Поставка

[5п] Написати оптималну секвенцу инструкција неопходних за срачунавање израза:

int *a, *b, c, i;
...
i = c-1;
while (i >= 0) {
    if (b[i] > 0) a[i] = 1;
    else a[i] = 0;
    i -= 1;
}
...

На располагању је процесор код кога аритметичке, логичке и померачке инструкције имају формат: OC reg, reg, reg/imm где је OC код операције, одредишни операнд и први операнд морају бити у регистру (reg), док други може бити или у регистру или дат непосредно (reg/imm). Инструкција LOAD има формат: LOAD reg, mem где је првим операндом дат одредишни регистар (reg), а другим извориште. Инструкција STORE има формат: STORE reg, mem где је првим операндом дат изворишни регистар (reg), а другим одредиште. A, B, C и I су глобалне променљиве које одговарају симболичким ознакама адреса меморијских локација у којима се налазе операнди. Садржај меморијских локација означених адресама A, B и C треба да остане непромењен, садржај одговарајућих регистара је дозвољено мењати. На располагању стоји 8 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.

Решење

        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. задатак

Поставка

[5п] Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој C функцији која проналази прво појављивање карактера c у првих n бајта низа str;

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

Функција као резултат враћа показивач на пронађени карактер или 0 у случају да карактер није пронађен. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.


Решење

;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. задатак

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

[25п] У рачунарском систему се налази једноадресни процесор, меморија и периферије PER0, PER1 до PERN. Сматрати да је[sic] број N припада скупу од 0h до FFh и да може да се користи као непосредна вредност у програму (#N). Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Сви подаци и адресе су ширине 16 бита. Улазно-излазни адресни простор и меморијски адресни простор су мапирани. Адресе релевантних регистара се формирају на следећи начин:

PERXX_CONTROL FXX0h
PERXX_STATUS FXX1h
PERXX_DATA FXX2h

где XX припада скупу од 0h до N. Нпр. за периферију PER5 адреса контролног, статусног и регистра података биле би F050h, F051h и F052h, респективно. У управљачким регистрима бит 0 је Start којим се дозвољава почетак операције, бит 1 одређују тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 2 је Enable којим се дозвољава прекид, а у статусним регистрима бит 0 је Ready који сигнализира спремност контролера периферије. Написати главни програм, одговарајући потпрограм и прекидне рутине којима се обавља следећи пренос. Периферија PERN шаље бесконачан низ података који се смешта у кружни бафер величине 100h у меморију почев од адресе 1000h. Пријем података од периферије PERN престаје када се напуни бафер и почиње опет када се у истом ослободи простор. У паралели са примањем података са периферије PERN, из кружног бафера је потребно слати податке на периферије PER0 до PERN-1. Податке треба слати тако да све периферије приме текући податак пре слања следећег податка из бафера. Нпр. податак на адреси 1000h треба послати периферијама PER0 до PERN-1 пре слања података на адреси 1001h. Периферије PER0 до PERN-1 престају са радом када се испразан[sic] бафер, а почињу опет када се у истом појави нови податак. Примање података са периферије PERN реализовати коришћењем механизма прекида. Слање података са периферија PER0 до PERN-1 реализовати испитивањем бита спремности. За слање једног податка из бафера на периферију XX, XX припада скупу од 0 до N-1, потребно реализовати потпрограм

bool sendDataToPERX(int value, int x)

који кроз акумулатор враћа јединицу ако аргумент value јесте послат на периферију PERX, где аргумент x одговара редном броју периферије на коју се шаље податак. У супротном враћа нулу. Аргументи value и x се приликом позива потпрограма преноси[sic] путем стека и позивалац потпрограма је дужан да аргумент скине са стека након извршавања. Сматрати да су доступни регистри BP и SP приликом писања потпрограма. Процесор не поседује регистре опште намене. Стек расте од виших ка нижим локацијама, а SP указује на последњу заузету локацију. Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. Обавезно је писање концизних коментара над семантичким целинама

Решење

; 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

Напомена:

У задатку је дато да функција sendDataToPERX(int value, int x) враћа boolean што највероватније значи да је било потребно у њој покушати слање па ако периферија није спремна онда вратити false. У горњем решењу функција увек враћа true зато што упослено чека на периферију у функцији, што вероватно није тражено решење.