<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=D3f4ult</id>
	<title>SI Wiki - Кориснички доприноси [sr]</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=D3f4ult"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D0%B1%D0%BD%D0%BE:%D0%94%D0%BE%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D0%B8/D3f4ult"/>
	<updated>2026-06-04T13:16:54Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A01&amp;diff=7937</id>
		<title>АОР1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A01&amp;diff=7937"/>
		<updated>2025-07-21T23:47:47Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Архитектура и организација рачунара 1&lt;br /&gt;
| шифра     = 13С113АОР1, 13Е113АОР1&lt;br /&gt;
| семестар  = 5&lt;br /&gt;
| статус    = изборни (СИ), обавезни (РТИ)&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir3aor1/ rti.etf.bg.ac.rs/rti/ir3aor1/]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
| претходни = Архитектура рачунара&lt;br /&gt;
| следећи   = АОР2&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Архитектура и организација рачунара 1&#039;&#039;&#039; је изборни предмет из петог семестра на СИ, а обавезни на РТИ. Да ли то може брже?&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=1FF2_Oa0TH9U943ZYjTiA5hmBTseD1rcm ETF SI] (наставни материјали, лабови)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/11270564251 ETF Materijali (Box)] (наставни материјал, лабови)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Као и на претходним ОРТоликим предметима, настава је организована у три блока.&lt;br /&gt;
# Кеш меморија (градиво за К1) - теорија 10 поена, задатак 10 поена;&lt;br /&gt;
# Виртуелна меморија, перформансе меморијског система, преклапање приступа меморијским модулима (градиво за К2) - теорија 15 поена, задаци 15 поена;&lt;br /&gt;
# Проточна обрада (градиво за испит) - теорија 15 поена, задатак 15 поена.&lt;br /&gt;
&lt;br /&gt;
Вежбе прате предавања. Прве недеље се обично држе предавања у термину вежби. Корисно је пратити предавања јер теорија долази на колоквијумима и испиту.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Постоје 3 лабораторијске вежбе које се оцењују са 7, 7 и 6 поена, респективно. Постоји једна надокнада у јануарском року. Тада се једна лабораторијска вежба може надокнадити/поправити бесплатно, док се друга плаћа по ценовнику факултета. Улазни тестови за све три лабораторијске вежбе су по структури идентични као и примери који су доступни на &#039;&#039;Moodle&#039;&#039; курсу (исти тип задатака).&lt;br /&gt;
&lt;br /&gt;
=== Прва лабораторијска вежба ===&lt;br /&gt;
Односи се на први блок наставе. Првих пола сата ради се улазни тест на &#039;&#039;Moodle&#039;&#039;. Тест садржи шест питања, од којих су потребна најмање три за пролаз. Број поена са теста се дели са два, а затим се одговара на питања кроз симулацију (слично Л2 и Л3 на ОРТ2). Такође, демонстратори постављају по три питања, свако вредно по поен. Број поена освојен код демонстратора сабира се са један и то се множи са процентом урађености лабораторијске вежбе.&lt;br /&gt;
&lt;br /&gt;
=== Друга лабораторијска вежба ===&lt;br /&gt;
Односи се на други блок наставе. Првих пола сата ради се улазни тест на &#039;&#039;Moodle&#039;&#039;. Тест садржи шест питања, од којих су потребна најмање три за пролаз. Број поена са теста се дели са два, а затим се одговара на питања кроз симулацију (као и на Л1). Такође, демонстратори постављају по три питања, свако вредно по поен. Број поена освојен код демонстратора сабира се са један и то се множи са процентом урађености лабораторијске вежбе.&lt;br /&gt;
&lt;br /&gt;
=== Трећа лабораторијска вежба ===&lt;br /&gt;
Односи се на проточну обраду. Првих пола сата ради се улазни тест на &#039;&#039;Moodle&#039;&#039;. Тест садржи шест питања, од којих су потребна најмање три за пролаз. Шаблон теста је исти као пример са &#039;&#039;Moodle&#039;&#039;-а, с тим што могу доћи другачије инструкције. Број поена са теста се дели са два, а затим се одговара на питања кроз симулацију (као и на Л1 и Л2). Такође, демонстратори постављају по три питања, свако вредно по поен. Број поена освојен код демонстратора се множи са процентом урађености лабораторијске вежбе.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Слично као на [[Архитектура рачунара#Испитни рокови|АР]], теоријска питања са рокова генерално немају решења.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = АОР1/.*&lt;br /&gt;
| noresultsheader = Тренутно нема решених испита.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1, L_2, L_3&amp;lt;/math&amp;gt; — Бодови са лабораторијских вежби (7+7+6, 0-20 укупно)&lt;br /&gt;
* &amp;lt;math&amp;gt;K1&amp;lt;/math&amp;gt; — Бодови са колоквијума један (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K2&amp;lt;/math&amp;gt; — Бодови са колоквијума два (0-30)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-30)&lt;br /&gt;
* Бодови: &amp;lt;math&amp;gt;P = L_1 + L_2 + L_3 + K1 + K2 + I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P &amp;lt; 51&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;51 \leq P &amp;lt; 61&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;61 \leq P &amp;lt; 71&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;71 \leq P &amp;lt; 81&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;81 \leq P &amp;lt; 91&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;91 \leq P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Рачунање ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K1&amp;quot; data-max=&amp;quot;20&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K2&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L1&amp;quot; data-max=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L2&amp;quot; data-max=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L3&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L3&amp;quot; data-max=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;K1 K2 I L1 L2 L3 + + + + +&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;br /&gt;
*: Рокови којима недостаје понеко решење су: {{rokovi|делимично решени}}&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0&amp;diff=7936</id>
		<title>Архитектура рачунара</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0&amp;diff=7936"/>
		<updated>2025-07-21T23:45:56Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С112АР, 13Е112АР&lt;br /&gt;
| семестар  = 4&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir2ar/ rti.etf.bg.ac.rs/rti/ir2ar/]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
| претходни = ОРТ2&lt;br /&gt;
| следећи   = АОР1&lt;br /&gt;
}}&lt;br /&gt;
ДОБАР ДАН! Добродошли на страницу из обавезног предмета у четвртом семестру &#039;&#039;&#039;Архитектура рачунара&#039;&#039;&#039;. Моје име је {{SITENAME}}. Да ли можда, имате, неких питања? Надам се да ме сада, чујете мало боље.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=15Jc3UWnpadZHIyndlrIqW9R98l64Cek9 ETF SI] (наставни материјали, решења рокова)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Градиво је подељено на следеће области:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Механизам прекида&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Магистрала, меморија (само на вежбама), улаз/излаз (основе, повезивање са периферијом)&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Технике рада са улазним/излазним уређајима (испитивање бита спремности, механизам прекида, DMA контролер), периферије и механизам прекида, конструкти из виших програмских језика, нестандардне инструкције&lt;br /&gt;
Предавања су неопходна, јер са теоријски задаци увек долазе на роковима (најчешће К1 10 поена, К2 15 поена, испит 15 поена). Вежбе прате градиво са предавања, и из њих обично долазе задаци сличих типова на колоквијуму:&lt;br /&gt;
* Задатак са извршавањем инструкција и руковођењем различитих врста прекида (долази на првом колоквијуму)&lt;br /&gt;
* Задатак са извршавањем инструкција и комуникацијом преко магистрале (може да дође на другом колоквијуму)&lt;br /&gt;
* Задатак са распоредом меморије и хардвером за руковођење адресним просторима (може да дође на другом колоквијуму)&lt;br /&gt;
* Комбинација претходне две ставке (може да дође на другом колоквијуму)&lt;br /&gt;
* Асемблерски задатак комуникације са меморијом и периферијама (долази на испиту)&lt;br /&gt;
Презентације са предавања могу се наћи на драјву из [[#Корисни материјали|одељка за корисне материјале]].&amp;lt;br&amp;gt;&lt;br /&gt;
Овде можете наћи и издвојену теорију:&amp;lt;br&amp;gt;&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       = File&lt;br /&gt;
| titleregexp     = Arhitektura računara teorija&lt;br /&gt;
| noresultsheader = Тренутно нема докумената.&lt;br /&gt;
| format          = ,\n* [[Медија:%TITLE%|²{#invoke:String¦sub¦%PAGE%¦11¦-5}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Постоје две лабораторијске вежбе, свака по 10 бодова, које се одржавају средином семестра. Раде се у симулатору, имају улазни &#039;&#039;Moodle&#039;&#039; тест и (само на другој лабораторијској вежби) домаћи задатак. Једну лабораторијску вежбу је могуће једном надокнадити, и бодови са лабораторијских вежби важе годину дана. Материјали са лабораторијских вежби од претходних година, попут домаћих задатака, упутства за асемблер и примера задатка за прву лабораторијску вежбу се могу наћи на [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/lab20212022/ страници предмета.] Више о самом симулатору може да се нађе у [[#SPECS|одељку са алатима]].&lt;br /&gt;
&lt;br /&gt;
Пре лабораторијских вежби доступни су пробни тестови за њих. 2020. године следећи пробни тестови су били на располагању са странице предмета:&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/Pitanja_2012_2013_V1.pdf Лаб 1 и 2]&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/Pitanja_2006_2007_V3.pdf Лаб 3]&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/Pitanja_2011_2012_V4.pdf Лаб 4]&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/Pitanja_2011_2012_V5.pdf Лаб 5]&lt;br /&gt;
Везе ка тим пробним тестовима се више не налазе на страници предмета од 2021. године. Уместо њих, на &#039;&#039;Moodle&#039;&#039; курсу предмета се могу наћи пробни тестови, од којих су за сада доступни они из [[Архитектура рачунара/Пробни тестови 2021|2021. године]].&lt;br /&gt;
Примере &#039;&#039;Moodle&#039;&#039; тестова који су били 2023. године на другој лабораторијској можете наћи [[Архитектура рачунара/Улазни тестови Лаб 2 2023|овде]].&lt;br /&gt;
&lt;br /&gt;
=== Прва лабораторијска вежба ===&lt;br /&gt;
&#039;&#039;Moodle&#039;&#039; тест носи 4 бода. Потребно је остварити најмање 2 како би се приступило изради лабораторијске вежбе. Осталих 6 бодова добија се на изради 4 задатка (2 лакша и 2 тежа). Задаци су по формату и идејама слични задацима на припремној лабораторијској вежби. Током израде лабораторијске вежбе демонстратор или асистент може поставити теоријска питања у вези са градивом и на основу њих може скинути одређен број поена у случају лошег одговора (мада је ово јако ретко). Задаци морају комплетно да раде да би се бодовали.&lt;br /&gt;
&lt;br /&gt;
=== Друга лабораторијска вежба ===&lt;br /&gt;
&#039;&#039;Moodle&#039;&#039; тест носи 4 бода. Потребно је остварити најмање 2 како би се приступило изради лабораторијске вежбе. Осталих 6 бодова добија се на изради 2 модификације домаћег задатка. Једна модификација је тривијална, док је друга мало тежа (али је већина успешно уради). Друга модификација на надокнади је, по правилу, прилично тежа. Током израде лабораторијске вежбе демонстратор или асистент може поставити теоријска питања у вези са градивом и на основу њих може скинути одређен број поена у случају лошег одговора (мада је ово јако ретко). Задаци морају комплетно да раде да би се бодовали. Свака од модификација носи 3 бода и оцењују се независно једна од друге.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат је реализовати процесор предложене архитектуре, магистрале и са периферијама (барем контролер миша или тастатуре и графичка картица која исцртава на VGA монитор) на коме ће се покретати предложени програм, на FPGA плочици &#039;&#039;Cyclone III&#039;&#039; (или &#039;&#039;Cyclone V&#039;&#039;) као што се користи на [[ПОРТ]]. Ради се у групи до 5 чланова, носи 20 бодова и &#039;&#039;&#039;није обавезан&#039;&#039;&#039;. У графичкој картици потребно је реализовати цртање пиксела, линије и квадрата користећи SDRAM чип на плочици. Контролери тастатуре и VGA монитора постоје реализовани на претходним [[ОРТ2]] лабораторијским вежбама, пре него што су измењене да не садрже рад са FPGA.&lt;br /&gt;
&lt;br /&gt;
По мишљењу предметних сарадника, пројекат носи много мање бодова него што је тежак, и не вреди га радити за оцену, већ само уколико су студенти заиста заинтересовани за такву врсту рада.&lt;br /&gt;
&lt;br /&gt;
Неке корисне везе при изради пројекта:&lt;br /&gt;
* [[github:topofkeks/arilla|Један од претходно реализованих пројеката]] (са реализованим контролером миша)&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ir2ort2/laboratorija/ORT2%20-%20LAB1%20(PS2).zip Контролер тастатуре са прве ОРТ2 лабораторијске вежбе]&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ir2ort2/laboratorija/ORT2%20-%20LAB2%20(VGA).zip VGA контролер са друге ОРТ2 лабораторијске вежбе]&lt;br /&gt;
* [http://www.burtonsys.com/ps2_chapweske.htm Више о PS/2 протоколу]&lt;br /&gt;
* [https://isdaman.com/alsos/hardware/mouse/ps2interface.htm Више о комуникацији са мишем]&lt;br /&gt;
* [http://www-ug.eecg.toronto.edu/msl/nios_devices/datasheets/PS2%20Keyboard%20Protocol.htm Више о комуникацији са тастатуром]&lt;br /&gt;
* [https://www.issi.com/WW/pdf/42S16400.pdf Документација SDRAM чипа са &#039;&#039;Cyclone III&#039;&#039; плочице] (препоручује се коришћење ове плочице јер досад на предмету нису рађени пројекти користећи SDRAM чип са &#039;&#039;Cyclone V&#039;&#039; плочице)&lt;br /&gt;
* [[wikipedia:Bresenham&#039;s line algorithm|Брезенхамов линијски алгоритам]] (доступан и на [[wikipedia:sr:Брезенхамов линијски алгоритам|српској Википедији]])&lt;br /&gt;
Софтверски алат &#039;&#039;ModelSim&#039;&#039; који може да се преузме поред &#039;&#039;Quartus&#039;&#039;-а је такође јако користан алат за дебаговање шема пре спуштања на плочицу, па је препоручљиво упознати се са тиме како ради.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Испитни рокови се могу наћи на страници предмета, али се испитни рокови од тренутне године објављују тек након што се година заврши. Често су решени, али само делимично. Испод се могу наћи рокови тренутно сакупљени на викију. Још увек непреписани рокови могу се наћи у [[#Потребна помоћ|одељку за потребну помоћ]]. Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Стандард (ћирилица)|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Колоквијуми ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Архитектура_рачунара/К\d? .*\d+&lt;br /&gt;
| noresultsheader = Тренутно нема решених колоквијума.&lt;br /&gt;
| format          = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦22¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| include         = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Испити ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Архитектура_рачунара/.*&lt;br /&gt;
| nottitleregexp  = Архитектура_рачунара/Пробни тестови&lt;br /&gt;
| nottitleregexp  = Архитектура_рачунара/Улазни тестови&lt;br /&gt;
| nottitleregexp  = Архитектура_рачунара/Лаб&lt;br /&gt;
| nottitleregexp  = Архитектура_рачунара/К &lt;br /&gt;
| noresultsheader = Тренутно нема решених испита.&lt;br /&gt;
| format          = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦22¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| include         = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алати ==&lt;br /&gt;
=== SPECS ===&lt;br /&gt;
&#039;&#039;SPECS&#039;&#039; је симулатор који се користи на лабораторијским вежбама. Може се преузети [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/lab20192020/simulator+asembler.zip са странице предмета] заједно са асемблером &#039;&#039;PSams&#039;&#039;. Детаљно упутство за коришћење ова два алата је такође [https://rti.etf.bg.ac.rs/rti/ef2ar/labvezbe/lab20212022/uputstvo.pdf дато на страници предмета.]&lt;br /&gt;
&lt;br /&gt;
Уколико симулатор покрећете кроз &#039;&#039;Wine&#039;&#039; на оперативном систему &#039;&#039;Linux&#039;&#039; (сличне инструкције можда раде и на &#039;&#039;macOS&#039;&#039;, али није тестирано), потребно је да:&lt;br /&gt;
* Из директоријума &amp;lt;code&amp;gt;p3lab1&amp;lt;/code&amp;gt; обришете &amp;lt;code&amp;gt;VEZBA.ECS&amp;lt;/code&amp;gt; јер ће асемблер генерисати нови фајл под именом &amp;lt;code&amp;gt;vezba.ecs&amp;lt;/code&amp;gt; који, уколико постоје оба фајла, симулатор неће читати.&lt;br /&gt;
* [https://askubuntu.com/a/177349 Користите 32-битни &#039;&#039;Wine&#039;&#039; префикс.]&lt;br /&gt;
* Кроз [https://wiki.winehq.org/Winetricks &#039;&#039;winetricks&#039;&#039;] инсталирајте &amp;lt;code&amp;gt;oleaut32&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vb6run&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;gdiplus&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1, L_2&amp;lt;/math&amp;gt; — Бодови са лабораторијских вежби (0-10 свака)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1, K_2&amp;lt;/math&amp;gt; — Бодови са првог и другог колоквијума носе по 25 сваки. (0-50)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-30)&lt;br /&gt;
* Бодови: &amp;lt;math&amp;gt;P = L_1 + L_2 + K_1 + K_2 + I&amp;lt;/math&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Рачунање ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K1&amp;quot; data-max=&amp;quot;25&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K2&amp;quot; data-max=&amp;quot;25&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L1&amp;quot; data-max=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L2&amp;quot; data-max=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;PR&amp;quot; data-max=&amp;quot;20&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;K1 K2 I L1 L2 PR + + + + +&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;br /&gt;
*: Рокови којима недостаје понеко решење су: {{rokovi|делимично решени}}&lt;br /&gt;
* {{zadaci|prepis}}&lt;br /&gt;
** Август 2020: [https://cdn.discordapp.com/attachments/693907737364398162/851646445852688424/ar-rokovi-avgust.jpg], [https://cdn.discordapp.com/attachments/693907737364398162/851646436667031562/ar-rokovi-avgust2.jpg]&lt;br /&gt;
** Август 2021: [https://cdn.discordapp.com/attachments/696381655933386832/882557009520652378/20210901_112613.jpg], [https://cdn.discordapp.com/attachments/696381655933386832/882557010346934322/20210901_112620.jpg]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BB_2024&amp;diff=7734</id>
		<title>Архитектура рачунара/Јул 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BB_2024&amp;diff=7734"/>
		<updated>2024-07-12T19:46:19Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор постоји само једна линија по којој улазно/излазни уређаји могу процесору да шаљу захтеве за прекид, док линија за слање сигнала потврде не постоји. У датом систему постоје 3 улазно/излазна уређаја UI2, UI1 и UI0, при чему UI2 има највиши, а UI0 најнижи приоритет. Периферија захтев за прекидом генерише као ниво и не постоји контролер прекида.&lt;br /&gt;
# Нацртати како та 3 улазно/излазна уређаја треба повезати помоћу те линије на процесор ради слања захтева за прекид.&lt;br /&gt;
# Објаснити како се реализује скок на одговарајућу прекидну рутину сваког од 3 улазно/излазна уређаја.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
# [[Датотека:AR jul 2024 zadatak1.png|1000px|безоквира|центар|алт=Задатак 1|Задатак 1]]&lt;br /&gt;
# Пошто не постоји линија за сигнал потврде, скок на одговарајућу прекидну рутину се реализује полирањем у заједничкој прекидној рутини. Због датих приоритета улазно/излазних уређаја, прво треба да испитујемо најприоритетнији уређај (UI2), па онда по приоритетима све до најмање приоритетног (UI0 у овом случају). Код изгледа овако:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
     PUSH R1&lt;br /&gt;
     PUSH R2&lt;br /&gt;
     LOAD R1, #2 ; ucitavamo broj ulaza najprioritetnijeg&lt;br /&gt;
UI2: LOAD R2, statusRegUI2&lt;br /&gt;
     TST R2, #readyUI2&lt;br /&gt;
     JZ UI1&lt;br /&gt;
     LOAD R2, controlRegUI2&lt;br /&gt;
     TST R2, #enableUI2&lt;br /&gt;
     JZ UI1&lt;br /&gt;
     TST R2, #startUI2&lt;br /&gt;
     JZ UI1&lt;br /&gt;
     JMP TBL&lt;br /&gt;
UI1: DEC R1 ; smanjujemo broj ulaza&lt;br /&gt;
     LOAD R2, statusRegUI1&lt;br /&gt;
     TST R2, #readyUI1&lt;br /&gt;
     JZ UI0&lt;br /&gt;
     LOAD R2, controlRegUI1&lt;br /&gt;
     TST R2, #enableUI1&lt;br /&gt;
     JZ UI0&lt;br /&gt;
     TST R2, #startUI1&lt;br /&gt;
     JZ UI0&lt;br /&gt;
     JMP TBL&lt;br /&gt;
UI0: DEC R1&lt;br /&gt;
     LOAD R2, statusRegUI0&lt;br /&gt;
     TST R2, #readyUI0&lt;br /&gt;
     JZ end&lt;br /&gt;
     LOAD R2, controlRegUI0&lt;br /&gt;
     TST R2, #enableUI0&lt;br /&gt;
     JZ end&lt;br /&gt;
     TST R2, #startUI0&lt;br /&gt;
     JZ end&lt;br /&gt;
TBL: SHL R1&lt;br /&gt;
     ADD R1, tbladr&lt;br /&gt;
     MOV R2, (R1)&lt;br /&gt;
     JADR (R2)&lt;br /&gt;
end: POP R2&lt;br /&gt;
     POP R1&lt;br /&gt;
     RTI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int *a, *b, *c, d, i;&lt;br /&gt;
...&lt;br /&gt;
for(i = 0; i &amp;lt; d; i += 1)&lt;br /&gt;
    c[i] = a[i] + b[i];&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На располаrању је процесор код кога аритметичке, логичке и померачке инструкције имају формат: ОС reg, reg, reg/imm где је ОС код операције, одредишни операнд и први операнд морају бити у регистру (reg), док други може бити или у регистру или дат непосредно (reg/imm). Инструкција LOAD има формат: LOAD reg, mem где је првим операндом дат одредишни регистар (reg), a другим извориште. Инструкцијa STORE има формат: STORE reg, mem где је првим операндом дат изворишни регистар (reg), a другим одредиште. А, В, С, D, и I су глобалне променљиве које одговарају симболичким ознакама адреса меморијских локација у којима се налазе операнди. Садржај меморијских локација означених адресама A, B, С и D треба да остане непромењен, садржај одговарајућих регистара је дозвољено мењати. На располагању стоји 8 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
      LOAD Ra, a&lt;br /&gt;
      LOAD Rb, b&lt;br /&gt;
      LOAD Rc, c&lt;br /&gt;
      LOAD Rd, d&lt;br /&gt;
      ...&lt;br /&gt;
      XOR Ri, Ri, Ri ; clear Ri&lt;br /&gt;
loop: STORE Ri, i&lt;br /&gt;
      SUB R0, Ri, Rd&lt;br /&gt;
      JGE end&lt;br /&gt;
      LOAD RtempA, (Ra, Ri)0&lt;br /&gt;
      LOAD RtempB, (Rb, Ri)0&lt;br /&gt;
      ADD R0, RtempA, RtempB&lt;br /&gt;
      STORE R0, (Rc, Ri)0&lt;br /&gt;
      ADD Ri, Ri, #1&lt;br /&gt;
      JMP loop&lt;br /&gt;
&lt;br /&gt;
end:  ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање карактера &#039;&#039;c&#039;&#039; у низу карактера &#039;&#039;str&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strchr(const char *str, char c)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање карактера &#039;&#039;c&#039;&#039; у низу карактера &#039;&#039;str&#039;&#039; или 0 уколико се карактер &#039;&#039;c&#039;&#039; не појављује у низу карактера &#039;&#039;str&#039;&#039;. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;gt;&lt;br /&gt;
strchr:&lt;br /&gt;
     PUSH BP&lt;br /&gt;
     MOV BP, SP&lt;br /&gt;
     PUSH R1&lt;br /&gt;
     PUSH R2&lt;br /&gt;
     PUSH R3&lt;br /&gt;
     LOAD R1, (BP)2 ; str&lt;br /&gt;
     LOAD R2, (BP)3 ; c&lt;br /&gt;
     XOR R0, R0, R0 ; clear R0&lt;br /&gt;
     ;strlen(str)&lt;br /&gt;
     ;LOCC len, addr, char&lt;br /&gt;
     LOAD R3, #maxValue&lt;br /&gt;
     LOCC R3, R1, &#039;\0&#039;&lt;br /&gt;
     SUB R1, R1, #1&lt;br /&gt;
     LOAD R3, (BP)2&lt;br /&gt;
     SUB R3, R1, R3 ; R3 = strlen(str)&lt;br /&gt;
     LOAD R1, (BP)2&lt;br /&gt;
     LOCC R3, R1, R2&lt;br /&gt;
     JNZ end ; c not found in str&lt;br /&gt;
     MOV R0, R1&lt;br /&gt;
end: POP R3&lt;br /&gt;
     POP R2&lt;br /&gt;
     POP R1&lt;br /&gt;
     POP BP&lt;br /&gt;
     RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R3, #maxValue -&amp;gt; ADD R3, R0, #maxValue ; R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 шаље низ шеснаестобитних података који је потребно сместити почев од локација 1000h. Величина низа је 100h. Након пријема потребно је формирати резултујући низ који не садржи дупликате. Могуће је да се нека вредност појављује више пута у оквиру низа, па је у резултујућем низу потребно задржати само једну њену појаву. Формирање резултујућег низа реализовати функцјиом &#039;&#039;&#039;int&#039;&#039;&#039; removeDuplicates(&#039;&#039;&#039;int&#039;&#039;&#039;* arr, &#039;&#039;&#039;int&#039;&#039;&#039; size) која као параметре има адресу почетка низа и његову величину, док јој је повратна вредност величина резултујућег низа. Резултујући низ се смешта почев од локације на коју указује параметар &#039;&#039;arr&#039;&#039;. &#039;&#039;&#039;У имплементацији функције дозвољено је користити само простор на стеку.&#039;&#039;&#039; Након формирања резултујућег низа потребно га је проследити периферији PER1.&lt;br /&gt;
&lt;br /&gt;
Потребно је написати главни програм, функцију &#039;&#039;removeDuplicates&#039;&#039; и одговарајуће прекидне рутине којима се обавља описани пренос података. Улаз са периферије PER0 реализовати техником програмираног улаза са прекидом, док слање на PER1 коришћењем DMA контролера у блоковском режиму.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP као и додатни помоћни регистар RX чија се претходна вредност не чува приликом извршавања функције (постоје инструкције LDRX и STRX за пренос вредности између акумулатора и регистра RX). Регистри BP и RX се могу користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;glavni program&lt;br /&gt;
;inicijalizacija &lt;br /&gt;
&lt;br /&gt;
LD #1000h&lt;br /&gt;
ST MemAddr&lt;br /&gt;
LD #100h&lt;br /&gt;
ST MemCnt&lt;br /&gt;
LD #1&lt;br /&gt;
ST semPER0&lt;br /&gt;
LD #13h ; 0001 0011&lt;br /&gt;
OUT F000h ; ukljucivanje PER0&lt;br /&gt;
&lt;br /&gt;
wait_per0: LD semPER0&lt;br /&gt;
           CMP #0&lt;br /&gt;
           JNZ wait_per0&lt;br /&gt;
&lt;br /&gt;
; priprema argumenata za poziv funkcije&lt;br /&gt;
LD #1000h&lt;br /&gt;
PUSH&lt;br /&gt;
LD #100h&lt;br /&gt;
PUSH&lt;br /&gt;
JSR removeDuplicates&lt;br /&gt;
;cuvamo novu velicinu niza na lokaciju NewMemCnt&lt;br /&gt;
ST NewMemCnt&lt;br /&gt;
; ciscenje steka&lt;br /&gt;
POP &lt;br /&gt;
POP&lt;br /&gt;
&lt;br /&gt;
LD #1000h&lt;br /&gt;
OUT F113h&lt;br /&gt;
LD NewMemCnt&lt;br /&gt;
OUT F114h&lt;br /&gt;
LD #1h&lt;br /&gt;
ST semDMA&lt;br /&gt;
LD #10h ; 0001 0000&lt;br /&gt;
OUT F100h ; ukljucivanje PER1&lt;br /&gt;
LD #12h ; 0001 0010&lt;br /&gt;
OUT F110h ; ukljucivanje DMA&lt;br /&gt;
&lt;br /&gt;
wait_dma: LD semDMA&lt;br /&gt;
          CMP #0&lt;br /&gt;
          JNZ wait_dma&lt;br /&gt;
&lt;br /&gt;
LD #0h&lt;br /&gt;
OUT F100h&lt;br /&gt;
HALT&lt;br /&gt;
&lt;br /&gt;
;prekidne rutine&lt;br /&gt;
PER0: PUSH&lt;br /&gt;
      IN F002h&lt;br /&gt;
      ST (MemAddr)&lt;br /&gt;
      LD MemAddr&lt;br /&gt;
      INC&lt;br /&gt;
      ST MemAddr&lt;br /&gt;
      LD MemCnt&lt;br /&gt;
      DEC&lt;br /&gt;
      ST MemCnt&lt;br /&gt;
      JNZ end0&lt;br /&gt;
      LOAD #0h&lt;br /&gt;
      OUT F000h&lt;br /&gt;
      ST semPER0&lt;br /&gt;
end0: POP&lt;br /&gt;
      RTI&lt;br /&gt;
&lt;br /&gt;
DMA: PUSH&lt;br /&gt;
     LD #0h&lt;br /&gt;
     OUT F110h&lt;br /&gt;
     ST semDMA&lt;br /&gt;
     POP&lt;br /&gt;
     RTI&lt;br /&gt;
    &lt;br /&gt;
;prekidne rutine kraj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;potprogram removeDuplicates&lt;br /&gt;
;int removeDuplicates(int* arr, int size);&lt;br /&gt;
&lt;br /&gt;
;   stek&lt;br /&gt;
;|  size   |+3&lt;br /&gt;
;|  arr    |+2&lt;br /&gt;
;|  retPC  |+1&lt;br /&gt;
;|  BP     | 0&amp;lt;---SP&lt;br /&gt;
;| remElem |-1&lt;br /&gt;
;|  i      |-2&lt;br /&gt;
;|  curEl  |-3&lt;br /&gt;
;|  j      |-4&lt;br /&gt;
&lt;br /&gt;
removeDuplicates:&lt;br /&gt;
         LD BP&lt;br /&gt;
         PUSH &lt;br /&gt;
         LD SP&lt;br /&gt;
         ST BP&lt;br /&gt;
         ;rezervisanje prostora na steku za 4 lokalne promenljive&lt;br /&gt;
         SUB #4&lt;br /&gt;
         ST SP&lt;br /&gt;
         AND #0h&lt;br /&gt;
         ST (BP)-1&lt;br /&gt;
         ST (BP)-2&lt;br /&gt;
outLoop: LD (BP)-2&lt;br /&gt;
         CMP (BP)+3&lt;br /&gt;
         JGE endFun&lt;br /&gt;
         ;ucitavanje elementa&lt;br /&gt;
         ADD (BP)+2&lt;br /&gt;
         STRX&lt;br /&gt;
         LD (RX)0 ; trenutni element&lt;br /&gt;
         ST (BP)-3&lt;br /&gt;
         LD (BP)-2 &lt;br /&gt;
         ST (BP)-4 ; postavljamo da je i = j&lt;br /&gt;
inLoop:  CMP (BP)-2 ; poredimo i sa j&lt;br /&gt;
         JGE endIn&lt;br /&gt;
         LD (BP)-4&lt;br /&gt;
         ADD (BP)+2&lt;br /&gt;
         STRX&lt;br /&gt;
         LD (RX)0 ; arr[j]&lt;br /&gt;
         CMP (BP)-3 ; arr[i] == arr[j]&lt;br /&gt;
         JNZ skipFun&lt;br /&gt;
         LD (BP)+2&lt;br /&gt;
         ADD (BP)-4&lt;br /&gt;
         PUSH ; lokacija u nizu odakle se pomera&lt;br /&gt;
         LD (BP)+3&lt;br /&gt;
         SUB (BP)-4&lt;br /&gt;
         PUSH ; koliko elemenata treba da se pomeri&lt;br /&gt;
         JSR moveElements&lt;br /&gt;
         POP&lt;br /&gt;
         POP&lt;br /&gt;
         ;povecaj broj izbacenih elemenata&lt;br /&gt;
         LD (BP)-1&lt;br /&gt;
         INC&lt;br /&gt;
         ST (BP)-1&lt;br /&gt;
         ; j++&lt;br /&gt;
skipFun: LD (BP)-4&lt;br /&gt;
         INC&lt;br /&gt;
         ST (BP)-4&lt;br /&gt;
         JMP inLoop&lt;br /&gt;
         ;i++&lt;br /&gt;
endIn:   LD (BP)-2&lt;br /&gt;
         INC&lt;br /&gt;
         ST (BP)-2&lt;br /&gt;
         JMP outLoop&lt;br /&gt;
         ;priprema nove velicine niza&lt;br /&gt;
endFun:  LD (BP)+3&lt;br /&gt;
         SUB (BP)-1&lt;br /&gt;
         STRX&lt;br /&gt;
         ;ciscenje lokalnih promenljivih&lt;br /&gt;
         LD SP&lt;br /&gt;
         ADD #4&lt;br /&gt;
         ST SP&lt;br /&gt;
         POP&lt;br /&gt;
         ST BP&lt;br /&gt;
         ;vracanje rezultata u akumulator&lt;br /&gt;
         LDRX&lt;br /&gt;
         RTS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;potprogram moveElements&lt;br /&gt;
;void moveElements(int* arr, int size);&lt;br /&gt;
&lt;br /&gt;
;   stek&lt;br /&gt;
;|  size   |+3&lt;br /&gt;
;|  arr    |+2&lt;br /&gt;
;|  retPC  |+1&lt;br /&gt;
;|  BP     | 0 &amp;lt;---SP&lt;br /&gt;
;|  cnt    |-1&lt;br /&gt;
;|  curEl  |-2&lt;br /&gt;
&lt;br /&gt;
moveElements:&lt;br /&gt;
        LD BP&lt;br /&gt;
        PUSH&lt;br /&gt;
        LD SP&lt;br /&gt;
        ST BP&lt;br /&gt;
        ;rezervisanje prostora na steku za 2 lokalne promenljive&lt;br /&gt;
        SUB #2&lt;br /&gt;
        ST SP&lt;br /&gt;
        AND #0&lt;br /&gt;
        ST (BP)-1&lt;br /&gt;
mvLoop: LD (BP)+3&lt;br /&gt;
        CMP #0&lt;br /&gt;
        JZ endMov&lt;br /&gt;
        ;arr++&lt;br /&gt;
        LD (BP)+2&lt;br /&gt;
        INC&lt;br /&gt;
        ST (BP)+2&lt;br /&gt;
        ;arr[cnt]&lt;br /&gt;
        ADD (BP)-1&lt;br /&gt;
        STRX&lt;br /&gt;
        LD (RX)0&lt;br /&gt;
        ST (BP)-2 ; curEl = arr[cnt]&lt;br /&gt;
        LD (BP)+2&lt;br /&gt;
        DEC&lt;br /&gt;
        ADD (BP)-1&lt;br /&gt;
        STRX ; arr+cnt-1&lt;br /&gt;
        LD (BP)-2&lt;br /&gt;
        ST (RX)0 arr[cnt-1] = arr[cnt]&lt;br /&gt;
        ; cnt++&lt;br /&gt;
        LD (BP)-1&lt;br /&gt;
        INC &lt;br /&gt;
        ST (BP)-1&lt;br /&gt;
        ;size--&lt;br /&gt;
        LD (BP)+3&lt;br /&gt;
        DEC&lt;br /&gt;
        ST (BP)+3&lt;br /&gt;
        JMP mvLoop&lt;br /&gt;
endMov: LD SP&lt;br /&gt;
        ; ciscenje lokalnih promenljivih&lt;br /&gt;
        ADD #2&lt;br /&gt;
        ST SP&lt;br /&gt;
        POP&lt;br /&gt;
        ST BP&lt;br /&gt;
        RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BB_2024&amp;diff=7733</id>
		<title>Архитектура рачунара/Јул 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BB_2024&amp;diff=7733"/>
		<updated>2024-07-12T19:41:23Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: Нова страница: {{tocright}} &amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор постоји само једна линија по којој улазно/излазни уређаји могу процесору да шаљу захтеве за прекид, док линија за слање сигнала потврде не постоји. У датом систему постоје 3 улазно/излазна уређаја UI2, UI1 и UI0, при чему UI2 има највиши, а UI0 најнижи приоритет. Периферија захтев за прекидом генерише као ниво и не постоји контролер прекида.&lt;br /&gt;
# Нацртати како та 3 улазно/излазна уређаја треба повезати помоћу те линије на процесор ради слања захтева за прекид.&lt;br /&gt;
# Објаснити како се реализује скок на одговарајућу прекидну рутину сваког од 3 улазно/излазна уређаја.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
# [[Датотека:AR jul 2024 zadatak1.png|1000px|безоквира|центар|алт=Задатак 1|Задатак 1]]&lt;br /&gt;
# Пошто не постоји линија за сигнал потврде, скок на одговарајућу прекидну рутину се реализује полирањем у заједничкој прекидној рутини. Због датих приоритета улазно/излазних уређаја, прво треба да испитујемо најприоритетнији уређај (UI2), па онда по приоритетима све до најмање приоритетног (UI0 у овом случају). Код изгледа овако:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
     PUSH R1&lt;br /&gt;
     PUSH R2&lt;br /&gt;
     LOAD R1, #2 ; ucitavamo broj ulaza najprioritetnijeg&lt;br /&gt;
UI2: LOAD R2, statusRegUI2&lt;br /&gt;
     TST R2, #readyUI2&lt;br /&gt;
     JZ UI1&lt;br /&gt;
     LOAD R2, controlRegUI2&lt;br /&gt;
     TST R2, #enableUI2&lt;br /&gt;
     JZ UI1&lt;br /&gt;
     TST R2, #startUI2&lt;br /&gt;
     JZ UI1&lt;br /&gt;
     JMP TBL&lt;br /&gt;
UI1: DEC R1 ; smanjujemo broj ulaza&lt;br /&gt;
     LOAD R2, statusRegUI1&lt;br /&gt;
     TST R2, #readyUI1&lt;br /&gt;
     JZ UI0&lt;br /&gt;
     LOAD R2, controlRegUI1&lt;br /&gt;
     TST R2, #enableUI1&lt;br /&gt;
     JZ UI0&lt;br /&gt;
     TST R2, #startUI1&lt;br /&gt;
     JZ UI0&lt;br /&gt;
     JMP TBL&lt;br /&gt;
UI0: DEC R1&lt;br /&gt;
     LOAD R2, statusRegUI0&lt;br /&gt;
     TST R2, #readyUI0&lt;br /&gt;
     JZ end&lt;br /&gt;
     LOAD R2, controlRegUI0&lt;br /&gt;
     TST R2, #enableUI0&lt;br /&gt;
     JZ end&lt;br /&gt;
     TST R2, #startUI0&lt;br /&gt;
     JZ end&lt;br /&gt;
TBL: SHL R1&lt;br /&gt;
     ADD R1, tbladr&lt;br /&gt;
     MOV R2, (R1)&lt;br /&gt;
     JADR (R2)&lt;br /&gt;
end: POP R2&lt;br /&gt;
     POP R1&lt;br /&gt;
     RTI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int *a, *b, *c, d, i;&lt;br /&gt;
...&lt;br /&gt;
for(i = 0; i &amp;lt; d; i += 1)&lt;br /&gt;
    c[i] = a[i] + b[i];&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На располаrању је процесор код кога аритметичке, логичке и померачке инструкције имају формат: ОС reg, reg, reg/imm где је ОС код операције, одредишни операнд и први операнд морају бити у регистру (reg), док други може бити или у регистру или дат непосредно (reg/imm). Инструкција LOAD има формат: LOAD reg, mem где је првим операндом дат одредишни регистар (reg), a другим извориште. Инструкцијa STORE има формат: STORE reg, mem где је првим операндом дат изворишни регистар (reg), a другим одредиште. А, В, С, D, и I су глобалне променљиве које одговарају симболичким ознакама адреса меморијских локација у којима се налазе операнди. Садржај меморијских локација означених адресама A, B, С и D треба да остане непромењен, садржај одговарајућих регистара је дозвољено мењати. На располагању стоји 8 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
      LOAD Ra, a&lt;br /&gt;
      LOAD Rb, b&lt;br /&gt;
      LOAD Rc, c&lt;br /&gt;
      LOAD Rd, d&lt;br /&gt;
      ...&lt;br /&gt;
      XOR Ri, Ri, Ri ; clear Ri&lt;br /&gt;
loop: STORE Ri, i&lt;br /&gt;
      SUB R0, Ri, Rd&lt;br /&gt;
      JGE end&lt;br /&gt;
      LOAD RtempA, (Ra, Ri)0&lt;br /&gt;
      LOAD RtempB, (Rb, Ri)0&lt;br /&gt;
      ADD R0, RtempA, RtempB&lt;br /&gt;
      STORE R0, (Rc, Ri)0&lt;br /&gt;
      ADD Ri, Ri, #1&lt;br /&gt;
      JMP loop&lt;br /&gt;
&lt;br /&gt;
end:  ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање карактера &#039;&#039;c&#039;&#039; у низу карактера &#039;&#039;str&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strchr(const char *str, char c)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање карактера &#039;&#039;c&#039;&#039; у низу карактера &#039;&#039;str&#039;&#039; или 0 уколико се карактер &#039;&#039;c&#039;&#039; не појављује у низу карактера &#039;&#039;str&#039;&#039;. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;gt;&lt;br /&gt;
strchr:&lt;br /&gt;
     PUSH BP&lt;br /&gt;
     MOV BP, SP&lt;br /&gt;
     PUSH R1&lt;br /&gt;
     PUSH R2&lt;br /&gt;
     PUSH R3&lt;br /&gt;
     LOAD R1, (BP)2 ; str&lt;br /&gt;
     LOAD R2, (BP)3 ; c&lt;br /&gt;
     XOR R0, R0, R0 ; clear R0&lt;br /&gt;
     ;strlen(str)&lt;br /&gt;
     ;locc len, addr, char&lt;br /&gt;
     LOAD R3, #maxValue&lt;br /&gt;
     LOCC R3, R1, &#039;\0&#039;&lt;br /&gt;
     SUB R1, R1, #1&lt;br /&gt;
     LOAD R3, (BP)2&lt;br /&gt;
     SUB R3, R1, R3 ; R3 = strlen(str)&lt;br /&gt;
     LOAD R1, (BP)2&lt;br /&gt;
     LOCC R3, R1, R2&lt;br /&gt;
     JNZ end ; c not found in str&lt;br /&gt;
     MOV R0, R1&lt;br /&gt;
end: POP R3&lt;br /&gt;
     POP R2&lt;br /&gt;
     POP R1&lt;br /&gt;
     POP BP&lt;br /&gt;
     RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R3, #maxValue -&amp;gt; ADD R3, R0, #maxValue ; R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 шаље низ шеснаестобитних података који је потребно сместити почев од локација 1000h. Величина низа је 100h. Након пријема потребно је формирати резултујући низ који не садржи дупликате. Могуће је да се нека вредност појављује више пута у оквиру низа, па је у резултујућем низу потребно задржати само једну њену појаву. Формирање резултујућег низа реализовати функцјиом &#039;&#039;&#039;int&#039;&#039;&#039; removeDuplicates(&#039;&#039;&#039;int&#039;&#039;&#039;* arr, &#039;&#039;&#039;int&#039;&#039;&#039; size) која као параметре има адресу почетка низа и његову величину, док јој је повратна вредност величина резултујућег низа. Резултујући низ се смешта почев од локације на коју указује параметар &#039;&#039;arr&#039;&#039;. &#039;&#039;&#039;У имплементацији функције дозвољено је користити само простор на стеку.&#039;&#039;&#039; Након формирања резултујућег низа потребно га је проследити периферији PER1.&lt;br /&gt;
&lt;br /&gt;
Потребно је написати главни програм, функцију &#039;&#039;removeDuplicates&#039;&#039; и одговарајуће прекидне рутине којима се обавља описани пренос података. Улаз са периферије PER0 реализовати техником програмираног улаза са прекидом, док слање на PER1 коришћењем DMA контролера у блоковском режиму.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP као и додатни помоћни регистар RX чија се претходна вредност не чува приликом извршавања функције (постоје инструкције LDRX и STRX за пренос вредности између акумулатора и регистра RX). Регистри BP и RX се могу користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;glavni program&lt;br /&gt;
;inicijalizacija &lt;br /&gt;
&lt;br /&gt;
LD #1000h&lt;br /&gt;
ST MemAddr&lt;br /&gt;
LD #100h&lt;br /&gt;
ST MemCnt&lt;br /&gt;
LD #1&lt;br /&gt;
ST semPER0&lt;br /&gt;
LD #13h ; 0001 0011&lt;br /&gt;
OUT F000h ; ukljucivanje PER0&lt;br /&gt;
&lt;br /&gt;
wait_per0: LD semPER0&lt;br /&gt;
           CMP #0&lt;br /&gt;
           JNZ wait_per0&lt;br /&gt;
&lt;br /&gt;
; priprema argumenata za poziv funkcije&lt;br /&gt;
LD #1000h&lt;br /&gt;
PUSH&lt;br /&gt;
LD #100h&lt;br /&gt;
PUSH&lt;br /&gt;
JSR removeDuplicates&lt;br /&gt;
;cuvamo novu velicinu niza na lokaciju NewMemCnt&lt;br /&gt;
ST NewMemCnt&lt;br /&gt;
; ciscenje steka&lt;br /&gt;
POP &lt;br /&gt;
POP&lt;br /&gt;
&lt;br /&gt;
LD #1000h&lt;br /&gt;
OUT F113h&lt;br /&gt;
LD NewMemCnt&lt;br /&gt;
OUT F114h&lt;br /&gt;
LD #1h&lt;br /&gt;
ST semDMA&lt;br /&gt;
LD #10h ; 0001 0000&lt;br /&gt;
OUT F100h ; ukljucivanje PER1&lt;br /&gt;
LD #12h ; 0001 0010&lt;br /&gt;
OUT F110h ; ukljucivanje DMA&lt;br /&gt;
&lt;br /&gt;
wait_dma: LD semDMA&lt;br /&gt;
          CMP #0&lt;br /&gt;
          JNZ wait_dma&lt;br /&gt;
&lt;br /&gt;
LD #0h&lt;br /&gt;
OUT F100h&lt;br /&gt;
HALT&lt;br /&gt;
&lt;br /&gt;
;prekidne rutine&lt;br /&gt;
PER0: PUSH&lt;br /&gt;
      IN F002h&lt;br /&gt;
      ST (MemAddr)&lt;br /&gt;
      LD MemAddr&lt;br /&gt;
      INC&lt;br /&gt;
      ST MemAddr&lt;br /&gt;
      LD MemCnt&lt;br /&gt;
      DEC&lt;br /&gt;
      ST MemCnt&lt;br /&gt;
      JNZ end0&lt;br /&gt;
      LOAD #0h&lt;br /&gt;
      OUT F000h&lt;br /&gt;
      ST semPER0&lt;br /&gt;
end0: POP&lt;br /&gt;
      RTI&lt;br /&gt;
&lt;br /&gt;
DMA: PUSH&lt;br /&gt;
     LD #0h&lt;br /&gt;
     OUT F110h&lt;br /&gt;
     ST semDMA&lt;br /&gt;
     POP&lt;br /&gt;
     RTI&lt;br /&gt;
    &lt;br /&gt;
;prekidne rutine kraj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;potprogram removeDuplicates&lt;br /&gt;
;int removeDuplicates(int* arr, int size);&lt;br /&gt;
&lt;br /&gt;
;   stek&lt;br /&gt;
;|  size   |+3&lt;br /&gt;
;|  arr    |+2&lt;br /&gt;
;|  retPC  |+1&lt;br /&gt;
;|  BP     | 0&amp;lt;---SP&lt;br /&gt;
;| remElem |-1&lt;br /&gt;
;|  i      |-2&lt;br /&gt;
;|  curEl  |-3&lt;br /&gt;
;|  j      |-4&lt;br /&gt;
&lt;br /&gt;
removeDuplicates:&lt;br /&gt;
         LD BP&lt;br /&gt;
         PUSH &lt;br /&gt;
         LD SP&lt;br /&gt;
         ST BP&lt;br /&gt;
         ;rezervisanje prostora na steku za 4 lokalne promenljive&lt;br /&gt;
         SUB #4&lt;br /&gt;
         ST SP&lt;br /&gt;
         AND #0h&lt;br /&gt;
         ST (BP)-1&lt;br /&gt;
         ST (BP)-2&lt;br /&gt;
outLoop: LD (BP)-2&lt;br /&gt;
         CMP (BP)+3&lt;br /&gt;
         JGE endFun&lt;br /&gt;
         ;ucitavanje elementa&lt;br /&gt;
         ADD (BP)+2&lt;br /&gt;
         STRX&lt;br /&gt;
         LD (RX)0 ; trenutni element&lt;br /&gt;
         ST (BP)-3&lt;br /&gt;
         LD (BP)-2 &lt;br /&gt;
         ST (BP)-4 ; postavljamo da je i = j&lt;br /&gt;
inLoop:  CMP (BP)-2 ; poredimo i sa j&lt;br /&gt;
         JGE endIn&lt;br /&gt;
         LD (BP)-4&lt;br /&gt;
         ADD (BP)+2&lt;br /&gt;
         STRX&lt;br /&gt;
         LD (RX)0 ; arr[j]&lt;br /&gt;
         CMP (BP)-3 ; arr[i] == arr[j]&lt;br /&gt;
         JNZ skipFun&lt;br /&gt;
         LD (BP)+2&lt;br /&gt;
         ADD (BP)-4&lt;br /&gt;
         PUSH ; lokacija u nizu odakle se pomera&lt;br /&gt;
         LD (BP)+3&lt;br /&gt;
         SUB (BP)-4&lt;br /&gt;
         PUSH ; koliko elemenata treba da se pomeri&lt;br /&gt;
         JSR moveElements&lt;br /&gt;
         POP&lt;br /&gt;
         POP&lt;br /&gt;
         ;povecaj broj izbacenih elemenata&lt;br /&gt;
         LD (BP)-1&lt;br /&gt;
         INC&lt;br /&gt;
         ST (BP)-1&lt;br /&gt;
         ; j++&lt;br /&gt;
skipFun: LD (BP)-4&lt;br /&gt;
         INC&lt;br /&gt;
         ST (BP)-4&lt;br /&gt;
         JMP inLoop&lt;br /&gt;
         ;i++&lt;br /&gt;
endIn:   LD (BP)-2&lt;br /&gt;
         INC&lt;br /&gt;
         ST (BP)-2&lt;br /&gt;
         JMP outLoop&lt;br /&gt;
         ;priprema nove velicine niza&lt;br /&gt;
endFun:  LD (BP)+3&lt;br /&gt;
         SUB (BP)-1&lt;br /&gt;
         STRX&lt;br /&gt;
         ;ciscenje lokalnih promenljivih&lt;br /&gt;
         LD SP&lt;br /&gt;
         ADD #4&lt;br /&gt;
         ST SP&lt;br /&gt;
         POP&lt;br /&gt;
         ST BP&lt;br /&gt;
         ;vracanje rezultata u akumulator&lt;br /&gt;
         LDRX&lt;br /&gt;
         RTS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;potprogram moveElements&lt;br /&gt;
;void moveElements(int* arr, int size);&lt;br /&gt;
&lt;br /&gt;
;   stek&lt;br /&gt;
;|  size   |+3&lt;br /&gt;
;|  arr    |+2&lt;br /&gt;
;|  retPC  |+1&lt;br /&gt;
;|  BP     | 0 &amp;lt;---SP&lt;br /&gt;
;|  cnt    |-1&lt;br /&gt;
;|  curEl  |-2&lt;br /&gt;
&lt;br /&gt;
moveElements:&lt;br /&gt;
        LD BP&lt;br /&gt;
        PUSH&lt;br /&gt;
        LD SP&lt;br /&gt;
        ST BP&lt;br /&gt;
        ;rezervisanje prostora na steku za 2 lokalne promenljive&lt;br /&gt;
        SUB #2&lt;br /&gt;
        ST SP&lt;br /&gt;
        AND #0&lt;br /&gt;
        ST (BP)-1&lt;br /&gt;
mvLoop: LD (BP)+3&lt;br /&gt;
        CMP #0&lt;br /&gt;
        JZ endMov&lt;br /&gt;
        ;arr++&lt;br /&gt;
        LD (BP)+2&lt;br /&gt;
        INC&lt;br /&gt;
        ST (BP)+2&lt;br /&gt;
        ;arr[cnt]&lt;br /&gt;
        ADD (BP)-1&lt;br /&gt;
        STRX&lt;br /&gt;
        LD (RX)0&lt;br /&gt;
        ST (BP)-2 ; curEl = arr[cnt]&lt;br /&gt;
        LD (BP)+2&lt;br /&gt;
        DEC&lt;br /&gt;
        ADD (BP)-1&lt;br /&gt;
        STRX ; arr+cnt-1&lt;br /&gt;
        LD (BP)-2&lt;br /&gt;
        ST (RX)0 arr[cnt-1] = arr[cnt]&lt;br /&gt;
        ; cnt++&lt;br /&gt;
        LD (BP)-1&lt;br /&gt;
        INC &lt;br /&gt;
        ST (BP)-1&lt;br /&gt;
        ;size--&lt;br /&gt;
        LD (BP)+3&lt;br /&gt;
        DEC&lt;br /&gt;
        ST (BP)+3&lt;br /&gt;
        JMP mvLoop&lt;br /&gt;
endMov: LD SP&lt;br /&gt;
        ; ciscenje lokalnih promenljivih&lt;br /&gt;
        ADD #2&lt;br /&gt;
        ST SP&lt;br /&gt;
        POP&lt;br /&gt;
        ST BP&lt;br /&gt;
        RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7732</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7732"/>
		<updated>2024-07-11T18:41:27Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 ; src1&lt;br /&gt;
    LOAD R2, (BP)3 ; src2&lt;br /&gt;
    XOR R0, R0, R0 ; clear R0&lt;br /&gt;
    ;strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    ;LOCC len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 ; R3 = strlen(src1)&lt;br /&gt;
    ;strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 ; R4 = strlen(src2)&lt;br /&gt;
    ;MATCH src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 ; src1&lt;br /&gt;
    LOAD R2, (BP)3 ; src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end ; z == 1 src2 not found in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue ; R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције &#039;&#039;&#039;int&#039;&#039;&#039; calcParity(&#039;&#039;&#039;int&#039;&#039;&#039; value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10h података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се DMA контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености DMA контролера, периферија PER1 се враћа у режим рада без DMA контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8h. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија PER0 буде успешно обрађен и прослеђен периферији PER1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију &#039;&#039;calcParity&#039;&#039; и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7731</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7731"/>
		<updated>2024-07-11T18:35:21Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 ; src1&lt;br /&gt;
    LOAD R2, (BP)3 ; src2&lt;br /&gt;
    XOR R0, R0, R0 ; clear R0&lt;br /&gt;
    ;strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    ;LOCC len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 ; R3 = strlen(src1)&lt;br /&gt;
    ;strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 ; R4 = strlen(src2)&lt;br /&gt;
    ;MATCH src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 ; src1&lt;br /&gt;
    LOAD R2, (BP)3 ; src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end ; z == 1 src2 not found in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције &#039;&#039;&#039;int&#039;&#039;&#039; calcParity(&#039;&#039;&#039;int&#039;&#039;&#039; value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10h података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се DMA контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености DMA контролера, периферија PER1 се враћа у режим рада без DMA контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8h. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија PER0 буде успешно обрађен и прослеђен периферији PER1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију &#039;&#039;calcParity&#039;&#039; и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Ar_jul2024_zadatak1_a.svg&amp;diff=7730</id>
		<title>Датотека:Ar jul2024 zadatak1 a.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Ar_jul2024_zadatak1_a.svg&amp;diff=7730"/>
		<updated>2024-07-11T17:55:02Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: D3f4ult отпремио је нову верзију датотеке Датотека:Ar jul2024 zadatak1 a.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Повезивање уређаја са процесором&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:AR_jul_2024_zadatak1.png&amp;diff=7729</id>
		<title>Датотека:AR jul 2024 zadatak1.png</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:AR_jul_2024_zadatak1.png&amp;diff=7729"/>
		<updated>2024-07-11T17:51:18Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: Отпремљено кроз дијалог за отпремање датотека.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Повезивање уређаја и процесора&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Ar_jul2024_zadatak1_a.svg&amp;diff=7728</id>
		<title>Датотека:Ar jul2024 zadatak1 a.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Ar_jul2024_zadatak1_a.svg&amp;diff=7728"/>
		<updated>2024-07-11T17:39:21Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: Отпремљено кроз дијалог за отпремање датотека.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Повезивање уређаја са процесором&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7727</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7727"/>
		<updated>2024-07-11T17:16:35Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: /* Поставка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    XOR R0, R0, R0 // clear R0&lt;br /&gt;
    //strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    //locc len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 // R3 = strlen(src1)&lt;br /&gt;
    //strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 // R4 = strlen(src2)&lt;br /&gt;
    //matchc src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end // z == 1 not found src2 in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције &#039;&#039;&#039;int&#039;&#039;&#039; calcParity(&#039;&#039;&#039;int&#039;&#039;&#039; value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10h података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се DMA контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености DMA контролера, периферија PER1 се враћа у режим рада без DMA контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8h. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија PER0 буде успешно обрађен и прослеђен периферији PER1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију &#039;&#039;calcParity&#039;&#039; и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7726</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7726"/>
		<updated>2024-07-11T17:16:19Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: /* Поставка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    XOR R0, R0, R0 // clear R0&lt;br /&gt;
    //strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    //locc len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 // R3 = strlen(src1)&lt;br /&gt;
    //strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 // R4 = strlen(src2)&lt;br /&gt;
    //matchc src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end // z == 1 not found src2 in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције &#039;&#039;&#039;int&#039;&#039;&#039; calcParity(&#039;&#039;&#039;int&#039;&#039;&#039; value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10h података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се DMA контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености DMA контролера, периферија PER1 се враћа у режим рада без DMA контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8h. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија PER0 буде успешно обрађен и прослеђен периферији PER1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију &#039;&#039;calcParity&#039;&#039; и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7725</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7725"/>
		<updated>2024-07-11T17:14:24Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: /* Поставка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    XOR R0, R0, R0 // clear R0&lt;br /&gt;
    //strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    //locc len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 // R3 = strlen(src1)&lt;br /&gt;
    //strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 // R4 = strlen(src2)&lt;br /&gt;
    //matchc src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end // z == 1 not found src2 in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције &#039;&#039;&#039;int&#039;&#039;&#039; calcParity(&#039;&#039;&#039;int&#039;&#039;&#039; value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10h података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се DMA контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености DMA контролера, периферија PER1 се враћа у режим рада без DMA контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8h. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија PER0 буде успешно обрађен и прослеђен периферији PER1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију &#039;&#039;calcParity&#039;&#039; и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7724</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7724"/>
		<updated>2024-07-11T15:27:17Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    XOR R0, R0, R0 // clear R0&lt;br /&gt;
    //strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    //locc len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 // R3 = strlen(src1)&lt;br /&gt;
    //strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 // R4 = strlen(src2)&lt;br /&gt;
    //matchc src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end // z == 1 not found src2 in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције int calcParity(int value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10х података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се ДМА контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености ДМА контролера, периферија ПЕР1 се враћа у режим рада без ДМА контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8х. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија ПЕР0 буде успешно обрађен и прослеђен периферији ПЕР1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију calcParity и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7722</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7722"/>
		<updated>2024-07-11T14:18:03Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: D3f4ult преместио је страницу АР/Јун 2024 на Архитектура рачунара/Јун 2024&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    XOR R0, R0, R0 // clear R0&lt;br /&gt;
    //strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    //locc len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 // R3 = strlen(src1)&lt;br /&gt;
    //strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 // R4 = strlen(src2)&lt;br /&gt;
    //matchc src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end // z == 1 not found src2 in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције int calcParity(int value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10х података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се ДМА контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености ДМА контролера, периферија ПЕР1 се враћа у режим рада без ДМА контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8х. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија ПЕР0 буде успешно обрађен и прослеђен периферији ПЕР1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију calcParity и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АР]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7721</id>
		<title>Архитектура рачунара/Јун 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2024&amp;diff=7721"/>
		<updated>2024-07-11T14:14:49Z</updated>

		<summary type="html">&lt;p&gt;D3f4ult: Нова страница: {{tocright}} &amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 1 пар линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнал потврде. У датом систему има 5 улазно/излазних уређаја које треба некако повезати помоћу тог 1 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида.&lt;br /&gt;
# Нацртати како тих 5 улазно/излазних уређаја треба повезати помоћу тог 1 пара линија на процесор.&lt;br /&gt;
# Објаснити како тих 5 улазно/излазних уређаја шаљу захтеве за прекид и добијају дозволе, и како се реализује скок на одговарајућу прекидну рутину.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a, b, c, d, e;&lt;br /&gt;
...&lt;br /&gt;
b = a + c - d - e;&lt;br /&gt;
if (b &amp;gt; 0) a = a - e;&lt;br /&gt;
else a = c - d;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На распола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 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039; Уместо инструкције SUB Rb, Rb, #0 се могла користити инструкција CMP Rb, #0, али она не одговара формату инструкција који је задат текстом задатка, такође важи и за &lt;br /&gt;
ADD Ra, Rtemp0, #0 могло се искористити MOV Ra, Rtemp0, али уколико се користе овакве инструкције (које не одговарају формату инструкције у тексту задатка) морају се са стране написати реализације датих инструкција тако да одговарају задатом процесору. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    LOAD Ra, a&lt;br /&gt;
    LOAD Rb, b&lt;br /&gt;
    LOAD Rc, c&lt;br /&gt;
    LOAD Rd, d&lt;br /&gt;
    LOAD Re, e&lt;br /&gt;
    ...&lt;br /&gt;
    SUB Rtemp0, Ra, Re&lt;br /&gt;
    SUB Rtemp1, Rc, Rd&lt;br /&gt;
    ADD Rb, Rtemp0, Rtemp1&lt;br /&gt;
    STORE Rb, b&lt;br /&gt;
    SUB Rb, Rb, #0&lt;br /&gt;
    JLE else&lt;br /&gt;
    ADD Ra, Rtemp0, #0&lt;br /&gt;
    JMP end&lt;br /&gt;
    else: ADD Ra, Rtemp1, #0&lt;br /&gt;
    end: STORE Ra, a&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char *strstr(const char *src1, const char *src2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Функција као резултат враћа показивач на прво појављивање низа карактера &#039;&#039;src2&#039;&#039; у низу карактера &#039;&#039;src1&#039;&#039; или 0 уколико се низ карактера &#039;&#039;src2&#039;&#039; не појављује у низу карактера &#039;&#039;src1&#039;&#039;. Функција приликом поређења не узима у обзир терминални &#039;\0&#039; карактер. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    strstr:&lt;br /&gt;
    PUSH BP &lt;br /&gt;
    MOV BP, SP&lt;br /&gt;
    PUSH R1&lt;br /&gt;
    PUSH R2&lt;br /&gt;
    PUSH R3&lt;br /&gt;
    PUSH R4&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    XOR R0, R0, R0 // clear R0&lt;br /&gt;
    //strlen(src1)&lt;br /&gt;
    LOAD R4, #maxValue &lt;br /&gt;
    //locc len, addr, char&lt;br /&gt;
    LOCC R4, R1, &#039;\0&#039;&lt;br /&gt;
    SUB R1, R1, #1&lt;br /&gt;
    LOAD R4, (BP)2&lt;br /&gt;
    SUB R3, R1, R4 // R3 = strlen(src1)&lt;br /&gt;
    //strlen(src2)&lt;br /&gt;
    LOAD R4, #maxValue&lt;br /&gt;
    LOCC R4, R2, &#039;\0&#039;&lt;br /&gt;
    SUB R2, R2, #1&lt;br /&gt;
    LOAD R4, (BP)3&lt;br /&gt;
    SUB R4, R2, R4 // R4 = strlen(src2)&lt;br /&gt;
    //matchc src1len, src1addr, src2len, src2addr&lt;br /&gt;
    LOAD R1, (BP)2 // src1&lt;br /&gt;
    LOAD R2, (BP)3 // src2&lt;br /&gt;
    MATCHC R3, R1, R4, R2&lt;br /&gt;
    JNZ end // z == 1 not found src2 in src1&lt;br /&gt;
    MOV R0, R1&lt;br /&gt;
    end: POP R4&lt;br /&gt;
    POP R3&lt;br /&gt;
    POP R2&lt;br /&gt;
    POP R1&lt;br /&gt;
    POP BP&lt;br /&gt;
    RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Реализација непостојећих инструкција (без овога се задатак не признаје са пуним бројем поена):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
    PUSH BP -&amp;gt; STORE BP, -(SP)&lt;br /&gt;
    POP BP -&amp;gt; LOAD BP, (SP)+&lt;br /&gt;
    MOV BP, SP -&amp;gt; ADD BP, SP, #0&lt;br /&gt;
    LOAD R4, #maxValue -&amp;gt; ADD R4, R0, #maxValue // R0 = 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&#039;&#039;&#039;[15п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферија PER0 и периферија PER1 са придруженим контролером са директним приступом меморији DMA. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Улазно-излазни адресни простор и меморијски адресни простор су раздвојени. Адресе релевантних регистара су:&lt;br /&gt;
    PER0_CONTROL   F000h   DMA_PER1_CONTROL   F110h&lt;br /&gt;
    PER0_STATUS    F001h   DMA_PER1_STATUS    F111h&lt;br /&gt;
    PER0_DATA      F002h   DMA_PER1_DATA      F112h&lt;br /&gt;
    PER1_CONTROL   F100h   DMA_PER1_ADDR      F113h&lt;br /&gt;
    PER1_STATUS    F101h   DMA_PER1_COUNT     F114h&lt;br /&gt;
    PER1_DATA      F102h&lt;br /&gt;
У управљачким регистрима бит 4 је Start којим се дозвољава почетак операције, бит 0 одређује тип преноса података (1 - улаз (input), 0 - излаз (output)), бит 1 је Enable којим се дозвољава прекид, а у статусним регистрима бит 8 је Ready који сигнализира спремност контролера периферије. Бит 2 управљачког регистра DMA контролера задаје режим рада (0-блоковски (burst), 1-циклус по циклус (cycle stealing)).&lt;br /&gt;
&lt;br /&gt;
Периферија PER0 континуирано шаље петнаестобитне вредности за које процесор треба да одреди бит парносто тако да број јединица у новој шеснаестобитној вредности буде паран. Бит парности је најстарији бит шеснаестобитне вредности. Вредности примљене од периферије PER0 (надаље подаци) се смештају у кружни бафер капацитета 100h који почиње од адресе 2000h. Након уписа податка у последњу адресу која припада баферу, наредни податак се уписује на прву адресу бафера. Уколико је бафер пун, периферија привремено престаје са радом док се не појави слободна локација на коју се може уписати нови податак. Процесор треба да одреди бит парности за сваки податак позивом функције int calcParity(int value). Функција као параметар прима вредност једног податка, док повратна вредност представља шеснаестобитну вредност у којој је податку придодат бит парности као најстарији бит.&lt;br /&gt;
&lt;br /&gt;
Упоредо са пријемом и обрадом података (рачунањем бита парности за примљене податке) потребно је слати претходно обрађене податке на излаз периферији PER1. Слањем податка на периферију PER1 се ослобађа његово место у баферу. Уколико периферија PER1 ради превише споро, што је случај уколико постоји барем 10х података у баферу који су већ обрађени и чекају слање на периферију PER1, укључује се ДМА контролер у блоковском режиму рада који се користи за слање података. Ради смањења оптерећености ДМА контролера, периферија ПЕР1 се враћа у режим рада без ДМА контролера уколико је број података у баферу који су обрађени и чекају слање мањи од 8х. &#039;&#039;&#039;Обезбедити да сваки податак који је послала периферија ПЕР0 буде успешно обрађен и прослеђен периферији ПЕР1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, функцију calcParity и прекиде рутине којима се обавља описани сценарио. Примање података са периферије PER0 реализовати техником програмираног улаза са прекидом, а операцију излаза на периферију PER1 без придруженог DMA контролера техником програмираног излаза са испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP. Регистар BP се може користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &#039;&#039;&#039;int&#039;&#039;&#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена&#039;&#039;&#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &#039;&#039;&#039;Студент је дужан да пише читко и уредно.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АР]]&lt;/div&gt;</summary>
		<author><name>D3f4ult</name></author>
	</entry>
</feed>