<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=David</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=David"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/David"/>
	<updated>2026-05-03T14:18:21Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5774</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5774"/>
		<updated>2010-06-23T14:50:50Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podprogram 'sčítaj' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
* CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
* LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude hodnota operanda prepísaná výsledkom.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 add CL, 10&lt;br /&gt;
 ret&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Volanie progrmu scitaj&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov CL, 1&lt;br /&gt;
 call scitaj&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
====Použitie podmienkových skokov====&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|Podmienka vetvenia&lt;br /&gt;
|Kód porovnania a vetvenia programu&lt;br /&gt;
|-&lt;br /&gt;
|A==4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;&amp;gt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;gt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5770</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5770"/>
		<updated>2010-06-23T14:44:02Z</updated>

		<summary type="html">&lt;p&gt;David: /* Návrat hodnoty z funkcie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
* CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
* LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
====Použitie podmienkových skokov====&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|Podmienka vetvenia&lt;br /&gt;
|Kód porovnania a vetvenia programu&lt;br /&gt;
|-&lt;br /&gt;
|A==4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;&amp;gt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;gt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5769</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5769"/>
		<updated>2010-06-23T14:43:43Z</updated>

		<summary type="html">&lt;p&gt;David: /* Návrat hodnoty z funkcie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
* CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
* LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
====Použitie podmienkových skokov====&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|Podmienka vetvenia&lt;br /&gt;
|Kód porovnania a vetvenia programu&lt;br /&gt;
|-&lt;br /&gt;
|A==4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;&amp;gt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;gt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5766</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5766"/>
		<updated>2010-06-23T14:42:27Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podmienený skok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
* CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
* LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
====Použitie podmienkových skokov====&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|Podmienka vetvenia&lt;br /&gt;
|Kód porovnania a vetvenia programu&lt;br /&gt;
|-&lt;br /&gt;
|A==4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;&amp;gt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;gt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5764</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5764"/>
		<updated>2010-06-23T14:34:46Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podmienený skok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
* CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
* LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
====Použitie podmienkových skokov====&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|Podmienka vetvenia&lt;br /&gt;
|Kód porovnania a vetvenia programu&lt;br /&gt;
|-&lt;br /&gt;
|A==4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;&amp;gt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNZ navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;gt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JNC navestie&lt;br /&gt;
|-&lt;br /&gt;
|A&amp;lt;=4&lt;br /&gt;
|CMP A,4&amp;lt;br/&amp;gt;JZ navestie&amp;lt;br/&amp;gt;JC navestie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Diskusia:Skoky_a_podprogramy_-_M8C&amp;diff=5700</id>
		<title>Diskusia:Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Diskusia:Skoky_a_podprogramy_-_M8C&amp;diff=5700"/>
		<updated>2010-06-23T09:35:48Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Premetom článku má byť popis inštrukcií ASM s názornými príkladmi. Príklady v C-cku tam nemajú čo hľadať. Článok vyžaduje prepracovanie. (pf)&lt;br /&gt;
&lt;br /&gt;
Upravene: vyhadzal som tie veci čo súvisia s C-čkom, pridané príklady v ANS (dd)&lt;br /&gt;
&lt;br /&gt;
Priklady a inštrukcie maju byť pre procesor M8C, článok treba preštiepať. Vlož sa do pozicie buduceho čitateľa. (pf)&lt;br /&gt;
&lt;br /&gt;
Upravene: ... (dd)&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5696</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5696"/>
		<updated>2010-06-23T09:32:31Z</updated>

		<summary type="html">&lt;p&gt;David: /* CALL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
* CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
* LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5695</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5695"/>
		<updated>2010-06-23T09:32:01Z</updated>

		<summary type="html">&lt;p&gt;David: /* CALL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
#CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
#LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5693</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5693"/>
		<updated>2010-06-23T09:31:23Z</updated>

		<summary type="html">&lt;p&gt;David: /* CALL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
CALL - rozsah podprogram 2 kB, 11-bitová adresa.&lt;br /&gt;
LCALL - rozsah podprogram 64 kB, 16-bitová adresa.&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5691</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5691"/>
		<updated>2010-06-23T09:28:39Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podmienený skok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5660</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5660"/>
		<updated>2010-06-23T08:10:17Z</updated>

		<summary type="html">&lt;p&gt;David: /* JMP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5658</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5658"/>
		<updated>2010-06-23T08:09:17Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podmienený skok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5656</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5656"/>
		<updated>2010-06-23T08:08:42Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podprogram 'sčítaj' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Diskusia:Skoky_a_podprogramy_-_M8C&amp;diff=5651</id>
		<title>Diskusia:Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Diskusia:Skoky_a_podprogramy_-_M8C&amp;diff=5651"/>
		<updated>2010-06-23T08:02:11Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Premetom článku má byť popis inštrukcií ASM s názornými príkladmi. Príklady v C-cku tam nemajú čo hľadať. Článok vyžaduje prepracovanie. (pf)&lt;br /&gt;
&lt;br /&gt;
Upravene: vyhadzal som tie veci čo súvisia s C-čkom, pridané príklady v ANS&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5647</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5647"/>
		<updated>2010-06-23T07:57:02Z</updated>

		<summary type="html">&lt;p&gt;David: /* Ukladanie parametrov do zásobníka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5645</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5645"/>
		<updated>2010-06-23T07:55:38Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podmienený skok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
 nav:&lt;br /&gt;
 DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
 JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5643</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5643"/>
		<updated>2010-06-23T07:53:57Z</updated>

		<summary type="html">&lt;p&gt;David: /* Návrat hodnoty z funkcie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5642</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5642"/>
		<updated>2010-06-23T07:53:32Z</updated>

		<summary type="html">&lt;p&gt;David: /* RET[F] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5633</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5633"/>
		<updated>2010-06-23T06:58:32Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Podprogramy==&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
===Ukladanie parametrov do zásobníka===&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní hodnotou====&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
====Pri volaní odkazom====&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
===Samotné volanie podprogramu===&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====CALL====&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
====RET[F]====&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
===Návrat hodnoty z funkcie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skoky==&lt;br /&gt;
&lt;br /&gt;
===Nepodmienený skok===&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
====JMP====&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
====Podmienený skok====&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5632</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5632"/>
		<updated>2010-06-23T06:56:49Z</updated>

		<summary type="html">&lt;p&gt;David: /* LITERATÚRA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Podprogramy=&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
==LITERATÚRA==&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5625</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5625"/>
		<updated>2010-06-23T06:52:01Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Podprogramy=&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
====LITERATÚRA====&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5619</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5619"/>
		<updated>2010-06-23T06:47:10Z</updated>

		<summary type="html">&lt;p&gt;David: /* Podmienený skok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Mikroprocesorové systémy]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{{Draft}}&lt;br /&gt;
=Podprogramy=&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Len týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
====LITERATÚRA====&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5384</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5384"/>
		<updated>2010-06-22T14:39:11Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Mikroprocesorové systémy]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{{Draft}}&lt;br /&gt;
=Podprogramy=&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Jen týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;br /&gt;
&lt;br /&gt;
====LITERATÚRA====&lt;br /&gt;
&lt;br /&gt;
# http://silent.melias.sk/assembler/obsah.html&lt;br /&gt;
# http://www.bloog.sk/2009/09/06/assembler-instrukcie-call-a-ret/&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5333</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5333"/>
		<updated>2010-06-22T13:12:16Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Mikroprocesorové systémy]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{{Draft}}&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Podprogram 'sčítaj'===&lt;br /&gt;
Vytvoríme podprogram sčítaj. Najskôr musíme vyriešiť odovzdávanie parametrov podprogramu. Vo vyšších programovacích jazykoch sa pre odovzdanie parametra používa zásobník, my si zatiaľ vystačíme s dohodnutými registrami. Akonáhle vykonáme inštrukciu pre sčítanie ADD, bude jedna hodnota operanda prepísaná výsledkom. Využijeme zásobník a hodnotu uloženú v danom registri si uložíme a neskôr opäť obnovíme.&lt;br /&gt;
&lt;br /&gt;
 scitaj:&lt;br /&gt;
 push eax; uložíme hodnotu registra EAX na zásobník &lt;br /&gt;
 add eax, EBX; sčítame EAX a EBX, výsledok bude v EAX &lt;br /&gt;
 mov ecx, eax; výsledok z EAX uložíme do ECX &lt;br /&gt;
 pop eax; obnovíme pôvodnú hodnotu v registri EAX &lt;br /&gt;
 ret ; návrat z podprogramu.&lt;br /&gt;
 &lt;br /&gt;
Podprogram scitaj vyskúšame s hodnotami 4 a 8.&lt;br /&gt;
 mov eax, 4; do EAX uložíme 4 &lt;br /&gt;
 mov EBX, 8; EBX = 8 &lt;br /&gt;
 call scitaj ; zavoláme podprogram scitaj &lt;br /&gt;
 ;Výsledok bude uložený v registri ECX a bude JIRRA. &lt;br /&gt;
 ; hodnota ECX = OxOOOOOOOC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Jen týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5241</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5241"/>
		<updated>2010-06-21T19:09:25Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Podprogramy=&lt;br /&gt;
Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Jen týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5240</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5240"/>
		<updated>2010-06-21T19:08:24Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
==Ukladanie parametrov do zásobníka==&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
==Samotné volanie podprogramu==&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa,wb,wc,wd;&lt;br /&gt;
 &lt;br /&gt;
 void pocitaj(word a, word b, word &amp;amp;c, word &amp;amp;d) {&lt;br /&gt;
   c = a + b;&lt;br /&gt;
   d = a - b;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *proc_pocitaj=pocitaj;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   wb = 5;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     LEA DI,wd           // zistíme adresu premennej wd&lt;br /&gt;
     PUSH DI             // offset premennej wd&lt;br /&gt;
     LEA DI,wc           // zistíme adresu premennej wc&lt;br /&gt;
     PUSH DI             // offset premennej wc&lt;br /&gt;
     PUSH wb             // procedúre posielame hodnotu wb&lt;br /&gt;
     PUSH wa             // procedúre posielame hodnotu wa&lt;br /&gt;
     CALL proc_pocitaj   // a zavoláme pocitaj&lt;br /&gt;
     MOV cx, 4           // do zásobníka sme vložili 4 hodnoty&lt;br /&gt;
     REP POP ax          // zásobník musíme vyprázdniť&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;%d+(-)%d=%d(%d)&amp;quot;, wa,wb,wc,wd);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Rovnakú postupnosť inštrukcií ako blok asm v tomto programe prevedie riadok pocitaj(aa,bb,cc,dd);&lt;br /&gt;
&lt;br /&gt;
==Návrat hodnoty z funkcie==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funkcia je podprogram, ktorý vracia jednu hodnotu typu uvedeného v záhlaví. Vracanú hodnotu zistíme po návrate z funkcie vždy v registroch:&lt;br /&gt;
* AL - funkčná hodnota o veľkosti slabiky&lt;br /&gt;
* AX - funkčná hodnota o veľkosti slova&lt;br /&gt;
* DX, AX - funkčná hodnota o veľkosti dvojslova (pri ukazovateli DX - segment, AX - offset)&lt;br /&gt;
* DX, BX, AX - funkčná hodnota typu float&lt;br /&gt;
&lt;br /&gt;
Pokiaľ funkcia vracia reťazec, musí byť volaná i s adresou miesta, kam má výsledný reťazec zapísať.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;process.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef unsigned int word;&lt;br /&gt;
 word wa, wc;&lt;br /&gt;
 word minus(word a) {&lt;br /&gt;
   return (a-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void *funk_minus = minus;&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   wa = 40;&lt;br /&gt;
   clrscr();&lt;br /&gt;
   asm {&lt;br /&gt;
     PUSH wa            // posielame hodnotu wa&lt;br /&gt;
     CALL funk_minus    // zavoláme funkciu&lt;br /&gt;
     MOV wc, AX         // slovo si vyzdvihneme v registri AX&lt;br /&gt;
     POP AX             // vyprázdnime zásobník&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;\n%d-1=%d&amp;quot;,wa,wc);&lt;br /&gt;
   getchar();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
=Skoky=&lt;br /&gt;
&lt;br /&gt;
==Nepodmienený skok==&lt;br /&gt;
&lt;br /&gt;
Je to nepodmienený skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou skoku je potom uvedený jeho názov.&lt;br /&gt;
===JMP===&lt;br /&gt;
navestie - urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený skok vyzerá takto:&lt;br /&gt;
&lt;br /&gt;
 navestie: inštrukcia na ktorú bude odkaz&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           JMP navestie&lt;br /&gt;
&lt;br /&gt;
Ak skoky používame, hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo dôjsť.&lt;br /&gt;
&lt;br /&gt;
===Podmienený skok===&lt;br /&gt;
&lt;br /&gt;
Jedná sa o skok podmienený stavom jedného alebo viac, bitov registri príznakov F. Jen týmto spôsobom je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je skok závislý.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* JE návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JZ návestie - skok na návestie pri ZF = 1&lt;br /&gt;
* JNE návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JNZ návestie - skok na návestie pri ZF = 0&lt;br /&gt;
* JC návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNC návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JS návestie - skok na návestie pri SF = 1&lt;br /&gt;
* JNS návestie - skok na návestie pri SF = 0&lt;br /&gt;
* JO návestie - skok na návestie pri OF = 1&lt;br /&gt;
* JNO návestie - skok na návestie pri OF = 0&lt;br /&gt;
* JP návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JNP návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JPE návestie - skok na návestie pri PF = 1&lt;br /&gt;
* JPO návestie - skok na návestie pri PF = 0&lt;br /&gt;
* JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)&lt;br /&gt;
* JAE návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JNB návestie - skok na návestie pri CF = 0&lt;br /&gt;
* JB návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JNAE návestie - skok na návestie pri CF = 1&lt;br /&gt;
* JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)&lt;br /&gt;
* JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)&lt;br /&gt;
* JGE návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JNL návestie - skok na návestie pri SF = OF&lt;br /&gt;
* JL návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JNGE návestie - skok na návestie pri SF &amp;lt;&amp;gt; OF&lt;br /&gt;
* JLE návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
* JNG návestie - skok na návestie pri (ZF = 1) OR (SF &amp;lt;&amp;gt; OF)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pri hľadaní inštrukcie podmieneného skoku musíme myslieť na to, za akých okolností chceme skok vykonať. K tomu je tiež dobré si uvedomiť:&lt;br /&gt;
* A &amp;lt; B =&amp;gt; A - B &amp;lt; 0 =&amp;gt; SF = 1&lt;br /&gt;
* A = B =&amp;gt; A - B = 0 =&amp;gt; ZF = 1&lt;br /&gt;
* A &amp;gt; B =&amp;gt; A - B &amp;gt; 0 =&amp;gt; SF = 0&lt;br /&gt;
Rozdiel čísel v tomto prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý cyklus potom vytvoríme podmieneným skokom:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 main() {&lt;br /&gt;
   asm MOV CL, 10  // do registra CL dosaď 10, počet krokov&lt;br /&gt;
   nav:            // návestie, tu umiestnime opakovanú činnosť&lt;br /&gt;
   asm {&lt;br /&gt;
     DEC CL        // odčítaj od CL číslo 1&lt;br /&gt;
     JNZ nav       // ak nie je nula skoč na návestie&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Program opakuje skok dokiaľ nie je v registri CL nulový výsledok.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5236</id>
		<title>Skoky a podprogramy - M8C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Skoky_a_podprogramy_-_M8C&amp;diff=5236"/>
		<updated>2010-06-21T18:46:27Z</updated>

		<summary type="html">&lt;p&gt;David: Vytvorená stránka „Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adr…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.&lt;br /&gt;
&lt;br /&gt;
=Ukladanie parametrov do zásobníka=&lt;br /&gt;
&lt;br /&gt;
V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:&lt;br /&gt;
* hodnotou - podprogram ich hodnoty iba využíva&lt;br /&gt;
* odkazom - podprogram ich môže čítať a môže do nich i zapísať&lt;br /&gt;
&lt;br /&gt;
Napríklad: void sucet (word a, word b, word &amp;amp;c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní hodnotou===&lt;br /&gt;
&lt;br /&gt;
Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:&lt;br /&gt;
&lt;br /&gt;
* parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)&lt;br /&gt;
* parametre o dĺžke jedného slova (word, int) - obsadia slovo&lt;br /&gt;
* parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)&lt;br /&gt;
* parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová&lt;br /&gt;
* parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.&lt;br /&gt;
&lt;br /&gt;
===Pri volaní odkazom===&lt;br /&gt;
&lt;br /&gt;
Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).&lt;br /&gt;
&lt;br /&gt;
=Samotné volanie podprogramu=&lt;br /&gt;
&lt;br /&gt;
Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===CALL===&lt;br /&gt;
adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)&lt;br /&gt;
&lt;br /&gt;
Ukončení samotného podprogramu zaistí inštrukcia&lt;br /&gt;
&lt;br /&gt;
===RET[F]===&lt;br /&gt;
z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.&lt;br /&gt;
&lt;br /&gt;
Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.&lt;br /&gt;
&lt;br /&gt;
Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Konfigurovate%C4%BEn%C3%A9_mikroprocesorov%C3%A9_syst%C3%A9my&amp;diff=5228</id>
		<title>Konfigurovateľné mikroprocesorové systémy</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Konfigurovate%C4%BEn%C3%A9_mikroprocesorov%C3%A9_syst%C3%A9my&amp;diff=5228"/>
		<updated>2010-06-21T17:08:44Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Mikroprocesorové systémy]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov=Konfigurovateľné mikroprocesorové systémy&lt;br /&gt;
Forma=Prednáška a praktické cvičenia&lt;br /&gt;
Abstrakt=Všeobecnej architektúra počítača a mikrokontroléra, rozdiely a porovnanie. Návrh a tvorb hybridných elektronických systémov na báze mikrokontrolérov PSoC. Komunikácia mikrokontroléra s prostredím. Komunikačné protokoly a štandardy. Pripájanie a riadenie periférií.  &lt;br /&gt;
Rozvrh=3/0/2&lt;br /&gt;
Hodnotenie=Spracovanie projektu a skúška&lt;br /&gt;
Poznámky=Predmetom projektu môže byť téma podľa vlastného výberu z oblasti prednášky a/alebo cvičení spracovaná v písomnej elektronickej podobe a verejne publikovaná na serveri KiWiKi. Hodnotenie a poznámky k projektu budú verejné a zverejnené v diskusii k práci. Pri písaní článkov sa riadte [[Pomoc:Obsah | návodom]] s dôrazom na zadávanie vzťahov vo formáte kiwiki a korektné spracovanie obrázkov. &lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:150px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Všeobecný úvod ==&lt;br /&gt;
* [[Od počítača k mikrokontroléru]]&lt;br /&gt;
* [[Architektúra všeobecného počítača]]&lt;br /&gt;
* [[Architektúra mikrokontroléra]]&lt;br /&gt;
* Prehľad aktuálneho stavu technológie&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:100px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Úvod do technológie PSoC ==&lt;br /&gt;
* [[Prehľad architektúry PSoC]] &lt;br /&gt;
* [[Elektrické a mechanické parametre architektúry PSoC]]&lt;br /&gt;
* [[Vývojové prostredie pre systémy PSoC]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:100px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Assembler M8C ==&lt;br /&gt;
* Štruktúra assembleru - Assembler M8C&lt;br /&gt;
* Pseudoinštrukcie assembleru - Assembler M8C&lt;br /&gt;
* Makrá - Assembler M8C&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:220px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Inštrukcie procesora M8C ==&lt;br /&gt;
* Prehľad inštrukcií procesora M8C&lt;br /&gt;
* [[Inštrukcie presunu dát - M8C]]&lt;br /&gt;
* [[Aritmetické inštrukcie - M8C]]&lt;br /&gt;
* [[Logické inštrukcie - M8C]]&lt;br /&gt;
* [[Inštrukcie pre prácu zo zásobníkom - M8C]]&lt;br /&gt;
* [[Skoky a podprogramy - M8C]]&lt;br /&gt;
* Špeciálne inštrukcie - M8C&lt;br /&gt;
* Prerušenia - M8C&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:100px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Programové konštrukcie assembleru M8C ==&lt;br /&gt;
* Konštrukcia IF-ELSE (assembler)&lt;br /&gt;
* Konštrukcia SWITCH-CASE (assembler)&lt;br /&gt;
* Cykly DO-WHILE, FOR-LOOP (assembler)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:180px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIO - Všeobecne vstupy a výstupy  PSoC==&lt;br /&gt;
* [[Popis GPIO]]&lt;br /&gt;
* [[Konfigurácia GPIO pomocou designera obvodu]]&lt;br /&gt;
* [[Programová konfigurácia GPIO]]&lt;br /&gt;
* [[Módy portov (M8C)]]&lt;br /&gt;
* [[Pripojenie periférnych obvodov]]&lt;br /&gt;
* [[Pripojenie tlačítok a ošetrenie zákmitov]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:200px;border: none; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Sériová asynchrónna komunikácia - UART ==&lt;br /&gt;
* [[Historický vývoj UART]]&lt;br /&gt;
* [[Štandard RS232]]&lt;br /&gt;
* [[Štandard RS485]]&lt;br /&gt;
* [[Blok UART]]&lt;br /&gt;
* [[API UART]]&lt;br /&gt;
* Protokol MODBUS/uBUS&lt;br /&gt;
** [[Popis protokolu MODBUS/uBUS]]&lt;br /&gt;
** [[Implementácia protokolu MODBUS/uBUS]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:200px;border: 10px; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sériové komunikačné zbernice==&lt;br /&gt;
* [[Synchrónna komunikácia I2C]]&lt;br /&gt;
** Meranie teploty pomocou LM92&lt;br /&gt;
** [[Hodiny reálneho času]] &lt;br /&gt;
* [[Synchrónna komunikácia SPI]]&lt;br /&gt;
* Distribuovaný systém zber dát 1-Wire&lt;br /&gt;
** Meranie teploty pomocou teplomera DS18S20&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:250px;border: 10px; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Čítače, časovače a šírkové modulátory PSoC==&lt;br /&gt;
* Blok čítača a časovača (M8C)&lt;br /&gt;
* API čítača a časovača (M8C)&lt;br /&gt;
* Generovanie časových intervalov (M8C)&lt;br /&gt;
* Meranie času a frekvencie (M8C)&lt;br /&gt;
** [[Presné meranie kapacity]]&lt;br /&gt;
** Meranie polohy pomocou magnetostrikčného senzoru&lt;br /&gt;
* [[Šírkový modulátor PWM]]&lt;br /&gt;
* API PWM&lt;br /&gt;
** Riadenie modelárskeho serva pomocou PWM&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:250px;border: 10px; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Analógové spracovanie signálov ==&lt;br /&gt;
* [[Prevodníky ADC]]&lt;br /&gt;
** Aproximačné prevodníky&lt;br /&gt;
** Delta-Sigma prevodníky&lt;br /&gt;
* [[Prevodníky DAC]]&lt;br /&gt;
* [[Analógové spracovanie signálov- zosilňovače]]&lt;br /&gt;
* [[Analógové spracovanie signálov - komparátor]]&lt;br /&gt;
** Spracovanie prerušenia od komparátora&lt;br /&gt;
* Filtre&lt;br /&gt;
** Návrh a realizácia filtrov&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:150px;border: 10px; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
== Všeobecné zásady tvorby programov ==&lt;br /&gt;
* Analýza&lt;br /&gt;
* Návrh &lt;br /&gt;
* Implementácia&lt;br /&gt;
* Testovanie a ladenie programu&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:600px;  padding:15px;position:relative; text-align:left;height:150px;border: 10px; -moz-border-radius:15px;background-color: #F3F781;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1-Wire ==&lt;br /&gt;
* [[Protokol 1-Wire]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Podklady k cvičeniam ==&lt;br /&gt;
# Binárne čísla&lt;br /&gt;
## Reprezentácia a formáty zobrazenia čísel&lt;br /&gt;
## Prevody medzi číselnými sústavami&lt;br /&gt;
## Matematické operácie s binárnymi číslami&lt;br /&gt;
# Vývojové prostredie PSoC&lt;br /&gt;
## Tvorba programov v PSoC Designer&lt;br /&gt;
## Vývojový kit CY3210&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Konfigurovate%C4%BEn%C3%A9_mikroprocesorov%C3%A9_syst%C3%A9my&amp;diff=3929</id>
		<title>Konfigurovateľné mikroprocesorové systémy</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Konfigurovate%C4%BEn%C3%A9_mikroprocesorov%C3%A9_syst%C3%A9my&amp;diff=3929"/>
		<updated>2010-05-06T10:21:52Z</updated>

		<summary type="html">&lt;p&gt;David: /* Obsah prednášok */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Mikroprocesorové systémy]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov=Konfigurovateľné mikroprocesorové systémy&lt;br /&gt;
Forma=Prednáška a praktické cvičenia&lt;br /&gt;
Abstrakt=Všeobecnej architektúra počítača a mikrokontroléra, rozdiely a porovnanie. Návrh a tvorb hybridných elektronických systémov na báze mikrokontrolérov PSoC. Komunikácia mikrokontroléra s prostredím. Komunikačné protokoly a štandardy. Pripájanie a riadenie periférií.  &lt;br /&gt;
Rozvrh=3/0/2&lt;br /&gt;
Hodnotenie=Spracovanie projektu a skúška&lt;br /&gt;
Poznámky=Predmetom projektu môže byť téma podľa vlastného výberu z oblasti prednášky a/alebo cvičení spracovaná v písomnej elektronickej podobe a verejne publikovaná na serveri KiWiKi. Hodnotenie a poznámky k projektu budú verejné a zverejnené v diskusii k práci. &lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsah prednášok ==&lt;br /&gt;
* Všeobecný úvod&lt;br /&gt;
** [[Od počítača k mikrokontroléru]]&lt;br /&gt;
*** Architektúra všeobecného počítača&lt;br /&gt;
*** Architektúra mikrokontrolera&lt;br /&gt;
*** Prehľad aktuálneho stavu technológie&lt;br /&gt;
* [[Úvod do technológie PSoC]] &lt;br /&gt;
** Prehľad architektúry &lt;br /&gt;
** Elektrické a mechanické parametre&lt;br /&gt;
** Vývojové prostredie&lt;br /&gt;
* Assembler M8C&lt;br /&gt;
** Štruktúra assembleru&lt;br /&gt;
** Pseudoinštrukcie assembleru&lt;br /&gt;
** Makrá&lt;br /&gt;
* [[Inštrukcie procesora M8C]]&lt;br /&gt;
** [[Inštrukcie presunu dát]]&lt;br /&gt;
** [[Aritmetické inštrukcie]]&lt;br /&gt;
** [[Logické inštrukcie]]&lt;br /&gt;
** [[Inštrukcie pre prácu zo zásobníkom]]&lt;br /&gt;
** Skoky a podprogramy&lt;br /&gt;
** Špeciálne inštrukcie&lt;br /&gt;
** Prerušenia&lt;br /&gt;
* [[Základné programové konštrukcie]]&lt;br /&gt;
** [[Konštrukcia IF-ELSE]]&lt;br /&gt;
** [[Konštrukcia SWITCH-CASE]]&lt;br /&gt;
** [[Cykly DO-WHILE, FOR-LOOP]]&lt;br /&gt;
* GPIO - Všeobecne použiteľné vstupy a výstupy &lt;br /&gt;
** Popis GPIO&lt;br /&gt;
** Konfigurácia GPIO pomocou designera obvodu&lt;br /&gt;
** Programová konfigurácia GPIO&lt;br /&gt;
** Módy portov &lt;br /&gt;
** Pripojenie periférnych obvodov&lt;br /&gt;
** Pripojenie tlačítok a ošetrenie zákmitov&lt;br /&gt;
* Sériová asynchrónna komunikácia - UART&lt;br /&gt;
** Historický vývoj&lt;br /&gt;
** [[Štandard RS232]]&lt;br /&gt;
*** [[Rozhranie TTL/RS232]] &lt;br /&gt;
** Štandard RS485&lt;br /&gt;
*** Rozhranie TTL/RS485&lt;br /&gt;
** [[Blok UART]]&lt;br /&gt;
** API UART&lt;br /&gt;
** Protokol MODBUS/uBUS&lt;br /&gt;
*** Popis&lt;br /&gt;
*** Implementácia&lt;br /&gt;
* Synchrónna komunikácia I2C&lt;br /&gt;
** Meranie teploty pomocou LM92&lt;br /&gt;
** Hodiny reálneho času &lt;br /&gt;
* [[Synchrónna komunikácia SPI]]&lt;br /&gt;
* Distribuovaný systém zber dát 1-Wire&lt;br /&gt;
** Meranie teploty pomocou teplomera DS18S20&lt;br /&gt;
* Čítače a časovače&lt;br /&gt;
** Blok čítača a časovača&lt;br /&gt;
** API Čítača a časovača&lt;br /&gt;
** Generovanie časových intervalov&lt;br /&gt;
** Meranie času a frekvencie&lt;br /&gt;
** [[Presné meranie kapacity]]&lt;br /&gt;
** Meranie polohy pomocou magnetostrikčného senzoru&lt;br /&gt;
[[* Šírkový modulátor PWM]]&lt;br /&gt;
** Blok čítača a časovača&lt;br /&gt;
** API PWM&lt;br /&gt;
** Riadenie modelárskeho serva pomocou PWM&lt;br /&gt;
* Prevodníky ADC&lt;br /&gt;
** Aproximačné prevodníky&lt;br /&gt;
** Delta-Sigma prevodníky&lt;br /&gt;
* Prevodníky DAC&lt;br /&gt;
* Analógové spracovanie signálov&lt;br /&gt;
** Zosilňovače&lt;br /&gt;
** Komparátor&lt;br /&gt;
*** Spracovanie prerušenia od komparátora&lt;br /&gt;
** Filtre&lt;br /&gt;
*** Návrh a realizácia filtrov&lt;br /&gt;
* Všeobecné zásady tvorby programov&lt;br /&gt;
** Analýza&lt;br /&gt;
** Návrh &lt;br /&gt;
** Implementácia&lt;br /&gt;
** Testovanie a ladenie programu&lt;br /&gt;
&lt;br /&gt;
== Podklady k cvičeniam ==&lt;br /&gt;
# Binárne čísla&lt;br /&gt;
## Reprezentácia a formáty zobrazenia čísel&lt;br /&gt;
## Prevody medzi číselnými sústavami&lt;br /&gt;
## Matematické operácie s binárnymi číslami&lt;br /&gt;
# Vývojové prostredie PSoC&lt;br /&gt;
## Tvorba programov v PSoC Designer&lt;br /&gt;
## Vývojový kit CY3210&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2388</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2388"/>
		<updated>2010-02-24T11:31:02Z</updated>

		<summary type="html">&lt;p&gt;David: /* Realizácia exportu rozvrhu do PDF súboru */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
= =&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&amp;lt;br/&amp;gt;&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&amp;lt;br/&amp;gt;&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 for($i=1;$i&amp;lt;=5;$i++){&lt;br /&gt;
 $selectDay = $db-&amp;gt;select()&lt;br /&gt;
                 -&amp;gt;from(T_VIEW)&lt;br /&gt;
                 -&amp;gt;where('day = ?', $i)&lt;br /&gt;
                 -&amp;gt;order('hour ASC');&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['kruzok'])){&lt;br /&gt;
 $selectDay-&amp;gt;where('subclass = ' . $db-&amp;gt;quote($this-&amp;gt;myFilter['kruzok']).' OR (subclass IS NULL &lt;br /&gt;
 AND branch_num = ' . intval( $this-&amp;gt;myFilter['kruzok'][1]) . ' &lt;br /&gt;
 AND year = ' . intval( $this-&amp;gt;myFilter['kruzok'][2]) . ')');            &lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['miestnost'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('room_id = ?',$this-&amp;gt;myFilter['miestnost']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['ucitel'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('user_id = ?',$this-&amp;gt;myFilter['ucitel']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['predmet'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('subject_id = ?',$this-&amp;gt;myFilter['predmet']);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Do poľa $selectDay uložíme s tabuľky rozvrh_view všetky záznamy z jednotlivých dní. Postupne sa z tohto poľa filtrujú údaje podľa poľa $myFilter. Získané údaje sú ďalej spracovávané a pripravované na vypisovanie do PDF súboru. Štyri hlavné údaje sa usporiadajú podľa URL požiadavku.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ukážka jednej bunky z tabuľky rozvrhu:&lt;br /&gt;
[[Súbor:Bunka tabulky.JPG|thumb|center|Obr. 2 Bunka tabuľky rozvrhu]]&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|+align=&amp;quot;top&amp;quot; style=&amp;quot;color:#000;&amp;quot;|''Tab. 2 Tabuľka kombinácií údajov''&lt;br /&gt;
!Priorita&lt;br /&gt;
!Filter&lt;br /&gt;
!Hlavný údaj&lt;br /&gt;
!Druhý údaj&lt;br /&gt;
!Tretí údaj&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|krúžok&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|učiteľ&lt;br /&gt;
|predmet&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|miestnosť&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|}&lt;br /&gt;
Príklad: ak URL obsahuje filtrovanie pre učiteľa a predmet tak hlavný údaj bude obsahovať predmet, druhý údaj bude obsahovať krúžok a tretí údaj miestnosť. Ďalšie údaje sú pre hociktorú variantu rovnaké. &lt;br /&gt;
Zoznam údajov:&lt;br /&gt;
*hlavný údaj&lt;br /&gt;
*druhý údaj&lt;br /&gt;
*tretí údaj&lt;br /&gt;
*dĺžka hodiny&lt;br /&gt;
*typ hodiny (prednášky, cvičenia alebo laboratórne cvičenia)&lt;br /&gt;
*farba políčka&lt;br /&gt;
*týždeň (párny, nepárny alebo každý týždeň)&lt;br /&gt;
*skratka hlavného údaju&lt;br /&gt;
*skratka druhého údaju&lt;br /&gt;
*začiatok hodiny&lt;br /&gt;
*údaje pre legendu číslo 1&lt;br /&gt;
*údaje pre legendu číslo 2&lt;br /&gt;
&lt;br /&gt;
Príklad jedného záznamu údajov:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 [0] =&amp;gt; string(32) &amp;quot;Logické a číslicové systémy&amp;quot;&lt;br /&gt;
 [1] =&amp;gt; string(7) &amp;quot;P. Fabo&amp;quot;&lt;br /&gt;
 [2] =&amp;gt; string(7) &amp;quot;Zlm 211&amp;quot;&lt;br /&gt;
 [3] =&amp;gt; string(1) &amp;quot;2&amp;quot;&lt;br /&gt;
 [4] =&amp;gt; string(1) &amp;quot;l&amp;quot;&lt;br /&gt;
 [5] =&amp;gt; string(7) &amp;quot;#EFD1D1&amp;quot;&lt;br /&gt;
 [6] =&amp;gt; string(1) &amp;quot;k&amp;quot;&lt;br /&gt;
 [9] =&amp;gt; string(4) &amp;quot;LČS&amp;quot;&lt;br /&gt;
 [10] =&amp;gt; string(5) &amp;quot;Peter&amp;quot;&lt;br /&gt;
 [11] =&amp;gt; string(2) &amp;quot;12&amp;quot;&lt;br /&gt;
 [12] =&amp;gt; string(27) &amp;quot;P. Fabo - Peter Fabo, RnDr.&amp;quot;&lt;br /&gt;
 [13] =&amp;gt; string(39) &amp;quot;LČS - Logické a číslicové systémy&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Takto upravené údaje ukladám do premennej $tabulka. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie hlavyčky'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalší krok je vykreslenie hlavičky PDF súboru. Najprv vykreslím logo našej fakulty potom vypíšem Trenčianska univerzita Alexandra Dubčeka v Trenčíne Fakulta Mechatroniky a nakoniec vykreslím oddeľovací pásik. Pod čiarou sa vykreslí filter s URL požiadaviek.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie tabuľky s rozvrhom'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Najprv som si vykreslil prázdnu tabuľku pomocou public function addEmptyTable($x1,$y1). Premenná $x1 a $y1 obsahuje polohu horného rohu tabuľky.&lt;br /&gt;
[[Súbor:Prazdna tabulka.JPG|thumb|center|Obr. 3 Prázdna tabuľka rozvrhu]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Potom pomocou opakovaného volania public function addRow($riadok,$x1,$y1) sa vykresľujú jednotlivé dni rozvrhu. Funkcia zabespečuje: &lt;br /&gt;
*správne zobrazovanie hodín párneho a nepárneho týždňa&lt;br /&gt;
*vyfarbuje bunky podľa typu hodiny&lt;br /&gt;
*počíta dĺžku danej bunky&lt;br /&gt;
*vypisuje údaje do bunky, ak je dĺžka názvu predmetu dlhšia ako dĺžka bunky tak sa vypíše skratka predmetu&lt;br /&gt;
*vyplňuje legendu podľa použitých skratiek&lt;br /&gt;
[[Súbor:Vyplnena tabulka.JPG|thumb|center|Obr. 4 Vyplnená tabuľka]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie legendy'''&amp;lt;br/&amp;gt;&lt;br /&gt;
public function addCaption($y1) do prvého stĺpca vypíše legendu pre skratky učiteľov a do druhého vypíše legendu pre skratky predmetov. Do spodnej časti PDF súboru vypíše legendu farebného značenia buniek.&lt;br /&gt;
[[Súbor:Legenda.JPG|thumb|center|Obr. 5 Legenda]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie päty dokumentu'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V päte súboru sú informácie o katedre ktorá zastrešuje celý projekt a o autorovi.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Popis PDF súboru'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Posledným krokom pred samotným odoslaním súboru na stiahnutie, je vyplnenie popisu. Sú vyplnené nasledovné údaje:&lt;br /&gt;
*titulok&lt;br /&gt;
*autor&lt;br /&gt;
*podrobnosti&lt;br /&gt;
*kľúčové slová&lt;br /&gt;
príklad: PDF súbor generovaný opisovanou aplikáciu by mohol vyzerať nasledovne&lt;br /&gt;
[[Súbor:Final PDF.JPG|thumb|center|Obr. 6 Ukážka PDF súboru]]&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
V práci bol popis PDF formátu ktorý následne používame ako formát pri exporte tabuľky rozvrhu a tlačových zostáv FM TnUAD. Po zadefinovaní rozloženia výstupnej zostavy rozvrhu som vytvoril PDF súbor s týmto návrhom. Pre generovanie PDF súboru som vytvoril triedu My_Pdf ktorá je potomkom triedy Zend_Pdf z frameworku ZEND. Celý projekt bol postavený na frameworku ZEND v jazyku PHP.&lt;br /&gt;
&amp;lt;br/&amp;gt;Práca bude pokračovať bakalárskou prácou kde budú rozšírené možnosti exportu o formát xlsx. Ďalšou úlohou bude vytvoriť štatistické reporty rozvrhu ako sú napr.: vyťaženie miestností, úväzky pedagógov a iné.&lt;br /&gt;
&lt;br /&gt;
=Bibliografia=&lt;br /&gt;
[1] wikipedia. www.wikipedia.org. www.sk.wikipedia.org. [Online] 27. 12 2009. [Dátum: 14. 1 2010.] http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t.&lt;br /&gt;
&amp;lt;br/&amp;gt;[2] abclinuxu.cz. www.abclinuxu.cz. [Online] 31. 03 2008. [Dátum: 18. 01 2010.] http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne.&lt;br /&gt;
&amp;lt;br/&amp;gt;[3] Adobe Systems Incorporated. Portable Document Format Reference Manual. s.l. : Adobe Systems Incorporated., 1996. ISBN 0–201–62628–4.&lt;br /&gt;
&amp;lt;br/&amp;gt;[4] Katedra informatiky a výpočetní techniky. www-kiv.zcu.cz. [Online] 08. 06 1999. [Dátum: 16. 01 2010.] http://www-kiv.zcu.cz/~herout/html_sbo/pdf/toc.htm.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Vyplnena_tabulka.JPG&amp;diff=2386</id>
		<title>Súbor:Vyplnena tabulka.JPG</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Vyplnena_tabulka.JPG&amp;diff=2386"/>
		<updated>2010-02-24T11:24:28Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Prazdna_tabulka.JPG&amp;diff=2384</id>
		<title>Súbor:Prazdna tabulka.JPG</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Prazdna_tabulka.JPG&amp;diff=2384"/>
		<updated>2010-02-24T11:23:09Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Legenda.JPG&amp;diff=2383</id>
		<title>Súbor:Legenda.JPG</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Legenda.JPG&amp;diff=2383"/>
		<updated>2010-02-24T11:22:55Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Final_PDF.JPG&amp;diff=2382</id>
		<title>Súbor:Final PDF.JPG</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Final_PDF.JPG&amp;diff=2382"/>
		<updated>2010-02-24T11:22:35Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Bunka_tabulky.JPG&amp;diff=2381</id>
		<title>Súbor:Bunka tabulky.JPG</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Bunka_tabulky.JPG&amp;diff=2381"/>
		<updated>2010-02-24T11:22:02Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=2380</id>
		<title>Štatistický modul v systéme rozvrhu FM</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=2380"/>
		<updated>2010-02-24T11:20:43Z</updated>

		<summary type="html">&lt;p&gt;David: /* Popis objektov dokumentu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Dávid Ďurika|Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|1|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|a&lt;br /&gt;
|a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
V dnešnej dobe je mnoho formátov súborov. Niektoré sú voľne šíriteľné na iné sú chránené rôznymi licenciami. Súčasnosti je trend vytvárať a používať otvorené formáty súborov. Otvorený formát je taký ktorého špecifikácia je verejne prístupná. Medzi otvorené formáty dokumentov patria: PDF, OO XML, ODT. Medzi otvorené grafické formáty môžeme zaradiť napríklad gif, png, svg. V tejto práci sa bude opísaná štruktúra PDF formátu a niektoré vlastnosti tohto formátu. Vdruhej časti práce budú opísané tlačové zostavy použité v aplikácii rozvrhu FM TnUAD.&lt;br /&gt;
&lt;br /&gt;
=Otvorené formáty dokumentov=&lt;br /&gt;
Otvorený formát (otvorený štandard, angl.: open format) je publikovaná špecifikácia na uchovávanie digitálnych údajov, obvykle udržiavaná neproprietárnou štandardizačnou organizáciou a bez právnych obmedzení na používanie. Napríklad, otvorený formát musí byť implementovateľný aj proprietárnym aj open source softvérom, za použitia im typických licencií. Na rozdiel od otvorených formátov, proprietárne formáty sa riadia a definujú súkromnými záujmami. Otvorené formáty sú podmonožinou otvorených noriem. [http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t]&lt;br /&gt;
&lt;br /&gt;
==ODF (OpenDocument Format)==&lt;br /&gt;
XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) vytvorený pre kancelársky balík OpenOffice.org. Špecifikácia bola pôvodne vyvinutá firmou Sun, ale štandard bol vyvinutý v rámci OASIS (Organization for the Advancement of Structured Information Standards) a založení na XML formátu vytvorený a implementovaný pre balík OpenOffice.org. Formát je neznárodním štandardom (ISO/IEC 26300) od 30. novembra 2006. &lt;br /&gt;
Formát je podporovaný hlavne v balíku aplikácií OpenOffice.org, KOffice a StarOffice. Pre MS Office existuje konvertor. [http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne [2&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt; ]&lt;br /&gt;
&lt;br /&gt;
==OOXML (Office Open XML)==&lt;br /&gt;
Takisto XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) od firmy Microsoft. Formát je podporovaný v nových verziách sady aplikácií MS Office (2007, pre staršie verzie je k dispozícii konvertor) a tiež prevodným modulom pre OpenOffice.org od firmy Novell (funguje však len vo verziách OpenOffice.org v SUSE Linuxu a niektorých verziách (K)Ubuntu). Podporuje ho napríklad také NeoOffice, čo je ekvivalentom OpenOffice.org pre Mac OS X. [http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne]&lt;br /&gt;
==OpenOffice.org==&lt;br /&gt;
Je kancelársky balíček ktorý obsahuje:&lt;br /&gt;
*Textový editor Writer&lt;br /&gt;
*Tabuľkový procesor Calc&lt;br /&gt;
*Prezentační program Impress&lt;br /&gt;
*Nástroj pre kreslení Draw&lt;br /&gt;
*Databázový nástroj Base&lt;br /&gt;
je voľne šíriteľný slobodný softvér pod licenciou LGPL. Je funkčný pod akoukoľvek platformou operačného systému. A dokáže konkurovať kancelárskemu balíku od Microsoftu – MS Office.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Portable Document Format==&lt;br /&gt;
PDF (Portable Document Format) alebo prenosný formát dokumentu vyvinutý firmou Adobe. Súbor formátu PDF je možné vytvoriť viacerými spôsobmi. Napríklad pomocou aplikácií určených len na tento účel: PDF Creator, BullZip PDF Printer. Ďalším spôsobom je priame napísanie kódu PDF, ale táto metóda je v praxi nepoužiteľná kvôli svojej náročnosti. Posledný spôsob, ktorý spomeniem, je generovanie PDF dokumentov pomocou web aplikácií. Tento spôsob budem ďalej demonštrovať v kapitole Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD. K zobrazovaniu PDF dokumentov sú nutné špeciálne prehliadače. Jedným s najznámejších je Adobe Acrobat Reader. Je voľne dostupný na www.adobe.com. Najväčšou výhodou PDF formátu je jeho nezávislosť na platforme (PC, Mac, UNIX). Čo zaručí, že sa zobrazí rovnako na všetkých tipoch počítačov. Je to veľká výhoda oproti ostatným formátom, ktoré zobrazujú dokument inak na rôznych platformách. Ďalšou výhodou PDF formátu je možnosť definovať náhľad stránok, odkazy alebo záložky, čo umožňuje užívateľovi komfortnejšie prezeranie dokumentu. &lt;br /&gt;
PDF súbory sa ukladajú vo formáte 7-bit ASCII alebo ako binárny súbor.  Pri posielaní PDF súborov cez e-mail niekedy dochádza k ich poškodeniu. Kvôli tomu sa odporúča ukladať súbory ako binárne.&lt;br /&gt;
&lt;br /&gt;
===Verzie PDF===&lt;br /&gt;
'''PDF 1.0'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V tejto verzii bolo povolené len kódovanie v 7-bit ASCII. Čiže aj binárne údaje sa museli kódovať do 7-bit ASCII. Riadok dokumentu nemohol obsahovať viac ako 255 znakov. Koniec riadku je definovaný znakmi &amp;lt;0D0A&amp;gt;.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.1'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Táto verzia vznikla v roku 1993.&lt;br /&gt;
Časom sa ukázalo, že kódovanie do 7-bit ASCII nie je najlepším riešením. Preto je už vo verzii PDF 1.1 povolené binárne kódovanie. Hlavnými dôvodmi, prečo boli nútení upustiť z tohto pravidla, sú:&lt;br /&gt;
*	Zmena/poškodenie súborov pri prenose.&lt;br /&gt;
*	Zväčšenie dokumentu aj o 20% pri kódovaní údajov s binárneho do ASCII kódovania.&lt;br /&gt;
Binárne údaje sa začali používať priamo v objektoch string, stream a aj v komentároch. Čo sa v praxi osvedčilo.&lt;br /&gt;
Ďalšie zmeny, ktoré boli uplatnené v PDF 1.1:&lt;br /&gt;
*	Novou verziou pribudla možnosť ochrany dokumentu pomocou hesla.&lt;br /&gt;
*	Ďalšou zmenou bolo zrušenie obmedzenia maximálneho počtu znakov v jednom riadku.&lt;br /&gt;
*	Možnosť poskytovať ďalšie informácie o dokumente.&lt;br /&gt;
*	Nový formát dátumu, ktorý umožňoval programové porovnávanie dátumov.&lt;br /&gt;
Štruktúra PDF 1.1 sa oproti PDF 1.0 nezmenila.  &lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Verzia PDF 1.2 vznikla v roku 1996.&lt;br /&gt;
Niektoré zmeny, ktoré boli uplatnené v PDF 1.2:&lt;br /&gt;
*	Interaktívne prvky ako prepínače a zaškrtávacie políčka.&lt;br /&gt;
*	Podpora pre prehrávanie filmov (z externých súborov) a zvukov (buď priamo zo súboru PDF, alebo z externých súborov).&lt;br /&gt;
*	Podpora pre čínske, kórejské, japonské texty.&lt;br /&gt;
&lt;br /&gt;
===Formát dokumentu PDF===&lt;br /&gt;
Štruktúra formátu sa skladá z nasledujúcich štyroch častí:&lt;br /&gt;
*	Popis objektov dokumentu&lt;br /&gt;
*	Popis štruktúry PDF súboru&lt;br /&gt;
*	Popis štruktúry dokumentu&lt;br /&gt;
*	Popis stránky&lt;br /&gt;
Súradnicový systém PDF formátu definuje plochu, na ktorú sa vykresľujú objekty. Určuje pozíciu, orientáciu a veľkosť objektu. Každé zariadenie, na ktorom je možné zobraziť PDF dokument, má svoj vlastný súradnicový systém, ktorý nám určuje plochu zariadenia – device space, na ktorom je vykreslený dokument.&lt;br /&gt;
Zobrazovaný PDF súbor nie je závislý na výstupnom  zariadení. Preto používa svoj vlastný súradnicový systém – user space. Pri zobrazovaní PDF dokumentu na výstupné zariadenie sú súradnice a rozmery objektov konvertované z user space do device space. K tomu sa využíva transformačná matica CTM (Current Transformation Matrix).&lt;br /&gt;
Štandardné zobrazovanie user space používa rozlíšenie 72 jednotiek (points) na palec. Kladný smer osi Y je orientovaný nahor a kladný smer osi X vpravo.&lt;br /&gt;
Text space-  je to oblasť kam je zobrazovaný text.  Character space definuje jednotlivé znaky fontu. Transformáciu s character space do text space je určená maticou character matrix. &lt;br /&gt;
Obrázky sú zobrazované v oblasti image space. Transformáciu z image space do user space je preddefinovaná a nedá sa zmeniť.                                                                                                                                        &amp;lt;br/&amp;gt;'''Transformácia súradníc'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V transformačnej matici je popísané zväčšenie, rotácia a posunutie objektov. Každá matica v PDF obsahuje šesť hodnôt. &lt;br /&gt;
*	Posunutie je definované [0,0,0,0,x,y], kde x,y sú súradnice určujúce vector posunutia&lt;br /&gt;
*	Pre zväčšenie objektu je matica nasledovná [x,0,0,y,0,0], kde x,y udávajú novú veľkosť jednotiek&lt;br /&gt;
*	Rotácia objektu [cos(theta), sin(theta), -sin(theta), cos(theta), 0, 0] je daná uhlom theta v protismere hodinových ručičiek&lt;br /&gt;
*	Zošikmenie je definované maticou  [1, tg(alpha), tg(beta), 1, 0, 0] os x je zošikmená o uhol alpha a os y o uhol beta.&lt;br /&gt;
Pokiaľ je použitých viac transformácií za sebou, tak nová transformácia je vykonaná v súradnicovom systéme z predošlej transformácie.&lt;br /&gt;
&lt;br /&gt;
====Popis objektov dokumentu====&lt;br /&gt;
Objekty podporované PDF sú podobné objektom PostScriptu. Sedem základných typov objektov, ktoré PDF využíva sú: boolean, number,  string, name, array, dictionary, stream a null (prázdny). Každý objekt môže byť pomenovaný, to nám potom umožňuje odkazovať sa naň z iných objektov. Pomenovaný objekt sa nazýva indirect object. V názvoch objektov sú rozlišované veľké a malé písmená.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Boolean'''&amp;lt;br/&amp;gt;                                                                                                                                  Obsahuje len hodnoty TRUE (pravda) a FALSE (nepravda)&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Number '''&amp;lt;br/&amp;gt;                                                                                                                                     Sú povolené len celé a desatinné čísla. Desatinné číslo musí obsahovať desatinnú čiarku. Iný spôsob zápisu nie je možný!&lt;br /&gt;
&amp;lt;br/&amp;gt;'''String'''&amp;lt;br/&amp;gt;&lt;br /&gt;
String (reťazec) je to n-tica prvkov danej množiny uzavretá v guľatých zátvorkách. Pokiaľ by reťazec svojou dĺžkou presahoval dĺžku riadku, je možné reťazec zalomiť spätným lomítkom ( \ ). Spätné lomítko nám slúži aj na výpis akéhokoľvek netlačitetelného znaku ecsape sekvencie v ASCII tabuľkách napr.: \), v tomto prípade nám zátvorka neukončuje reťazec, ale je súčasťou reťazca a bude vypísaná.&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
!Zápis&lt;br /&gt;
!Význam&lt;br /&gt;
|-&lt;br /&gt;
|\n&lt;br /&gt;
|koniec riadku&lt;br /&gt;
|-&lt;br /&gt;
|\r&lt;br /&gt;
|návrat na začiatok riadku &lt;br /&gt;
|-&lt;br /&gt;
|\t&lt;br /&gt;
|tabulátor&lt;br /&gt;
|-&lt;br /&gt;
|\b&lt;br /&gt;
|backspace&lt;br /&gt;
|-&lt;br /&gt;
|\f&lt;br /&gt;
|Form feed &lt;br /&gt;
|-&lt;br /&gt;
|\\&lt;br /&gt;
|spätné lomítko&lt;br /&gt;
|-&lt;br /&gt;
|\(&lt;br /&gt;
|začiatok guľatej zátvorky&lt;br /&gt;
|-&lt;br /&gt;
|\)&lt;br /&gt;
|koniec guľatej zátvorky &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
String je možné zapísať aj v hexadecimálnom tvare napr.: &amp;lt;6cd3&amp;gt;, je to reťazec obsahujúci dva hexadecimálne znaky z tabuľky ASCII a to 6c, d3. Všimnite si, že reťazce v tomto tvare nie sú v guľatých zátvorkách, ale v zobákových &amp;lt; &amp;gt; .&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 (toto je reťazec na jeden riadok)&lt;br /&gt;
 (toto je reťazec \&lt;br /&gt;
 zalomený \&lt;br /&gt;
 na viac riadkov)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Name'''&amp;lt;br/&amp;gt;                                                                                                                               &lt;br /&gt;
Name (meno)- je to n-tica prvkov danej množiny začínajúca lomítkom ( / ). Však na rozdiel od reťazca, má povolené len znaky, ktoré sa nachádzajú v ASCII tabuľke medzi hodnotami &amp;lt;21&amp;gt; &amp;lt;7e&amp;gt;, okrem  %, (, ), &amp;lt;, &amp;gt;, [, ], {, }, / a #.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 /Meno&lt;br /&gt;
 /Ďalšie_meno&lt;br /&gt;
&lt;br /&gt;
Od verzie PDF 1.2 môže meno obsahovať hexadecimálne hodnoty (okrem &amp;lt;00&amp;gt;), pred ktoré je umiestnený znak mriežky #. &lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
/tretie#20meno&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Array'''&amp;lt;br/&amp;gt;                                                                                                                                       &lt;br /&gt;
Array (pole)- je to sekvencia PDF objektov. Môže obsahovať viac objektov rôzneho typu. Pole je uzatvorené v zátvorkách [ ], v ktorých sa nachádza výpis objektov pola.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 [false (reťazec) /meno 432 (reťazec2)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Dictionary'''&amp;lt;br/&amp;gt;                                                                    &lt;br /&gt;
Dictionary (slovník) obsahuje tabuľku spárovaných objektov. Prvý objekt musí byť objekt typu name a nazýva sa key. Druhý objekt sa nazýva value a môže obsahovať akýkoľvek typ objektu dokonca aj dictionary.&lt;br /&gt;
Dictionary je uzavretý do dvojitých zobákových zátvoriek &amp;lt;&amp;lt; &amp;gt;&amp;gt;, v ktorých sú dvojice key-value. &lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt; &lt;br /&gt;
  &amp;lt;&amp;lt; /kľúč hodnota /key value /key1 34 &amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad dictionary obsahujúci ďalší objekt typu dictionary:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 /objednávka 0244003 &lt;br /&gt;
 /počet 2&lt;br /&gt;
 /info&lt;br /&gt;
 &amp;lt;&amp;lt;/typ (meno produktu) &lt;br /&gt;
 /farba (čierna) &amp;gt;&amp;gt;&lt;br /&gt;
 	&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Stream'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Stream (prúd) je totožný s objektom string, až na rozdiel prístupu k objektom. Nakoľko string sa číta celý naraz, ku streamu sa pristupuje po častiach. Preto sa objekt stream využíva na zapisovanie veľkého množstva údajov. Ako napríklad u obrázkov, kde je potrebné definovať viac parametrov pre správne zobrazenie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;stream&amp;gt;::=	&amp;lt;dictionary&amp;gt;&lt;br /&gt;
 		stream&lt;br /&gt;
 		{&amp;lt;riadok znakov&amp;gt;}*&lt;br /&gt;
 endstream&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; /Length 41 &amp;gt;&amp;gt;&lt;br /&gt;
 stream&lt;br /&gt;
 [/pole (v) (streame) 45]&lt;br /&gt;
 /object#20name&lt;br /&gt;
 (obyčajný reťazec)&lt;br /&gt;
  endstream&lt;br /&gt;
&lt;br /&gt;
Všetky stream objekty musia byť pomenované (indirect object). Dictionary objekty nemôžu byť pomenované (direct object).&lt;br /&gt;
&amp;lt;br/&amp;gt;Stream atribúty&amp;lt;br/&amp;gt;&lt;br /&gt;
Uvediem niekoľko atribútov objektu stream v tvare : kľúč (typ) opis atribútu.&lt;br /&gt;
&amp;lt;br/&amp;gt;Length (celočíselná hodnota) počet znakov, ktoré sa nachádzajú medzi identifikátormi stream a endstream. Atribút length je povinný.&lt;br /&gt;
&amp;lt;br/&amp;gt;Filter (meno alebo pole mien) nám poskytuje informácie o filtroch, ktoré majú byť použité pri čítaní streamu. Napr.: údaje kódované pomocou filtra LZW a potom ASCII base-85 sú dekódované filtrom: &lt;br /&gt;
/Filter [/ASCII85Decode /LZWDecode]&lt;br /&gt;
&amp;lt;br/&amp;gt;FFilter (meno alebo pole mien) definuje filter, ktorý sa použije na dekódovanie znakov z externého súboru.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Indirect object'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Indirect object (nepriami objekt). Každý objekt môže byť pomenovaný. Takýto objekt sa skladá z : identifikátoru objektu, priameho kľúča a identifikátora endobj. Identifikátor objektu sa skladá z object number (číslo objektu), generation number (generačného čísla) a kľúčového slova obj.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect object&amp;gt; ::=	&amp;lt;object ID&amp;gt;&lt;br /&gt;
 &amp;lt;direct object&amp;gt;&lt;br /&gt;
 endobj&lt;br /&gt;
 &amp;lt;object ID&amp;gt; ::= 	&amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 obj&lt;br /&gt;
Číslo objektu a generačné číslo objektu jednoznačne definuje nepriami objekt v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Odkazy na objekty'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý objekt ako je prvok poľa alebo hodnota v slovníku, môže byť definovaný priamo alebo pomocou nepriameho odkazu na objekt (indirect reference). Indirect reference sa skladá z čísla objektu (objec number), generačného čísla (generation number) a kľúčového slova R.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect reference&amp;gt;::=&lt;br /&gt;
 &amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 R&lt;br /&gt;
&lt;br /&gt;
====Popis štruktúry PDF súboru====&lt;br /&gt;
Základná štruktúra PDF súboru sa skladá z hlavičky head, ktorá obsahuje len jeden riadok, tela body, tabuľka krížových odkazov cross-reference table a päty trailer. &lt;br /&gt;
 &amp;lt;PDF file&amp;gt;::=&lt;br /&gt;
 &amp;lt;header&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference table&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Hlavička'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Hlavička sa nachádza len na prvom riadku PDF súboru. Začína znakom percento (%). Poskytuje informácie o použitej verzii. Keby sme chceli vytvoriť PDF súbor vo verzii PDF 1.1, hlavička by vyzerala takto:&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&lt;br /&gt;
 %PDF-1.1&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Telo'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Telo obsahuje postupnosť nepriamych objektov (fonty, stránky, obrázky...) reprezentujúcich dokument. Tieto objekty sú zo základných typov opisovaných v kapitole 4. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Komentáre'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Komentáre sa môžu nachádzať len v tele PDF súboru. Komentáre sa začínajú znakom percento (%) a končia sa na konci riadku. Môžu začínať na hociktorej pozícii riadku. &lt;br /&gt;
Pokiaľ sa znak percento (%) nachádza v objekte stream alebo string, nie je považovaný za začiatok komentára.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 %Toto bude v tele dokumentu považované za komentár&lt;br /&gt;
 (toto je reťazec STRING % pokračovanie reťazca)&lt;br /&gt;
 (aj toto je reťazec) % toto je už komentár&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Tabuľka krížových odkazov'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý PDF súbor obsahuje práve jednu tabuľku krížových odkazov. V nej sú popísané prístupy ku všetkým nepriamym objektom súboru. Každý takýto prístup je definovaný práve v jednom riadku tabuľky. &lt;br /&gt;
Tabuľka krížových odkazov sa rozdeľuje na sekcie. Novovytvorený PDF súbor obsahuje len jednu sekciu. Po každej úprave súboru sa počet sekcií zvýši o jednu. Sekcie sú usporiadané do jednej sekcie ako podsekcie, subsection.&lt;br /&gt;
Syntax pre tabuľku krížových odkazov je presne definovaná. Začína kľúčovým slovom xref  a za ním nasledujú podsekcie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference section&amp;gt;:==&lt;br /&gt;
 xref&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;+&lt;br /&gt;
&lt;br /&gt;
Syntax pre podsekcie je nasledovná. Na začiatku každej podsekcie sú uvedené dva parametre. Tým prvým je číslo prvého objektu v podsekcii, druhý parameter obsahuje počet objektov, ktoré sa v podsekcii nachádzajú.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;:==&lt;br /&gt;
 &amp;lt;číslo prvého objektu podsekcie&amp;gt;&lt;br /&gt;
 &amp;lt;počet objektov v podsekcii&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference entry&amp;gt;+&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov s jednoduchou podsekciou:&lt;br /&gt;
 xref&lt;br /&gt;
 0 6&lt;br /&gt;
 0000000003 65535 f&lt;br /&gt;
 0000000017 00000 n&lt;br /&gt;
 0000000081 00000 n&lt;br /&gt;
 0000000000 00007 f&lt;br /&gt;
 0000000331 00000 n&lt;br /&gt;
 0000000409 00000 n&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov so štyrmi podsekciami:&lt;br /&gt;
 xref&lt;br /&gt;
 0 1&lt;br /&gt;
 0000000000 65535 f&lt;br /&gt;
 3 1&lt;br /&gt;
 0000025325 00000 n&lt;br /&gt;
 23 2&lt;br /&gt;
 0000025518 00002 n&lt;br /&gt;
 0000025635 00000 n&lt;br /&gt;
 30 1&lt;br /&gt;
 0000025777 00000 n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Päta'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Päta - trailer je posledná časť súboru PDF. Slúži k rýchlemu nalezeniu tabuľky krížových odkazov a niektorých dôležitých objektov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Platí, že aplikácia by mala čítať PDF súbor od jeho konca. Posledný riadok PDF súboru obsahuje značku konca súboru: %%EOF. Dva predchádzajúce riadky obsahujú postupné kľúčové slová startxref a offset bytu od začiatku súboru ku kľúčovému slovu xref z poslednej sekcie tabuľky krížových odkazov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pred týmito riadkami je umiestnený trailer dictionary. Ten obsahuje kľúčové slovo trailer nasledované dvojicami kľúč - hodnota:&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt; ::= trailer&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 &amp;lt;trailer key-value pair&amp;gt;+&lt;br /&gt;
 &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prehľad hodnôt v trailer-dictionary&lt;br /&gt;
*	Size (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Celkový počet záznamov v tabuľke krížových odkazov. Počet zahŕňa všetky záznamy v dokumente - teda zo všetkých sekcií tabuľky.&lt;br /&gt;
*	Prev (len u súboru s viacerými sekciami tabuľky krížových odkazov)&amp;lt;br/&amp;gt;&lt;br /&gt;
Offset bytu od začiatku súboru k predchádzajúcej sekcii tabuľky.&lt;br /&gt;
*	Root (povinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na objekt katalóg.&lt;br /&gt;
*	Info (nepovinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na informácie o dokumente.&lt;br /&gt;
*	ID (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pole dvoch objektov string. Touto dvojicou je určená verzia dokumentu. Prvý string je založený pri vytvorení dokumentu, druhý je zmenený pri každej modifikácii dokumentu.&lt;br /&gt;
*	Encrypt (nepovinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pokiaľ je dokument zašifrovaný, obsahuje informácie pre jeho dešifrovanie.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2368</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2368"/>
		<updated>2010-02-24T09:51:31Z</updated>

		<summary type="html">&lt;p&gt;David: /* Realizácia exportu rozvrhu do PDF súboru */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
= =&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&amp;lt;br/&amp;gt;&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&amp;lt;br/&amp;gt;&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 for($i=1;$i&amp;lt;=5;$i++){&lt;br /&gt;
 $selectDay = $db-&amp;gt;select()&lt;br /&gt;
                 -&amp;gt;from(T_VIEW)&lt;br /&gt;
                 -&amp;gt;where('day = ?', $i)&lt;br /&gt;
                 -&amp;gt;order('hour ASC');&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['kruzok'])){&lt;br /&gt;
 $selectDay-&amp;gt;where('subclass = ' . $db-&amp;gt;quote($this-&amp;gt;myFilter['kruzok']).' OR (subclass IS NULL &lt;br /&gt;
 AND branch_num = ' . intval( $this-&amp;gt;myFilter['kruzok'][1]) . ' &lt;br /&gt;
 AND year = ' . intval( $this-&amp;gt;myFilter['kruzok'][2]) . ')');            &lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['miestnost'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('room_id = ?',$this-&amp;gt;myFilter['miestnost']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['ucitel'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('user_id = ?',$this-&amp;gt;myFilter['ucitel']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['predmet'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('subject_id = ?',$this-&amp;gt;myFilter['predmet']);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Do poľa $selectDay uložíme s tabuľky rozvrh_view všetky záznamy z jednotlivých dní. Postupne sa z tohto poľa filtrujú údaje podľa poľa $myFilter. Získané údaje sú ďalej spracovávané a pripravované na vypisovanie do PDF súboru. Štyri hlavné údaje sa usporiadajú podľa URL požiadavku.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ukážka jednej bunky z tabuľky rozvrhu:&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 2 Bunka tabuľky rozvrhu]]&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|+align=&amp;quot;top&amp;quot; style=&amp;quot;color:#000;&amp;quot;|''Tab. 2 Tabuľka kombinácií údajov''&lt;br /&gt;
!Priorita&lt;br /&gt;
!Filter&lt;br /&gt;
!Hlavný údaj&lt;br /&gt;
!Druhý údaj&lt;br /&gt;
!Tretí údaj&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|krúžok&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|učiteľ&lt;br /&gt;
|predmet&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|miestnosť&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|}&lt;br /&gt;
Príklad: ak URL obsahuje filtrovanie pre učiteľa a predmet tak hlavný údaj bude obsahovať predmet, druhý údaj bude obsahovať krúžok a tretí údaj miestnosť. Ďalšie údaje sú pre hociktorú variantu rovnaké. &lt;br /&gt;
Zoznam údajov:&lt;br /&gt;
*hlavný údaj&lt;br /&gt;
*druhý údaj&lt;br /&gt;
*tretí údaj&lt;br /&gt;
*dĺžka hodiny&lt;br /&gt;
*typ hodiny (prednášky, cvičenia alebo laboratórne cvičenia)&lt;br /&gt;
*farba políčka&lt;br /&gt;
*týždeň (párny, nepárny alebo každý týždeň)&lt;br /&gt;
*skratka hlavného údaju&lt;br /&gt;
*skratka druhého údaju&lt;br /&gt;
*začiatok hodiny&lt;br /&gt;
*údaje pre legendu číslo 1&lt;br /&gt;
*údaje pre legendu číslo 2&lt;br /&gt;
&lt;br /&gt;
Príklad jedného záznamu údajov:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 [0] =&amp;gt; string(32) &amp;quot;Logické a číslicové systémy&amp;quot;&lt;br /&gt;
 [1] =&amp;gt; string(7) &amp;quot;P. Fabo&amp;quot;&lt;br /&gt;
 [2] =&amp;gt; string(7) &amp;quot;Zlm 211&amp;quot;&lt;br /&gt;
 [3] =&amp;gt; string(1) &amp;quot;2&amp;quot;&lt;br /&gt;
 [4] =&amp;gt; string(1) &amp;quot;l&amp;quot;&lt;br /&gt;
 [5] =&amp;gt; string(7) &amp;quot;#EFD1D1&amp;quot;&lt;br /&gt;
 [6] =&amp;gt; string(1) &amp;quot;k&amp;quot;&lt;br /&gt;
 [9] =&amp;gt; string(4) &amp;quot;LČS&amp;quot;&lt;br /&gt;
 [10] =&amp;gt; string(5) &amp;quot;Peter&amp;quot;&lt;br /&gt;
 [11] =&amp;gt; string(2) &amp;quot;12&amp;quot;&lt;br /&gt;
 [12] =&amp;gt; string(27) &amp;quot;P. Fabo - Peter Fabo, RnDr.&amp;quot;&lt;br /&gt;
 [13] =&amp;gt; string(39) &amp;quot;LČS - Logické a číslicové systémy&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Takto upravené údaje ukladám do premennej $tabulka. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie hlavyčky'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalší krok je vykreslenie hlavičky PDF súboru. Najprv vykreslím logo našej fakulty potom vypíšem Trenčianska univerzita Alexandra Dubčeka v Trenčíne Fakulta Mechatroniky a nakoniec vykreslím oddeľovací pásik. Pod čiarou sa vykreslí filter s URL požiadaviek.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie tabuľky s rozvrhom'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Najprv som si vykreslil prázdnu tabuľku pomocou public function addEmptyTable($x1,$y1). Premenná $x1 a $y1 obsahuje polohu horného rohu tabuľky.&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 3 Prázdna tabuľka rozvrhu]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Potom pomocou opakovaného volania public function addRow($riadok,$x1,$y1) sa vykresľujú jednotlivé dni rozvrhu. Funkcia zabespečuje: &lt;br /&gt;
*správne zobrazovanie hodín párneho a nepárneho týždňa&lt;br /&gt;
*vyfarbuje bunky podľa typu hodiny&lt;br /&gt;
*počíta dĺžku danej bunky&lt;br /&gt;
*vypisuje údaje do bunky, ak je dĺžka názvu predmetu dlhšia ako dĺžka bunky tak sa vypíše skratka predmetu&lt;br /&gt;
*vyplňuje legendu podľa použitých skratiek&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 4 Vyplnená tabuľka]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie legendy'''&amp;lt;br/&amp;gt;&lt;br /&gt;
public function addCaption($y1) do prvého stĺpca vypíše legendu pre skratky učiteľov a do druhého vypíše legendu pre skratky predmetov. Do spodnej časti PDF súboru vypíše legendu farebného značenia buniek.&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 5 Legenda]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie päty dokumentu'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V päte súboru sú informácie o katedre ktorá zastrešuje celý projekt a o autorovi.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Popis PDF súboru'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Posledným krokom pred samotným odoslaním súboru na stiahnutie, je vyplnenie popisu. Sú vyplnené nasledovné údaje:&lt;br /&gt;
*titulok&lt;br /&gt;
*autor&lt;br /&gt;
*podrobnosti&lt;br /&gt;
*kľúčové slová&lt;br /&gt;
príklad: PDF súbor generovaný opisovanou aplikáciu by mohol vyzerať nasledovne&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 6 Ukážka PDF súboru]]&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
V práci bol popis PDF formátu ktorý následne používame ako formát pri exporte tabuľky rozvrhu a tlačových zostáv FM TnUAD. Po zadefinovaní rozloženia výstupnej zostavy rozvrhu som vytvoril PDF súbor s týmto návrhom. Pre generovanie PDF súboru som vytvoril triedu My_Pdf ktorá je potomkom triedy Zend_Pdf z frameworku ZEND. Celý projekt bol postavený na frameworku ZEND v jazyku PHP.&lt;br /&gt;
&amp;lt;br/&amp;gt;Práca bude pokračovať bakalárskou prácou kde budú rozšírené možnosti exportu o formát xlsx. Ďalšou úlohou bude vytvoriť štatistické reporty rozvrhu ako sú napr.: vyťaženie miestností, úväzky pedagógov a iné.&lt;br /&gt;
&lt;br /&gt;
=Bibliografia=&lt;br /&gt;
[1] wikipedia. www.wikipedia.org. www.sk.wikipedia.org. [Online] 27. 12 2009. [Dátum: 14. 1 2010.] http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t.&lt;br /&gt;
&amp;lt;br/&amp;gt;[2] abclinuxu.cz. www.abclinuxu.cz. [Online] 31. 03 2008. [Dátum: 18. 01 2010.] http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne.&lt;br /&gt;
&amp;lt;br/&amp;gt;[3] Adobe Systems Incorporated. Portable Document Format Reference Manual. s.l. : Adobe Systems Incorporated., 1996. ISBN 0–201–62628–4.&lt;br /&gt;
&amp;lt;br/&amp;gt;[4] Katedra informatiky a výpočetní techniky. www-kiv.zcu.cz. [Online] 08. 06 1999. [Dátum: 16. 01 2010.] http://www-kiv.zcu.cz/~herout/html_sbo/pdf/toc.htm.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2205</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2205"/>
		<updated>2010-02-17T13:23:50Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&amp;lt;br/&amp;gt;&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&amp;lt;br/&amp;gt;&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&amp;lt;br/&amp;gt;&lt;br /&gt;
 for($i=1;$i&amp;lt;=5;$i++){&lt;br /&gt;
 $selectDay = $db-&amp;gt;select()&lt;br /&gt;
                 -&amp;gt;from(T_VIEW)&lt;br /&gt;
                 -&amp;gt;where('day = ?', $i)&lt;br /&gt;
                 -&amp;gt;order('hour ASC');&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['kruzok'])){&lt;br /&gt;
 $selectDay-&amp;gt;where('subclass = ' . $db-&amp;gt;quote($this-&amp;gt;myFilter['kruzok']).' OR (subclass IS NULL &lt;br /&gt;
 AND branch_num = ' . intval( $this-&amp;gt;myFilter['kruzok'][1]) . ' &lt;br /&gt;
 AND year = ' . intval( $this-&amp;gt;myFilter['kruzok'][2]) . ')');            &lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['miestnost'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('room_id = ?',$this-&amp;gt;myFilter['miestnost']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['ucitel'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('user_id = ?',$this-&amp;gt;myFilter['ucitel']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['predmet'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('subject_id = ?',$this-&amp;gt;myFilter['predmet']);&lt;br /&gt;
 }&lt;br /&gt;
Do poľa $selectDay uložíme s tabuľky rozvrh_view všetky záznamy z jednotlivých dní. Postupne sa z tohto poľa filtrujú údaje podľa poľa $myFilter. Získané údaje sú ďalej spracovávané a pripravované na vypisovanie do PDF súboru. Štyri hlavné údaje sa usporiadajú podľa URL požiadavku.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ukážka jednej bunky z tabuľky rozvrhu:&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 2 Bunka tabuľky rozvrhu]]&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;top&amp;quot; style=&amp;quot;color:#000;&amp;quot;|''Tab. 2 Tabuľka kombinácií údajov''&lt;br /&gt;
!Priorita&lt;br /&gt;
!Filter&lt;br /&gt;
!Hlavný údaj&lt;br /&gt;
!Druhý údaj&lt;br /&gt;
!Tretí údaj&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|krúžok&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|učiteľ&lt;br /&gt;
|predmet&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|miestnosť&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|}&lt;br /&gt;
Príklad: ak URL obsahuje filtrovanie pre učiteľa a predmet tak hlavný údaj bude obsahovať predmet, druhý údaj bude obsahovať krúžok a tretí údaj miestnosť. Ďalšie údaje sú pre hociktorú variantu rovnaké. &lt;br /&gt;
Zoznam údajov:&lt;br /&gt;
*hlavný údaj&lt;br /&gt;
*druhý údaj&lt;br /&gt;
*tretí údaj&lt;br /&gt;
*dĺžka hodiny&lt;br /&gt;
*typ hodiny (prednášky, cvičenia alebo laboratórne cvičenia)&lt;br /&gt;
*farba políčka&lt;br /&gt;
*týždeň (párny, nepárny alebo každý týždeň)&lt;br /&gt;
*skratka hlavného údaju&lt;br /&gt;
*skratka druhého údaju&lt;br /&gt;
*začiatok hodiny&lt;br /&gt;
*údaje pre legendu číslo 1&lt;br /&gt;
*údaje pre legendu číslo 2&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad jedného záznamu údajov:&lt;br /&gt;
 [0] =&amp;gt; string(32) &amp;quot;Logické a číslicové systémy&amp;quot;&lt;br /&gt;
 [1] =&amp;gt; string(7) &amp;quot;P. Fabo&amp;quot;&lt;br /&gt;
 [2] =&amp;gt; string(7) &amp;quot;Zlm 211&amp;quot;&lt;br /&gt;
 [3] =&amp;gt; string(1) &amp;quot;2&amp;quot;&lt;br /&gt;
 [4] =&amp;gt; string(1) &amp;quot;l&amp;quot;&lt;br /&gt;
 [5] =&amp;gt; string(7) &amp;quot;#EFD1D1&amp;quot;&lt;br /&gt;
 [6] =&amp;gt; string(1) &amp;quot;k&amp;quot;&lt;br /&gt;
 [9] =&amp;gt; string(4) &amp;quot;LČS&amp;quot;&lt;br /&gt;
 [10] =&amp;gt; string(5) &amp;quot;Peter&amp;quot;&lt;br /&gt;
 [11] =&amp;gt; string(2) &amp;quot;12&amp;quot;&lt;br /&gt;
 [12] =&amp;gt; string(27) &amp;quot;P. Fabo - Peter Fabo, RnDr.&amp;quot;&lt;br /&gt;
 [13] =&amp;gt; string(39) &amp;quot;LČS - Logické a číslicové systémy&amp;quot;&lt;br /&gt;
Takto upravené údaje ukladám do premennej $tabulka. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie hlavyčky'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalší krok je vykreslenie hlavičky PDF súboru. Najprv vykreslím logo našej fakulty potom vypíšem Trenčianska univerzita Alexandra Dubčeka v Trenčíne Fakulta Mechatroniky a nakoniec vykreslím oddeľovací pásik. Pod čiarou sa vykreslí filter s URL požiadaviek.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie tabuľky s rozvrhom'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Najprv som si vykreslil prázdnu tabuľku pomocou public function addEmptyTable($x1,$y1). Premenná $x1 a $y1 obsahuje polohu horného rohu tabuľky.&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 3 Prázdna tabuľka rozvrhu]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Potom pomocou opakovaného volania public function addRow($riadok,$x1,$y1) sa vykresľujú jednotlivé dni rozvrhu. Funkcia zabespečuje: &lt;br /&gt;
*správne zobrazovanie hodín párneho a nepárneho týždňa&lt;br /&gt;
*vyfarbuje bunky podľa typu hodiny&lt;br /&gt;
*počíta dĺžku danej bunky&lt;br /&gt;
*vypisuje údaje do bunky, ak je dĺžka názvu predmetu dlhšia ako dĺžka bunky tak sa vypíše skratka predmetu&lt;br /&gt;
*vyplňuje legendu podľa použitých skratiek&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 4 Vyplnená tabuľka]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie legendy'''&amp;lt;br/&amp;gt;&lt;br /&gt;
public function addCaption($y1) do prvého stĺpca vypíše legendu pre skratky učiteľov a do druhého vypíše legendu pre skratky predmetov. Do spodnej časti PDF súboru vypíše legendu farebného značenia buniek.&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 5 Legenda]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie päty dokumentu'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V päte súboru sú informácie o katedre ktorá zastrešuje celý projekt a o autorovi.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Popis PDF súboru'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Posledným krokom pred samotným odoslaním súboru na stiahnutie, je vyplnenie popisu. Sú vyplnené nasledovné údaje:&lt;br /&gt;
*titulok&lt;br /&gt;
*autor&lt;br /&gt;
*podrobnosti&lt;br /&gt;
*kľúčové slová&lt;br /&gt;
príklad: PDF súbor generovaný opisovanou aplikáciu by mohol vyzerať nasledovne&lt;br /&gt;
[[Súbor:mpbc1.3.jpg|thumb|center|Obr. 6 Ukážka PDF súboru]]&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
V práci bol popis PDF formátu ktorý následne používame ako formát pri exporte tabuľky rozvrhu a tlačových zostáv FM TnUAD. Po zadefinovaní rozloženia výstupnej zostavy rozvrhu som vytvoril PDF súbor s týmto návrhom. Pre generovanie PDF súboru som vytvoril triedu My_Pdf ktorá je potomkom triedy Zend_Pdf z frameworku ZEND. Celý projekt bol postavený na frameworku ZEND v jazyku PHP.&lt;br /&gt;
&amp;lt;br/&amp;gt;Práca bude pokračovať bakalárskou prácou kde budú rozšírené možnosti exportu o formát xlsx. Ďalšou úlohou bude vytvoriť štatistické reporty rozvrhu ako sú napr.: vyťaženie miestností, úväzky pedagógov a iné.&lt;br /&gt;
&lt;br /&gt;
=Bibliografia=&lt;br /&gt;
[1] wikipedia. www.wikipedia.org. www.sk.wikipedia.org. [Online] 27. 12 2009. [Dátum: 14. 1 2010.] http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t.&lt;br /&gt;
&amp;lt;br/&amp;gt;[2] abclinuxu.cz. www.abclinuxu.cz. [Online] 31. 03 2008. [Dátum: 18. 01 2010.] http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne.&lt;br /&gt;
&amp;lt;br/&amp;gt;[3] Adobe Systems Incorporated. Portable Document Format Reference Manual. s.l. : Adobe Systems Incorporated., 1996. ISBN 0–201–62628–4.&lt;br /&gt;
&amp;lt;br/&amp;gt;[4] Katedra informatiky a výpočetní techniky. www-kiv.zcu.cz. [Online] 08. 06 1999. [Dátum: 16. 01 2010.] http://www-kiv.zcu.cz/~herout/html_sbo/pdf/toc.htm.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2204</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2204"/>
		<updated>2010-02-17T13:20:33Z</updated>

		<summary type="html">&lt;p&gt;David: /* Bibliografia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&amp;lt;br/&amp;gt;&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&amp;lt;br/&amp;gt;&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&amp;lt;br/&amp;gt;&lt;br /&gt;
 for($i=1;$i&amp;lt;=5;$i++){&lt;br /&gt;
 $selectDay = $db-&amp;gt;select()&lt;br /&gt;
                 -&amp;gt;from(T_VIEW)&lt;br /&gt;
                 -&amp;gt;where('day = ?', $i)&lt;br /&gt;
                 -&amp;gt;order('hour ASC');&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['kruzok'])){&lt;br /&gt;
 $selectDay-&amp;gt;where('subclass = ' . $db-&amp;gt;quote($this-&amp;gt;myFilter['kruzok']).' OR (subclass IS NULL &lt;br /&gt;
 AND branch_num = ' . intval( $this-&amp;gt;myFilter['kruzok'][1]) . ' &lt;br /&gt;
 AND year = ' . intval( $this-&amp;gt;myFilter['kruzok'][2]) . ')');            &lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['miestnost'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('room_id = ?',$this-&amp;gt;myFilter['miestnost']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['ucitel'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('user_id = ?',$this-&amp;gt;myFilter['ucitel']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['predmet'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('subject_id = ?',$this-&amp;gt;myFilter['predmet']);&lt;br /&gt;
 }&lt;br /&gt;
Do poľa $selectDay uložíme s tabuľky rozvrh_view všetky záznamy z jednotlivých dní. Postupne sa z tohto poľa filtrujú údaje podľa poľa $myFilter. Získané údaje sú ďalej spracovávané a pripravované na vypisovanie do PDF súboru. Štyri hlavné údaje sa usporiadajú podľa URL požiadavku.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ukážka jednej bunky z tabuľky rozvrhu:&lt;br /&gt;
[[Image:Example.jpg|Obr. 2 Bunka tabuľky rozvrhu]]&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;top&amp;quot; style=&amp;quot;color:#000;&amp;quot;|''Tab. 2 Tabuľka kombinácií údajov''&lt;br /&gt;
!Priorita&lt;br /&gt;
!Filter&lt;br /&gt;
!Hlavný údaj&lt;br /&gt;
!Druhý údaj&lt;br /&gt;
!Tretí údaj&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|krúžok&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|učiteľ&lt;br /&gt;
|predmet&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|miestnosť&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|}&lt;br /&gt;
Príklad: ak URL obsahuje filtrovanie pre učiteľa a predmet tak hlavný údaj bude obsahovať predmet, druhý údaj bude obsahovať krúžok a tretí údaj miestnosť. Ďalšie údaje sú pre hociktorú variantu rovnaké. &lt;br /&gt;
Zoznam údajov:&lt;br /&gt;
*hlavný údaj&lt;br /&gt;
*druhý údaj&lt;br /&gt;
*tretí údaj&lt;br /&gt;
*dĺžka hodiny&lt;br /&gt;
*typ hodiny (prednášky, cvičenia alebo laboratórne cvičenia)&lt;br /&gt;
*farba políčka&lt;br /&gt;
*týždeň (párny, nepárny alebo každý týždeň)&lt;br /&gt;
*skratka hlavného údaju&lt;br /&gt;
*skratka druhého údaju&lt;br /&gt;
*začiatok hodiny&lt;br /&gt;
*údaje pre legendu číslo 1&lt;br /&gt;
*údaje pre legendu číslo 2&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad jedného záznamu údajov:&lt;br /&gt;
 [0] =&amp;gt; string(32) &amp;quot;Logické a číslicové systémy&amp;quot;&lt;br /&gt;
 [1] =&amp;gt; string(7) &amp;quot;P. Fabo&amp;quot;&lt;br /&gt;
 [2] =&amp;gt; string(7) &amp;quot;Zlm 211&amp;quot;&lt;br /&gt;
 [3] =&amp;gt; string(1) &amp;quot;2&amp;quot;&lt;br /&gt;
 [4] =&amp;gt; string(1) &amp;quot;l&amp;quot;&lt;br /&gt;
 [5] =&amp;gt; string(7) &amp;quot;#EFD1D1&amp;quot;&lt;br /&gt;
 [6] =&amp;gt; string(1) &amp;quot;k&amp;quot;&lt;br /&gt;
 [9] =&amp;gt; string(4) &amp;quot;LČS&amp;quot;&lt;br /&gt;
 [10] =&amp;gt; string(5) &amp;quot;Peter&amp;quot;&lt;br /&gt;
 [11] =&amp;gt; string(2) &amp;quot;12&amp;quot;&lt;br /&gt;
 [12] =&amp;gt; string(27) &amp;quot;P. Fabo - Peter Fabo, RnDr.&amp;quot;&lt;br /&gt;
 [13] =&amp;gt; string(39) &amp;quot;LČS - Logické a číslicové systémy&amp;quot;&lt;br /&gt;
Takto upravené údaje ukladám do premennej $tabulka. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie hlavyčky'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalší krok je vykreslenie hlavičky PDF súboru. Najprv vykreslím logo našej fakulty potom vypíšem Trenčianska univerzita Alexandra Dubčeka v Trenčíne Fakulta Mechatroniky a nakoniec vykreslím oddeľovací pásik. Pod čiarou sa vykreslí filter s URL požiadaviek.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie tabuľky s rozvrhom'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Najprv som si vykreslil prázdnu tabuľku pomocou public function addEmptyTable($x1,$y1). Premenná $x1 a $y1 obsahuje polohu horného rohu tabuľky.&lt;br /&gt;
[[Image:Example.jpg|Obr. 3 Prázdna tabuľka rozvrhu]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Potom pomocou opakovaného volania public function addRow($riadok,$x1,$y1) sa vykresľujú jednotlivé dni rozvrhu. Funkcia zabespečuje: &lt;br /&gt;
*správne zobrazovanie hodín párneho a nepárneho týždňa&lt;br /&gt;
*vyfarbuje bunky podľa typu hodiny&lt;br /&gt;
*počíta dĺžku danej bunky&lt;br /&gt;
*vypisuje údaje do bunky, ak je dĺžka názvu predmetu dlhšia ako dĺžka bunky tak sa vypíše skratka predmetu&lt;br /&gt;
*vyplňuje legendu podľa použitých skratiek&lt;br /&gt;
[[Image:Example.jpg|Obr. 4 Vyplnená tabuľka]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie legendy'''&amp;lt;br/&amp;gt;&lt;br /&gt;
public function addCaption($y1) do prvého stĺpca vypíše legendu pre skratky učiteľov a do druhého vypíše legendu pre skratky predmetov. Do spodnej časti PDF súboru vypíše legendu farebného značenia buniek.&lt;br /&gt;
[[Image:Example.jpg|Obr. 5 Legenda]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie päty dokumentu'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V päte súboru sú informácie o katedre ktorá zastrešuje celý projekt a o autorovi.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Popis PDF súboru'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Posledným krokom pred samotným odoslaním súboru na stiahnutie, je vyplnenie popisu. Sú vyplnené nasledovné údaje:&lt;br /&gt;
*titulok&lt;br /&gt;
*autor&lt;br /&gt;
*podrobnosti&lt;br /&gt;
*kľúčové slová&lt;br /&gt;
príklad: PDF súbor generovaný opisovanou aplikáciu by mohol vyzerať nasledovne&lt;br /&gt;
[[Image:Example.jpg|Obr. 6 Ukážka PDF súboru]]&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
V práci bol popis PDF formátu ktorý následne používame ako formát pri exporte tabuľky rozvrhu a tlačových zostáv FM TnUAD. Po zadefinovaní rozloženia výstupnej zostavy rozvrhu som vytvoril PDF súbor s týmto návrhom. Pre generovanie PDF súboru som vytvoril triedu My_Pdf ktorá je potomkom triedy Zend_Pdf z frameworku ZEND. Celý projekt bol postavený na frameworku ZEND v jazyku PHP.&lt;br /&gt;
&amp;lt;br/&amp;gt;Práca bude pokračovať bakalárskou prácou kde budú rozšírené možnosti exportu o formát xlsx. Ďalšou úlohou bude vytvoriť štatistické reporty rozvrhu ako sú napr.: vyťaženie miestností, úväzky pedagógov a iné.&lt;br /&gt;
&lt;br /&gt;
=Bibliografia=&lt;br /&gt;
[1] wikipedia. www.wikipedia.org. www.sk.wikipedia.org. [Online] 27. 12 2009. [Dátum: 14. 1 2010.] http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t.&lt;br /&gt;
&amp;lt;br/&amp;gt;[2] abclinuxu.cz. www.abclinuxu.cz. [Online] 31. 03 2008. [Dátum: 18. 01 2010.] http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne.&lt;br /&gt;
&amp;lt;br/&amp;gt;[3] Adobe Systems Incorporated. Portable Document Format Reference Manual. s.l. : Adobe Systems Incorporated., 1996. ISBN 0–201–62628–4.&lt;br /&gt;
&amp;lt;br/&amp;gt;[4] Katedra informatiky a výpočetní techniky. www-kiv.zcu.cz. [Online] 08. 06 1999. [Dátum: 16. 01 2010.] http://www-kiv.zcu.cz/~herout/html_sbo/pdf/toc.htm.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2203</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2203"/>
		<updated>2010-02-17T13:19:35Z</updated>

		<summary type="html">&lt;p&gt;David: /* Záver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&amp;lt;br/&amp;gt;&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&amp;lt;br/&amp;gt;&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&amp;lt;br/&amp;gt;&lt;br /&gt;
 for($i=1;$i&amp;lt;=5;$i++){&lt;br /&gt;
 $selectDay = $db-&amp;gt;select()&lt;br /&gt;
                 -&amp;gt;from(T_VIEW)&lt;br /&gt;
                 -&amp;gt;where('day = ?', $i)&lt;br /&gt;
                 -&amp;gt;order('hour ASC');&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['kruzok'])){&lt;br /&gt;
 $selectDay-&amp;gt;where('subclass = ' . $db-&amp;gt;quote($this-&amp;gt;myFilter['kruzok']).' OR (subclass IS NULL &lt;br /&gt;
 AND branch_num = ' . intval( $this-&amp;gt;myFilter['kruzok'][1]) . ' &lt;br /&gt;
 AND year = ' . intval( $this-&amp;gt;myFilter['kruzok'][2]) . ')');            &lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['miestnost'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('room_id = ?',$this-&amp;gt;myFilter['miestnost']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['ucitel'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('user_id = ?',$this-&amp;gt;myFilter['ucitel']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['predmet'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('subject_id = ?',$this-&amp;gt;myFilter['predmet']);&lt;br /&gt;
 }&lt;br /&gt;
Do poľa $selectDay uložíme s tabuľky rozvrh_view všetky záznamy z jednotlivých dní. Postupne sa z tohto poľa filtrujú údaje podľa poľa $myFilter. Získané údaje sú ďalej spracovávané a pripravované na vypisovanie do PDF súboru. Štyri hlavné údaje sa usporiadajú podľa URL požiadavku.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ukážka jednej bunky z tabuľky rozvrhu:&lt;br /&gt;
[[Image:Example.jpg|Obr. 2 Bunka tabuľky rozvrhu]]&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;top&amp;quot; style=&amp;quot;color:#000;&amp;quot;|''Tab. 2 Tabuľka kombinácií údajov''&lt;br /&gt;
!Priorita&lt;br /&gt;
!Filter&lt;br /&gt;
!Hlavný údaj&lt;br /&gt;
!Druhý údaj&lt;br /&gt;
!Tretí údaj&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|krúžok&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|učiteľ&lt;br /&gt;
|predmet&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|miestnosť&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|}&lt;br /&gt;
Príklad: ak URL obsahuje filtrovanie pre učiteľa a predmet tak hlavný údaj bude obsahovať predmet, druhý údaj bude obsahovať krúžok a tretí údaj miestnosť. Ďalšie údaje sú pre hociktorú variantu rovnaké. &lt;br /&gt;
Zoznam údajov:&lt;br /&gt;
*hlavný údaj&lt;br /&gt;
*druhý údaj&lt;br /&gt;
*tretí údaj&lt;br /&gt;
*dĺžka hodiny&lt;br /&gt;
*typ hodiny (prednášky, cvičenia alebo laboratórne cvičenia)&lt;br /&gt;
*farba políčka&lt;br /&gt;
*týždeň (párny, nepárny alebo každý týždeň)&lt;br /&gt;
*skratka hlavného údaju&lt;br /&gt;
*skratka druhého údaju&lt;br /&gt;
*začiatok hodiny&lt;br /&gt;
*údaje pre legendu číslo 1&lt;br /&gt;
*údaje pre legendu číslo 2&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad jedného záznamu údajov:&lt;br /&gt;
 [0] =&amp;gt; string(32) &amp;quot;Logické a číslicové systémy&amp;quot;&lt;br /&gt;
 [1] =&amp;gt; string(7) &amp;quot;P. Fabo&amp;quot;&lt;br /&gt;
 [2] =&amp;gt; string(7) &amp;quot;Zlm 211&amp;quot;&lt;br /&gt;
 [3] =&amp;gt; string(1) &amp;quot;2&amp;quot;&lt;br /&gt;
 [4] =&amp;gt; string(1) &amp;quot;l&amp;quot;&lt;br /&gt;
 [5] =&amp;gt; string(7) &amp;quot;#EFD1D1&amp;quot;&lt;br /&gt;
 [6] =&amp;gt; string(1) &amp;quot;k&amp;quot;&lt;br /&gt;
 [9] =&amp;gt; string(4) &amp;quot;LČS&amp;quot;&lt;br /&gt;
 [10] =&amp;gt; string(5) &amp;quot;Peter&amp;quot;&lt;br /&gt;
 [11] =&amp;gt; string(2) &amp;quot;12&amp;quot;&lt;br /&gt;
 [12] =&amp;gt; string(27) &amp;quot;P. Fabo - Peter Fabo, RnDr.&amp;quot;&lt;br /&gt;
 [13] =&amp;gt; string(39) &amp;quot;LČS - Logické a číslicové systémy&amp;quot;&lt;br /&gt;
Takto upravené údaje ukladám do premennej $tabulka. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie hlavyčky'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalší krok je vykreslenie hlavičky PDF súboru. Najprv vykreslím logo našej fakulty potom vypíšem Trenčianska univerzita Alexandra Dubčeka v Trenčíne Fakulta Mechatroniky a nakoniec vykreslím oddeľovací pásik. Pod čiarou sa vykreslí filter s URL požiadaviek.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie tabuľky s rozvrhom'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Najprv som si vykreslil prázdnu tabuľku pomocou public function addEmptyTable($x1,$y1). Premenná $x1 a $y1 obsahuje polohu horného rohu tabuľky.&lt;br /&gt;
[[Image:Example.jpg|Obr. 3 Prázdna tabuľka rozvrhu]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Potom pomocou opakovaného volania public function addRow($riadok,$x1,$y1) sa vykresľujú jednotlivé dni rozvrhu. Funkcia zabespečuje: &lt;br /&gt;
*správne zobrazovanie hodín párneho a nepárneho týždňa&lt;br /&gt;
*vyfarbuje bunky podľa typu hodiny&lt;br /&gt;
*počíta dĺžku danej bunky&lt;br /&gt;
*vypisuje údaje do bunky, ak je dĺžka názvu predmetu dlhšia ako dĺžka bunky tak sa vypíše skratka predmetu&lt;br /&gt;
*vyplňuje legendu podľa použitých skratiek&lt;br /&gt;
[[Image:Example.jpg|Obr. 4 Vyplnená tabuľka]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie legendy'''&amp;lt;br/&amp;gt;&lt;br /&gt;
public function addCaption($y1) do prvého stĺpca vypíše legendu pre skratky učiteľov a do druhého vypíše legendu pre skratky predmetov. Do spodnej časti PDF súboru vypíše legendu farebného značenia buniek.&lt;br /&gt;
[[Image:Example.jpg|Obr. 5 Legenda]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie päty dokumentu'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V päte súboru sú informácie o katedre ktorá zastrešuje celý projekt a o autorovi.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Popis PDF súboru'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Posledným krokom pred samotným odoslaním súboru na stiahnutie, je vyplnenie popisu. Sú vyplnené nasledovné údaje:&lt;br /&gt;
*titulok&lt;br /&gt;
*autor&lt;br /&gt;
*podrobnosti&lt;br /&gt;
*kľúčové slová&lt;br /&gt;
príklad: PDF súbor generovaný opisovanou aplikáciu by mohol vyzerať nasledovne&lt;br /&gt;
[[Image:Example.jpg|Obr. 6 Ukážka PDF súboru]]&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
V práci bol popis PDF formátu ktorý následne používame ako formát pri exporte tabuľky rozvrhu a tlačových zostáv FM TnUAD. Po zadefinovaní rozloženia výstupnej zostavy rozvrhu som vytvoril PDF súbor s týmto návrhom. Pre generovanie PDF súboru som vytvoril triedu My_Pdf ktorá je potomkom triedy Zend_Pdf z frameworku ZEND. Celý projekt bol postavený na frameworku ZEND v jazyku PHP.&lt;br /&gt;
&amp;lt;br/&amp;gt;Práca bude pokračovať bakalárskou prácou kde budú rozšírené možnosti exportu o formát xlsx. Ďalšou úlohou bude vytvoriť štatistické reporty rozvrhu ako sú napr.: vyťaženie miestností, úväzky pedagógov a iné.&lt;br /&gt;
&lt;br /&gt;
=Bibliografia=&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2202</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2202"/>
		<updated>2010-02-17T13:18:31Z</updated>

		<summary type="html">&lt;p&gt;David: /* Realizácia exportu rozvrhu do PDF súboru */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&amp;lt;br/&amp;gt;&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&amp;lt;br/&amp;gt;&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&amp;lt;br/&amp;gt;&lt;br /&gt;
 for($i=1;$i&amp;lt;=5;$i++){&lt;br /&gt;
 $selectDay = $db-&amp;gt;select()&lt;br /&gt;
                 -&amp;gt;from(T_VIEW)&lt;br /&gt;
                 -&amp;gt;where('day = ?', $i)&lt;br /&gt;
                 -&amp;gt;order('hour ASC');&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['kruzok'])){&lt;br /&gt;
 $selectDay-&amp;gt;where('subclass = ' . $db-&amp;gt;quote($this-&amp;gt;myFilter['kruzok']).' OR (subclass IS NULL &lt;br /&gt;
 AND branch_num = ' . intval( $this-&amp;gt;myFilter['kruzok'][1]) . ' &lt;br /&gt;
 AND year = ' . intval( $this-&amp;gt;myFilter['kruzok'][2]) . ')');            &lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['miestnost'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('room_id = ?',$this-&amp;gt;myFilter['miestnost']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['ucitel'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('user_id = ?',$this-&amp;gt;myFilter['ucitel']);&lt;br /&gt;
 }&lt;br /&gt;
 if(isset($this-&amp;gt;myFilter['predmet'])){&lt;br /&gt;
   $selectDay-&amp;gt;where('subject_id = ?',$this-&amp;gt;myFilter['predmet']);&lt;br /&gt;
 }&lt;br /&gt;
Do poľa $selectDay uložíme s tabuľky rozvrh_view všetky záznamy z jednotlivých dní. Postupne sa z tohto poľa filtrujú údaje podľa poľa $myFilter. Získané údaje sú ďalej spracovávané a pripravované na vypisovanie do PDF súboru. Štyri hlavné údaje sa usporiadajú podľa URL požiadavku.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ukážka jednej bunky z tabuľky rozvrhu:&lt;br /&gt;
[[Image:Example.jpg|Obr. 2 Bunka tabuľky rozvrhu]]&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;top&amp;quot; style=&amp;quot;color:#000;&amp;quot;|''Tab. 2 Tabuľka kombinácií údajov''&lt;br /&gt;
!Priorita&lt;br /&gt;
!Filter&lt;br /&gt;
!Hlavný údaj&lt;br /&gt;
!Druhý údaj&lt;br /&gt;
!Tretí údaj&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|krúžok&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|učiteľ&lt;br /&gt;
|predmet&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|miestnosť&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|miestnosť&lt;br /&gt;
|predmet&lt;br /&gt;
|učiteľ&lt;br /&gt;
|krúžok&lt;br /&gt;
|}&lt;br /&gt;
Príklad: ak URL obsahuje filtrovanie pre učiteľa a predmet tak hlavný údaj bude obsahovať predmet, druhý údaj bude obsahovať krúžok a tretí údaj miestnosť. Ďalšie údaje sú pre hociktorú variantu rovnaké. &lt;br /&gt;
Zoznam údajov:&lt;br /&gt;
*hlavný údaj&lt;br /&gt;
*druhý údaj&lt;br /&gt;
*tretí údaj&lt;br /&gt;
*dĺžka hodiny&lt;br /&gt;
*typ hodiny (prednášky, cvičenia alebo laboratórne cvičenia)&lt;br /&gt;
*farba políčka&lt;br /&gt;
*týždeň (párny, nepárny alebo každý týždeň)&lt;br /&gt;
*skratka hlavného údaju&lt;br /&gt;
*skratka druhého údaju&lt;br /&gt;
*začiatok hodiny&lt;br /&gt;
*údaje pre legendu číslo 1&lt;br /&gt;
*údaje pre legendu číslo 2&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad jedného záznamu údajov:&lt;br /&gt;
 [0] =&amp;gt; string(32) &amp;quot;Logické a číslicové systémy&amp;quot;&lt;br /&gt;
 [1] =&amp;gt; string(7) &amp;quot;P. Fabo&amp;quot;&lt;br /&gt;
 [2] =&amp;gt; string(7) &amp;quot;Zlm 211&amp;quot;&lt;br /&gt;
 [3] =&amp;gt; string(1) &amp;quot;2&amp;quot;&lt;br /&gt;
 [4] =&amp;gt; string(1) &amp;quot;l&amp;quot;&lt;br /&gt;
 [5] =&amp;gt; string(7) &amp;quot;#EFD1D1&amp;quot;&lt;br /&gt;
 [6] =&amp;gt; string(1) &amp;quot;k&amp;quot;&lt;br /&gt;
 [9] =&amp;gt; string(4) &amp;quot;LČS&amp;quot;&lt;br /&gt;
 [10] =&amp;gt; string(5) &amp;quot;Peter&amp;quot;&lt;br /&gt;
 [11] =&amp;gt; string(2) &amp;quot;12&amp;quot;&lt;br /&gt;
 [12] =&amp;gt; string(27) &amp;quot;P. Fabo - Peter Fabo, RnDr.&amp;quot;&lt;br /&gt;
 [13] =&amp;gt; string(39) &amp;quot;LČS - Logické a číslicové systémy&amp;quot;&lt;br /&gt;
Takto upravené údaje ukladám do premennej $tabulka. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie hlavyčky'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Ďalší krok je vykreslenie hlavičky PDF súboru. Najprv vykreslím logo našej fakulty potom vypíšem Trenčianska univerzita Alexandra Dubčeka v Trenčíne Fakulta Mechatroniky a nakoniec vykreslím oddeľovací pásik. Pod čiarou sa vykreslí filter s URL požiadaviek.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vykresľovanie tabuľky s rozvrhom'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Najprv som si vykreslil prázdnu tabuľku pomocou public function addEmptyTable($x1,$y1). Premenná $x1 a $y1 obsahuje polohu horného rohu tabuľky.&lt;br /&gt;
[[Image:Example.jpg|Obr. 3 Prázdna tabuľka rozvrhu]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Potom pomocou opakovaného volania public function addRow($riadok,$x1,$y1) sa vykresľujú jednotlivé dni rozvrhu. Funkcia zabespečuje: &lt;br /&gt;
*správne zobrazovanie hodín párneho a nepárneho týždňa&lt;br /&gt;
*vyfarbuje bunky podľa typu hodiny&lt;br /&gt;
*počíta dĺžku danej bunky&lt;br /&gt;
*vypisuje údaje do bunky, ak je dĺžka názvu predmetu dlhšia ako dĺžka bunky tak sa vypíše skratka predmetu&lt;br /&gt;
*vyplňuje legendu podľa použitých skratiek&lt;br /&gt;
[[Image:Example.jpg|Obr. 4 Vyplnená tabuľka]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie legendy'''&amp;lt;br/&amp;gt;&lt;br /&gt;
public function addCaption($y1) do prvého stĺpca vypíše legendu pre skratky učiteľov a do druhého vypíše legendu pre skratky predmetov. Do spodnej časti PDF súboru vypíše legendu farebného značenia buniek.&lt;br /&gt;
[[Image:Example.jpg|Obr. 5 Legenda]]&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Vypísanie päty dokumentu'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V päte súboru sú informácie o katedre ktorá zastrešuje celý projekt a o autorovi.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Popis PDF súboru'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Posledným krokom pred samotným odoslaním súboru na stiahnutie, je vyplnenie popisu. Sú vyplnené nasledovné údaje:&lt;br /&gt;
*titulok&lt;br /&gt;
*autor&lt;br /&gt;
*podrobnosti&lt;br /&gt;
*kľúčové slová&lt;br /&gt;
príklad: PDF súbor generovaný opisovanou aplikáciu by mohol vyzerať nasledovne&lt;br /&gt;
[[Image:Example.jpg|Obr. 6 Ukážka PDF súboru]]&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
=Bibliografia=&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2201</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2201"/>
		<updated>2010-02-17T12:57:37Z</updated>

		<summary type="html">&lt;p&gt;David: /* Realizácia tlačových zostáv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
Celý projekt sme realizovali v programovacom jazyku PHP a s použitím ZEND frameworku. Čo je jedným s pravidiel na ktorých sme sa dohodli so študentmi čo pracujú na tomto projekte a s naším konzultantom. Ďalšie pravidlá boli:&lt;br /&gt;
*štruktúra databázových tabuliek&lt;br /&gt;
*formát URL pre filtrovanie rozvrhu&lt;br /&gt;
&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
Prvým krokom bolo spracovanie URL požiadavku na filtrovanie rozvrhu. &lt;br /&gt;
Príklad URL požiadavku:&lt;br /&gt;
 http://domena.sk/rozvrh/export/pdf/?kruzok=21302&amp;amp;ucitel=3&amp;amp;miestnost=30&amp;amp;predmet=2&lt;br /&gt;
v tomto prípade ma filter nasledovné hodnoty:&lt;br /&gt;
Krúžok je 21302. Hodnoty ucitel, miestnost a predmet obsahujú identifikačné číslo učiteľa, miestnosti a predmetu v databáze.&lt;br /&gt;
Funkcia public function getUrlData()mi do poľa public $myFilter uloží hodnoty z URL.&lt;br /&gt;
Ďalším krokom je samotné filtrovanie údajov z databázy.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
=Bibliografia=&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2200</id>
		<title>Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Tvorba_tla%C4%8Dov%C3%BDch_zost%C3%A1v_v_aplik%C3%A1cii_rozvrhu_FM_TnUAD&amp;diff=2200"/>
		<updated>2010-02-17T12:55:01Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Praca_uvod|2|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na projekte „rozvrh FM TnUAD“ pracujeme 3 študenti. Dušan Pagáč, Milan Porubský a ja. Preto sme sa museli dohodnúť na určitých štandardoch a pravidlách. Mojou úlohou bolo:&lt;br /&gt;
*generovanie tlačových zostáv&lt;br /&gt;
*štatistické reporty údajov&lt;br /&gt;
'''Generovanie tlačových zostáv'''&lt;br /&gt;
V našej aplikácii má používateľ dve možnosti tlačových zostáv&lt;br /&gt;
*export rozvrhu do PDF súboru&lt;br /&gt;
*export rozvrhu do formátu xlsx&lt;br /&gt;
'''Export rozvrhu do PDF súboru'''&lt;br /&gt;
PDF formát je v dnešnej dobe nepísaným štandardom pre archiváciu technických dokumentov. je to voľne šíriteľný formát čo je jedným z dôvodov prečo som sa rozhodol pravé pre tento formát.&lt;br /&gt;
'''Export rozvrhu do formátu xlsx'''&lt;br /&gt;
Ďalšia možnosť exportu dát je xlsx formát. Xlsx formát je tiež voľne šíriteľný a rozšírený medzi používateľmi. &lt;br /&gt;
&lt;br /&gt;
==Realizácia tlačových zostáv==&lt;br /&gt;
===Realizácia exportu rozvrhu do PDF súboru===&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
=Bibliografia=&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=1652</id>
		<title>Štatistický modul v systéme rozvrhu FM</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=1652"/>
		<updated>2010-01-29T12:44:47Z</updated>

		<summary type="html">&lt;p&gt;David: /* ODF (OpenDocument Format) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Dávid Ďurika|Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|1|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|a&lt;br /&gt;
|a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
V dnešnej dobe je mnoho formátov súborov. Niektoré sú voľne šíriteľné na iné sú chránené rôznymi licenciami. Súčasnosti je trend vytvárať a používať otvorené formáty súborov. Otvorený formát je taký ktorého špecifikácia je verejne prístupná. Medzi otvorené formáty dokumentov patria: PDF, OO XML, ODT. Medzi otvorené grafické formáty môžeme zaradiť napríklad gif, png, svg. V tejto práci sa bude opísaná štruktúra PDF formátu a niektoré vlastnosti tohto formátu. Vdruhej časti práce budú opísané tlačové zostavy použité v aplikácii rozvrhu FM TnUAD.&lt;br /&gt;
&lt;br /&gt;
=Otvorené formáty dokumentov=&lt;br /&gt;
Otvorený formát (otvorený štandard, angl.: open format) je publikovaná špecifikácia na uchovávanie digitálnych údajov, obvykle udržiavaná neproprietárnou štandardizačnou organizáciou a bez právnych obmedzení na používanie. Napríklad, otvorený formát musí byť implementovateľný aj proprietárnym aj open source softvérom, za použitia im typických licencií. Na rozdiel od otvorených formátov, proprietárne formáty sa riadia a definujú súkromnými záujmami. Otvorené formáty sú podmonožinou otvorených noriem. [http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t]&lt;br /&gt;
&lt;br /&gt;
==ODF (OpenDocument Format)==&lt;br /&gt;
XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) vytvorený pre kancelársky balík OpenOffice.org. Špecifikácia bola pôvodne vyvinutá firmou Sun, ale štandard bol vyvinutý v rámci OASIS (Organization for the Advancement of Structured Information Standards) a založení na XML formátu vytvorený a implementovaný pre balík OpenOffice.org. Formát je neznárodním štandardom (ISO/IEC 26300) od 30. novembra 2006. &lt;br /&gt;
Formát je podporovaný hlavne v balíku aplikácií OpenOffice.org, KOffice a StarOffice. Pre MS Office existuje konvertor. [http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne [2&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt; ]&lt;br /&gt;
&lt;br /&gt;
==OOXML (Office Open XML)==&lt;br /&gt;
Takisto XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) od firmy Microsoft. Formát je podporovaný v nových verziách sady aplikácií MS Office (2007, pre staršie verzie je k dispozícii konvertor) a tiež prevodným modulom pre OpenOffice.org od firmy Novell (funguje však len vo verziách OpenOffice.org v SUSE Linuxu a niektorých verziách (K)Ubuntu). Podporuje ho napríklad také NeoOffice, čo je ekvivalentom OpenOffice.org pre Mac OS X. [http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne]&lt;br /&gt;
==OpenOffice.org==&lt;br /&gt;
Je kancelársky balíček ktorý obsahuje:&lt;br /&gt;
*Textový editor Writer&lt;br /&gt;
*Tabuľkový procesor Calc&lt;br /&gt;
*Prezentační program Impress&lt;br /&gt;
*Nástroj pre kreslení Draw&lt;br /&gt;
*Databázový nástroj Base&lt;br /&gt;
je voľne šíriteľný slobodný softvér pod licenciou LGPL. Je funkčný pod akoukoľvek platformou operačného systému. A dokáže konkurovať kancelárskemu balíku od Microsoftu – MS Office.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Portable Document Format==&lt;br /&gt;
PDF (Portable Document Format) alebo prenosný formát dokumentu vyvinutý firmou Adobe. Súbor formátu PDF je možné vytvoriť viacerými spôsobmi. Napríklad pomocou aplikácií určených len na tento účel: PDF Creator, BullZip PDF Printer. Ďalším spôsobom je priame napísanie kódu PDF, ale táto metóda je v praxi nepoužiteľná kvôli svojej náročnosti. Posledný spôsob, ktorý spomeniem, je generovanie PDF dokumentov pomocou web aplikácií. Tento spôsob budem ďalej demonštrovať v kapitole Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD. K zobrazovaniu PDF dokumentov sú nutné špeciálne prehliadače. Jedným s najznámejších je Adobe Acrobat Reader. Je voľne dostupný na www.adobe.com. Najväčšou výhodou PDF formátu je jeho nezávislosť na platforme (PC, Mac, UNIX). Čo zaručí, že sa zobrazí rovnako na všetkých tipoch počítačov. Je to veľká výhoda oproti ostatným formátom, ktoré zobrazujú dokument inak na rôznych platformách. Ďalšou výhodou PDF formátu je možnosť definovať náhľad stránok, odkazy alebo záložky, čo umožňuje užívateľovi komfortnejšie prezeranie dokumentu. &lt;br /&gt;
PDF súbory sa ukladajú vo formáte 7-bit ASCII alebo ako binárny súbor.  Pri posielaní PDF súborov cez e-mail niekedy dochádza k ich poškodeniu. Kvôli tomu sa odporúča ukladať súbory ako binárne.&lt;br /&gt;
&lt;br /&gt;
===Verzie PDF===&lt;br /&gt;
'''PDF 1.0'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V tejto verzii bolo povolené len kódovanie v 7-bit ASCII. Čiže aj binárne údaje sa museli kódovať do 7-bit ASCII. Riadok dokumentu nemohol obsahovať viac ako 255 znakov. Koniec riadku je definovaný znakmi &amp;lt;0D0A&amp;gt;.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.1'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Táto verzia vznikla v roku 1993.&lt;br /&gt;
Časom sa ukázalo, že kódovanie do 7-bit ASCII nie je najlepším riešením. Preto je už vo verzii PDF 1.1 povolené binárne kódovanie. Hlavnými dôvodmi, prečo boli nútení upustiť z tohto pravidla, sú:&lt;br /&gt;
*	Zmena/poškodenie súborov pri prenose.&lt;br /&gt;
*	Zväčšenie dokumentu aj o 20% pri kódovaní údajov s binárneho do ASCII kódovania.&lt;br /&gt;
Binárne údaje sa začali používať priamo v objektoch string, stream a aj v komentároch. Čo sa v praxi osvedčilo.&lt;br /&gt;
Ďalšie zmeny, ktoré boli uplatnené v PDF 1.1:&lt;br /&gt;
*	Novou verziou pribudla možnosť ochrany dokumentu pomocou hesla.&lt;br /&gt;
*	Ďalšou zmenou bolo zrušenie obmedzenia maximálneho počtu znakov v jednom riadku.&lt;br /&gt;
*	Možnosť poskytovať ďalšie informácie o dokumente.&lt;br /&gt;
*	Nový formát dátumu, ktorý umožňoval programové porovnávanie dátumov.&lt;br /&gt;
Štruktúra PDF 1.1 sa oproti PDF 1.0 nezmenila.  &lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Verzia PDF 1.2 vznikla v roku 1996.&lt;br /&gt;
Niektoré zmeny, ktoré boli uplatnené v PDF 1.2:&lt;br /&gt;
*	Interaktívne prvky ako prepínače a zaškrtávacie políčka.&lt;br /&gt;
*	Podpora pre prehrávanie filmov (z externých súborov) a zvukov (buď priamo zo súboru PDF, alebo z externých súborov).&lt;br /&gt;
*	Podpora pre čínske, kórejské, japonské texty.&lt;br /&gt;
&lt;br /&gt;
===Formát dokumentu PDF===&lt;br /&gt;
Štruktúra formátu sa skladá z nasledujúcich štyroch častí:&lt;br /&gt;
*	Popis objektov dokumentu&lt;br /&gt;
*	Popis štruktúry PDF súboru&lt;br /&gt;
*	Popis štruktúry dokumentu&lt;br /&gt;
*	Popis stránky&lt;br /&gt;
Súradnicový systém PDF formátu definuje plochu, na ktorú sa vykresľujú objekty. Určuje pozíciu, orientáciu a veľkosť objektu. Každé zariadenie, na ktorom je možné zobraziť PDF dokument, má svoj vlastný súradnicový systém, ktorý nám určuje plochu zariadenia – device space, na ktorom je vykreslený dokument.&lt;br /&gt;
Zobrazovaný PDF súbor nie je závislý na výstupnom  zariadení. Preto používa svoj vlastný súradnicový systém – user space. Pri zobrazovaní PDF dokumentu na výstupné zariadenie sú súradnice a rozmery objektov konvertované z user space do device space. K tomu sa využíva transformačná matica CTM (Current Transformation Matrix).&lt;br /&gt;
Štandardné zobrazovanie user space používa rozlíšenie 72 jednotiek (points) na palec. Kladný smer osi Y je orientovaný nahor a kladný smer osi X vpravo.&lt;br /&gt;
Text space-  je to oblasť kam je zobrazovaný text.  Character space definuje jednotlivé znaky fontu. Transformáciu s character space do text space je určená maticou character matrix. &lt;br /&gt;
Obrázky sú zobrazované v oblasti image space. Transformáciu z image space do user space je preddefinovaná a nedá sa zmeniť.                                                                                                                                        &amp;lt;br/&amp;gt;'''Transformácia súradníc'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V transformačnej matici je popísané zväčšenie, rotácia a posunutie objektov. Každá matica v PDF obsahuje šesť hodnôt. &lt;br /&gt;
*	Posunutie je definované [0,0,0,0,x,y], kde x,y sú súradnice určujúce vector posunutia&lt;br /&gt;
*	Pre zväčšenie objektu je matica nasledovná [x,0,0,y,0,0], kde x,y udávajú novú veľkosť jednotiek&lt;br /&gt;
*	Rotácia objektu [cos(theta), sin(theta), -sin(theta), cos(theta), 0, 0] je daná uhlom theta v protismere hodinových ručičiek&lt;br /&gt;
*	Zošikmenie je definované maticou  [1, tg(alpha), tg(beta), 1, 0, 0] os x je zošikmená o uhol alpha a os y o uhol beta.&lt;br /&gt;
Pokiaľ je použitých viac transformácií za sebou, tak nová transformácia je vykonaná v súradnicovom systéme z predošlej transformácie.&lt;br /&gt;
&lt;br /&gt;
====Popis objektov dokumentu====&lt;br /&gt;
Objekty podporované PDF sú podobné objektom PostScriptu. Sedem základných typov objektov, ktoré PDF využíva sú: boolean, number,  string, name, array, dictionary, stream a null (prázdny). Každý objekt môže byť pomenovaný, to nám potom umožňuje odkazovať sa naň z iných objektov. Pomenovaný objekt sa nazýva indirect object. V názvoch objektov sú rozlišované veľké a malé písmená.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Boolean'''&amp;lt;br/&amp;gt;                                                                                                                                  Obsahuje len hodnoty TRUE (pravda) a FALSE (nepravda)&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Number '''&amp;lt;br/&amp;gt;                                                                                                                                     Sú povolené len celé a desatinné čísla. Desatinné číslo musí obsahovať desatinnú čiarku. Iný spôsob zápisu nie je možný!&lt;br /&gt;
&amp;lt;br/&amp;gt;'''String'''&amp;lt;br/&amp;gt;&lt;br /&gt;
String (reťazec) je to n-tica prvkov danej množiny uzavretá v guľatých zátvorkách. Pokiaľ by reťazec svojou dĺžkou presahoval dĺžku riadku, je možné reťazec zalomiť spätným lomítkom ( \ ). Spätné lomítko nám slúži aj na výpis akéhokoľvek netlačitetelného znaku ecsape sekvencie v ASCII tabuľkách napr.: \), v tomto prípade nám zátvorka neukončuje reťazec, ale je súčasťou reťazca a bude vypísaná.&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Zápis&lt;br /&gt;
!Význam&lt;br /&gt;
|-&lt;br /&gt;
|\n&lt;br /&gt;
|koniec riadku&lt;br /&gt;
|-&lt;br /&gt;
|\r&lt;br /&gt;
|návrat na začiatok riadku &lt;br /&gt;
|-&lt;br /&gt;
|\t&lt;br /&gt;
|tabulátor&lt;br /&gt;
|-&lt;br /&gt;
|\b&lt;br /&gt;
|backspace&lt;br /&gt;
|-&lt;br /&gt;
|\f&lt;br /&gt;
|Form feed &lt;br /&gt;
|-&lt;br /&gt;
|\\&lt;br /&gt;
|spätné lomítko&lt;br /&gt;
|-&lt;br /&gt;
|\(&lt;br /&gt;
|začiatok guľatej zátvorky&lt;br /&gt;
|-&lt;br /&gt;
|\)&lt;br /&gt;
|koniec guľatej zátvorky &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
String je možné zapísať aj v hexadecimálnom tvare napr.: &amp;lt;6cd3&amp;gt;, je to reťazec obsahujúci dva hexadecimálne znaky z tabuľky ASCII a to 6c, d3. Všimnite si, že reťazce v tomto tvare nie sú v guľatých zátvorkách, ale v zobákových &amp;lt; &amp;gt; .&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 (toto je reťazec na jeden riadok)&lt;br /&gt;
 (toto je reťazec \&lt;br /&gt;
 zalomený \&lt;br /&gt;
 na viac riadkov)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Name'''&amp;lt;br/&amp;gt;                                                                                                                               &lt;br /&gt;
Name (meno)- je to n-tica prvkov danej množiny začínajúca lomítkom ( / ). Však na rozdiel od reťazca, má povolené len znaky, ktoré sa nachádzajú v ASCII tabuľke medzi hodnotami &amp;lt;21&amp;gt; &amp;lt;7e&amp;gt;, okrem  %, (, ), &amp;lt;, &amp;gt;, [, ], {, }, / a #.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 /Meno&lt;br /&gt;
 /Ďalšie_meno&lt;br /&gt;
&lt;br /&gt;
Od verzie PDF 1.2 môže meno obsahovať hexadecimálne hodnoty (okrem &amp;lt;00&amp;gt;), pred ktoré je umiestnený znak mriežky #. &lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
/tretie#20meno&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Array'''&amp;lt;br/&amp;gt;                                                                                                                                       &lt;br /&gt;
Array (pole)- je to sekvencia PDF objektov. Môže obsahovať viac objektov rôzneho typu. Pole je uzatvorené v zátvorkách [ ], v ktorých sa nachádza výpis objektov pola.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 [false (reťazec) /meno 432 (reťazec2)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Dictionary'''&amp;lt;br/&amp;gt;                                                                    &lt;br /&gt;
Dictionary (slovník) obsahuje tabuľku spárovaných objektov. Prvý objekt musí byť objekt typu name a nazýva sa key. Druhý objekt sa nazýva value a môže obsahovať akýkoľvek typ objektu dokonca aj dictionary.&lt;br /&gt;
Dictionary je uzavretý do dvojitých zobákových zátvoriek &amp;lt;&amp;lt; &amp;gt;&amp;gt;, v ktorých sú dvojice key-value. &lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt; &lt;br /&gt;
  &amp;lt;&amp;lt; /kľúč hodnota /key value /key1 34 &amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad dictionary obsahujúci ďalší objekt typu dictionary:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 /objednávka 0244003 &lt;br /&gt;
 /počet 2&lt;br /&gt;
 /info&lt;br /&gt;
 &amp;lt;&amp;lt;/typ (meno produktu) &lt;br /&gt;
 /farba (čierna) &amp;gt;&amp;gt;&lt;br /&gt;
 	&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Stream'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Stream (prúd) je totožný s objektom string, až na rozdiel prístupu k objektom. Nakoľko string sa číta celý naraz, ku streamu sa pristupuje po častiach. Preto sa objekt stream využíva na zapisovanie veľkého množstva údajov. Ako napríklad u obrázkov, kde je potrebné definovať viac parametrov pre správne zobrazenie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;stream&amp;gt;::=	&amp;lt;dictionary&amp;gt;&lt;br /&gt;
 		stream&lt;br /&gt;
 		{&amp;lt;riadok znakov&amp;gt;}*&lt;br /&gt;
 endstream&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; /Length 41 &amp;gt;&amp;gt;&lt;br /&gt;
 stream&lt;br /&gt;
 [/pole (v) (streame) 45]&lt;br /&gt;
 /object#20name&lt;br /&gt;
 (obyčajný reťazec)&lt;br /&gt;
  endstream&lt;br /&gt;
&lt;br /&gt;
Všetky stream objekty musia byť pomenované (indirect object). Dictionary objekty nemôžu byť pomenované (direct object).&lt;br /&gt;
&amp;lt;br/&amp;gt;Stream atribúty&amp;lt;br/&amp;gt;&lt;br /&gt;
Uvediem niekoľko atribútov objektu stream v tvare : kľúč (typ) opis atribútu.&lt;br /&gt;
&amp;lt;br/&amp;gt;Length (celočíselná hodnota) počet znakov, ktoré sa nachádzajú medzi identifikátormi stream a endstream. Atribút length je povinný.&lt;br /&gt;
&amp;lt;br/&amp;gt;Filter (meno alebo pole mien) nám poskytuje informácie o filtroch, ktoré majú byť použité pri čítaní streamu. Napr.: údaje kódované pomocou filtra LZW a potom ASCII base-85 sú dekódované filtrom: &lt;br /&gt;
/Filter [/ASCII85Decode /LZWDecode]&lt;br /&gt;
&amp;lt;br/&amp;gt;FFilter (meno alebo pole mien) definuje filter, ktorý sa použije na dekódovanie znakov z externého súboru.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Indirect object'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Indirect object (nepriami objekt). Každý objekt môže byť pomenovaný. Takýto objekt sa skladá z : identifikátoru objektu, priameho kľúča a identifikátora endobj. Identifikátor objektu sa skladá z object number (číslo objektu), generation number (generačného čísla) a kľúčového slova obj.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect object&amp;gt; ::=	&amp;lt;object ID&amp;gt;&lt;br /&gt;
 &amp;lt;direct object&amp;gt;&lt;br /&gt;
 endobj&lt;br /&gt;
 &amp;lt;object ID&amp;gt; ::= 	&amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 obj&lt;br /&gt;
Číslo objektu a generačné číslo objektu jednoznačne definuje nepriami objekt v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Odkazy na objekty'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý objekt ako je prvok poľa alebo hodnota v slovníku, môže byť definovaný priamo alebo pomocou nepriameho odkazu na objekt (indirect reference). Indirect reference sa skladá z čísla objektu (objec number), generačného čísla (generation number) a kľúčového slova R.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect reference&amp;gt;::=&lt;br /&gt;
 &amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 R&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Popis štruktúry PDF súboru====&lt;br /&gt;
Základná štruktúra PDF súboru sa skladá z hlavičky head, ktorá obsahuje len jeden riadok, tela body, tabuľka krížových odkazov cross-reference table a päty trailer. &lt;br /&gt;
 &amp;lt;PDF file&amp;gt;::=&lt;br /&gt;
 &amp;lt;header&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference table&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Hlavička'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Hlavička sa nachádza len na prvom riadku PDF súboru. Začína znakom percento (%). Poskytuje informácie o použitej verzii. Keby sme chceli vytvoriť PDF súbor vo verzii PDF 1.1, hlavička by vyzerala takto:&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&lt;br /&gt;
 %PDF-1.1&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Telo'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Telo obsahuje postupnosť nepriamych objektov (fonty, stránky, obrázky...) reprezentujúcich dokument. Tieto objekty sú zo základných typov opisovaných v kapitole 4. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Komentáre'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Komentáre sa môžu nachádzať len v tele PDF súboru. Komentáre sa začínajú znakom percento (%) a končia sa na konci riadku. Môžu začínať na hociktorej pozícii riadku. &lt;br /&gt;
Pokiaľ sa znak percento (%) nachádza v objekte stream alebo string, nie je považovaný za začiatok komentára.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 %Toto bude v tele dokumentu považované za komentár&lt;br /&gt;
 (toto je reťazec STRING % pokračovanie reťazca)&lt;br /&gt;
 (aj toto je reťazec) % toto je už komentár&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Tabuľka krížových odkazov'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý PDF súbor obsahuje práve jednu tabuľku krížových odkazov. V nej sú popísané prístupy ku všetkým nepriamym objektom súboru. Každý takýto prístup je definovaný práve v jednom riadku tabuľky. &lt;br /&gt;
Tabuľka krížových odkazov sa rozdeľuje na sekcie. Novovytvorený PDF súbor obsahuje len jednu sekciu. Po každej úprave súboru sa počet sekcií zvýši o jednu. Sekcie sú usporiadané do jednej sekcie ako podsekcie, subsection.&lt;br /&gt;
Syntax pre tabuľku krížových odkazov je presne definovaná. Začína kľúčovým slovom xref  a za ním nasledujú podsekcie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference section&amp;gt;:==&lt;br /&gt;
 xref&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;+&lt;br /&gt;
&lt;br /&gt;
Syntax pre podsekcie je nasledovná. Na začiatku každej podsekcie sú uvedené dva parametre. Tým prvým je číslo prvého objektu v podsekcii, druhý parameter obsahuje počet objektov, ktoré sa v podsekcii nachádzajú.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;:==&lt;br /&gt;
 &amp;lt;číslo prvého objektu podsekcie&amp;gt;&lt;br /&gt;
 &amp;lt;počet objektov v podsekcii&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference entry&amp;gt;+&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov s jednoduchou podsekciou:&lt;br /&gt;
 xref&lt;br /&gt;
 0 6&lt;br /&gt;
 0000000003 65535 f&lt;br /&gt;
 0000000017 00000 n&lt;br /&gt;
 0000000081 00000 n&lt;br /&gt;
 0000000000 00007 f&lt;br /&gt;
 0000000331 00000 n&lt;br /&gt;
 0000000409 00000 n&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov so štyrmi podsekciami:&lt;br /&gt;
 xref&lt;br /&gt;
 0 1&lt;br /&gt;
 0000000000 65535 f&lt;br /&gt;
 3 1&lt;br /&gt;
 0000025325 00000 n&lt;br /&gt;
 23 2&lt;br /&gt;
 0000025518 00002 n&lt;br /&gt;
 0000025635 00000 n&lt;br /&gt;
 30 1&lt;br /&gt;
 0000025777 00000 n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Päta'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Päta - trailer je posledná časť súboru PDF. Slúži k rýchlemu nalezeniu tabuľky krížových odkazov a niektorých dôležitých objektov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Platí, že aplikácia by mala čítať PDF súbor od jeho konca. Posledný riadok PDF súboru obsahuje značku konca súboru: %%EOF. Dva predchádzajúce riadky obsahujú postupné kľúčové slová startxref a offset bytu od začiatku súboru ku kľúčovému slovu xref z poslednej sekcie tabuľky krížových odkazov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pred týmito riadkami je umiestnený trailer dictionary. Ten obsahuje kľúčové slovo trailer nasledované dvojicami kľúč - hodnota:&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt; ::= trailer&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 &amp;lt;trailer key-value pair&amp;gt;+&lt;br /&gt;
 &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prehľad hodnôt v trailer-dictionary&lt;br /&gt;
*	Size (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Celkový počet záznamov v tabuľke krížových odkazov. Počet zahŕňa všetky záznamy v dokumente - teda zo všetkých sekcií tabuľky.&lt;br /&gt;
*	Prev (len u súboru s viacerými sekciami tabuľky krížových odkazov)&amp;lt;br/&amp;gt;&lt;br /&gt;
Offset bytu od začiatku súboru k predchádzajúcej sekcii tabuľky.&lt;br /&gt;
*	Root (povinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na objekt katalóg.&lt;br /&gt;
*	Info (nepovinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na informácie o dokumente.&lt;br /&gt;
*	ID (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pole dvoch objektov string. Touto dvojicou je určená verzia dokumentu. Prvý string je založený pri vytvorení dokumentu, druhý je zmenený pri každej modifikácii dokumentu.&lt;br /&gt;
*	Encrypt (nepovinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pokiaľ je dokument zašifrovaný, obsahuje informácie pre jeho dešifrovanie.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=1651</id>
		<title>Štatistický modul v systéme rozvrhu FM</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=1651"/>
		<updated>2010-01-29T12:44:10Z</updated>

		<summary type="html">&lt;p&gt;David: /* Otvorené formáty dokumentov */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Dávid Ďurika|Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|1|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|a&lt;br /&gt;
|a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
V dnešnej dobe je mnoho formátov súborov. Niektoré sú voľne šíriteľné na iné sú chránené rôznymi licenciami. Súčasnosti je trend vytvárať a používať otvorené formáty súborov. Otvorený formát je taký ktorého špecifikácia je verejne prístupná. Medzi otvorené formáty dokumentov patria: PDF, OO XML, ODT. Medzi otvorené grafické formáty môžeme zaradiť napríklad gif, png, svg. V tejto práci sa bude opísaná štruktúra PDF formátu a niektoré vlastnosti tohto formátu. Vdruhej časti práce budú opísané tlačové zostavy použité v aplikácii rozvrhu FM TnUAD.&lt;br /&gt;
&lt;br /&gt;
=Otvorené formáty dokumentov=&lt;br /&gt;
Otvorený formát (otvorený štandard, angl.: open format) je publikovaná špecifikácia na uchovávanie digitálnych údajov, obvykle udržiavaná neproprietárnou štandardizačnou organizáciou a bez právnych obmedzení na používanie. Napríklad, otvorený formát musí byť implementovateľný aj proprietárnym aj open source softvérom, za použitia im typických licencií. Na rozdiel od otvorených formátov, proprietárne formáty sa riadia a definujú súkromnými záujmami. Otvorené formáty sú podmonožinou otvorených noriem. [http://sk.wikipedia.org/wiki/Otvoren%C3%BD_form%C3%A1t]&lt;br /&gt;
&lt;br /&gt;
==ODF (OpenDocument Format)==&lt;br /&gt;
XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) vytvorený pre kancelársky balík OpenOffice.org. Špecifikácia bola pôvodne vyvinutá firmou Sun, ale štandard bol vyvinutý v rámci OASIS (Organization for the Advancement of Structured Information Standards) a založení na XML formátu vytvorený a implementovaný pre balík OpenOffice.org. Formát je neznárodním štandardom (ISO/IEC 26300) od 30. novembra 2006. &lt;br /&gt;
Formát je podporovaný hlavne v balíku aplikácií OpenOffice.org, KOffice a StarOffice. Pre MS Office existuje konvertor. [http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne [2]&lt;br /&gt;
&lt;br /&gt;
==OOXML (Office Open XML)==&lt;br /&gt;
Takisto XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) od firmy Microsoft. Formát je podporovaný v nových verziách sady aplikácií MS Office (2007, pre staršie verzie je k dispozícii konvertor) a tiež prevodným modulom pre OpenOffice.org od firmy Novell (funguje však len vo verziách OpenOffice.org v SUSE Linuxu a niektorých verziách (K)Ubuntu). Podporuje ho napríklad také NeoOffice, čo je ekvivalentom OpenOffice.org pre Mac OS X. [http://www.abclinuxu.cz/clanky/rozhovory/rozhovor-jiri-kosek-o-ooxml-odf-a-formatech-obecne]&lt;br /&gt;
==OpenOffice.org==&lt;br /&gt;
Je kancelársky balíček ktorý obsahuje:&lt;br /&gt;
*Textový editor Writer&lt;br /&gt;
*Tabuľkový procesor Calc&lt;br /&gt;
*Prezentační program Impress&lt;br /&gt;
*Nástroj pre kreslení Draw&lt;br /&gt;
*Databázový nástroj Base&lt;br /&gt;
je voľne šíriteľný slobodný softvér pod licenciou LGPL. Je funkčný pod akoukoľvek platformou operačného systému. A dokáže konkurovať kancelárskemu balíku od Microsoftu – MS Office.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Portable Document Format==&lt;br /&gt;
PDF (Portable Document Format) alebo prenosný formát dokumentu vyvinutý firmou Adobe. Súbor formátu PDF je možné vytvoriť viacerými spôsobmi. Napríklad pomocou aplikácií určených len na tento účel: PDF Creator, BullZip PDF Printer. Ďalším spôsobom je priame napísanie kódu PDF, ale táto metóda je v praxi nepoužiteľná kvôli svojej náročnosti. Posledný spôsob, ktorý spomeniem, je generovanie PDF dokumentov pomocou web aplikácií. Tento spôsob budem ďalej demonštrovať v kapitole Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD. K zobrazovaniu PDF dokumentov sú nutné špeciálne prehliadače. Jedným s najznámejších je Adobe Acrobat Reader. Je voľne dostupný na www.adobe.com. Najväčšou výhodou PDF formátu je jeho nezávislosť na platforme (PC, Mac, UNIX). Čo zaručí, že sa zobrazí rovnako na všetkých tipoch počítačov. Je to veľká výhoda oproti ostatným formátom, ktoré zobrazujú dokument inak na rôznych platformách. Ďalšou výhodou PDF formátu je možnosť definovať náhľad stránok, odkazy alebo záložky, čo umožňuje užívateľovi komfortnejšie prezeranie dokumentu. &lt;br /&gt;
PDF súbory sa ukladajú vo formáte 7-bit ASCII alebo ako binárny súbor.  Pri posielaní PDF súborov cez e-mail niekedy dochádza k ich poškodeniu. Kvôli tomu sa odporúča ukladať súbory ako binárne.&lt;br /&gt;
&lt;br /&gt;
===Verzie PDF===&lt;br /&gt;
'''PDF 1.0'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V tejto verzii bolo povolené len kódovanie v 7-bit ASCII. Čiže aj binárne údaje sa museli kódovať do 7-bit ASCII. Riadok dokumentu nemohol obsahovať viac ako 255 znakov. Koniec riadku je definovaný znakmi &amp;lt;0D0A&amp;gt;.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.1'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Táto verzia vznikla v roku 1993.&lt;br /&gt;
Časom sa ukázalo, že kódovanie do 7-bit ASCII nie je najlepším riešením. Preto je už vo verzii PDF 1.1 povolené binárne kódovanie. Hlavnými dôvodmi, prečo boli nútení upustiť z tohto pravidla, sú:&lt;br /&gt;
*	Zmena/poškodenie súborov pri prenose.&lt;br /&gt;
*	Zväčšenie dokumentu aj o 20% pri kódovaní údajov s binárneho do ASCII kódovania.&lt;br /&gt;
Binárne údaje sa začali používať priamo v objektoch string, stream a aj v komentároch. Čo sa v praxi osvedčilo.&lt;br /&gt;
Ďalšie zmeny, ktoré boli uplatnené v PDF 1.1:&lt;br /&gt;
*	Novou verziou pribudla možnosť ochrany dokumentu pomocou hesla.&lt;br /&gt;
*	Ďalšou zmenou bolo zrušenie obmedzenia maximálneho počtu znakov v jednom riadku.&lt;br /&gt;
*	Možnosť poskytovať ďalšie informácie o dokumente.&lt;br /&gt;
*	Nový formát dátumu, ktorý umožňoval programové porovnávanie dátumov.&lt;br /&gt;
Štruktúra PDF 1.1 sa oproti PDF 1.0 nezmenila.  &lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Verzia PDF 1.2 vznikla v roku 1996.&lt;br /&gt;
Niektoré zmeny, ktoré boli uplatnené v PDF 1.2:&lt;br /&gt;
*	Interaktívne prvky ako prepínače a zaškrtávacie políčka.&lt;br /&gt;
*	Podpora pre prehrávanie filmov (z externých súborov) a zvukov (buď priamo zo súboru PDF, alebo z externých súborov).&lt;br /&gt;
*	Podpora pre čínske, kórejské, japonské texty.&lt;br /&gt;
&lt;br /&gt;
===Formát dokumentu PDF===&lt;br /&gt;
Štruktúra formátu sa skladá z nasledujúcich štyroch častí:&lt;br /&gt;
*	Popis objektov dokumentu&lt;br /&gt;
*	Popis štruktúry PDF súboru&lt;br /&gt;
*	Popis štruktúry dokumentu&lt;br /&gt;
*	Popis stránky&lt;br /&gt;
Súradnicový systém PDF formátu definuje plochu, na ktorú sa vykresľujú objekty. Určuje pozíciu, orientáciu a veľkosť objektu. Každé zariadenie, na ktorom je možné zobraziť PDF dokument, má svoj vlastný súradnicový systém, ktorý nám určuje plochu zariadenia – device space, na ktorom je vykreslený dokument.&lt;br /&gt;
Zobrazovaný PDF súbor nie je závislý na výstupnom  zariadení. Preto používa svoj vlastný súradnicový systém – user space. Pri zobrazovaní PDF dokumentu na výstupné zariadenie sú súradnice a rozmery objektov konvertované z user space do device space. K tomu sa využíva transformačná matica CTM (Current Transformation Matrix).&lt;br /&gt;
Štandardné zobrazovanie user space používa rozlíšenie 72 jednotiek (points) na palec. Kladný smer osi Y je orientovaný nahor a kladný smer osi X vpravo.&lt;br /&gt;
Text space-  je to oblasť kam je zobrazovaný text.  Character space definuje jednotlivé znaky fontu. Transformáciu s character space do text space je určená maticou character matrix. &lt;br /&gt;
Obrázky sú zobrazované v oblasti image space. Transformáciu z image space do user space je preddefinovaná a nedá sa zmeniť.                                                                                                                                        &amp;lt;br/&amp;gt;'''Transformácia súradníc'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V transformačnej matici je popísané zväčšenie, rotácia a posunutie objektov. Každá matica v PDF obsahuje šesť hodnôt. &lt;br /&gt;
*	Posunutie je definované [0,0,0,0,x,y], kde x,y sú súradnice určujúce vector posunutia&lt;br /&gt;
*	Pre zväčšenie objektu je matica nasledovná [x,0,0,y,0,0], kde x,y udávajú novú veľkosť jednotiek&lt;br /&gt;
*	Rotácia objektu [cos(theta), sin(theta), -sin(theta), cos(theta), 0, 0] je daná uhlom theta v protismere hodinových ručičiek&lt;br /&gt;
*	Zošikmenie je definované maticou  [1, tg(alpha), tg(beta), 1, 0, 0] os x je zošikmená o uhol alpha a os y o uhol beta.&lt;br /&gt;
Pokiaľ je použitých viac transformácií za sebou, tak nová transformácia je vykonaná v súradnicovom systéme z predošlej transformácie.&lt;br /&gt;
&lt;br /&gt;
====Popis objektov dokumentu====&lt;br /&gt;
Objekty podporované PDF sú podobné objektom PostScriptu. Sedem základných typov objektov, ktoré PDF využíva sú: boolean, number,  string, name, array, dictionary, stream a null (prázdny). Každý objekt môže byť pomenovaný, to nám potom umožňuje odkazovať sa naň z iných objektov. Pomenovaný objekt sa nazýva indirect object. V názvoch objektov sú rozlišované veľké a malé písmená.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Boolean'''&amp;lt;br/&amp;gt;                                                                                                                                  Obsahuje len hodnoty TRUE (pravda) a FALSE (nepravda)&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Number '''&amp;lt;br/&amp;gt;                                                                                                                                     Sú povolené len celé a desatinné čísla. Desatinné číslo musí obsahovať desatinnú čiarku. Iný spôsob zápisu nie je možný!&lt;br /&gt;
&amp;lt;br/&amp;gt;'''String'''&amp;lt;br/&amp;gt;&lt;br /&gt;
String (reťazec) je to n-tica prvkov danej množiny uzavretá v guľatých zátvorkách. Pokiaľ by reťazec svojou dĺžkou presahoval dĺžku riadku, je možné reťazec zalomiť spätným lomítkom ( \ ). Spätné lomítko nám slúži aj na výpis akéhokoľvek netlačitetelného znaku ecsape sekvencie v ASCII tabuľkách napr.: \), v tomto prípade nám zátvorka neukončuje reťazec, ale je súčasťou reťazca a bude vypísaná.&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Zápis&lt;br /&gt;
!Význam&lt;br /&gt;
|-&lt;br /&gt;
|\n&lt;br /&gt;
|koniec riadku&lt;br /&gt;
|-&lt;br /&gt;
|\r&lt;br /&gt;
|návrat na začiatok riadku &lt;br /&gt;
|-&lt;br /&gt;
|\t&lt;br /&gt;
|tabulátor&lt;br /&gt;
|-&lt;br /&gt;
|\b&lt;br /&gt;
|backspace&lt;br /&gt;
|-&lt;br /&gt;
|\f&lt;br /&gt;
|Form feed &lt;br /&gt;
|-&lt;br /&gt;
|\\&lt;br /&gt;
|spätné lomítko&lt;br /&gt;
|-&lt;br /&gt;
|\(&lt;br /&gt;
|začiatok guľatej zátvorky&lt;br /&gt;
|-&lt;br /&gt;
|\)&lt;br /&gt;
|koniec guľatej zátvorky &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
String je možné zapísať aj v hexadecimálnom tvare napr.: &amp;lt;6cd3&amp;gt;, je to reťazec obsahujúci dva hexadecimálne znaky z tabuľky ASCII a to 6c, d3. Všimnite si, že reťazce v tomto tvare nie sú v guľatých zátvorkách, ale v zobákových &amp;lt; &amp;gt; .&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 (toto je reťazec na jeden riadok)&lt;br /&gt;
 (toto je reťazec \&lt;br /&gt;
 zalomený \&lt;br /&gt;
 na viac riadkov)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Name'''&amp;lt;br/&amp;gt;                                                                                                                               &lt;br /&gt;
Name (meno)- je to n-tica prvkov danej množiny začínajúca lomítkom ( / ). Však na rozdiel od reťazca, má povolené len znaky, ktoré sa nachádzajú v ASCII tabuľke medzi hodnotami &amp;lt;21&amp;gt; &amp;lt;7e&amp;gt;, okrem  %, (, ), &amp;lt;, &amp;gt;, [, ], {, }, / a #.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 /Meno&lt;br /&gt;
 /Ďalšie_meno&lt;br /&gt;
&lt;br /&gt;
Od verzie PDF 1.2 môže meno obsahovať hexadecimálne hodnoty (okrem &amp;lt;00&amp;gt;), pred ktoré je umiestnený znak mriežky #. &lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
/tretie#20meno&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Array'''&amp;lt;br/&amp;gt;                                                                                                                                       &lt;br /&gt;
Array (pole)- je to sekvencia PDF objektov. Môže obsahovať viac objektov rôzneho typu. Pole je uzatvorené v zátvorkách [ ], v ktorých sa nachádza výpis objektov pola.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 [false (reťazec) /meno 432 (reťazec2)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Dictionary'''&amp;lt;br/&amp;gt;                                                                    &lt;br /&gt;
Dictionary (slovník) obsahuje tabuľku spárovaných objektov. Prvý objekt musí byť objekt typu name a nazýva sa key. Druhý objekt sa nazýva value a môže obsahovať akýkoľvek typ objektu dokonca aj dictionary.&lt;br /&gt;
Dictionary je uzavretý do dvojitých zobákových zátvoriek &amp;lt;&amp;lt; &amp;gt;&amp;gt;, v ktorých sú dvojice key-value. &lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt; &lt;br /&gt;
  &amp;lt;&amp;lt; /kľúč hodnota /key value /key1 34 &amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad dictionary obsahujúci ďalší objekt typu dictionary:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 /objednávka 0244003 &lt;br /&gt;
 /počet 2&lt;br /&gt;
 /info&lt;br /&gt;
 &amp;lt;&amp;lt;/typ (meno produktu) &lt;br /&gt;
 /farba (čierna) &amp;gt;&amp;gt;&lt;br /&gt;
 	&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Stream'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Stream (prúd) je totožný s objektom string, až na rozdiel prístupu k objektom. Nakoľko string sa číta celý naraz, ku streamu sa pristupuje po častiach. Preto sa objekt stream využíva na zapisovanie veľkého množstva údajov. Ako napríklad u obrázkov, kde je potrebné definovať viac parametrov pre správne zobrazenie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;stream&amp;gt;::=	&amp;lt;dictionary&amp;gt;&lt;br /&gt;
 		stream&lt;br /&gt;
 		{&amp;lt;riadok znakov&amp;gt;}*&lt;br /&gt;
 endstream&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; /Length 41 &amp;gt;&amp;gt;&lt;br /&gt;
 stream&lt;br /&gt;
 [/pole (v) (streame) 45]&lt;br /&gt;
 /object#20name&lt;br /&gt;
 (obyčajný reťazec)&lt;br /&gt;
  endstream&lt;br /&gt;
&lt;br /&gt;
Všetky stream objekty musia byť pomenované (indirect object). Dictionary objekty nemôžu byť pomenované (direct object).&lt;br /&gt;
&amp;lt;br/&amp;gt;Stream atribúty&amp;lt;br/&amp;gt;&lt;br /&gt;
Uvediem niekoľko atribútov objektu stream v tvare : kľúč (typ) opis atribútu.&lt;br /&gt;
&amp;lt;br/&amp;gt;Length (celočíselná hodnota) počet znakov, ktoré sa nachádzajú medzi identifikátormi stream a endstream. Atribút length je povinný.&lt;br /&gt;
&amp;lt;br/&amp;gt;Filter (meno alebo pole mien) nám poskytuje informácie o filtroch, ktoré majú byť použité pri čítaní streamu. Napr.: údaje kódované pomocou filtra LZW a potom ASCII base-85 sú dekódované filtrom: &lt;br /&gt;
/Filter [/ASCII85Decode /LZWDecode]&lt;br /&gt;
&amp;lt;br/&amp;gt;FFilter (meno alebo pole mien) definuje filter, ktorý sa použije na dekódovanie znakov z externého súboru.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Indirect object'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Indirect object (nepriami objekt). Každý objekt môže byť pomenovaný. Takýto objekt sa skladá z : identifikátoru objektu, priameho kľúča a identifikátora endobj. Identifikátor objektu sa skladá z object number (číslo objektu), generation number (generačného čísla) a kľúčového slova obj.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect object&amp;gt; ::=	&amp;lt;object ID&amp;gt;&lt;br /&gt;
 &amp;lt;direct object&amp;gt;&lt;br /&gt;
 endobj&lt;br /&gt;
 &amp;lt;object ID&amp;gt; ::= 	&amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 obj&lt;br /&gt;
Číslo objektu a generačné číslo objektu jednoznačne definuje nepriami objekt v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Odkazy na objekty'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý objekt ako je prvok poľa alebo hodnota v slovníku, môže byť definovaný priamo alebo pomocou nepriameho odkazu na objekt (indirect reference). Indirect reference sa skladá z čísla objektu (objec number), generačného čísla (generation number) a kľúčového slova R.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect reference&amp;gt;::=&lt;br /&gt;
 &amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 R&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Popis štruktúry PDF súboru====&lt;br /&gt;
Základná štruktúra PDF súboru sa skladá z hlavičky head, ktorá obsahuje len jeden riadok, tela body, tabuľka krížových odkazov cross-reference table a päty trailer. &lt;br /&gt;
 &amp;lt;PDF file&amp;gt;::=&lt;br /&gt;
 &amp;lt;header&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference table&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Hlavička'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Hlavička sa nachádza len na prvom riadku PDF súboru. Začína znakom percento (%). Poskytuje informácie o použitej verzii. Keby sme chceli vytvoriť PDF súbor vo verzii PDF 1.1, hlavička by vyzerala takto:&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&lt;br /&gt;
 %PDF-1.1&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Telo'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Telo obsahuje postupnosť nepriamych objektov (fonty, stránky, obrázky...) reprezentujúcich dokument. Tieto objekty sú zo základných typov opisovaných v kapitole 4. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Komentáre'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Komentáre sa môžu nachádzať len v tele PDF súboru. Komentáre sa začínajú znakom percento (%) a končia sa na konci riadku. Môžu začínať na hociktorej pozícii riadku. &lt;br /&gt;
Pokiaľ sa znak percento (%) nachádza v objekte stream alebo string, nie je považovaný za začiatok komentára.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 %Toto bude v tele dokumentu považované za komentár&lt;br /&gt;
 (toto je reťazec STRING % pokračovanie reťazca)&lt;br /&gt;
 (aj toto je reťazec) % toto je už komentár&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Tabuľka krížových odkazov'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý PDF súbor obsahuje práve jednu tabuľku krížových odkazov. V nej sú popísané prístupy ku všetkým nepriamym objektom súboru. Každý takýto prístup je definovaný práve v jednom riadku tabuľky. &lt;br /&gt;
Tabuľka krížových odkazov sa rozdeľuje na sekcie. Novovytvorený PDF súbor obsahuje len jednu sekciu. Po každej úprave súboru sa počet sekcií zvýši o jednu. Sekcie sú usporiadané do jednej sekcie ako podsekcie, subsection.&lt;br /&gt;
Syntax pre tabuľku krížových odkazov je presne definovaná. Začína kľúčovým slovom xref  a za ním nasledujú podsekcie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference section&amp;gt;:==&lt;br /&gt;
 xref&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;+&lt;br /&gt;
&lt;br /&gt;
Syntax pre podsekcie je nasledovná. Na začiatku každej podsekcie sú uvedené dva parametre. Tým prvým je číslo prvého objektu v podsekcii, druhý parameter obsahuje počet objektov, ktoré sa v podsekcii nachádzajú.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;:==&lt;br /&gt;
 &amp;lt;číslo prvého objektu podsekcie&amp;gt;&lt;br /&gt;
 &amp;lt;počet objektov v podsekcii&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference entry&amp;gt;+&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov s jednoduchou podsekciou:&lt;br /&gt;
 xref&lt;br /&gt;
 0 6&lt;br /&gt;
 0000000003 65535 f&lt;br /&gt;
 0000000017 00000 n&lt;br /&gt;
 0000000081 00000 n&lt;br /&gt;
 0000000000 00007 f&lt;br /&gt;
 0000000331 00000 n&lt;br /&gt;
 0000000409 00000 n&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov so štyrmi podsekciami:&lt;br /&gt;
 xref&lt;br /&gt;
 0 1&lt;br /&gt;
 0000000000 65535 f&lt;br /&gt;
 3 1&lt;br /&gt;
 0000025325 00000 n&lt;br /&gt;
 23 2&lt;br /&gt;
 0000025518 00002 n&lt;br /&gt;
 0000025635 00000 n&lt;br /&gt;
 30 1&lt;br /&gt;
 0000025777 00000 n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Päta'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Päta - trailer je posledná časť súboru PDF. Slúži k rýchlemu nalezeniu tabuľky krížových odkazov a niektorých dôležitých objektov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Platí, že aplikácia by mala čítať PDF súbor od jeho konca. Posledný riadok PDF súboru obsahuje značku konca súboru: %%EOF. Dva predchádzajúce riadky obsahujú postupné kľúčové slová startxref a offset bytu od začiatku súboru ku kľúčovému slovu xref z poslednej sekcie tabuľky krížových odkazov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pred týmito riadkami je umiestnený trailer dictionary. Ten obsahuje kľúčové slovo trailer nasledované dvojicami kľúč - hodnota:&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt; ::= trailer&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 &amp;lt;trailer key-value pair&amp;gt;+&lt;br /&gt;
 &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prehľad hodnôt v trailer-dictionary&lt;br /&gt;
*	Size (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Celkový počet záznamov v tabuľke krížových odkazov. Počet zahŕňa všetky záznamy v dokumente - teda zo všetkých sekcií tabuľky.&lt;br /&gt;
*	Prev (len u súboru s viacerými sekciami tabuľky krížových odkazov)&amp;lt;br/&amp;gt;&lt;br /&gt;
Offset bytu od začiatku súboru k predchádzajúcej sekcii tabuľky.&lt;br /&gt;
*	Root (povinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na objekt katalóg.&lt;br /&gt;
*	Info (nepovinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na informácie o dokumente.&lt;br /&gt;
*	ID (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pole dvoch objektov string. Touto dvojicou je určená verzia dokumentu. Prvý string je založený pri vytvorení dokumentu, druhý je zmenený pri každej modifikácii dokumentu.&lt;br /&gt;
*	Encrypt (nepovinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pokiaľ je dokument zašifrovaný, obsahuje informácie pre jeho dešifrovanie.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=1650</id>
		<title>Štatistický modul v systéme rozvrhu FM</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0tatistick%C3%BD_modul_v_syst%C3%A9me_rozvrhu_FM&amp;diff=1650"/>
		<updated>2010-01-29T12:38:09Z</updated>

		<summary type="html">&lt;p&gt;David: /* Otvorené formáty dokumentov */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:web]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Dávid Ďurika|Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|1|Štatistický modul v systéme rozvrhu FM|Otvorené formáty dokumentov|Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD|||||||||}}&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|a&lt;br /&gt;
|a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
V dnešnej dobe je mnoho formátov súborov. Niektoré sú voľne šíriteľné na iné sú chránené rôznymi licenciami. Súčasnosti je trend vytvárať a používať otvorené formáty súborov. Otvorený formát je taký ktorého špecifikácia je verejne prístupná. Medzi otvorené formáty dokumentov patria: PDF, OO XML, ODT. Medzi otvorené grafické formáty môžeme zaradiť napríklad gif, png, svg. V tejto práci sa bude opísaná štruktúra PDF formátu a niektoré vlastnosti tohto formátu. Vdruhej časti práce budú opísané tlačové zostavy použité v aplikácii rozvrhu FM TnUAD.&lt;br /&gt;
&lt;br /&gt;
=Otvorené formáty dokumentov=&lt;br /&gt;
Otvorený formát (otvorený štandard, angl.: open format) je publikovaná špecifikácia na uchovávanie digitálnych údajov, obvykle udržiavaná neproprietárnou štandardizačnou organizáciou a bez právnych obmedzení na používanie. Napríklad, otvorený formát musí byť implementovateľný aj proprietárnym aj open source softvérom, za použitia im typických licencií. Na rozdiel od otvorených formátov, proprietárne formáty sa riadia a definujú súkromnými záujmami. Otvorené formáty sú podmonožinou otvorených noriem.[1]&lt;br /&gt;
&lt;br /&gt;
==ODF (OpenDocument Format)==&lt;br /&gt;
XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) vytvorený pre kancelársky balík OpenOffice.org. Špecifikácia bola pôvodne vyvinutá firmou Sun, ale štandard bol vyvinutý v rámci OASIS (Organization for the Advancement of Structured Information Standards) a založení na XML formátu vytvorený a implementovaný pre balík OpenOffice.org. Formát je neznárodním štandardom (ISO/IEC 26300) od 30. novembra 2006. &lt;br /&gt;
Formát je podporovaný hlavne v balíku aplikácií OpenOffice.org, KOffice a StarOffice. Pre MS Office existuje konvertor.[2]&lt;br /&gt;
&lt;br /&gt;
==OOXML (Office Open XML)==&lt;br /&gt;
Takisto XML formát pre ukladanie kancelárskych dokumentov (textové dokumenty, tabuľky, prezentácie apod.) od firmy Microsoft. Formát je podporovaný v nových verziách sady aplikácií MS Office (2007, pre staršie verzie je k dispozícii konvertor) a tiež prevodným modulom pre OpenOffice.org od firmy Novell (funguje však len vo verziách OpenOffice.org v SUSE Linuxu a niektorých verziách (K)Ubuntu). Podporuje ho napríklad také NeoOffice, čo je ekvivalentom OpenOffice.org pre Mac OS X.[2]&lt;br /&gt;
==OpenOffice.org==&lt;br /&gt;
Je kancelársky balíček ktorý obsahuje:&lt;br /&gt;
*Textový editor Writer&lt;br /&gt;
*Tabuľkový procesor Calc&lt;br /&gt;
*Prezentační program Impress&lt;br /&gt;
*Nástroj pre kreslení Draw&lt;br /&gt;
*Databázový nástroj Base&lt;br /&gt;
je voľne šíriteľný slobodný softvér pod licenciou LGPL. Je funkčný pod akoukoľvek platformou operačného systému. A dokáže konkurovať kancelárskemu balíku od Microsoftu – MS Office.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Portable Document Format==&lt;br /&gt;
PDF (Portable Document Format) alebo prenosný formát dokumentu vyvinutý firmou Adobe. Súbor formátu PDF je možné vytvoriť viacerými spôsobmi. Napríklad pomocou aplikácií určených len na tento účel: PDF Creator, BullZip PDF Printer. Ďalším spôsobom je priame napísanie kódu PDF, ale táto metóda je v praxi nepoužiteľná kvôli svojej náročnosti. Posledný spôsob, ktorý spomeniem, je generovanie PDF dokumentov pomocou web aplikácií. Tento spôsob budem ďalej demonštrovať v kapitole Tvorba tlačových zostáv v aplikácii rozvrhu FM TnUAD. K zobrazovaniu PDF dokumentov sú nutné špeciálne prehliadače. Jedným s najznámejších je Adobe Acrobat Reader. Je voľne dostupný na www.adobe.com. Najväčšou výhodou PDF formátu je jeho nezávislosť na platforme (PC, Mac, UNIX). Čo zaručí, že sa zobrazí rovnako na všetkých tipoch počítačov. Je to veľká výhoda oproti ostatným formátom, ktoré zobrazujú dokument inak na rôznych platformách. Ďalšou výhodou PDF formátu je možnosť definovať náhľad stránok, odkazy alebo záložky, čo umožňuje užívateľovi komfortnejšie prezeranie dokumentu. &lt;br /&gt;
PDF súbory sa ukladajú vo formáte 7-bit ASCII alebo ako binárny súbor.  Pri posielaní PDF súborov cez e-mail niekedy dochádza k ich poškodeniu. Kvôli tomu sa odporúča ukladať súbory ako binárne.&lt;br /&gt;
&lt;br /&gt;
===Verzie PDF===&lt;br /&gt;
'''PDF 1.0'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V tejto verzii bolo povolené len kódovanie v 7-bit ASCII. Čiže aj binárne údaje sa museli kódovať do 7-bit ASCII. Riadok dokumentu nemohol obsahovať viac ako 255 znakov. Koniec riadku je definovaný znakmi &amp;lt;0D0A&amp;gt;.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.1'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Táto verzia vznikla v roku 1993.&lt;br /&gt;
Časom sa ukázalo, že kódovanie do 7-bit ASCII nie je najlepším riešením. Preto je už vo verzii PDF 1.1 povolené binárne kódovanie. Hlavnými dôvodmi, prečo boli nútení upustiť z tohto pravidla, sú:&lt;br /&gt;
*	Zmena/poškodenie súborov pri prenose.&lt;br /&gt;
*	Zväčšenie dokumentu aj o 20% pri kódovaní údajov s binárneho do ASCII kódovania.&lt;br /&gt;
Binárne údaje sa začali používať priamo v objektoch string, stream a aj v komentároch. Čo sa v praxi osvedčilo.&lt;br /&gt;
Ďalšie zmeny, ktoré boli uplatnené v PDF 1.1:&lt;br /&gt;
*	Novou verziou pribudla možnosť ochrany dokumentu pomocou hesla.&lt;br /&gt;
*	Ďalšou zmenou bolo zrušenie obmedzenia maximálneho počtu znakov v jednom riadku.&lt;br /&gt;
*	Možnosť poskytovať ďalšie informácie o dokumente.&lt;br /&gt;
*	Nový formát dátumu, ktorý umožňoval programové porovnávanie dátumov.&lt;br /&gt;
Štruktúra PDF 1.1 sa oproti PDF 1.0 nezmenila.  &lt;br /&gt;
&amp;lt;br/&amp;gt;'''PDF 1.2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Verzia PDF 1.2 vznikla v roku 1996.&lt;br /&gt;
Niektoré zmeny, ktoré boli uplatnené v PDF 1.2:&lt;br /&gt;
*	Interaktívne prvky ako prepínače a zaškrtávacie políčka.&lt;br /&gt;
*	Podpora pre prehrávanie filmov (z externých súborov) a zvukov (buď priamo zo súboru PDF, alebo z externých súborov).&lt;br /&gt;
*	Podpora pre čínske, kórejské, japonské texty.&lt;br /&gt;
&lt;br /&gt;
===Formát dokumentu PDF===&lt;br /&gt;
Štruktúra formátu sa skladá z nasledujúcich štyroch častí:&lt;br /&gt;
*	Popis objektov dokumentu&lt;br /&gt;
*	Popis štruktúry PDF súboru&lt;br /&gt;
*	Popis štruktúry dokumentu&lt;br /&gt;
*	Popis stránky&lt;br /&gt;
Súradnicový systém PDF formátu definuje plochu, na ktorú sa vykresľujú objekty. Určuje pozíciu, orientáciu a veľkosť objektu. Každé zariadenie, na ktorom je možné zobraziť PDF dokument, má svoj vlastný súradnicový systém, ktorý nám určuje plochu zariadenia – device space, na ktorom je vykreslený dokument.&lt;br /&gt;
Zobrazovaný PDF súbor nie je závislý na výstupnom  zariadení. Preto používa svoj vlastný súradnicový systém – user space. Pri zobrazovaní PDF dokumentu na výstupné zariadenie sú súradnice a rozmery objektov konvertované z user space do device space. K tomu sa využíva transformačná matica CTM (Current Transformation Matrix).&lt;br /&gt;
Štandardné zobrazovanie user space používa rozlíšenie 72 jednotiek (points) na palec. Kladný smer osi Y je orientovaný nahor a kladný smer osi X vpravo.&lt;br /&gt;
Text space-  je to oblasť kam je zobrazovaný text.  Character space definuje jednotlivé znaky fontu. Transformáciu s character space do text space je určená maticou character matrix. &lt;br /&gt;
Obrázky sú zobrazované v oblasti image space. Transformáciu z image space do user space je preddefinovaná a nedá sa zmeniť.                                                                                                                                        &amp;lt;br/&amp;gt;'''Transformácia súradníc'''&amp;lt;br/&amp;gt;&lt;br /&gt;
V transformačnej matici je popísané zväčšenie, rotácia a posunutie objektov. Každá matica v PDF obsahuje šesť hodnôt. &lt;br /&gt;
*	Posunutie je definované [0,0,0,0,x,y], kde x,y sú súradnice určujúce vector posunutia&lt;br /&gt;
*	Pre zväčšenie objektu je matica nasledovná [x,0,0,y,0,0], kde x,y udávajú novú veľkosť jednotiek&lt;br /&gt;
*	Rotácia objektu [cos(theta), sin(theta), -sin(theta), cos(theta), 0, 0] je daná uhlom theta v protismere hodinových ručičiek&lt;br /&gt;
*	Zošikmenie je definované maticou  [1, tg(alpha), tg(beta), 1, 0, 0] os x je zošikmená o uhol alpha a os y o uhol beta.&lt;br /&gt;
Pokiaľ je použitých viac transformácií za sebou, tak nová transformácia je vykonaná v súradnicovom systéme z predošlej transformácie.&lt;br /&gt;
&lt;br /&gt;
====Popis objektov dokumentu====&lt;br /&gt;
Objekty podporované PDF sú podobné objektom PostScriptu. Sedem základných typov objektov, ktoré PDF využíva sú: boolean, number,  string, name, array, dictionary, stream a null (prázdny). Každý objekt môže byť pomenovaný, to nám potom umožňuje odkazovať sa naň z iných objektov. Pomenovaný objekt sa nazýva indirect object. V názvoch objektov sú rozlišované veľké a malé písmená.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Boolean'''&amp;lt;br/&amp;gt;                                                                                                                                  Obsahuje len hodnoty TRUE (pravda) a FALSE (nepravda)&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Number '''&amp;lt;br/&amp;gt;                                                                                                                                     Sú povolené len celé a desatinné čísla. Desatinné číslo musí obsahovať desatinnú čiarku. Iný spôsob zápisu nie je možný!&lt;br /&gt;
&amp;lt;br/&amp;gt;'''String'''&amp;lt;br/&amp;gt;&lt;br /&gt;
String (reťazec) je to n-tica prvkov danej množiny uzavretá v guľatých zátvorkách. Pokiaľ by reťazec svojou dĺžkou presahoval dĺžku riadku, je možné reťazec zalomiť spätným lomítkom ( \ ). Spätné lomítko nám slúži aj na výpis akéhokoľvek netlačitetelného znaku ecsape sekvencie v ASCII tabuľkách napr.: \), v tomto prípade nám zátvorka neukončuje reťazec, ale je súčasťou reťazca a bude vypísaná.&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Zápis&lt;br /&gt;
!Význam&lt;br /&gt;
|-&lt;br /&gt;
|\n&lt;br /&gt;
|koniec riadku&lt;br /&gt;
|-&lt;br /&gt;
|\r&lt;br /&gt;
|návrat na začiatok riadku &lt;br /&gt;
|-&lt;br /&gt;
|\t&lt;br /&gt;
|tabulátor&lt;br /&gt;
|-&lt;br /&gt;
|\b&lt;br /&gt;
|backspace&lt;br /&gt;
|-&lt;br /&gt;
|\f&lt;br /&gt;
|Form feed &lt;br /&gt;
|-&lt;br /&gt;
|\\&lt;br /&gt;
|spätné lomítko&lt;br /&gt;
|-&lt;br /&gt;
|\(&lt;br /&gt;
|začiatok guľatej zátvorky&lt;br /&gt;
|-&lt;br /&gt;
|\)&lt;br /&gt;
|koniec guľatej zátvorky &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
String je možné zapísať aj v hexadecimálnom tvare napr.: &amp;lt;6cd3&amp;gt;, je to reťazec obsahujúci dva hexadecimálne znaky z tabuľky ASCII a to 6c, d3. Všimnite si, že reťazce v tomto tvare nie sú v guľatých zátvorkách, ale v zobákových &amp;lt; &amp;gt; .&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 (toto je reťazec na jeden riadok)&lt;br /&gt;
 (toto je reťazec \&lt;br /&gt;
 zalomený \&lt;br /&gt;
 na viac riadkov)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Name'''&amp;lt;br/&amp;gt;                                                                                                                               &lt;br /&gt;
Name (meno)- je to n-tica prvkov danej množiny začínajúca lomítkom ( / ). Však na rozdiel od reťazca, má povolené len znaky, ktoré sa nachádzajú v ASCII tabuľke medzi hodnotami &amp;lt;21&amp;gt; &amp;lt;7e&amp;gt;, okrem  %, (, ), &amp;lt;, &amp;gt;, [, ], {, }, / a #.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 /Meno&lt;br /&gt;
 /Ďalšie_meno&lt;br /&gt;
&lt;br /&gt;
Od verzie PDF 1.2 môže meno obsahovať hexadecimálne hodnoty (okrem &amp;lt;00&amp;gt;), pred ktoré je umiestnený znak mriežky #. &lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
/tretie#20meno&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Array'''&amp;lt;br/&amp;gt;                                                                                                                                       &lt;br /&gt;
Array (pole)- je to sekvencia PDF objektov. Môže obsahovať viac objektov rôzneho typu. Pole je uzatvorené v zátvorkách [ ], v ktorých sa nachádza výpis objektov pola.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 [false (reťazec) /meno 432 (reťazec2)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Dictionary'''&amp;lt;br/&amp;gt;                                                                    &lt;br /&gt;
Dictionary (slovník) obsahuje tabuľku spárovaných objektov. Prvý objekt musí byť objekt typu name a nazýva sa key. Druhý objekt sa nazýva value a môže obsahovať akýkoľvek typ objektu dokonca aj dictionary.&lt;br /&gt;
Dictionary je uzavretý do dvojitých zobákových zátvoriek &amp;lt;&amp;lt; &amp;gt;&amp;gt;, v ktorých sú dvojice key-value. &lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt; &lt;br /&gt;
  &amp;lt;&amp;lt; /kľúč hodnota /key value /key1 34 &amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad dictionary obsahujúci ďalší objekt typu dictionary:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 /objednávka 0244003 &lt;br /&gt;
 /počet 2&lt;br /&gt;
 /info&lt;br /&gt;
 &amp;lt;&amp;lt;/typ (meno produktu) &lt;br /&gt;
 /farba (čierna) &amp;gt;&amp;gt;&lt;br /&gt;
 	&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Stream'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Stream (prúd) je totožný s objektom string, až na rozdiel prístupu k objektom. Nakoľko string sa číta celý naraz, ku streamu sa pristupuje po častiach. Preto sa objekt stream využíva na zapisovanie veľkého množstva údajov. Ako napríklad u obrázkov, kde je potrebné definovať viac parametrov pre správne zobrazenie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;stream&amp;gt;::=	&amp;lt;dictionary&amp;gt;&lt;br /&gt;
 		stream&lt;br /&gt;
 		{&amp;lt;riadok znakov&amp;gt;}*&lt;br /&gt;
 endstream&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; /Length 41 &amp;gt;&amp;gt;&lt;br /&gt;
 stream&lt;br /&gt;
 [/pole (v) (streame) 45]&lt;br /&gt;
 /object#20name&lt;br /&gt;
 (obyčajný reťazec)&lt;br /&gt;
  endstream&lt;br /&gt;
&lt;br /&gt;
Všetky stream objekty musia byť pomenované (indirect object). Dictionary objekty nemôžu byť pomenované (direct object).&lt;br /&gt;
&amp;lt;br/&amp;gt;Stream atribúty&amp;lt;br/&amp;gt;&lt;br /&gt;
Uvediem niekoľko atribútov objektu stream v tvare : kľúč (typ) opis atribútu.&lt;br /&gt;
&amp;lt;br/&amp;gt;Length (celočíselná hodnota) počet znakov, ktoré sa nachádzajú medzi identifikátormi stream a endstream. Atribút length je povinný.&lt;br /&gt;
&amp;lt;br/&amp;gt;Filter (meno alebo pole mien) nám poskytuje informácie o filtroch, ktoré majú byť použité pri čítaní streamu. Napr.: údaje kódované pomocou filtra LZW a potom ASCII base-85 sú dekódované filtrom: &lt;br /&gt;
/Filter [/ASCII85Decode /LZWDecode]&lt;br /&gt;
&amp;lt;br/&amp;gt;FFilter (meno alebo pole mien) definuje filter, ktorý sa použije na dekódovanie znakov z externého súboru.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Indirect object'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Indirect object (nepriami objekt). Každý objekt môže byť pomenovaný. Takýto objekt sa skladá z : identifikátoru objektu, priameho kľúča a identifikátora endobj. Identifikátor objektu sa skladá z object number (číslo objektu), generation number (generačného čísla) a kľúčového slova obj.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect object&amp;gt; ::=	&amp;lt;object ID&amp;gt;&lt;br /&gt;
 &amp;lt;direct object&amp;gt;&lt;br /&gt;
 endobj&lt;br /&gt;
 &amp;lt;object ID&amp;gt; ::= 	&amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 obj&lt;br /&gt;
Číslo objektu a generačné číslo objektu jednoznačne definuje nepriami objekt v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Odkazy na objekty'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý objekt ako je prvok poľa alebo hodnota v slovníku, môže byť definovaný priamo alebo pomocou nepriameho odkazu na objekt (indirect reference). Indirect reference sa skladá z čísla objektu (objec number), generačného čísla (generation number) a kľúčového slova R.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;indirect reference&amp;gt;::=&lt;br /&gt;
 &amp;lt;object number&amp;gt;&lt;br /&gt;
 &amp;lt;generation number&amp;gt;&lt;br /&gt;
 R&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Popis štruktúry PDF súboru====&lt;br /&gt;
Základná štruktúra PDF súboru sa skladá z hlavičky head, ktorá obsahuje len jeden riadok, tela body, tabuľka krížových odkazov cross-reference table a päty trailer. &lt;br /&gt;
 &amp;lt;PDF file&amp;gt;::=&lt;br /&gt;
 &amp;lt;header&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference table&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Hlavička'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Hlavička sa nachádza len na prvom riadku PDF súboru. Začína znakom percento (%). Poskytuje informácie o použitej verzii. Keby sme chceli vytvoriť PDF súbor vo verzii PDF 1.1, hlavička by vyzerala takto:&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&lt;br /&gt;
 %PDF-1.1&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Telo'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Telo obsahuje postupnosť nepriamych objektov (fonty, stránky, obrázky...) reprezentujúcich dokument. Tieto objekty sú zo základných typov opisovaných v kapitole 4. &lt;br /&gt;
&amp;lt;br/&amp;gt;'''Komentáre'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Komentáre sa môžu nachádzať len v tele PDF súboru. Komentáre sa začínajú znakom percento (%) a končia sa na konci riadku. Môžu začínať na hociktorej pozícii riadku. &lt;br /&gt;
Pokiaľ sa znak percento (%) nachádza v objekte stream alebo string, nie je považovaný za začiatok komentára.&lt;br /&gt;
&amp;lt;br/&amp;gt;Príklad:&amp;lt;br/&amp;gt;&lt;br /&gt;
 %Toto bude v tele dokumentu považované za komentár&lt;br /&gt;
 (toto je reťazec STRING % pokračovanie reťazca)&lt;br /&gt;
 (aj toto je reťazec) % toto je už komentár&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Tabuľka krížových odkazov'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Každý PDF súbor obsahuje práve jednu tabuľku krížových odkazov. V nej sú popísané prístupy ku všetkým nepriamym objektom súboru. Každý takýto prístup je definovaný práve v jednom riadku tabuľky. &lt;br /&gt;
Tabuľka krížových odkazov sa rozdeľuje na sekcie. Novovytvorený PDF súbor obsahuje len jednu sekciu. Po každej úprave súboru sa počet sekcií zvýši o jednu. Sekcie sú usporiadané do jednej sekcie ako podsekcie, subsection.&lt;br /&gt;
Syntax pre tabuľku krížových odkazov je presne definovaná. Začína kľúčovým slovom xref  a za ním nasledujú podsekcie.&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference section&amp;gt;:==&lt;br /&gt;
 xref&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;+&lt;br /&gt;
&lt;br /&gt;
Syntax pre podsekcie je nasledovná. Na začiatku každej podsekcie sú uvedené dva parametre. Tým prvým je číslo prvého objektu v podsekcii, druhý parameter obsahuje počet objektov, ktoré sa v podsekcii nachádzajú.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference subsection&amp;gt;:==&lt;br /&gt;
 &amp;lt;číslo prvého objektu podsekcie&amp;gt;&lt;br /&gt;
 &amp;lt;počet objektov v podsekcii&amp;gt;&lt;br /&gt;
 &amp;lt;cross-reference entry&amp;gt;+&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov s jednoduchou podsekciou:&lt;br /&gt;
 xref&lt;br /&gt;
 0 6&lt;br /&gt;
 0000000003 65535 f&lt;br /&gt;
 0000000017 00000 n&lt;br /&gt;
 0000000081 00000 n&lt;br /&gt;
 0000000000 00007 f&lt;br /&gt;
 0000000331 00000 n&lt;br /&gt;
 0000000409 00000 n&lt;br /&gt;
Príklad sekcie tabuľky krížových odkazov so štyrmi podsekciami:&lt;br /&gt;
 xref&lt;br /&gt;
 0 1&lt;br /&gt;
 0000000000 65535 f&lt;br /&gt;
 3 1&lt;br /&gt;
 0000025325 00000 n&lt;br /&gt;
 23 2&lt;br /&gt;
 0000025518 00002 n&lt;br /&gt;
 0000025635 00000 n&lt;br /&gt;
 30 1&lt;br /&gt;
 0000025777 00000 n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Päta'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Päta - trailer je posledná časť súboru PDF. Slúži k rýchlemu nalezeniu tabuľky krížových odkazov a niektorých dôležitých objektov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Platí, že aplikácia by mala čítať PDF súbor od jeho konca. Posledný riadok PDF súboru obsahuje značku konca súboru: %%EOF. Dva predchádzajúce riadky obsahujú postupné kľúčové slová startxref a offset bytu od začiatku súboru ku kľúčovému slovu xref z poslednej sekcie tabuľky krížových odkazov v dokumente.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pred týmito riadkami je umiestnený trailer dictionary. Ten obsahuje kľúčové slovo trailer nasledované dvojicami kľúč - hodnota:&lt;br /&gt;
&amp;lt;br/&amp;gt;Syntax:&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;trailer&amp;gt; ::= trailer&lt;br /&gt;
 &amp;lt;&amp;lt;&lt;br /&gt;
 &amp;lt;trailer key-value pair&amp;gt;+&lt;br /&gt;
 &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prehľad hodnôt v trailer-dictionary&lt;br /&gt;
*	Size (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Celkový počet záznamov v tabuľke krížových odkazov. Počet zahŕňa všetky záznamy v dokumente - teda zo všetkých sekcií tabuľky.&lt;br /&gt;
*	Prev (len u súboru s viacerými sekciami tabuľky krížových odkazov)&amp;lt;br/&amp;gt;&lt;br /&gt;
Offset bytu od začiatku súboru k predchádzajúcej sekcii tabuľky.&lt;br /&gt;
*	Root (povinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na objekt katalóg.&lt;br /&gt;
*	Info (nepovinné, nepriamy odkaz)&amp;lt;br/&amp;gt;&lt;br /&gt;
Odkaz na informácie o dokumente.&lt;br /&gt;
*	ID (povinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pole dvoch objektov string. Touto dvojicou je určená verzia dokumentu. Prvý string je založený pri vytvorení dokumentu, druhý je zmenený pri každej modifikácii dokumentu.&lt;br /&gt;
*	Encrypt (nepovinné)&amp;lt;br/&amp;gt;&lt;br /&gt;
Pokiaľ je dokument zašifrovaný, obsahuje informácie pre jeho dešifrovanie.&lt;/div&gt;</summary>
		<author><name>David</name></author>
		
	</entry>
</feed>