Архитектура рачунара/Фебруар 2020 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (Resenje prepravljeno da bude komplijantno sa load/store arhitekturom datom u opisu zadatka)
 
(Није приказана једна међуизмена другог корисника)
Ред 40: Ред 40:
         JGE end
         JGE end


         CMP (Ri, Ra)0, #0
         LOAD Rtemp0, (Ri, Ra)0
        CMP Rtemp0, #0
         JLE else
         JLE else
         STORE (Ri, Rb)0, R0
         STORE R0, (Ri, Rb)0
         JMP skip
         JMP skip
          
          
else:  STORE (Ri, Rb)0, R1
else:  STORE R1, (Ri, Rb)0
          
          
skip:  ADD Ri, Ri, #1
skip:  ADD Ri, Ri, #1
Ред 55: Ред 56:


== 3. задатак ==
== 3. задатак ==
{{делимично решено}}
=== Поставка ===
=== Поставка ===
'''[5п]''' Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој C функцији која копира карактер ''c'' у првих ''n'' карактера низа ''str''.
'''[5п]''' Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој C функцији која копира карактер ''c'' у првих ''n'' карактера низа ''str''.

Тренутна верзија на датум 18. јун 2023. у 10:03

1. задатак

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

Поставка

[5п] У посматраном рачунарском систему процесор има 3 пара линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнале потврда. У датом систему има 9 улазно/излазних уређаја које треба некако повезати помоћу та 3 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.

  1. Нацртати како тих 9 улазно/излазних уређаја треба повезати помоћу та 3 пара линија на процесор.
  2. Објаснити како тих 9 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.

2. задатак

Поставка

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

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

loop:   CMP Ri, Ri, Rc
        JGE end

        LOAD Rtemp0, (Ri, Ra)0
        CMP Rtemp0, #0
        JLE else
        STORE R0, (Ri, Rb)0
        JMP skip
        
else:   STORE R1, (Ri, Rb)0
        
skip:   ADD Ri, Ri, #1
        STORE Ri, i
        JMP loop
        
end:    ! ...

3. задатак

Поставка

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

void *memset(void *str, int c, int n);

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

Решење

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

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

Поставка

[25п] У рачунарском систему се налази једноадресни процесор, меморија и периферије PER0, PER1 и PER2. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Адресни простор овог рачунара и улазно/излазни адресни простор су раздвојени. Сви подаци и адресе су ширине 16 бита. Адресе релевантних регистара су:

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

У управљачким регистрима бит 0 је Start којим се дозвољава почетак операције, бит 1 одређују тип преноса података (0 - улаз (input), 1 - излаз (output)), бит 7 је Enable којим се дозвољава прекид, а у статусним регистрима бит 0 је Ready који сигнализира спремност контролера периферије. Могуће је уписивати и читати из свих регистара. Написати главни програм и одговарајућу прекидну рутину којима се обавља следећи пренос. Са периферије PER0 се прихвата низ A(i) (i=0..99h). Низ A(i) се смешта у меморију почев од локације 1000h. Такође, са пријемом овог низа упоредо се обавља и његово слање тако што се елементи низа чија је вредност непарна шаљу периферији PER1, а елементи низа чија је вредност парна шаљу периферији PER2. Потребно је реализовати и искористити на одговарајућим местима следеће потпрограме:

  • Неблокирајући потпрограм int receiveFromPER0(), овај потпрограм враћа примљену вредност са PER0 без провере да ли је PER0 уопште спремила податак за слање.
  • Блокирајући потпрограм void sendToPER1(int value), овај потпрограм шаље аргумент value на периферију PER1 при чему прво проверава да ли је PER1 спремна да прими податак и када буде спремна, онда аргумент шаље периферији.
  • Неблокирајући потпрограм void sendToPER2(int value), овај потпрограм шаље аргумент value на периферију PER2 без провере да ли је PER2 спремна да прими податак, већ одмах шаље аргумент периферији.

Прихватање низа са периферије PER0 реализовати коришћењем механизма прекида, слање одговарајућих елемената на PER1 реализовати испитивањем бита спремности, а слање одговарајућих елемената на периферију PER2 реализовати коришћењем механизма прекида. Водити рачуна да сви трансфери теку упоредо. Програм треба да ради циклично (прима се нов низ A(i) и на претходно описан начин прослеђује одговарајућим периферијама).

Процесор поседује акумулатор дужине 16 бита и не поседује регистре опште намене. Стек расте од виших ка нижим локацијама, а SP указује на последњу заузету локацију. Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. Обавезно је писање концизних коментара над семантичким целинама