Архитектура рачунара/Јун 2024 — разлика између измена
(→Решење) |
|||
(Једна међуизмена истог корисника није приказана) | |||
Ред 58: | Ред 58: | ||
PUSH R3 | PUSH R3 | ||
PUSH R4 | PUSH R4 | ||
LOAD R1, (BP)2 | LOAD R1, (BP)2 ; src1 | ||
LOAD R2, (BP)3 | LOAD R2, (BP)3 ; src2 | ||
XOR R0, R0, R0 | XOR R0, R0, R0 ; clear R0 | ||
;strlen(src1) | |||
LOAD R4, #maxValue | LOAD R4, #maxValue | ||
;LOCC len, addr, char | |||
LOCC R4, R1, '\0' | LOCC R4, R1, '\0' | ||
SUB R1, R1, #1 | SUB R1, R1, #1 | ||
LOAD R4, (BP)2 | LOAD R4, (BP)2 | ||
SUB R3, R1, R4 | SUB R3, R1, R4 ; R3 = strlen(src1) | ||
;strlen(src2) | |||
LOAD R4, #maxValue | LOAD R4, #maxValue | ||
LOCC R4, R2, '\0' | LOCC R4, R2, '\0' | ||
SUB R2, R2, #1 | SUB R2, R2, #1 | ||
LOAD R4, (BP)3 | LOAD R4, (BP)3 | ||
SUB R4, R2, R4 | SUB R4, R2, R4 ; R4 = strlen(src2) | ||
;MATCH src1len, src1addr, src2len, src2addr | |||
LOAD R1, (BP)2 | LOAD R1, (BP)2 ; src1 | ||
LOAD R2, (BP)3 | LOAD R2, (BP)3 ; src2 | ||
MATCHC R3, R1, R4, R2 | MATCHC R3, R1, R4, R2 | ||
JNZ end | JNZ end ; z == 1 src2 not found in src1 | ||
MOV R0, R1 | MOV R0, R1 | ||
end: POP R4 | end: POP R4 | ||
Ред 92: | Ред 92: | ||
POP BP -> LOAD BP, (SP)+ | POP BP -> LOAD BP, (SP)+ | ||
MOV BP, SP -> ADD BP, SP, #0 | MOV BP, SP -> ADD BP, SP, #0 | ||
LOAD R4, #maxValue -> ADD R4, R0, #maxValue | LOAD R4, #maxValue -> ADD R4, R0, #maxValue ; R0 = 0 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== 4. задатак == | == 4. задатак == | ||
{{делимично решено}} | {{делимично решено}} |
Тренутна верзија на датум 11. јул 2024. у 19:41
1. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
[5п] У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.
- Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.
- Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.
2. задатак
Поставка
[5п] Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:
int a, b, c, d, e;
...
b = a + c - d - e;
if (b > 0) a = a - e;
else a = c - d;
...
На располаrању је процесор код кога аритметичке, логичке и померачке инструкције имају формат: ОС reg, reg, reg/imm где је ОС код операције, одредишни операнд и први операнд морају бити у регистру (reg), док други може бити или у регистру или дат непосредно (reg/imm). Инструкција LOAD има формат: LOAD reg, mem где је првим операндом дат одредишни регистар (reg), a другим извориште. Инструкцијa STORE има формат: STORE reg, mem где је првим операндом дат изворишни регистар (reg), a другим одредиште. А, В, С, D, и E су глобалне променљиве које одговарају симболичким ознакама адреса меморијских локација у којима се налазе операнди. Садржај меморијских локација означених адресама С, D и Е треба да остане непромењен, садржај одговарајућих регистара је дозвољено мењати. На располагању стоји 8 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.
Решење
Напомена Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору.
LOAD Ra, a
LOAD Rb, b
LOAD Rc, c
LOAD Rd, d
LOAD Re, e
...
SUB Rtemp0, Ra, Re
SUB Rtemp1, Rc, Rd
ADD Rb, Rtemp0, Rtemp1
STORE Rb, b
SUB Rb, Rb, #0
JLE else
ADD Ra, Rtemp0, #0
JMP end
else: ADD Ra, Rtemp1, #0
end: STORE Ra, a
...
3. задатак
Поставка
[5п] Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера src2 у низу карактера src1:
char *strstr(const char *src1, const char *src2)
Функција као резултат враћа показивач на прво појављивање низа карактера src2 у низу карактера src1 или 0 уколико се низ карактера src2 не појављује у низу карактера src1. Функција приликом поређења не узима у обзир терминални '\0' карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.
Решење
strstr:
PUSH BP
MOV BP, SP
PUSH R1
PUSH R2
PUSH R3
PUSH R4
LOAD R1, (BP)2 ; src1
LOAD R2, (BP)3 ; src2
XOR R0, R0, R0 ; clear R0
;strlen(src1)
LOAD R4, #maxValue
;LOCC len, addr, char
LOCC R4, R1, '\0'
SUB R1, R1, #1
LOAD R4, (BP)2
SUB R3, R1, R4 ; R3 = strlen(src1)
;strlen(src2)
LOAD R4, #maxValue
LOCC R4, R2, '\0'
SUB R2, R2, #1
LOAD R4, (BP)3
SUB R4, R2, R4 ; R4 = strlen(src2)
;MATCH src1len, src1addr, src2len, src2addr
LOAD R1, (BP)2 ; src1
LOAD R2, (BP)3 ; src2
MATCHC R3, R1, R4, R2
JNZ end ; z == 1 src2 not found in src1
MOV R0, R1
end: POP R4
POP R3
POP R2
POP R1
POP BP
RTS
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):
PUSH BP -> STORE BP, -(SP)
POP BP -> LOAD BP, (SP)+
MOV BP, SP -> ADD BP, SP, #0
LOAD R4, #maxValue -> ADD R4, R0, #maxValue ; R0 = 0
4. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
[15п] У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:
PER0_CONTROL F000h DMA_PER1_CONTROL F110h PER0_STATUS F001h DMA_PER1_STATUS F111h PER0_DATA F002h DMA_PER1_DATA F112h PER1_CONTROL F100h DMA_PER1_ADDR F113h PER1_STATUS F101h DMA_PER1_COUNT F114h PER1_DATA F102h
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције int calcParity(int value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10h података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се DMA контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености DMA контролера, периферија PER1 се враћа у режим рада без DMA контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8h. Обезбедити да сваки податак који је послала периферија PER0 буде успешно обрађен и прослеђен периферији PER1.
Написати главни програм, функцију calcParity и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип int ширине 16 бита.
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.
Напомена: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. Студент је дужан да пише читко и уредно.