<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;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%2F%D0%88%D1%83%D0%BB_2024</id>
	<title>Архитектура рачунара/Јул 2024 - Историја измена</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;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%2F%D0%88%D1%83%D0%BB_2024"/>
	<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;action=history"/>
	<updated>2026-06-04T02:38:43Z</updated>
	<subtitle>Историја измена ове странице на пројекту</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<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&amp;oldid=prev</id>
		<title>D3f4ult: /* Решење */</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&amp;oldid=prev"/>
		<updated>2024-07-12T19:46:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Решење&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Старија измена&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Верзија на датум 12. јул 2024. у 21:46&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l100&quot;&gt;Ред 100:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ред 100:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      XOR R0, R0, R0 ; clear R0&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      XOR R0, R0, R0 ; clear R0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      ;strlen(str)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      ;strlen(str)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      ;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;locc &lt;/del&gt;len, addr, char&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      ;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LOCC &lt;/ins&gt;len, addr, char&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      LOAD R3, #maxValue&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      LOAD R3, #maxValue&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      LOCC R3, R1, &amp;#039;\0&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      LOCC R3, R1, &amp;#039;\0&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l123&quot;&gt;Ред 123:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ред 123:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     LOAD R3, #maxValue -&amp;gt; ADD R3, R0, #maxValue ; R0 = 0&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     LOAD R3, #maxValue -&amp;gt; ADD R3, R0, #maxValue ; R0 = 0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 4. задатак ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 4. задатак ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Поставка ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Поставка ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&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&amp;oldid=prev</id>
		<title>D3f4ult: Нова страница: {{tocright}} &lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање…</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&amp;oldid=prev"/>
		<updated>2024-07-12T19:41:23Z</updated>

		<summary type="html">&lt;p&gt;Нова страница: {{tocright}} &amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање…&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[5п]&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;[5п]&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;[5п]&amp;#039;&amp;#039;&amp;#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која проналази прво појављивање карактера &amp;#039;&amp;#039;c&amp;#039;&amp;#039; у низу карактера &amp;#039;&amp;#039;str&amp;#039;&amp;#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;
Функција као резултат враћа показивач на прво појављивање карактера &amp;#039;&amp;#039;c&amp;#039;&amp;#039; у низу карактера &amp;#039;&amp;#039;str&amp;#039;&amp;#039; или 0 уколико се карактер &amp;#039;&amp;#039;c&amp;#039;&amp;#039; не појављује у низу карактера &amp;#039;&amp;#039;str&amp;#039;&amp;#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, &amp;#039;\0&amp;#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;
&amp;#039;&amp;#039;&amp;#039;[15п]&amp;#039;&amp;#039;&amp;#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. Након пријема потребно је формирати резултујући низ који не садржи дупликате. Могуће је да се нека вредност појављује више пута у оквиру низа, па је у резултујућем низу потребно задржати само једну њену појаву. Формирање резултујућег низа реализовати функцјиом &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; removeDuplicates(&amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;* arr, &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; size) која као параметре има адресу почетка низа и његову величину, док јој је повратна вредност величина резултујућег низа. Резултујући низ се смешта почев од локације на коју указује параметар &amp;#039;&amp;#039;arr&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;У имплементацији функције дозвољено је користити само простор на стеку.&amp;#039;&amp;#039;&amp;#039; Након формирања резултујућег низа потребно га је проследити периферији PER1.&lt;br /&gt;
&lt;br /&gt;
Потребно је написати главни програм, функцију &amp;#039;&amp;#039;removeDuplicates&amp;#039;&amp;#039; и одговарајуће прекидне рутине којима се обавља описани пренос података. Улаз са периферије PER0 реализовати техником програмираног улаза са прекидом, док слање на PER1 коришћењем DMA контролера у блоковском режиму.&lt;br /&gt;
&lt;br /&gt;
Процесор има регистре SP и BP као и додатни помоћни регистар RX чија се претходна вредност не чува приликом извршавања функције (постоје инструкције LDRX и STRX за пренос вредности између акумулатора и регистра RX). Регистри BP и RX се могу користити за регистарско индиректно адресирање. Функција локалне променљиве алоцира на стеку. Сматрати да је тип &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; ширине 16 бита.&lt;br /&gt;
&lt;br /&gt;
Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &amp;#039;&amp;#039;&amp;#039;Обавезно је писање концизних коментара над семантичким целинама у оквиру главног програма и прекидне рутине.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Напомена&amp;#039;&amp;#039;&amp;#039;: На испиту нису дозвољена никаква помоћна средства, ни калкулатори, ни литература. Испит траје 120 минута. &amp;#039;&amp;#039;&amp;#039;Студент је дужан да пише читко и уредно.&amp;#039;&amp;#039;&amp;#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>
</feed>