Архитектура рачунара/Јун 2021 — разлика између измена
(→3. задатак: Resen) |
|||
Ред 38: | Ред 38: | ||
== 3. задатак == | == 3. задатак == | ||
=== Поставка === | === Поставка === | ||
'''[5п]''' Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која копира ''n'' бајта низа ''src'' y низ ''dst'': | '''[5п]''' Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која копира ''n'' бајта низа ''src'' y низ ''dst'': | ||
<syntaxhighlight lang="C">void *memсру (void *dst, const void *src, int n);</syntaxhighlight> | <syntaxhighlight lang="C">void *memсру (void *dst, const void *src, int n);</syntaxhighlight> | ||
Функција као резултат враћа показивач на одредишни низ ''dst''. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције. | Функција као резултат враћа показивач на одредишни низ ''dst''. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције. | ||
=== Решење === | |||
<syntaxhighlight lang="asm"> | |||
PUSH BP | |||
MV BP, SP | |||
PUSH R0 | |||
PUSH R1 | |||
PUSH R2 | |||
//Pretpostavka da SP ukazuje na prvu slobodnu lokaciju i da raste na dole | |||
LD R0, [BP]3 //dst | |||
LD R1, [BP]4 //src | |||
LD R2, [BP]5 //n | |||
//srcLen, srcAddr, fill, dstLen, dstAddr | |||
MOVC R2, R1, 'x', R2, R0 | |||
POP R2 | |||
POP R1 | |||
POP R0 | |||
POP BP | |||
RTS | |||
</syntaxhighlight> | |||
== 4. задатак == | == 4. задатак == |
Верзија на датум 13. јун 2022. у 23:33
1. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
[5п] У посматраном рачунарском систему процесор има 3 пара линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнале потврда. У датом систему има 8 улазно/излазних уређаја које треба некако повезати помоћу та 3 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.
- Нацртати како тих 8 улазно/излазних уређаја треба повезати помоћу та 3 пара линија на процесор.
- Нацртати интерну структуру контролера периферије који дозвољава серијско слање прекида наредној периферији у ланцу.
2. задатак
Поставка
[5п] Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:
int a,b,c,d,e,f;
...
a = (b+c) - (d+e);
if (a == 0) f = (b+c);
else f = (d+e);
На располаrању је процесор код кога аритметичке, логичке и померачке инструкције имају формат: ОС reg, reg, reg/imm где је ОС код операције, одредишни операнд и први операнд морају бити у регистру (reg), док други може бити или у регистру или дат непосредно (reg/imm). Инструкција LOAD има формат: LOAD reg, mem где је првим операндом дат одредишни регистар (reg), a другим извориште. Инструкцијa STORE има формат: STORE reg, mem где је првим операндом дат изворишни регистар (reg), a другим одредиште. А, В, С, D, E и F су глобалне променљиве које одговарају симболичким ознакама адреса меморијских локација у којима се налазе операнди. Садржај меморијских локација означених адресама В, С, D и Е треба да остане непромењен, садржај одговарајућих регистара је дозвољено мењати. На располагању стоји 8 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици
Решење
LOAD R1, b
LOAD R2, c
ADD R1, R1, R2
LOAD R2, d
LOAD R3, e
ADD R2, R2, R3
SUB R3, R1, R2
STORE R3, a
JNZ else
STORE R1, f
JMP end
else: STORE R2, f
end: ...
3. задатак
Поставка
[5п] Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која копира n бајта низа src y низ dst:
void *memсру (void *dst, const void *src, int n);
Функција као резултат враћа показивач на одредишни низ dst. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.
Решење
PUSH BP
MV BP, SP
PUSH R0
PUSH R1
PUSH R2
//Pretpostavka da SP ukazuje na prvu slobodnu lokaciju i da raste na dole
LD R0, [BP]3 //dst
LD R1, [BP]4 //src
LD R2, [BP]5 //n
//srcLen, srcAddr, fill, dstLen, dstAddr
MOVC R2, R1, 'x', R2, R0
POP R2
POP R1
POP R0
POP BP
RTS
4. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
[25п] У рачунарском систему се налази једноадресни процесор, меморија и периферије РЕR0, PER1 до РERN. Cматрати да број N припада скупу од 1 до 15 и да може да се користи као непосредна вредност у програму (#N). Периферији РER0 jе придружен DMA0 контролер. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Сви подаци и адресе су ширине 16 бита. Узети да је тип података іnt дужине 16 бита. Улазно-излазни адресни простор и меморијски адресни простор су преклопљени. Адресе релевантних регистара периферија РER0 и DМА0 контролера су:
PER0_CONTROL | F000h | DMA0_CONTROL | F003h | DMA0_ADDR | F006h |
PER0_STATUS | F001h | DMA0_STATUS | F004h | DMA0_CNT | F007h |
PER0_DATA | F002h | DMA0_DATA | F005h |
Адресе релевантних регистара периферија РER1 до РERN се добијају као резултат потпрограма
int* getPеrRegAddr (unsigned int N, unsigned int typе);
где N представља број периферије, type представља тип регистра (1 - ENTRY, 2 - CONTROL, 3 - STATUS, 4 - DATA). Потпрограм getPerRegAddr не треба имплементирати, већ само позивати на одговарајућем месту у програму.
У управљачким регистрима бит 0 је Start којим се дозвољава почетак операције, бит 1 одрeђују тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 2 је Enable којим се дозвољава прекид. Бит 3 управљачког регистра контролера DMA0 се задаје режим рада (0-блоковски (burst), 1-циклус по циклус (сусle stealing)). У статусним регистрима бит 0 је Ready који сигнализира спремност контролера периферије.
Написати главни програм, одговарајући потпрограм и прекидну рутину којима се обавља следећи пренос.
Периферија РER0 шаље низ од 100h означених целих бројева који се смештају у меморију почев од адресе 5000h. Hакон учитаног низа у меморију потребно је проследити максималну вредност низа периферијама РER1 до РЕRN. Пренос максималне вредности периферијама треба обављати у паралели, чим периферија буде спремна да прими податак. Након што је свака периферија примила максималну вредност, потребно је да РER0 учита нов низ (од 100h означених целих бројева који се смештају у меморију почев од адресе 5000h), да се проследи нова максимална вредност низа периферијама РER1 до PERN и тако циклично да ради програм.
Периферије PER1 до РERN када се једном укључе, није дозвољено да се потом искључе. Ради евиденције којoј периферији је прослеђена тренутна максимална вредност низа потребно је увести променљиву mask. Bредност бита maski треба да има вредност 1 уколико је тренутна максимална вредност низа прослеђена периферији РERi, a да има вредност 0 уколико тренутна максимална вредност низа није још прослеђена периферији РERi. Након прослеђене максималне вредности свим периферијама, вредност променльиву mask треба ресетовати на 0.
Потребно је имплементирати и у програму на одговарајуhем месту позвати потпрограм
int max (int* arrAddr, unsigned int length);
Који враћа максималну вредност низа задатом почетном адресом аrrAddr и дужине length eлемената.
Примање података са периферије РERO реализовати коришћењем DMА0 контролера у блоковском режиму рада. Слање података на периферије РER1 до РERN peализовати испитивањем бита спремности.
Сматрати да су доступни регистри ВР и SP приликом писања потпрограма. Обратити пажњу да потпрограм не сме да користи глобалне променљиве, већ само параметре потпрограма и локане променљиве. Позивалац потпрограма је дужан да уклони параметре са стека. Резултат потпрограма се враћа кроз акумулатор. Процесор не поседује регистре опште намене, као ни регистар IМR. Стек расте од виших ка нижим локацијама, а SP указује на последњу заузету локацију. Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. Обавезно је писање концизних коментара над семантичким целинама.