Department of Computer Science and Engineering Language/Codepage <a href='/~arnost/vyuka/soj/projekt.html.cs'>
 

SOJ - Zadání projektu

Název:Implementace algoritmů v jazyce symbolických instrukcí
Datum zadání:16. listopadu 2000
Datum odevzdání:15. prosince 2000
Hodnocení:20 bodů

Popis

Smyslem tohoto projektu je naučit se vytvářet jednoduché algoritmy v JSI procesorů řady x86 jako součást většího programu napsaného ve vyšším programovacím jazyce (Turbo Pascal, C, C++, apod.). Důraz je kladen na pochopení základních principů tvorby těchto programů a vnitřní architektury procesorů Intel.

Student si sám vymyslí své zadání, které bude konzultovat s vyučujícím. Rozsah projektu by měl odpovídat algoritmům probíraným v kursu ADS (vyhledávání, řazení, abstraktní datové typy, převody mezi číselnými soustavami, analýza textu, apod.) nebo jiná vlastní témata tak, aby řešení nepřesáhlo zhruba 200 řádků kódu v JSI. Zadání by měla být pokud možno rozptýlena rovnoměrně, aby stejný problém neřešili více než 2 studenti. Je možné využít i zadání projektů řešených současně do jiných předmětů, pokud umožňují vytváření algoritmů v JSI.

Každý student pracuje na svém projektu samostatně a problémy nebo nejasnosti konzultuje s vyučujícím. Opisování celých částí řešení může vést ke ztrátě bodů.

Pokyny k řešení

Součástí řešení je krátký textový soubor (Popis.txt) obsahující jméno, studijní skupinu, datum odevzdání, název projektu, jméno a verzi použitého překladače a stručný popis řešeného problému. Délka max 1 stránka A4. Stejné informace (kromě popisu problému) budou i ve všech zdrojových textech. Dodržujte pravidla spisovné češtiny, vyhýbejte se žargonu, nepleťte si pojmy. Pište stručně a výstižně. Shrnutí popisu do několika bodů je srozumitelnější než dlouhé odstavce textu.

Snažte se dodržovat konzistentní styl psaní zdrojových textů. Čitelnost programu hraje v JSI velmi důležitou roli:

  • neplýtvejte komentáři na zjevné věci, nekomentujte každou instrukci
  • popisujte co se v proceduře/úseku kódu děje a jaký má smysl, povzneste se trochu nad jednotlivé instrukce
  • oddělujte logické bloky instrukcí prázdnými řádky a/nebo komentáři
  • formátujte zdrojový text JSI do sloupců: návěští, instrukce, operandy a komentáře (lze s výhodou použít tabulátory)
  • deklarujte pojmenované konstanty místo magických čísel v programu
  • používejte krátká, ale výstižná návěští (@qwert: není výstižné návěští)

Pozor na časté chyby:

  • algoritmy musí kontrolovat platnost předaných parametrů, v případě nevyhovujících hodnot se musí správně zachovat (skončit, vrátit chybu) a nesmí se zacyklit ani zhroutit (např. pro prázdný řetězec, pole délky 0 nebo 1 prvek, záporné hodnoty Integer parametrů apod.)
  • pozor na překračování indexů polí (z obou stran)
  • procedury nesmí změnit registry DS, SS, SP a BP - pokud je potřebujete použít pro nějaký účel, musíte jejich obsah uschovat a na konci obnovit
  • nepředpokládejte, že registry před vstupem do funkce obsahují nějaké definované hodnoty (třeba nulu), mohli byste být později překvapeni
  • hodnoty typu Byte/Char nelze načítat to 16-bitových registrů a naopak
  • porovnávejte čísla bez znaménka pomocí cmp+ja/jb a se znaménkem jg/jl (nultý byte řetězce v Pascalu, délka, nemá znaménko)
  • pokud má procedura dva parametry předávané far adresou, tak oba segmenty nemůžete současně načíst do stejného segmentového registru (např. ES:SI a ES:DI), nesmíte předpokládat, že oba shodou okolností leží ve stejném segmentu
  • pokud naplníte registr ES segmentovou adresou dat, tak se na ta data později neodkazujte pomocí DS (překvapivě častá chyba!)
  • všechny parametry a lokální proměnné leží v SS segmentu, použijte SS: prefix pokud se odkazujete jinak než přes registr BP
  • pozor na rozdíl v předávání parametrů a výsledků mezi funkcemi deklarovanými v Pascalu jako begin/end; a assembler;asm/end;
  • využíváte-li instrukce procesoru vyššího než 286, tak na to upozorněte ve zdrojovém textu
  • neopisujte (pozor na chyby v cizích programech)

Prohřešky proti efektivitě:

  • neprovádějte zbytečně víckrát stejné výpočty, pokud máte volný registr, uložte si mezivýsledek, přesuňte konstantní výrazy ven z cyklů
  • plně využívejte registry místo vícenásobných přístupů do paměti
  • nestačí-li registry, je možné je uvolnit uložením dočasně nepotřebných hodnot na zásobník (push/pop), je to jednodušší a rychlejší než deklarace lokálních proměnných
  • nepoužívejte instrukce MUL a DIV pro násobení/dělení mocninami dvou
  • nezamotávejte se ve skocích, nevyrábějte "špagetový kód"
  • pište efektivní kód, využívejte celou instrukční sadu procesoru

Použité prostředky

Borland Pascal 7, Borland C++ 3.1, Turbo Assembler, DJGPP
- musí být přeložitelné v prostředí sítě Novell v DOSu nebo ve Windows
- nepřeložitelné projekty nebudou hodnoceny

Odevzdání

Řešení budou odevzdána pomocí dávky ODEVZDEJ.BAT v komprimované podobě. Odevzdává se archiv vytvořený programem PKZIP, ARJ nebo RAR se jménem rovným řešitelovu login-name. Soubor s řešením je možné odevzdat pouze jednou. Např.

  PKZIP xjmeno99
  ODEVZDEJ xjmeno99.zip

Odevzdávají se tyto soubory:

  • rozumně komentovaný zdrojový text programu (komentovat proč děláte to či ono, ne pouze otrocky přeložit instrukce do češtiny)
  • popis programu v obyčejném textovém souboru (ne Word)
  • funkční dávka (make.bat) nebo Makefile pro překlad

NEodevzdávají se .EXE soubory ani jiné vedlejší produkty překladu (.OBJ, .SYM, .PRJ, .DSK, .TP, .TPU, .PSM, .MAP, .LST, .BAK, .TDS, apod.).

Zpět


© Department of Computer Science and Engineering, Božetěchova 2,
612 66 Brno, Czech Republic
Tel.: +420 54114 1144, +420 54121 2219, Fax: +420 54114 1270
e-mail: uivt@fee.vutbr.cz, Web: http://www.fee.vutbr.cz/UIVT/
Last modification: 16. November 2000