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

Podobné dokumenty
PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 10

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

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

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

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

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

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

Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.

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

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

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

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

Princip funkce počítače

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

Programování PICAXE18M2 v Assembleru

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

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

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

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

Paměti a jejich organizace

Assembler - 5.část. poslední změna této stránky: Zpět

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

Implementace LL(1) překladů

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

5 Přehled operátorů, příkazy, přetypování

ISU Cvičení 7. Marta Čudová

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

Vysoká škola chemicko-technologická v Praze Fakulta chemicko-inženýrská Ústav počítačové a řídicí techniky. Aplikace mikroprocesorů.

ANOTACE vytvořených/inovovaných materiálů

Algoritmizace a programování

Algoritmy a datové struktury

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

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

6 Příkazy řízení toku

Standardní algoritmy vyhledávací.

10 Algoritmizace Příklad 2 Word 2007/ VBA

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ý.

Klimatizace. Třída: 4.C. Střední Průmyslová Škola Elektrotechnická Havířov Protokol do MIT. Skupina: 3. Zpráva číslo: 3

Algoritmizace a programování

Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

Lekce 01 Úvod do algoritmizace

Assembler - 2.část. poslední změna této stránky: Zpět

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

2. lekce Algoritmus, cyklus Miroslav Jílek

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Jazyk symbolických adres

- funkce, které integrujete aproximujte jejich Taylorovými řadami a ty následně zintegrujte. V obou případech vyzkoušejte Taylorovy řady

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Zvyšování kvality výuky technických oborů

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

Modul řízení otáček stejnosměrného motorku

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Více o konstruktorech a destruktorech

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

setup() { I = 0; } loop() { I = I + 1; }

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

2. úkol MI-PAA. Jan Jůna (junajan)

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

Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Jednoduché cykly

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

zení Koncepce připojení V/V zařízení POT POT ... V/V zařízení jsou připojena na sběrnici pomocí řadičů. Řadiče Připojení periferních zařízení

Textové, datumové a časové funkce

8 Třídy, objekty, metody, předávání argumentů metod

Řízení IO přenosů DMA řadičem

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Pointery II. Jan Hnilica Počítačové modelování 17

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

Lineární spojový seznam (úvod do dynamických datových struktur)

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

Katedra informatiky a výpočetní techniky. 10. prosince Ing. Tomáš Zahradnický doc. Ing. Róbert Lórencz, CSc.

Obr. P1.1 Zadání úlohy v MS Excel

ZADÁNÍ Č. 6 ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA APLIKOVANÝCH VĚD KATEDRA INFORMATIKY A VÝPOČETNÍ TECHNIKY

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

Algoritmizace řazení Bubble Sort

Návod k obsluze trenažéru

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

MPASM a IDE pro vývoj aplikací MCU (Microchip)

programátorský manuál

AUTOMATIZACE Úvod do programování PLC

Zpráva o průběhu přijímacího řízení na vysokých školách dle Vyhlášky MŠMT č. 343/2002 a její změně 276/2004 Sb.

Programování v jazyku LOGO - úvod

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

Výukový materiál zpracován v rámci projektu EU peníze školám

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

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

Principy komunikace s adaptéry periferních zařízení (PZ)

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

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Transkript:

UNIVERZITA TOMÁŠE BATI VE ZLÍNĚ FAKULTA APLIKOVANÉ INFORMATIKY PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 3 Podprogramy a práce se zásobníkem Jan Dolinay Petr Dostálek Zlín 2013 Tento studijní materiál vznikl za finanční podpory Evropského sociálního fondu (ESF) a rozpočtu České republiky v rámci řešení projektu: MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD

2 Cvičení 3 Podprogramy a práce se zásobníkem STRUČNÝ OBSAH CVIČENÍ: Vysvětlení principu podprogramů a jejich použití, souvislost se zásobníkem Řešený proklad podprogram pro určení, zda je číslo sudé Řešený příklad počítání sudých čísel v poli Úkoly k procvičení VSTUPNÍ ZNALOSTI: Toto cvičení předpokládá znalosti získané na předchozím cvičení. CÍL: V tomto cvičení se naučíme pracovat se zásobníkem a vytvářet podprogramy, což nám usnadní tvorbu složitějších programů v budoucnu. Díky využití podprogramů budeme moci vytvářet knihovny znovupoužitelných programových modulů. Cvičení se vztahuje k těmto otázkám Funkce a ovládání zásobníkové paměti, instrukce pro práci se zásobníkem u mikropočítače HC08 Makroinstrukce a podprogramy, princip, použití, příklady

3 1. Řešené příklady Program 1 Podprogram pro určení, zda je číslo sudé Úkol: Vytvořte podprogram JeSude, který určí, jestli je zadané číslo sudé. Vstupním parametrem bude číslo v registru A, výsledkem je v registru A číslo 1, jestliže bylo zadané číslo sudé, 0 jestliže nebylo sudé. Podprogram využijte v programu, který určí kolik z čísel c1 a c2 je sudých - tedy zda žádné, jedno nebo obě. Poznámka: Návratovou hodnotu podprogramu JeSude jsme úmyslně zvolili tak, že jestliže je předané číslo sudé, vrací podprogram 1, protože jednička má v kombinační logice význam pravda (true). Jestliže není číslo sudé vrací nulu což je hodnota pro nepravdu, (false). Můžeme tedy při použití podprogramu jako pomůcku uvažovat, že se podprogramu JeSude ptáme, zda zadané číslo je sudé. Jestliže ano, dostaneme odpověď 1, pravda. Řešení Zda je číslo sudé určíme tak, že číslo vydělíme dvěma a jestliže je zbytek po celočíselném dělení nulový, číslo je sudé (je dělitelné dvěma beze zbytku). Algoritmus pro podprogram JeSude lze tedy slovně zapsat takto: Vydělíme předané číslo dvěma Porovnáme zbytek s nulou Jestliže je zbytek roven nule, do registru A vložíme 1 viz zadání úkolu, 1 = je sudé a ukončíme podprogram. V opačném případě vložíme do registru A nulu a ukončíme podprogram. Vývojový diagram a odpovídající kód je na následujícím obrázku.

4 Obr. 1 Vývojový diagram a kód podprogramu JeSude. Hlavní program má určit počet sudých čísel pomocí podprogramu, který jsme už napsali. Pro jednoduchost pouze ze dvou čísel, tj. z čísel c1 a c2. V hlavním programu proto budeme používat počitadlo, které se zvětší o jedna tehdy, jestliže při testu některého z čísel zjistíme, že je sudé. V programu se nejprve vynuluje toto počitadlo sudých čísel. Poté se testuje, jestli je c1 sudé číslo. Pokud ano, inkrementujeme počítadlo sudých čísel. Následuje test c2 a opět, jestliže je toto číslo sudé, inkrementuje se počitadlo sudých čísel. Jestliže tedy není ani c1 ani c2 sudé, projde program rovně dolů vývojovým diagramem a v počitadle sudých zůstane nula. Bodově můžeme hlavní program popsat takto: Vynuluje se počitadlo sudých čísel Do registru A vloží číslo c1 (argument podprogramu JeSude) Provede skok do podprogramu JeSude Porovná obsah registru A (návratovou hodnotu podprogramu) s 1. Jestliže je návratová hodnota rovna 1 (což znamená že c1 je sudé), inkrementuje se počitadlo sudých čísel. Do registru A se nahraje c2. Provede se skok do podprogramu JeSude atd. Postup pro c2 je stejný jako pro c1. Vývojový diagram a odpovídající kód je na následujícím obrázku.

5 Obr. 2 Vývojový diagram a kód hlavního programu pro testování podprogramu JeSude. Potřebné instrukce LDHX nahraje 2-bajtové číslo z paměti do registru H:X CMP porovná obsah A s paměťovou buňkou: (A) (M) BEQ skočí na zadané návěští pokud číslo v akumulátoru A je rovno číslu v paměťové buňce (M). BNE opak BEQ, skočí pokud není rovno. INC inkrementuje obsah zadané paměťové buňky: M (M) + 1 PSHH uloží registr H na zásobník PULA načte do reg. A hodnotu ze zásobníku BRA skočí vždy (bez podmínky) na zadané návěští JSR skok do podprogramu RTS návrat z podprogramu Vysvětlení programu Nejprve se zabývejme podprogramem JeSude. Srovnáme-li vývojový diagram v levé části obrázku 3.4 se slovním popisem algoritmu výše, měla by být zřejmá souvislost. V pravé části obrázku jsou jednotlivé bloky vývojového diagramu přepsány do assembleru pro procesor HC08. Základem podprogramu je instrukce pro dělení - DIV, která vydělí 16-bitové číslo uložené v registrech H:A (tedy horní bajt čísla v registru H a dolní v registru A) číslem uloženým v registru X. Výsledek po celočíselném dělení pak vloží do registru A, a zbytek po

6 dělení do registru H. (jedná se o celočíselné dělení. Procesor HC08 neumí pracovat s reálnými čísly). Např. při dělení čísla 5 číslem 2, tedy: 5 / 2 bude v registru A výsledek = 2 a v registru H bude zbytek 1. (5/2 = 2, zbytek 1). Instrukce DIV je v instrukční sadě popsána takto: DIV: A <- (H:A) / (X), H <- zbytek Podívejme se nyní na kód programu odpovídající jednotlivým blokům vývojového diagramu na obr. 2. Podprogram JeSude dostane v registru A číslo, které má testovat. Jestliže je toto číslo sudé, (ANO), má podle zadání umístit do registru A číslo 1. Jestliže číslo není sudé, má do registru A umístit číslo 0. Blok porovnání je nejsložitější, protože provádí dělení. Již víme, že instrukce pro dělení DIV dělí číslo v registru H:A číslem v registru X. Výsledek dělení bude v registru A, zbytek v reg. H. Náš podprogram ovšem dostává jako vstupní parametr pouze registr A tj. spodní byte čísla, které pro dělení použije instrukce DIV. Horní byte, registr H musí být proto nulový (tak aby se dělilo skutečně jen číslo v registru A, a nikoliv i případná hodnota v registru H. Proto před dělením vynulujeme instrukcí CLRH obsah registru H. Poté do registru X nahrajeme číslo 2, tj. číslo kterým budeme dělit. V reg. A už máme číslo, které chceme testovat, takže můžeme provést dělení instrukcí DIV. Po vykonání instrukce DIV potřebujeme otestovat jestli je zbytek po dělení roven nule. K tomu použijeme instrukci pro porovnání CMP. Ta ovšem porovnává registr A, a paměťovou buňku. Přitom ale zbytek po dělení je v registru H (viz popis instrukce DIV výše). Proto musíme zbytek přesunout z registru H do registru A. Uděláme to s pomocí zásobníku: obsah registru H uložíme na zásobník instrukcí PSHH a uloženou hodnotou pak naplníme registr A pomocí instrukce PULA. Pak už můžeme obsah reg. A porovnat instrukcí CMP s nulou. Skok BNE se v našem případě provede tehdy, jestliže číslo v reg. A není rovno nule (tedy jestliže zbytek po dělení nebyl nula), tj. jestliže je číslo liché. V případě, že se skok provede (číslo je liché) se proto v následujícím kódu do registru A nahrává nula návratová hodnota. Jestliže se skok neprovede, nahraje se do registru A číslo 1 (návratová hodnota pro případ sudého čísla). Poté se instrukcí BRA provede skok na konec podprogramu. Skok BRA je zde nutný, jinak by program pokračoval následující instrukcí, což je nahrání nuly do registru A. Takový podprogram by pak vracel vždy nulu bez ohledu na vstupní parametr. Hlavní program provede nejprve nulování počitadla sudých čísel a to instrukcí CLR (clear). Proměnná je pojmenovaná nsude.

7 Test zda je číslo sudé provádíme pomocí podprogramu JeSude. Tento podprogram má jako vstupní parametr číslo, které chceme testovat v registru A. Proto před skokem do něj nahráváme číslo c1 do registru A (instrukcí LDA). Poté zavoláme podprogram instrukcí JSR JeSude. Podprogram vrátí v reg. A číslo 1 jestliže zadané číslo bylo sudé. Porovnáme toto vrácené číslo (návratovou hodnotu) s číslem 1 pomocí instrukce CMP. Jestliže je vrácené číslo rovno 1, provede se skok instrukcí BEQ (BEQ = skoč jestliže je rovno) na návěští Pricti1, kde se inkrementuje počitadlo nsude. Jestliže se skok BEQ neprovede, provede se nepodmíněný skok BRA, který přeskočí inkrementaci a pokračuje další částí programu, kde se testuje číslo c2. Postup testování c2 je stejný jako u c1. Na konci hlavního programu bude v proměnné nsude číslo 0, 1 nebo 2 podle toho zda není sudé žádné z obou čísel, jedno z nich nebo obě. Kód programu Na následujícím výpisu je uveden kompletní zdrojový kód programu. Pozor na umístění na správné místo v kostře programu, kterou vygeneroval CodeWarrior, tj. data programu (proměnné) do Data section a kód programu do Code section. Podprogram JeSude umístěte na úplný konec zdrojového souboru. ; variable/data section MY_ZEROPAGE: SECTION SHORT c1 DS.B 1 c2 DS.B 1 nsude DS.B 1 ; code section MyCode: SECTION main: LDHX # SEG_END_SSTACK ; initialize the stack pointer TXS CLI ; enable interrupts mainloop: NOP MOV #8,c1 MOV #3,c2 ; inicializace promennych CLR nsude ; nuluj pocet sudych cisel LDA c1 ; priprava parametru pro podprogram JeSude JSR JeSude ; volani podprogramu JeSude CMP #1 ; vratil podprogram jednicku? (je cislo sude?) BEQ Pricti1 ; pokud je sude, inkrementuj pocitadlo BRA Skok1 ; pokud ne, preskoc inkrementaci a testuj ;dalsi cislo Pricti1 INC nsude ; nsude = nsude + 1 Skok1 LDA c2 ; totez pro druhe cislo JSR JeSude

8 CMP #1 BEQ Pricti2 BRA Skok2 Pricti2 INC nsude Skok2 NOP ; konec programu BRA mainloop ;------------------------------------------------------ ; Podprogram JeSude ; VSTUP: reg.a - cislo, ktere su bude testovat ; VYSTUP: reg.a: 1 = cislo je sude, 0 = cislo je liche ;------------------------------------------------------ JeSude CLRH ; vynulujem registr H LDX #2 ; budeme delit 2 DIV PSHH ; uloz zbytek na zasobnik (chceme dostat H- >A) PULA ; nactu do A hodnotu ze zasobniku CMP #0 ; je zbytek po deleni 0? BNE Liche ; neni-li, cislo je liche LDA #1 ; v opacnem pripade je sude BRA Konec Liche CLRA ; liche cislo, v A vracime 0 Konec RTS Testování programu Program přeložíme a spustíme. Nejčastější chyby: Zkopírován a vložen ze vzorového programu celý jeho obsah i s kódem, který už v kostře aplikace byl. Některá návěští se pak v programu vyskytují dvakrát. Není vložen kód z druhého (zeleného) pole tj. definice proměnných. Není vložen kód podprogramu Návěští (tj. jméno podprogramu) je odsazeno od levého okraje řádku. Vyzkoušíme program odkrokovat. Se zadanými čísly c1 = 8 a c2 = 3 by měl být výsledek v proměnné nsude roven 1 (jedno sudé číslo). Vyzkoušejte nyní také tlačítko simulátoru Step over (krok přes). To, na rozdíl od dosud používaného tlačítka Single Step, neprovede skok dovnitř podprogramu, ale provede celý podprogram v jediném kroku - jakoby to byla jediná instrukce. To je výhodné pokud už máme podprogram odladěn, víme tedy že funguje a nemusíme jej při každém použití krokovat.

9 Sami vyzkoušejte v simulátoru následující: Výsledek pro různé hodnoty c1 a c2 Krokování dovnitř podprogramu tlačítkem Single Step. Krokování přes podprogram tlačítkem Step Over. Obsah registru A po návratu z podprogramu JeSude jestliže předané číslo bylo/nebylo sudé. Pro sudé číslo bude v reg A číslo 1, pro liché č. 0. Program 2 Využití podprogramu v cyklu Úkol: Podprogram JeSude z minulého příkladu použijte v programu, který určí počet sudých čísel v poli data o šesti prvcích. Počet sudých čísel uložte do proměnné sud. Řešení Princip: v cyklu projdeme prvky pole a pro každý zavoláme podprogram JeSude pro určení zda je daný prvek sudé číslo. Pokud jste už zapomněli základní principy práce s polem, podívejte se nejprve do předchozí kapitoly na program pro nulování pole. Slovně bychom mohli činnost programu pro určení počtu sudých čísel v poli popsat takto: Vynuluje se počitadlo sudých čísel Podprogramu JeSude se předá první prvek pole Otestuje se návratová hodnota podprogramu JeSude. Jestliže bylo předané číslo sudé, inkrementuje se počitadlo Posuneme se na další prvek pole Testujeme, jestli už jsme prověřili všechny prvky pole. Jestliže ne, opakujeme volání JeSude s aktuálním prvkem pole a opět inkrementujeme počitadlo jestliže tento prvek je sudé číslo Tento popis je ovšem příliš lidský, neurčitý. Přesnější popis s ohledem na princip programování v assembleru je zachycen na vývojovém diagramu na následujícím obrázku.

10 Obr. 3 Vývojový diagram programu pro počítání sudých čísel v poli Nejprve nastavujeme do registru H:X (index registr) adresu pole viz minulá lekce o cyklech a polích. Také nulujeme počitadlo cyklů, které slouží k tomu, abychom cyklus ukončili po zpracování všech prvků pole. Blok zpracuj aktuální prvek má zde význam: zjisti jestli je aktuální prvek sudé číslo a pokud ano, inkrementuj počitadlo sudých čísel. Posun na další prvek se provede inkrementací obsahu index registru (instrukce AIX). Poté se testuje, zda už je zpracováno všech šest prvků pole. Jestliže ne, vrací se program na začátek cyklu a zpracovává další prvek. Možná jste si všimli, že vývojový diagram je stejný jako u příkladu na nulování pole v minulé kapitole. Diagram je totiž obecný pro prakticky libovolnou operaci s prvky pole. Blok Zpracuj aktuální prvek pole totiž v sobě skrývá celou akci, která se má s prvkem pole vykonat, ať už je to nulování nebo zjištění zda je sudý a inkrementace počitadla. Ostatní bloky tedy vlastně představují režii, pomocné operace, nezbytné pro práci s polem. V kódu se nahrává aktuální prvek pole do registru A pomocí instrukce LDA,X, tedy používáme indexové adresování. V index registru (H:X) je adresa začátku pole. Připomeňme si, že podprogram JeSude vrací 1, jestliže jsme mu v registru A (kam vždy nahráváme aktuální prvek pole) předali sudé číslo. V tom případě se zde neprovede skok BNE, protože to je skok jestliže není rovno. Tedy jestliže je číslo sudé, skok se neprovede a inkrementuje se proměnná sud pomocí instrukce INC sud. Jestliže je číslo liché, skok se provede a tím se inkrementace přeskočí.

11 Následuje inkrementace index registru instrukcí AIX #1 čímž se adresa aktuálního prvku pole v registru H:X zvětší o jedničku a tudíž při opakování cyklu už instrukce LDA,X nahraje do registru A další prvek pole. Také se inkrementuje počitadlo cyklů v proměnné citac. Obsah této proměnné se následně nahraje do registru A k porovnání s počtem prvků pole (s číslem 6). Jestliže je čítač menší než 6, provede se skok BLO (skoč jestliže je menší) na začátek cyklu a kód se opakuje pro další prvek pole. Na následujícím výpisu je kód podprogramu JeSude. Všimněme si červeně orámovaných změn oproti minulé verzi tohoto podprogramu. Jedná se o uložení obsahu registrů H a X na začátku programu na zásobník a jejich obnovení na konci, před instrukcí RTS. Proč se tyto registry musejí v podprogramu ukládat? Obr. 4 Úprava podprogramu JeSude Sledujte kód hlavního programu na předchozím obrázku. Do registru H:X nahráváme adresu začátku pole a z této adresy pak vždy v průběhu cyklu nahráváme aktuální prvek pole instrukcí LDA,X. Spoléháme tedy na to, že registr H:X obsahuje vždy adresu aktuálního prvku pole. Tuto adresu také zvětšujeme uvnitř cyklu instrukcí AIX. Jestliže by ale podprogram JeSude registr H:X neuložil, při jeho zavolání by byla adresa aktuálního prvku pole ztracena protože podprogram JeSude registr H:X využívá (v H je zbytek po dělení, do X nahrává dělitele atd.). Je tedy třeba aby podprogram vrátil registr H:X se stejným obsahem, s jakým jej dostal. K tomu stačí na začátku uložit registry H a X na zásobník a na konci podprogramu je ze zásobníku obnovit, tak jak je to provedeno na výpisu na obr. 4.

12 ; code section MyCode: SECTION main: LDHX # SEG_END_SSTACK ; initialize the stack pointer TXS CLI ; enable interrupts mainloop: NOP MOV #3,data MOV #1,data+1 MOV #5,data+2 MOV #8,data+3 MOV #2,data+4 MOV #3,data+5 ; inicializace dat v poli CLR sud CLR citac LDHX #data ; adresa pole data do H:X opakuj LDA,x ; nacti do A prvek pole dany adresou v H:X JSR JeSude CMP #1 ; je cislo sude? BNE preskoc ; pokud ne, preskoc inkrementaci sud INC sud preskoc AIX #1 ; prejdi na dalsi prvek pole INC citac ; citac = citac + 1 LDA citac CMP #pocet ; jsme na konci pole? BLO opakuj ; pokud je citac<pocet, skoc na opakuj BRA mainloop Obr. 5 Zdrojový kód hlavního programu Testování programu Po překladu program vyzkoušejte a prohlédněte si v simulátoru následující: Výsledek v proměnné sud po proběhnutí programu Hodnotu v registru A vždy po nahrání aktuálního prvku a pak po návratu z podprogramu (použijte tlačítko Step over). Obsah registru A po návratu z podprogramu JeSude jestliže předané číslo bylo/nebylo sudé. Pro sudé číslo bude v reg A číslo 1, pro liché č. 0. Krokování dovnitř podprogramu tlačítkem Single Step a uložení a obnovení obsahu H:X.

13 Poznámka: Pole jako parametr podprogramu Pokud bychom chtěli podprogram, který by zpracoval sám celé pole a vrátil rovnou např. počet sudých nebo lichých čísel v něm, narazíme na otázku jak podprogramu předat pole. Samozřejmě by bylo zbytečné předávat podprogramu celé pole např. jeho zkopírováním na zásobník. Raději předáme jen adresu začátku pole. Nejjednodušší je předat ji přímo v registru H:X tj. v index registru. Podprogram pak pracuje s tímto registrem obvyklým způsobem pro indexové adresování. Aby byl podprogram univerzální, použitelný pro pole různých rozměrů (ať už ve stejném programu nebo v nějakém jiném), musíme mu také předat počet prvků pole. Příklady k procvičení Obr. 6 princip předání pole jako parametru do podprogramu 1. Vytvořte podprogram, který sečte dvě čísla a výsledek vrátí v registru A. Vstupní parametry dostane v registru A a X. 2. Vytvořte podprogram, který spočítá lichá čísla v předaném poli. Adresa pole se předá v registru H:X, počet prvků v registru A. Podprogram vrátí počet lichých čísel v reg. A. Pak napište program, který pomocí zadaného podprogramu určí počet lichých čísel v poli data s pěti prvky. Pole můžete inicializovat na libovolné hodnoty. 3. Pomocí stejného podprogramu se pokuste spočítat počet bajtů v paměti mikropočítače, které obsahují lichá čísla v paměti od adresy $182C v rozsahu 10 bajtů. Poznámka: od této adresy začíná v paměti kód našeho programu) Doplňující zdroje [1] Freescale: Firemní dokumentace pro mikropočítače HCS08, dostupné online: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=s08gb&nodeid= 01624684491437EDD5