Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce



Podobné dokumenty
.include "m32def.inc" // Konstanty.equ N = 5 // Počet prvků v poli.equ PRVNI = 3 // První číslo v poli

8. Laboratoř: Aritmetika a řídicí struktury programu

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Algoritmizace řazení Bubble Sort

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Algoritmizace prostorových úloh

Maturitní téma: Programovací jazyk JAVA

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Testování jednotky ALU a aplikace metody FMEA

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Program "Světla" pro mikropočítač PMI-80

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 3

Dynamické datové struktury III.

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Digitální učební materiál

ISU Cvičení 7. Marta Čudová

Pole a kolekce. v C#, Javě a C++

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Princip funkce počítače

Digitální učební materiál

Implementace LL(1) překladů

II. Úlohy na vložené cykly a podprogramy

Struktura a architektura počítačů (BI-SAP) 9

Prioritní fronta, halda

NPRG030 Programování I, 2018/19 1 / :03:07

IMTEE Přednáška č. 8. interrupt vector table CPU při vzniku přerušení skáče na pevně dané místo v paměti (obvykle začátek CODE seg.

Prohledávání do šířky = algoritmus vlny

Časová a prostorová složitost algoritmů

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

programátorský manuál


Algoritmy I, složitost

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Dynamické datové struktury IV.

Lekce 01 Úvod do algoritmizace

Semestrální práce z předmětu ÚPA MIPS

TGH07 - Chytré stromové datové struktury

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Kubatova Y36SAP 8. Strojový kód Jazyk symbolických instrukcí asembler JSA pro ADOP a AVR Kubátová Y36SAP-strojový kód 1

Popis instrukční sady procesoru ADOP

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Algoritmizace prostorových úloh

Jednočipové mikropočítače

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

Základy algoritmizace a programování

2. lekce Algoritmus, cyklus Miroslav Jílek

IMTEE Přednáška č. 11

Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort.

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Digitální učební materiál

Sada 1 - Základy programování

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ , 5.1 a 5.2 8/14

Struktura a architektura počítačů (BI-SAP) 7

Zadání k 2. programovacímu testu

REGRESNÍ ANALÝZA V PROSTŘEDÍ MATLAB

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 10

Strojový kód. Instrukce počítače

PK Design. EVMS-mega128 v1.0. Výukové příklady. Výuková deska s mikrokontrolerem ATmega128. Verze dokumentu 1.0 ( )

Šablony, kontejnery a iterátory

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Programování v C++ 2, 4. cvičení

Poslední nenulová číslice faktoriálu

Časová složitost algoritmů

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Přerušení POT POT. Přerušovací systém. Přerušovací systém. skok do obslužného programu. vykonávaný program. asynchronní událost. obslužný.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Definice 7.2. Nejmenší přirozené číslo k, pro které je graf G k-obarvitelný, se nazývá chromatické číslo (barevnost) grafu G a značí se χ(g).

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

ALGORITMIZACE PROGRAMOVÁNÍ VT3/VT4

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

PODPROGRAMY PROCEDURY A FUNKCE

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

INFORMATIKA. Vybrané podposloupnosti

Lineární datové struktury

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

Algoritmizace prostorových úloh

6 Příkazy řízení toku

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Watkinsův algoritmus řádkového rozkladu

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Algoritmus Minimax. Tomáš Kühr. Projektový seminář 1

Algoritmus pro hledání nejkratší cesty orientovaným grafem

1 Úvod do Turbo Pascalu

VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, Varnsdorf PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY

Přerušovací systém s prioritním řetězem

IB111 Úvod do programování skrze Python

Transkript:

Universita Pardubice Fakulta elektrotechniky a informatiky Mikroprocesorová technika Semestrální práce Jméno: Chmelař Pavel Datum: 14. 5. 2008

Úkol: Příklad č. 1 V paměti dat je uložen blok 8 b čísel se znaménkem. Sestavte program, který tato čísla srovná sestupně podle velikosti. Pro řazení použijte algoritmus Select Sort. Řazení bude napsáno jako podprogram se dvěma parametry adresa začátku bloku dat a jeho délka. Sellect short: Principem tohoto řazení je výběr mezního prvku (maximum nebo minimum) z tříděné posloupnosti a jeho záměna s prvním (posledním) prvkem. V dalším kroku máme pole o (n-1) prvcích a opakujeme totéž. Takto postupujeme až do úplného seřazení posloupnosti. Získaná posloupnost bude seřazená vzestupně v případě, že budeme vybírat z nesetříděné posloupnosti nejmenší prvek a zařadíme ho na začátek posloupnosti, a sestupně v případě, že vybereme největší prvek z nesetříděné posloupnosti a zařadíme ho na začátek. Při tomto řazení se vlastně setříděná část pole postupně zvětšuje a nesetříděná část naopak zmenšuje. Algoritmus končí v případě, že nesetříděná část již neobsahuje žádný prvek. Tato metoda je vnitřní, přímá a jednoduchá. Nevýhodou tohoto algoritmu je, že jestliže se na vstupu nachází již částečně setříděná posloupnost, algoritmus to nerozlišuje a proběhne v maximálním počtu koků. Princip činnosti řazení sestupně, čísla se znaménkem ve dvojkovém doplňku: Složitost: 1. V poli nalezneme prvek s největší hodnotou a zapamatujeme si jeho pořadí 2. Vyměníme tento prvek s prvkem na prvním místě 3. Postupně opakujeme body 1. a 2. nad zbývající, nesetříděnou částí pole Složitost algoritmu SelectSort je O(n 2 ). Implementace: Použití: 1) Z paměti programu se nahrají čísla k srovnání do paměti dat 2) Před voláním metody se musí nahrát parametr délky pole do příslušného registru a pointer Y se musí inicializovat na začátek pole v paměti (pole[0]) 3) Zavolat podprogram SelSort 2

Vývojový diagram: SelSort Z = pole[1] rcount1 = pocet rcount2 = pocet -1 rtemp1 = pole[0] rpocet = N + 2 If( rcount2!= 0 ) rtemp2 = pole[y] rcislo = Z++ rpozice++ If(rCislo > rtemp rtemp = rcislo rpozmax = rpozice rpozmax += rcount3 rcount2-- If( rcount2 = 0 ) If(rTemp1 > rtemp2 ) Z = rpozmax rtemp2 = pole[y] pole[z] = rtemp2 pole[y] = rtemp1 rpozice = rpocet rpozice - = rcount1 Z = rpozice rtemp1 = pole[++y] rpozmax, rpozice = 0 rcount2 = rcount1-2 rcount3++ rcount1-- If(rCount1) = 0 return 3

Tabulka použitých registrů: Registr: Pojmenování: Funkce: r16 rtemp1 pomocný registr v metodě r17 rtemp2 pomocný registr v metodě r18 rpozice počítadlo pozice r19 rpozmax pozice prvku maximální velikosti r20 rcount1 počítadlo hlavního cyklu r21 rcount2 počítadlo vedlejšího cyklu r22 rcount3 počítadlo hlavního cyklu + výpočet pozice prvku r23 rcislo pomocný registr v metodě (vnořený cyklus) r24 rpocet parametr délky pole Slovní popis algoritmu: 1) Po zavolání metody se pointer Z nastaví na adresu pole[1], rcounter2 pro vnořený cyklus se nastaví na hodnotu počet 1 prvků pole, rcounter1 se nastaví na hodnotu počtu prvků pole a do rtemp1 se uloží hodnota pole[1]. rpozice se nastaví na N+2. 2) Následuje test hodnoty rcount2, která se porovná s nulou a jestliže je tato hodnota větší, tak se spustí vnořený cyklus, jinak se skočí na konec celé metody, protože nejsou prvky k srovnání. 3) Těsně před vnořeným cyklem se nejprve zapíše do rtemp2 hodnota prvku pole, na které ukazuje pointer Y, poté se už v cyklu do rcislo uloží hodnota pole, na kterou ukazuje pointer Z a následně se zvětší o jedničku a rpozice se také zvětší o jedničku. 4) Dále se porovnají hodnoty rcislo s rtemp1 a jestliže je rcislo větší, poté se zapíše do rtemp jeho hodnota a do rpozmax se zapíše rpozice + rcount3. Dekrementuje se hodnota rcount2, proces se opakuje, dokud se neprojde celé zbývající pole. 5) Nyní následuje porovnání hodnot rtemp1 s rtemp2 a jestliže se tyto hodnoty od sebe neliší, přeskočí se prohazovací proces mezi prvky, jinak se pokračuje dál na výměnu prvků 6) Pointer Z se nastaví na pozici maximálního prvku v poli, do rtemp2 se zapíše prvek pole, na které ukazuje pointer Y a rtemp2 se zapíše na pozici pointru Z, rtemp1 na pozici Y 7) Následuje procedura přípravy na další cyklus, tzn. pozice pointru Y se zvýši o jedničku, jeho hodnota se zapíše do rtemp1. Pomocí rcount1 se vypočítá hodnota rcount2 a pointru Z, aby ukazoval o jednu adresu v paměti výš, než pointer Y. Zvětší se o jedničku rcount3. 8) Nakonec se porovná hodnota rcount1 s nulou, jestliže je hodnota větší jak nula, cyklus se opakuje od bodu 2), jinak je pole srovnané a navrací se zpět do hlavního programu 4

Rozbor fint : 1) Před vnořeným cyklem se do rtemp2 zapíše hodnota prvku pole, na které ukazuje pointer Y a po projití vnořeného cyklu se tato hodnota porovná s hodnotou rtemp1, do které se ve vnořeném cyklu ukládá hodnota největšího prvku pole. Jestliže jsou stejné tak se přeskočí vyměňovací procedura, tím se ušetří čas a třídění probíhá značně kratší dobu, než kdyby se stejné prvky musely nesmyslně mezi sebou vyměnit. Díky tomuto porovnání obecně platí, čím je pole více srovnané, tím menší dobu trvá třídění. Jedinou nevýhodou tohoto principu je, že když se přerovnávají všechny prvky v poli, trvá celé třídění o něco déle než bez použití této testovací podmínky. 2) Registr pojmenovaný rcount3 slouží jako pomocné počítadlo, které čítá, kolikrát proběhl základní cyklus a toho se využívá při výpočtu pozice, na které se nachází prvek s nejvyšší hodnotou. Pole, které se prochází, se postupně zmenšuje, protože není třeba kontrolovat srovnané prvky. Proto se ve vnořeném cyklu k rpozmax (maximální prvek zmenšeného pole) přičte tato hodnota rcount3 a výsledkem je správná pozice prvku v rozsahu celého pole. 3) Registr pojmenovaný rpozice slouží, k počítání pozice, kde se nacházíme v postupně zmenšujícím poli ve vnořeném cyklu vlivem třídění. Jestliže je hodnota rcislo větší než rtemp, dojde k zápisu rcislo do rtemp a rpozice ukazuje pozici nejvyššího prvku zmenšeného pole, následně se tedy zapíše do rpozmax. 4) Celá metoda funguje na principu, že pointer Y ukazuje zpočátku na první prvek pole (pole[0]) a pointer Z ukazuje vždy na prvek pole o jeden větší. Ve vnořeném cyklu se projde pole, od pozice, kam ukazuje pointer Z, až dokonce a najde se nejvyšší prvek, zapamatuje se jeho pozice, díky této získané pozici se nastaví pointer Z na hodnotu nejvyššího prvku v poli. Poté dojde výměně mezi menším a větším prvkem. Následně se na další cyklus připraví pointer Y, aby ukazoval na prvek o jednu hodnotu větší než v předešlém cyklu a pomocí rpocet, rcount1 se dopočítá pozice pointru Z, aby ukazoval na prvek o jednu větší než pointer Y. 5

Program:.include "m32def.inc" // konstanty ATmega32 //konstanty.equ N = 6 // Pocet prvku pole //registry.def rtemp1 = r16 // pomocny registr v metode.def rtemp2 = r17 // pomocny registr v metode.def rpozice = r18 // pocitadlo pozice.def rpozmax = r19 // pozice prvku maximalni velikosti.def rcount1 = r20 // pocitadlo hlavniho cyklu.def rcount2 = r21 // pocitadlo vedlejsiho cyklu.def rcount3 = r22 // pocitadlo hlavniho cyklu + vypocet pozice prvku.def rcislo = r23 // pomocny registr v metode (vnoreny cyklus).def rpocet = r24 // parametr delky pole //promene ve SRAM.dseg pole:.byte N // promena pole[n] //program.cseg.org 0X0000 start: // nacitani cisel z pameti programu ldi ZL, LOW(cisla << 1) // nastaveni pointru Z na cisla ldi ZH, HIGH(cisla << 1) ldi YL, LOW(pole) // nastaveni pointru Y na pozici pole ldi YH, HIGH(pole) ldi rtemp1, N // pocitadlo cyklu vyplnovani plneni: lpm r0, Z+ // r1 = Z++ st Y+, r0 // Y++ = r1 dec rtemp1 // rtemp-- brne plneni // if(rcount2!= 0) skok na plneni // priprava volani metody ldi r16, LOW(RAMEND) // inicializace zasobniku (Stack Pointer) out SPL, R16 ldi r16, HIGH(RAMEND) out SPH, R16 ldi rpocet, N // parametr delka pole ldi YL, LOW(pole) // nastaveni pointru Y na pozici pole ldi YH, HIGH(pole) rcall SelShort // volani metody SelShort + aktualni PC do zasobniku 6

end: rjmp end // nekonecna smycka SelShort: // nastaveni parametru pro spravnou funkci metody push rtemp1 // kvuli uchovani hodnot registru po metode push rtemp2 push rpozice push rpozmax push rcount1 push rcount2 push rcount3 push rcislo push rpocet push ZL push ZH ldi ZL, LOW(pole+1) // nastaveni pointru Z na pozici pole+1 ldi ZH, HIGH(pole+1) // (pomocne pole ve vnorenem cyklu) dec rpocet // nastaveni pozic countru 1 a 2 mov rcount2, rpocet // rcount2 = rpozice - 1 (pro vnoreny cyklus) inc rpocet mov rcount1, rpocet // nastaveni rpozice rcount1 (rcount1 = rpozice) inc rpocet inc rpocet // nastaveni rpozice pro dalsi vypocty ld rtemp1, Y // pole[0] = rtemp1 zakladni: // zakladni cyklus cpi rcount2,0 // porovnani rcount2 s 0 breq konec // if(rcount2 == 0) skok na konec ld rtemp2, Y // rtemp2 = pole[y] (pro porovnani po cyklu) vnoreny: // vnoreny cyklus ld rcislo, Z+ // rcislo = pole[z++] inc rpozice // rpozice++ cp rcislo, rtemp1 // porovnani cisla s rtemp1 brlt pokrac // if(rcislo < rtemp1) skok na pokrac mov rtemp1, rcislo // rtemp1 = rcislo mov rpozmax, rpozice // rpozmax = rpozice add rpozmax, rcount3 // rpozmax += rcount3 (spravna rpozice max. prvku) pokrac:dec rcount2 // rcount2-- brne vnoreny // if(rcount2!= 0) skok na vnoreny // nastaveni pointu Z pro vymenu prvku a nasledna vymena, pripadny skok cp rtemp1,rtemp2 // porovnani rtemp1, rtemp2 breq skok // if(rtemp1==pemp2) skok na skok ldi ZL, LOW(pole) // nulovani pointru Z (pole[z] = pole[0]) ldi ZH, HIGH(pole) add ZL, rpozmax // pole[z] = Z + pole[rpozmax] adc ZH, r1 // ZH += carry (ZH += 0 + carry) ld rtemp2, Y // rtemp2 = pole[y] st Z, rtemp2 // pole[z] = rtemp2 st Y, rtemp1 // pole[y] = rtemp1 // priprava na dalsi cyklus 7

skok: ldi ZL, LOW(pole) // nulovani pointru Z (pole[z] = pole[0]) ldi ZH, HIGH(pole) mov rpozice, rpocet // rpozice = rpocet sub rpozice, rcount1 // rpozice -= rcount1 add ZL, rpozice // pole[z] = Z + pole[rpozice] adc ZH, r1 // ZH += carry (ZH += 0 + carry) ld rtemp1, Y+ // nataveni pointru Y rtemp1 = pole[y++] ld rtemp1, Y // rtemp1 = pole[y] ldi rpozmax,0 // rpozmax = 0 ldi rpozice,0 // rpozice = 0 mov rcount2, rcount1 // vypocet rcount2 (rcount2 = rcount1) subi rcount2, 2 // rcount2 -= 2 inc rcount3 // rcount3++ konec: dec rcount1 // rcount1-- brne zakladni // if(rcount1!= 0) skok na zakladni pop ZH // stav registru pred metodou pop ZL pop rpocet pop rcislo pop rcount3 pop rcount2 pop rcount1 pop rpozmax pop rpozice pop rtemp2 pop rtemp1 ret // navrat z metody na pozici PC ze zasovniku cisla:.db 2,-15,55,-100,39,6 // ulozena cisla v ROM 8