<?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%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%2F%D0%9B%D0%B0%D0%B1%D0%9F_%D0%88%D1%83%D0%BB_2020</id>
	<title>Системски софтвер/ЛабП Јул 2020 - Историја измена</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%2F%D0%9B%D0%B0%D0%B1%D0%9F_%D0%88%D1%83%D0%BB_2020"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%9B%D0%B0%D0%B1%D0%9F_%D0%88%D1%83%D0%BB_2020&amp;action=history"/>
	<updated>2026-06-04T02:18:38Z</updated>
	<subtitle>Историја измена ове странице на пројекту</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%9B%D0%B0%D0%B1%D0%9F_%D0%88%D1%83%D0%BB_2020&amp;diff=7899&amp;oldid=prev</id>
		<title>Miljan Đođević: Додат рок</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%9B%D0%B0%D0%B1%D0%9F_%D0%88%D1%83%D0%BB_2020&amp;diff=7899&amp;oldid=prev"/>
		<updated>2025-04-16T04:19:31Z</updated>

		<summary type="html">&lt;p&gt;Додат рок&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;
&amp;#039;&amp;#039;&amp;#039;Поправна лаб вежба на РТИ смеру из Јула 2020. године&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
За дати код у асемблеру дати како би могао изгледати Ц код чијим је превођењен добијен.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.intel-syntax noprefix&lt;br /&gt;
.text&lt;br /&gt;
.global foo&lt;br /&gt;
.type foo, @function&lt;br /&gt;
foo:&lt;br /&gt;
    push rbp&lt;br /&gt;
    mov rbp, rsp&lt;br /&gt;
    mov DWORD PTR -36[rbp], edi&lt;br /&gt;
    mov DWORD PTR -32[rbp], 0&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp]&lt;br /&gt;
    mov QWORD PTR -24[rbp], rax&lt;br /&gt;
    cmp DWORD PTR -36[rbp], 1&lt;br /&gt;
    jg label_1&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp]&lt;br /&gt;
    mov QWORD PTR -24[rbp], rax&lt;br /&gt;
    jmp label_2&lt;br /&gt;
label_1:&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp]&lt;br /&gt;
    sub eax, 1&lt;br /&gt;
    mov edi, eax&lt;br /&gt;
    call foo&lt;br /&gt;
    mov rcx, rdx&lt;br /&gt;
    mov rdx, rcx&lt;br /&gt;
    mov rbx, rdx&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp]&lt;br /&gt;
    sub eax, 2&lt;br /&gt;
    mov edi, eax&lt;br /&gt;
    call foo&lt;br /&gt;
    mov rcx, rdx&lt;br /&gt;
    mov rdx, rcx&lt;br /&gt;
    mov rax, rdx&lt;br /&gt;
    add rax, rbx&lt;br /&gt;
    mov QWORD PTR -24[rbp], rax&lt;br /&gt;
label_2:&lt;br /&gt;
    mov rax, QWORD PTR -32[rbp]&lt;br /&gt;
    mov rdx, QWORD PTR -24[rbp]&lt;br /&gt;
    mov rcx, rax&lt;br /&gt;
    mov rbx, rdx&lt;br /&gt;
    mov eax, ecx&lt;br /&gt;
    pop rbp&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// 0 0 0 0 int int int int (l1)&lt;br /&gt;
// int int int int 0 0 0 0 (lstruct.a and padding)&lt;br /&gt;
// long long long long long long long long (lstruct.b)&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
    int a;&lt;br /&gt;
    long b;&lt;br /&gt;
} A;&lt;br /&gt;
&lt;br /&gt;
A foo(int a)&lt;br /&gt;
{&lt;br /&gt;
    int l1 = a;&lt;br /&gt;
    A lstruct = {0, (unsigned long)l1}; // lstruct.a is l2, lstruct.b is l3&lt;br /&gt;
&lt;br /&gt;
    if (l1 &amp;gt; 1)&lt;br /&gt;
        lstruct.b = foo(l1 - 1).b + foo(l1 - 2).b;&lt;br /&gt;
    else&lt;br /&gt;
        lstruct.b = (unsigned long)l1;&lt;br /&gt;
&lt;br /&gt;
    return lstruct;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Објашњење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.intel-syntax noprefix&lt;br /&gt;
.text&lt;br /&gt;
.global foo&lt;br /&gt;
.type foo, @function&lt;br /&gt;
foo:&lt;br /&gt;
    push rbp&lt;br /&gt;
    mov rbp, rsp # sub rsp, 0x10 (three times); mov QWORD PTR -8[rbp], rbx (saves rbx to stack)&lt;br /&gt;
    mov DWORD PTR -36[rbp], edi # int l1 = rdi; (param1)&lt;br /&gt;
    mov DWORD PTR -32[rbp], 0 # int l2 = 0; (lstruct.a)&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp] # eax = l1;&lt;br /&gt;
    mov QWORD PTR -24[rbp], rax # long (or pointer) l3 = (unsigned long) a; (lstruct.b)&lt;br /&gt;
    cmp DWORD PTR -36[rbp], 1 # l1 - 1&lt;br /&gt;
    jg label_1 # jumps if l1 - 1 &amp;gt; 0&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp] # eax = l1;&lt;br /&gt;
    mov QWORD PTR -24[rbp], rax # l3 = (unsigned long) l1;&lt;br /&gt;
    jmp label_2&lt;br /&gt;
label_1: # then&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp] # eax = l1;&lt;br /&gt;
    sub eax, 1 # eax = l1 - 1;&lt;br /&gt;
    mov edi, eax # foo: param1: l1 - 1;&lt;br /&gt;
    call foo # recursive call, returns two eightbytes using rax and rdx&lt;br /&gt;
    mov rcx, rdx # rcx = second eightbyte of foo&amp;#039;s return (foo1_ret2)&lt;br /&gt;
    mov rdx, rcx # rdx = rcx (foo1_ret2)&lt;br /&gt;
    mov rbx, rdx # rbx = foo1_ret2 (rbx is callee saved, should be saved to stack)&lt;br /&gt;
    mov eax, DWORD PTR -36[rbp] # eax = l1;&lt;br /&gt;
    sub eax, 2 # eax = l1 - 2;&lt;br /&gt;
    mov edi, eax # foo: param1: l1 - 2;&lt;br /&gt;
    call foo # recursive call&lt;br /&gt;
    mov rcx, rdx # rcx = foo2_ret2&lt;br /&gt;
    mov rdx, rcx # rdx = rcx (foo2_ret2)&lt;br /&gt;
    mov rax, rdx # rax = foo2_ret2&lt;br /&gt;
    add rax, rbx # rax += rbx (rax = foo1_ret2 + foo2_ret2)&lt;br /&gt;
    mov QWORD PTR -24[rbp], rax # l3 = foo1_ret2 + foo2_ret2;&lt;br /&gt;
label_2:&lt;br /&gt;
    mov rax, QWORD PTR -32[rbp] # lower rax = l2, upper rax is undefined (struct padding)&lt;br /&gt;
    mov rdx, QWORD PTR -24[rbp] # rdx = l3 (second eightbyte of foo&amp;#039;s return)&lt;br /&gt;
    mov rcx, rax # rcx = rax (l2 and padding)&lt;br /&gt;
    mov rbx, rdx # rbx = l3&lt;br /&gt;
    mov eax, ecx # eax = l2 (no padding) (first eightbyte of foo&amp;#039;s return)&lt;br /&gt;
    pop rbp # &amp;#039;mov rsp, rbp&amp;#039; before this line, or &amp;#039;leave&amp;#039; instead; mov rbx, QWORD PTR -8[rbp] (restoring rbx)&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Системски софтвер]]&lt;/div&gt;</summary>
		<author><name>Miljan Đođević</name></author>
	</entry>
</feed>