STROJOVE ORIENTOVANE JAZYKY

STROJOVE ORIENTOVANE JAZYKY

There are 10 types of people in the world. Those who understand binary and those who don't.

Cviceni_1 Cviceni_2 Cviceni_3 Cviceni_4 Cviceni_5 Cviceni_6 Cviceni_7
Cviceni_8 Cviceni_9 Cviceni_10 Cviceni_11 Cviceni_12 Cviceni_13 Cviceni_14
Uloha_1 Uloha_2 Uloha_3 Uloha_4 Uloha_5
Semestralni_prace
Hodnoceni
Odevzdat semestralku a doresit zapocty muzete naposled v utery 17. unora v mistnosti K310 v 10:00.
Ukazky

Cviceni:

Pavel Cimbal (mail: xcimbal@quick.cz icq: 51599423)

Ctvrtek 7:30 - 9:00 mistnost K310
Ctvrtek 9:15 - 10:45 mistnost K310
Ctvrtek 11:00 - 12:30 mistnost K310
Ctvrtek 12:45 - 14:15 mistnost K310

Nektere z uloh na techto strankach jsou zavazne i pro dalsi cviceni SOJ
(informace poda konkretni vyucujici)


Napln semestru:

Cviceni se stridaji v rytmu laboratorni (ladeni programu u pocitacu) a seminarni (vice teoreticka). Naplni cviceni u pocitacu bude vypracovavani uloh, resp. semestralni prace ve zbytku casu. Odladeny program-uloha (fungujici spustitelny soubor spolu s rozumne okomentovanym zdrojovym textem) se odevzdava bud na konci laboratorniho cviceni, ve kterem byl zadan, nebo na pristim laboratornim cviceni. Od tretiho tydne se na uvod kazdeho seminarniho (nebo laboratorniho) cviceni pise kratky test.

Do konce rijna si take kazdy student vybere zadani semestralni prace (bud nektere z nabidky, nebo sve vlastni, pokud mu bude odsouhlaseno). Semestralni prace se odevzdava v poslednich dvou tydnech semestru, a je tvorena fungujicim spustitelnym programem se zdrojovym textem spolu s referatem (obsahuje zadani, navrzene reseni a pripadne popis nekterych implementacnich zajimavosti). Zazipovanou semestralni praci (spustitelny program, zdrojovy text, pripadne referat, pokud je v elektronicke forme) poslete po odevzdani mailem svemu cvicicimu.

Odevzdavani odladenych uloh bude mozne (po domluve) i pomoci mailu (zadani pristi ulohy se pak dozvite misto na cviceni z tohoto www). Semestralni praci musite odevzdat a predvest osobne. Pokud jste pokrocili coderi, a seminarni cviceni i ulohy by pro vas byly ponizujici, muzete se s nami domluvit i na nejake vlastni individualni praci, namisto uloh, testu a semestralky.

Hodnoceni:

Hodnoceni je formou klasifikovaneho zapoctu. Pro ziskani zapoctu je treba odevzdat vsech 5 uloh a semestralni praci, znamku pak urcuje kvalita semestralky a body z peti testu, psanych v prubehu semestru. Z testu lze celkem ziskat 0..25 bodu, uroven semestralni prace je ohodnocena procenty 0..100 (zde se prihlizi i k pracnosti, takze napr. rozsahly zdrojovy text, z nejakeho duvodu nahle nefungujici, muze dostat klidne i 40, semestralka, co splnuje zadani, 75, vyssi ohodnoceni pak umerne libivosti zpracovani).

skore = 2 * soucet_bodu_z_testu + uroven_semestralni_prace / 2

75..100 = vyborne, 60..74 = velmi dobre, 40..59 = dobre, 0..39 nebo neodevzdana uloha = nevyhovel

Vyslednou znamku muze dale zlepsit napr. plus za odevzdani kratsiho reseni ulohy, nez bylo ukazkove, napsani semestralni prace pod neDOSove prostredi, vymysleni nejake vychytrale rutiny a podobne.


Cviceni 1 (laboratorni):

Pro psani v assembleru pouzivame assemblery, ktere zdrojovy text prelozi bud do moduloveho souboru (z ktereho pak linkerem vytvorime spustitelny soubor), nebo primo do binarni spustitelne podoby. Obvykle se pouziva bud MASM (od Microsoftu, se vsim specifickym, co z toho vyplyva), TASM (rychly, soucasti borlandskych baliku, bohuzel syntakticky misty nelogicky - dedictvi od MASMu, take potrebuje linker) nebo NASM (freewarovy, syntakticky cisty a logicky, nepotrebuje linker, bohuzel ale pomalejsi). Protoze verze 0.98 obsahuje nektere chyby, pouzivejte radsi starsi verzi nasm097.zip. K NASMu take existuje pomerne sugestivne psany help nasmdoc.ps.

Rodina assembleru, odvozena od MASMu, je starsi, a z historickych duvodu obsahuje mnoho matoucich konstrukci, ze kterych neni zcela zrejmy vztah zdrojoveho textu ke generovanemu kodu. Proto je pro zacatecnika snazsi, kdyz zacne psat v NASMu. Pokud si potrebujete osvezit MASMovsky styl syntaxe, muzete pouzit elektronickou verzi knihy The Art of Assembly Language Programming . Dalsi hezky webovy tutorial je Carteruv PC Assembly Tutorial . Pro rychlou pomoc pri psani programu existuje take nekolik elektronickych manualu, jako techhelp.zip (vse je k dispozici i na CSLABu, doufam), SYSMAN nebo ATHELP. Pro prehled o obsazeni V/V prostoru PC je k dispozici jeho temer vycerpavajici popis ports.zip. Pokud vas zajima, jake rutiny se mohou nachazet na prerusovacich vektorech, spolu s jejich detailnim popisem, stahnete si seznam preruseni od Ralfa Browna rbint.tgz. Popis instrukcni sady procesoru i386 naleznete v druhem dile dokumentu The IA-32 Intel Architecture Software Developer's Manual, ale zbyle dva dily jsou take velmi zajimave.

Programy muzete vytvaret bud pro model "small" jako *.exe soubory, nebo pro model "tiny" jako soubory *.com. Prekladace si muzete otestovat na nasledujicich prikladech:

TASM - vytvoreni EXE souboru:
Stahnete si soubor tasmexe.asm, a ten prelozte pomoci:

tasm tasmexe.asm
tlink tasmexe.obj

TASM - vytvoreni COM souboru:
Stahnete si soubor tasmcom.asm, a ten prelozte pomoci:

tasm tasmcom.asm
tlink /t tasmcom.obj

NASM - vytvoreni COM souboru:
Stahnete si soubor nasmcom.asm, a ten prelozte pomoci:

nasm nasmcom.asm -o nasmcom.com

Ke zjistovani chyb v prelozenych spustitelnych programech muzete pouzit borlandsky TD, pripadne k diassemblovani a upravam utilitu HIEW. V pripade nouze muzete vkladat pomocne ladici vypisy. Pro snazsi zacatek psani programu jsou zde sablony pro vytvoreni souboru com a pro vytvoreni souboru exe (oba pro TASM). Take muzete vyuzit davky pro preklad a linkovani mkcom.bat a mkexe.bat (opet TASM).

Na cviceni si nejdriv vyzkousejte, jestli jste schopni prelozit zdrojovy text, a odstranit pripadne problemy. Pak reste nasledujici ulohu:

Uloha 1:

A) [nase reseni - 24 bytu] [P. Jirik - 21 bytu]
Pripravte si podprogram, ktery bude umet nasledujici vec:

Vstup:
Registr AX - jeho obsah je povazovan za unsigned sestnactibitove cislo.
Po zavolani:
Na obrazovce bude na aktualni pozici kurzoru dekadicky vypsane toto cislo (pokud mozno bez zbytecnych pocatecnich nul, pro AX=17 vypisujte 17 a ne 00017, ale pro AX=0 se vypise 0).

B) [nase reseni - 510 bytu, pokud nahravate pole ze souboru, pripoctete si jeho delku 423 bytu] [P. Jirik - 499 bytu] [nase minimum - 490 bytu]
POKUD ZKRATITE MINIMUM O N-BYTU, ZISKATE O N-STUPNU LEPSI ZNAMKU, NEZ VAM VYCHAZELA PODLE HODNOCENI.
(Pouze korektni reseni, spolehajici maximalne na prednastaveni CS, DS, ES, SS a IP, spustitelne na cemkoli s i8086+.
U totoznych reseni ziskava lepsi znamku jen ten, kdo ho predvede/zasle jako prvni.)

Kratsi alternativa: [T. Skala - 488 bytu] - bohuzel, funguje jen na mene nez 32770 prvku, ale 2B plus ziskava. Pri pouziti mene nez 32769 prvku lze take nahradit XOR DX,DX za CWD a jit na delku 487B.
Jina kratsi alternativa: [P. Jirik - 489 bytu] - bohuzel, vypisuje vysledek v mirne odlisnem formatu (zbytecna posledni mezera), ale 1B plus ziskava. Lze ji narozdil od te predchazejici pouzit pro libovolne dlouha pole (ktera se vejdou do pametove oblasti mezi kod a stack u *.com).


Za pouziti podprogramu A) napiste program, ktery v poli bytu nalezne nejmensi prvek, nejvetsi prvek, index nejmensiho prvku (prvni prvek ma index 0, druhy 1 atd.) a index nejvetsiho prvku. Pokud bude vice takovych prvku, vypise se z jejich indexu vzdy ten nejvyssi.

Vstup:
Pole 423 bytu (alokujte si ho nekam do pameti bud pomoci DB - pouzijte soubor sojarray.txt, nebo v NASMu pomoci direktivy INCBIN pro vkladani externich binarnich souboru - soubor sojarray.bin). Pouzijte primo toto pripravene pole, kvuli snadnejsi kontrole vasi rutiny.
Vystup:
Na obrazovce budou vypsana 4 cisla - hodnota nejmensiho prvku, hodnota nejvetsiho prvku, index nejmensiho prvku a index nejvetsiho prvku.

Hotovou ulohu muzete predvest bud hned, nebo na pristim laboratornim cviceni (za 14 dnu). That's all. ;) Vzdy po uplynuti teto lhuty se dozvite, jak mela uloha vypadat. Komu se povede napsat kratsi kod, nez bude nas vzorovy (na byty), ziska vsestranne vyuzitelne plus. Pak mu mohou byt prominuty treba nepovedene testy, nebo ma sanci na lepsi znamku na konci semestru.

FAQ 1:

Q: Proc musime psat v assembleru, kdyz je to hrozne nepohodlne, snadno se tam udela chyba, a neni to pak ani prenositelne?
A: Protoze CPU vykonava strojovy kod, a pokud chceme jeho moznosti efektivne vyuzit, meli bychom pripravovat programy primo v nem. I sebemodernejsi kompilator totiz zvlada jen nektere zakladni optimalizace, a vysledek je pak n-nasobne delsi a pomalejsi, nez promyslena strojova rutina. Nejkratsi, nejhezci a nejrychlejsi program lze napsat pouze v assembleru, podivejte se na asmrulez.asm pro NASM, nebo si ho stahnete prelozeny asmrulez.zip, program se ovlada pomoci shiftu. ;)


Cviceni 2 (teoreticke):

Ciselne kody v pocitacich, zpusob prace s cisly v ruznych kodech, aritmetika s cisly, ktera se nevejdou do registru 80x86, vstup a vystup pomoci funkci DOSu. Aritmetika v plovouci radove carce a souvisejici pojmy. Muzete si take predem rozmyslet priklad, ktery se bude resit u tabule:

Priklad: Napiste program, ktery cte z klavesnice zadavane znaky. Vstupujici posloupnost nul a jednicek bude chapana jako binarni cislo, ktere se prepisuje na obrazovku. Po stisku kterekoliv jine klavesy (jine nez 0 nebo 1) se pak vypise dekadicky. Pokud zadna nula ani jednicka nevstoupi, a bude rovnou stisknuta jina klavesa, vypise se 0. Vkladany binarni retezec muze obsahovat az 332 bitu, tedy odpovidajici dekadicke cislo bude maximalne 100 ciferne.

Program lze napsat na 53 bytu, resp. 49, pokud spolehame na vynulovani registru pri zavedeni *.com do pameti. Napocitavani dekadickeho vyjadreni se provadi po vstupu kazdeho bitu, a sice jako dvojnasobek predchoziho vyjadreni plus hodnota nacteneho bitu. Pole s dekadickymi ciframi je alokovano atypicky na zasobniku, a jeho prevod na ASCII kody se provadi az pri vypisu. Zde je zdrojovy text programu bconvert.asm.


Cviceni 3 (laboratorni):

Odevzdani ulohy 1 z prvniho cviceni a zadani ulohy 2. Take se pise prvni z testu.

Test 1:

V testu dostane kazdy 5 otazek, kde ke kazde vzdy budou 4 moznosti a), b) c), d), z toho jedina spravna. Na vypracovani testu je 15 minut. Jako literatura je povoleno v podstate cokoliv. Jednotlive otazky se budou tykat:

- zakladni rysy i8086 (kolikabitovy a proc, adresove prostory, sada registru, komunikace s periferiemi)
- segmenty a offsety (jak urcuji vyslednou adresu, k cemu slouzi, v jakych muze byt adresa rozsazich)
- soubory *.exe a *.com (cim se lisi, jak se pisi, zpusoby jejich ukoncovani)
- podprogramy a prace s poli (druhy instrukci CALL a RET, pouziti instrukci pro praci s retezci)
- jednoducha nekolikaradkova rutina (poznat, co dela, a jestli je napsana spravne)

Uloha 2:

A) [nase reseni - 89 bytu] [Nejkratsi studentske reseni - ??? bytu] [nase minimum - 80 bytu]
POKUD ZKRATITE MINIMUM O N-BYTU, ZISKATE O N-STUPNU LEPSI ZNAMKU, NEZ VAM VYCHAZELA PODLE HODNOCENI.
(Pouze korektni reseni, spolehajici maximalne na prednastaveni CS, DS, ES, SS a IP, spustitelne na cemkoli s i8086+.
U totoznych reseni ziskava lepsi znamku jen ten, kdo ho predvede/zasle jako prvni.)

Minimalni (zrejme) reseni: [T. Skala - 69 bytu] [T. Skala - 68 bytu] [T. Skala - 66 bytu] - bohuzel, vsechna tato reseni mirne upravuji zadani (jine formatovani vypisu, odskok kurzoru), ale velke plus a 1B stupen nahoru samozrejme ziskavaji.
Moznost zkraceni: J. Kokes upozornil na moznost drobne modifikace posledniho reseni T. Skaly, neni ale studentem. Druhy v poradi byl P. Jirik (prohozeni operandu v ADD AX,SI a vypusteni XCHG AX,SI), tedy 1B zkraceni a stupen nahoru. Obdobnou upravou bylo mozne zkratit i puvodni uvedene 80B minimum (misto XCHG AX,BX pouzit XCHG AX,SI, pak ale MUL BX a nakonec ADD SI,AX, jiz bez XCHG AX,SI).
Kratsi reseni splnujici zadani: [P. Jirik - 79 bytu] - splnuje zadani, a ziskava tak stupen nahoru za zkraceni o 1B.


Napiste program, ktery bude umet nasledujici vec:

Vstup:
Z klavesnice nacitany retezec libovolnych znaku.
Cinnost:
Program zadavane znaky opisuje na obrazovku, a pokud se v retezci vyskytlo dekadicke cislo, do zavorek za nej napise jeho hexadecimalni podobu (ctyri hexadecimalni cifry). Stiskem klavesy Esc program ukoncime.
Testovaci priklad:
Pokud po spusteni programu napiseme na klavesnici retezec
Tohle0je1testovaci65535retezec65536!65537Esc,
musi byt na obrazovce napsano:
Tohle0 (0000h) je1 (0001h) testovaci65535 (FFFFh) retezec65536 (0000h) !65537

Hotova uloha se odevzdava na pristim laboratornim cviceni (za 14 dni).


Cviceni 4 (teoreticke):

Mapa pametoveho a V/V prostoru PC, softwarove a hardwarove preruseni. Zpusob programovani obsluznych rutin, prace s radicem preruseni. Take byste si meli vybrat semestralni praci z uvedene nabidky.

Priklad: Ukazeme si, jak napsat jednoduchy emulator terminalu, za pouziti znalosti o funkci hardwaroveho preruseni od serioveho portu. Terminal pri stisku klavesy posila znak na seriovou linku (do modemu, linuxoveho serveru ci jednoduse do druheho PC, kde bude bezet take tento program - jejich propojeni pak bude prekrizenym tzv. nullmodem kabelem). Take chceme, aby byly prichozi znaky bufferovany (pokud se nestihaji z nejakeho duvodu vypisovat, neztrati se, pokud ovsem vystaci buffer). Program se ukonci stiskem klavesy Esc. Zde je zdrojovy text programu pro TASM smallcom.asm. Netvrdim, ze je nejoptimalnejsi (126 bytu), uz ma svych hezkych par let, ale zatim jsem nevidel nic podobne kratkeho.

FAQ 2:

Q: Kdyz predvadim ulohu, ukaze se DOSove okenko s vystupem jen na chvilku, a kdyz vystup presmeruji do souboru stylem muj_prog.com >vystup.txt, obsahuje pak soubor vystup.txt po zobrazeni v notepadu nejake divne znaky, ktere urcite program neprodukoval.
A: Bud si nastavte vlastnosti DOSPromptu tak, aby se okno po skonceni ulohy hned nezaviralo, nebo jednoduse pridejte tesne pred ukonceni programu instrukce MOV AH,08h INT 21h, ktere zajisti cekani na stisk klavesy. Spatne zobrazovane znaky v notepadu jsou zpusobene praktikami nejmenovane redmondske firmy, ktera si vyznam ridicich znaku 0ah (LF) a 0dh (CR) vyklada po svem. Pro zalomeni radku proto pouzivejte vyhradne sekvenci (CR)(LF), sekvence (LF)(CR) nebude podobnymi editory zobrazena spravne.


Cviceni 5 (laboratorni):

Odevzdani ulohy 2 ze tretiho cviceni a zadani ulohy 3. Take se pise druhy z testu. Koho zaujaly moznosti celociselne aritmetiky, muze se podivat, jak napocitat tabulku funkce sinus, a to jen za pouziti nasobeni a scitani. Vysledny kod sine.asm ma jen 26 bytu.

Test 2:

V testu dostane kazdy 5 otazek, kde ke kazde vzdy budou 4 moznosti a), b) c), d), z toho jedina spravna. Na vypracovani testu je 15 minut. Jako literatura je povoleno v podstate cokoliv. Jednotlive otazky se budou tykat:

- segmenty a offsety (jak urcuji vyslednou fyzickou adresu, jake instrukce pouzivaji ktere segmenty)
- rotace a aritmetika (jak souvisi typy shiftu a rotaci s aritmetickymi ukony a doplnkovym kodem)
- nasobeni a deleni (jak a k cemu se daji vyuzit instrukce pro nasobeni a deleni)
- doplnkovy kod (pouziti doplnkoveho kodu, jak je potom nastaveno carry)
- jednoducha nekolikaradkova obsluha preruseni (poznat, co dela, a jestli je napsana spravne)

Uloha 3:

A) [nase reseni - 127 bytu] [Nejkratsi studentske reseni - ??? bytu] [nase minimum - 105 bytu]
POKUD ZKRATITE MINIMUM O N-BYTU, ZISKATE O N-STUPNU LEPSI ZNAMKU, NEZ VAM VYCHAZELA PODLE HODNOCENI.
(Pouze korektni reseni, spolehajici maximalne na prednastaveni CS, DS, ES, SS a IP, spustitelne na cemkoli s i8086+.
U totoznych reseni ziskava lepsi znamku jen ten, kdo ho predvede/zasle jako prvni.)

Vyrazne zkraceni: [S. Gorb - 99 bytu] - poskytla zdrojovy text tohoto hezkeho zkraceni na 99B, nicmene neni vyhradni autorkou upravy. Tento kod jsem dukladne analyzoval, a lze ho jeste zkratit minimalne na 96B, aniz by jakkoliv utrpela korektnost reseni, takze znacne sance pro ostatni na dalsi zkracovani tu stale jsou. ;)
Mirna uprava: [T. Lusk - 104 bytu] - inicializaci lze provest vicekrat (ale ne zase 65536x, to uz je prilis), a tedy usetrit byte v prednastavovani CX v 105B verzi. Ziskava tak 1B stupen nahoru, protoze dalsi mozne zkraceni o 2B je jen primou aplikaci jiz zverejnene upravy z predchazejici verze.
Dalsi uprava: [J. Hajas - 103 bytu] - nastaveni barvy atributu lze provest bez skoku pomoci instrukce CBW a usetrit tim jeden byte. Dalsi zkraceni je jen primou aplikaci jiz zverejneneho, autor tedy ziskava 1B stupen nahoru. Avizovana uprava na 96B je ale zalozena jeste na necem jinem ;).
Uprava druhe verze: [J. Hajas - 98 bytu] - inicializce smycky, spolu se zarucenim sudosti, lze provest na 2 byty. Pocet zbytecneho opakovani tvorby tabulky je zde pevne dan na 50, coz je na XT zdrzeni maximalne pod 5 sekund, coz jsem se nakone rozhodl akceptovat. Toto zkraceni ovsem ke zbylym dvema bytum nenavadi. Autor ziskava 1B stupen nahoru za zkraceni.
Cesta k dalsimu zkracovani: [S. Gorb - 97 bytu] - poskytla zdrojovy text dalsiho zkraceni na 96B, ale uprava s DAA po AND neni korektni, slo by tedy o 1B zkraceni. Tato uprava jiz vede az k avizovanym 96B (chybi jen krucek), a za pouziti tolerovatelneho XCHG AX,CX pana Hajase pak dokonce na 95B.


Napiste program, ktery bude umet nasledujici vec:

Vstup:
Na klavesnici zadavane vicestisky klaves.
Cinnost:
Program po spusteni vykresli v horni casti obrazovky osmiradkovou tabulku s hexadecimalnimi cisly od 00h do 7Fh, na bledemodrem podklade, cernym inkoustem, podivejte se na screenshot. Kazde cislo v tabulce reprezentuje jeden scancode (tento scancode je v podstate poradove cislo klavesy, ktere nacteme z portu 60h, kdyz klavesnice vyvola preruseni IRQ1). Pokud je klavesa stlacena, je cislo jejiho scancode zvyrazneno jasne bilym inkoustem a tmavomodrym podkladem. Pokud byla klavesa uvolnena, dostane jeji scancode bledemodry podklad a tmavomodry inkoust, cimz budou v minulosti stisknute klavesy odliseny od zatim nestisknutych. Program se ukonci na stisk klavesy Esc.
Testovaci screenshot:

Pokud po spusteni programu stlacime klavesy Enter a pravy Shift, obe uvolnime, a pak pridrzime stisknute klavesy Tab a 1, musi tabulka vypadat podle vyse uvedeneho screenshotu.

Poznamka: K predvedeni budete patrne potrebovat bootovaci disketu do systemu MS-DOS, zejmena v pripade, ze se (zcela opravnene) spolehate na spravne nastaveni textoveho modu VGA adapteru. Pokud ale chcete, aby vas program fungoval i pod DSOPROMPTem ve Windows NT/2000, musite na zacatku textovy mod explicitne inicializovat (napriklad sekvenci MOV AH,0fh; INT 10h; XOR AH,AH; INT 10h). Tedy opet vam kdosi z nejmenovane redmondske firmy pomohl. Akceptuji pouze ulohy, resene pomoci preruseni od klavesnice, tedy IRQ1. Informaci o stisku klavesy lze ziskat pouze v dobe preruseni, a to z portu 60h. Nezapomente, ze nikdy nemate jistotu, zda vas program jiz neco jineho neprerusilo, a proto musi vase obsluha preruseni vzdy preventivne schovavat vsechny registry, co zmodifikuje, i kdyz je hlavni program treba vubec nepouzival (nebo nedejboze pouzival pro komunikaci s obsluhou preruseni). Pokud musi obsluha predat informaci hlavnimu programu, muze tak ucinit jen pres nejake misto v pameti. Take se zamyslete, jestli je zaruceno, aby hlavni program vzdy stihal zpracovavat informace, dodavane primo obsluhou (preruseni mohou jit naprosto tesne za sebou). Vysledkem uvahy je bud konstrukce fronty pro komunikaci s obsluhou (zbytecne sofistikovane), nebo provedeni obarveni primo v obsluze (obsluha by mela byt sice co nejkratsi, ale to vas barvici kod jiste vic nez splnuje ;).

Hotova uloha se odevzdava na pristim laboratornim cviceni (za 14 dni).

FAQ 3:

Q: Jak se nastavuje barva znaku v textovem rezimu, a jak to mam udelat pres sluzby DOSu nebo BIOSu, kdyz je v obsluze klavesnicoveho preruseni nemohu volat?
A: Pomoci sluzeb DOSu a BIOSu se obvykle atributy ani nenastavuji. Videopamet defaultniho textoveho rezimu (rezim cislo 3, pokud jsme v jinem, prepneme do nej MOV AX,3; INT 10h) je na fyzicke adrese 0b8000h. Obvykle k ni pristupujeme tak, ze si registr ES nastavime na 0b800h, a pomoci registru DI a instrukci STOSB nebo STOSW do pameti zapisujeme. Kazdy zobrazitelny znak v tomto modu obsazuje ve videopameti 2 sousedni byty. V prvnim je primo jeho ASCII kod, v druhem zakodovana jeho barva. Znaky jsou ve videoram usporadany zleva doprava a pak po radcich dolu, takze napr. tretimu znaku ve ctvrtem radku prislusi bytova dvojice na offsetu 484 od zacatku videopameti. Barva znaku je kodovana v druhem bytu zpusobem [F,Rp,Gp,Bp,H,Ri,Gi,Bi], kde bit F zapina blikani, bit H zvyseny jas inkoustu, a RGB jsou slozky barvy bud papiru (s indexem p) nebo inkoustu (s indexem i).


Cviceni 6 (teoreticke):

Rezimy grafickeho adapteru a prace s grafikou pomoci primeho pristupu do videopameti. Zpusoby prace s paletami, generatory palet. Princip stinove videopameti.

Priklad: Ukazeme si, jak nagenerovat a zobrazit baletu pro rezim 320x200. Rutina generuje paletu 16 zakladnich sytych odstinu, ktere pak linearne v sestnacti krocich zesvetluje az k jasne bile. Takova paleta se hodi napr. pro texturovani sestnactibarevnou texturou, ktera pokryva nasvecovane 3D teleso. Pak textura urci spodni 4 bity indexu barvy, a jas horni ctyri bity. Zde je zdrojovy text programu pro NASM lastpall.asm. Rutina pomoci generatoru pseudonahodnych cisel urci krok v rozsahu 1 az 4, a ten pak odcita od plneho vybuzeni 63 slozky R, G nebo B dane barvy. Postupne tak napocita hodnotu vsech 16 jasu slozky barvy, a po trech opakovanich vnitrniho cyklu jsou tak urceny jasy jedne z 16 sytych barev. Protoze systych barev je 16, povede se cyklus 48 krat. Polozky se ukladaji do pomocneho pole, v poradi, v jakem se pak posilaji do VGA adapteru. Protoze index nastavovane barvy se po vyslani 3 bytu (R, G a B) automaticky inkrementuje, muzeme po nastaveni indexu 0 vyslat na port 03c9h vsech 768 bajtu instrukci REP OUTSB (dostupna od i80286).


Cviceni 7 (laboratorni):

Odevzdani ulohy 3 z pateho cviceni a zadani ulohy 4. Take se pise treti z testu.

Test 3:

V testu dostane kazdy 5 otazek, kde ke kazde vzdy budou 4 moznosti a), b) c), d), z toho jedina spravna. Na vypracovani testu je 15 minut. Jako literatura je povoleno v podstate cokoliv. Jednotlive otazky se budou tykat:

- mapovani videopameti (umisteni v adresovem prostoru a jeji velikost, pro textovy rezim 03h a graficky 13h)
- vyznam bytu videopameti (jak urcuji zobrazeny znak, barvu, nebo pixel v grafickem modu 320x200)
- techniky prace s videoram (synchronizace s paprskem, stinova videoram)
- paleta (nastavovani palety, mozne rozsahy RGB slozek jednotlivych barev)
- jednoducha rutina zapisujici do videoram (poznat, co dela, a jestli je napsana spravne)

Uloha 4:

A) [nase reseni - 206 bytu] [M.Pavlicek - 166 bytu] [nase minimum - 159 bytu]
POKUD ZKRATITE MINIMUM O N-BYTU, ZISKATE O N-STUPNU LEPSI ZNAMKU, NEZ VAM VYCHAZELA PODLE HODNOCENI.
(Pouze korektni reseni, spolehajici maximalne na prednastaveni CS, DS, ES, SS a IP, spustitelne na cemkoli s i8086+.
U totoznych reseni ziskava lepsi znamku jen ten, kdo ho predvede/zasle jako prvni.)

Kratsi modifikace: [M. Pavlicek - 156 bytu] - toto reseni je temer presnym komplementem meho minima, pouziva totiz vesmes na vse odlisny pristup. Zkraceni je pak dosazeno castecne i vyuzitim faktu, ze implementace Bressenhamova algoritmu pro kresleni tohoto obrazce nemusi byt zcela univerzalni, protoze delka y-prumetu je fixni. Ze zadani sice plyne, ze podprogram pro kresleni cary by mel byt obecny (kreslit caru mezi dvema libovolnymi body [X0,Y0] a [X1,Y1]), ale nebudeme na tomto rysu pro dalsi zkracovani trvat. Fuzi triku, pouzitych v obou uverejnenych minimech, lze vysledek dale zkracovat (jednoduchou upravou hned minimalne o byte ;). Autor ziskava 3B stupne nahoru za zkraceni.
Fuze narychlo: [J. Cihak - 155 bytu] - program vznikl slozenim meho generatoru palety a Bressenhamova algoritmu s modifikaci M. Pavlicka. Autor si bohuzel neuvedomil, ze muj generator palety zaroven nastavuje i ES, cimz se ochudil pri jeho zbytecnem znovunastavovani o dalsi usetritelne byty, a ziskava tak jen 1B stupen nahoru za zkraceni.
Spravna fuze: [O. Guth - 145 bytu] - toto uz je fuze, jak by mela byt, bez evidentnich redundanci, a autor teoreticky ziskava 10B stupnu nahoru za zkraceni. Prakticky mu samozrejme staci jen 3.
Uprava generatoru: [M. Pfeiffer - 155 bytu] - autor si vsiml zavislosti mezi koeficienty barevnych diferenci pro jednotlive casti palety, a vyjadril je ve zkomprimovanem tvaru, cimz usetril 3 byty. Zbyly byte je jiz vysledkem kratsiho kroku po diferencich. Autor ziskava 4B stupnu nahoru za zkraceni. Kombinovanim a modifikovanim zde uvedenych triku lze pak skutecne minimum teto ulohy z dosavadnich 145 bytu jeste dale snizovat.
Dalsi fuze: [M. Jansa - 141 bytu] - sloucenim reseni M. Pfeiffera a predesleho mixu O. Gutha lze dale zkracovat, az na 141 bytu. Ale ani to neni definitivni minimum. Autor ziskava 4B stupne nahoru.
Zkraceni zadarmo: [J. Hajas - 140 bytu] - autor si vsiml neefektivniho sestnactibitoveho skoku v minulem reseni, ktery samozrejme snadno nahradil kratkym relativnim. Tato uprava je sice ponekud lacina, ale splnuje vsechna kriteria, a autor tak ziskava 1B stupen nahoru.
Dalsi zkraceni: [S. Gorb - 137 bytu] - autorka odhalila zjevnou neoptimalitu v testu sudosti u 141 bytoveho reseni, a ziskava tak 4B stupne nahoru za zkraceni. Je videt, ze je uloha 4 stale zivnou pudou pro dalsi optimalizace.
Stale lze zkracovat: [O. Korbel / J. Galajda - 136 bytu] - autori de facto provedli (doufejme nezavisle) fuzi dvou predchozich pristupu, minule reseni totiz stale obsahovalo neoptimalitu sestnactibitoveho skoku, a ziskava tak 1B stupen nahoru za zkraceni. Uprava s vynechanim nastaveni direction flagu ale neni korektni, vynulovani neni totiz pri startu programu systemem garantovano.


Napiste program, ktery bude umet nasledujici vec:

Vstup:
Stisk libovolne klavesy program ukonci (s navratem do puvodniho rezimu graficke karty).
Cinnost:

1) Program zinicializuje graficky rezim 320x200 256 barev (13h) a nastavi linearni paletu cerna-modra-cervena-svetlemodra-bila. To znamena, ze polozky palety budou rozdeleny do 4 skupin po 64 polozkach, kde vzdy bude jedna nebo vice slozek po jedne stoupat k maximu nebo klesat k minimu. Pokud si polozku vyjadrime jako [R,G,B], muzeme paletu popsat takto:

Polozky 0-63: [0,0,0] [0,0,1] [0,0,2] [0,0,3] ... [0,0,62] [0,0,63]
Polozky 64-127: [0,0,63] [1,0,62] [2,0,61] [3,0,60] ... [62,0,1] [63,0,0]
Polozky 128-191: [63,0,0] [62,1,1] [61,2,2] [60,3,3] ... [1,62,62] [0,63,63]
Polozky 192-255: [0,63,63] [1,63,63] [2,63,63] [3,63,63] ... [62,63,63] [63,63,63]

2) Vytvorte si podprogram na kresleni cary vybranou barvou z palety, podle optimalizovaneho Bressenhamova algoritmu, vysvetleneho ve FAQ 4. Vstupem do algoritmu bude bod [X0,Y0], odkud bude cara vychazet, a bod [X1,Y1], kde bude koncit. Bod muze byt zadan vzdy bud pomoci dvojice sestnactibitovych registru, nebo jedinym sestnactibitovym registrem (vsech pixelu je 64000, takze pak udavame poradove cislo resp. adresu pixelu). Bod [0,0] je na obrazovce v levem hornim rohu, bod [319,0] v pravem hornim, bod [0,199] v levem dolnim a bod [319,199] v pravem dolnim.

3) Pomoci podprogramu na kresleni cary vytvorte barevny obrazec, slozeny z 256 barevnych car. Kazda cara je kreslena svou vlastni barvou, urcenou indexem N v palete. Krajni body cary zavisi na hodnote N podle nasledujiciho vyrazu:

Pokud je N sude, vede cara z bodu [0,199] do bodu [255-N,0]
Pokud je N liche, vede cara z bodu [256,0] do bodu [64+N,199]

Testovaci screenshot:

Po spusteni programu byste meli videt presne tento obrazec.

FAQ 4:

Q: Co je to Bressenhamuv algoritmus a jak se na nej da prijit?
A: Bressenhamuv algoritmus se pouziva ve vetsine systemu, kde je treba kreslit caru bud do matice diskretnich pixelu, nebo pomoci sekvence diskretnich kroku (napriklad posunu pisatka plotteru). Algoritmus pracuje s celymi cisly a vystaci s operacemi scitani, odcitani a rotace doprava. Ukolem je nakreslit caru z bodu [X0,Y0] do bodu [X1,Y1]. Pokud takovou caru kreslime, zacneme nakreslenim pocatecniho bodu. Potom provedeme VZDY posun ve smeru osy, kam ma cara delsi prumet (prumet do osy X je ABS(X1-X0) a prumet do osy Y ABS(Y1-Y0)), a OBCAS i posun ve smeru zbyvajici osy. Pak se vzdy kresli dalsi bod, a cyklus se opakuje tolikrat, kolik pixelu mel delsi prumet. Otazkou je, jak zjistovat, kdy posun ve zbyvajicim smeru provest. Reseni je intuitivni - pokud mame ve smeru delsiho prumetu provest D kroku a ve smeru zbyvajici osy K kroku, meli bychom spravne pri kazdem posunu ve smeru D udelat vzdy zaroven i K/D posunu ve zbylem smeru. Protoze posuny jde delat minimalne o 1, musime pockat, az se nam ze zlomku K/D nastrada cislo vetsi nez 1/2, a pak muzeme provest 1 posun ve smeru K. Nastradane cislo pak o 1 zmensime. Protoze procesor pracuje s celymi cisly a ne se zlomky, musime tuto aritmetiku na cela cisla nejak prevest. Nejjednodussi je pamatovat si bokem hodnotu jmenovatele (cislo D), a pracovat jen s citateli. Odecteni jednicky od nastradaneho cisla pak provedeme odectenim D, a porovnani nastradaneho cisla s 1/2 provedeme jako porovnani s cislem D/2. Celou zalezitost jde dale upravit tak, ze porovnani nahradime pretecenim po pricteni citatele k nastradane hodnote (tu pak inicializujeme na -D/2) a podobne. Bressenhamuv algoritmus se odvozuje obvykle zcela jinak, ale protoze je tato filozofie obsazena v mnoha rutinach, ktere s grafikou vubec nesouvisi (mixovani zvuku, zvetsovani, vypocet goniometrickych funkci), nabizim vam toto vysvetleni (doufam, ze jsem to vylozil dostatecne lidsky :).


Cviceni 8 (teoreticke):

Syntakticke (ne)moznosti assembleru, pouzivani procedur a maker. Duvody pro (ne)pouziti maker, vliv na kvalitu a efektivitu vysledneho kodu.

Priklad: Pomoci maker zkusime zjednodusit nektere ulohy z minula. Zbytek cviceni bude venovan problemum ohledne reseni vasich semestralnich praci a nekterym castym chybam pri reseni uloh.


Cviceni 9 (laboratorni):

Odevzdani ulohy 4 ze sedmeho cviceni a zadani ulohy 5. Take se pise ctvrty z testu.

Test 4:

V testu dostane kazdy 5 otazek, kde ke kazde vzdy budou 4 moznosti a), b) c), d), z toho jedina spravna. Na vypracovani testu je 15 minut. Jako literatura je povoleno v podstate cokoliv. V testu jsou zrecyklovany otazky, ktere delaly v minulych trech testech nejvice problemu.

Uloha 5:

A) [nase reseni - 346 bytu]
Napiste program, ktery bude umet nasledujici vec:

Vstup:
Stisk libovolne klavesy program ukonci, jinak je ovladan prostrednictvim mysi a argumentu z prikazove radky pri spusteni. Program realizuje softwarovou lupu nad obrazkem v rezimu 320x200 256 barev.
Cinnost:

1) Program si pomoci sluzby DOSu 04ah zaalokuje navazujicich 64kB na stinovou videoram. Pokud se alokace nezdari, program se rovnou ukonci.

2) Dalsim vypocetnim krokem bude nagenerovani specialniho mapovaciho pole Am[], realizujiciho efekt lupy. Pokud pozadujeme lupu o polomeru R pixelu, vytvorime si jej jako matici (2R-1)x(2R-1) wordu, kde kazdy word znamena offset, o ktery je nutne se po puvodnim obrazku posunout, abychom dostali dalsi pixel k vykresleni. Predpoklada se tedy, ze ctvercovy vyrez obrazku, kam bude lupa umistena, se zazalohuje jako souvisly blok (2R-1)x(2R-1) bajtu do datasegmentu, a vlastni vykresleni lupy se provede sekvencnim prekreslenim mista vyrezu (z leveho horniho rohu po radcich dolu). Na pixel P[X,Y] ve ctvercovem vyrezu puvodniho obrazku tedy vzdy umistime ten pixel ze zazalohovaneho bloku, ktery nam relativne oproti minule pouzitemu pixelu urci hodnota z mapovaciho pole Am[]. Algoritmus vykresleni lupy vypada tedy takto:

- okopiruj ctvercovou oblast obrazku, kam bude umistena lupa, do souvisleho pomocneho bloku Bl[].
- nastav ukazatel Um na zacatek mapovaciho pole Am[], a zdrojovy ukazatel Us na zacatek pomocneho bloku Bl[].
- v cyklu sekvencne prekresluj pixely P[X,Y] ve vyrezu obrazku stylem Us=Us+Am[Um]; P[X,Y]=Bl[Us]; Um=Um+1; dalsi P[X,Y] (ve smeru zleva doprava a pak dolu)

Mapovaci pole si napocitejte bud predem jako datovy blok, ktery si pak vlozite do programu, nebo pouzijte moji rutinu, uvedenou ve FAQ 5. Pokud prijdete na jeste efektivnejsi zpusob, jak pole Am[] vypocitat, budu rad.

3) V prefixu programoveho segmentu PSP (to jsou ona servisni data spusteneho souboru, kvuli kterym napr. *.com zacina az od adresy 100h) si prectete prvni argument zadany z prikazove radky a zkusite otevrit soubor takoveho jmena. Pokud se otevreni nezdari, program rovnou ukoncete.

4) Predpokladame, ze zadanym souborem je nekomprimovany 256-barevny obrazek ve formatu *.tga o rozmerech 320x200 pixelu. Pro jeho zobrazeni je treba nacist paletu (blok 768 bytu, zacina na offsetu 18) a vlastni data (64000 bytu, nasleduji hned za paletou). Paleta je ponekud atypicky ulozena s prohozenym poradim slozek (B,G a R) jednotlivych barev (kazda je navic v rozsahu 0..255, takze ji musite pred outovanim vydelit 4mi), zato pixely jsou ukladany klasicky zleva doprava a dolu (nemusi byt vzdy pravidlem, obcas lze toto poradi navolit pri ukladani souboru, a nektere programy si format *.tga vykladaji vubec po svem). Popsany soubor vyrabi korektne napr. L-View nebo ACDSee.

5) Detekujte mys pomoci sluzby 00h na Int 33h. Pokud nebude nalezena, ukoncete program. Jinak prepnete do grafickeho rezimu 320x200 256 barev, a nastavte paletu.

6) Pomoci sluzeb 07h a 08h na Int 33h nastavte rozsahy X a Y souradnic mysi tak, aby lupa pri posunovani po obrazku nikdy nepresahovala pres jeho okraj.

7) V cyklu pomoci sluzby 03h na Int 33h zjistite pozici mysi a na takto urceny vyrez vykreslite popsanym algoritmem lupu. Cela uloha je stavena na pouziti stinove vram, takze zmenu provedete v ni, a az vysledek po pockani na paprsek prokopirujete do videoram. Pak z pole Bl[] stinovou videoram obnovite a pokud nebyla stisknuta zadna klavesa, skocite na zacatek cyklu.

8) Pri odchodu z programu obnovte puvodni graficky mod.

Testovaci screenshot:

Po spusteni programu nad obrazkem syndrome.tga z dema Syndrome a po nastaveni lupy s polomerem 31 pixelu (obvodove zvetseni 2, stredove zvetseni 3) nad levy dolni roh polstare byste meli videt uvedeny screenshot. Zde je k dispozici nekolik dalsich rucne kreslenych obrazku z demosceny pictures.zip.

Toto je posledni, nejtezsi z uloh a meli byste ji odevzdat do vanoc.

FAQ 5:

Q: Jak si efektivne napocitam mapovaci pole Am[] pro lupu o polomeru R pixelu?
A: Princip lupy spociva v tom, ze pixely ve svem stredu zvetsuje (nahrazuje je pixely, co lezi v obrazku na souradnicich blize stredu oblasti). Naopak pixely na okraji lupy uz nejsou tolik zvetsene, a jsou proto blize pozici pixelu puvodnich. Moje metoda urci pro kazdy pixel P[X,Y] jeho vzdalenost od stredu, cimz se zaroven zjisti, jestli vubec lezi v kruhu lupy. Pokud nelezi, je primo nahrazen stejnolehlym pixelem puvodniho obrazku (tytez souradnice X,Y), jinak se vypoctou nove X a Y tak, aby byl zdrojovy pixel umerne bliz stredu lupy. Koeficientem umernosti je primo kvadrat vzdalenosti od stredu, cimz se vyhybam tezko realizovatelnemu odmocnovani vyrazu (X^2 + Y^2). Parabola (v podstate ve 3D, tedy Z=X^2 + Y^2) ma ovsem tu nehezkou vlastnost, ze prochazi nulou, a tedy pro pixely okolo stredu kruhu poroste jejich koeficient zvetseni k neprijemnym velkym cislum (efekt rybiho oka). Proto je stanoveno maximalni zvetseni M, kterym posunuji minimum paraboly na hodnotu (R^2)/M, a parabolu predtim prenasobim zlomkem (M-N)/(M*N), tedy hodnota paraboly na obvodu lupy bude (R^2)/N, a tedy se zde bude zvetsovat podle hodnoty obvodoveho zvetseni N. Pak mohu kazdou souradnici vynasobit hodnotou paraboly a vydelit R^2 a ziskam jeji zdrojovou hodnotu, odkud budu brat zdrojovy pixel. Tu prevadim na offset vuci zacatku pomocneho pole Bl[] a do pole Am[] ukladam pouze prirustky offsetu vuci jejich minule hodnote. Rutina ma tedy parametry R (polomer, 1..64), N (obvodove zvetseni, N<=M, 1..~8) a M (maximalni zvetseni, 1..~8), pole vytvari v oblasti MAP adresovane registrem DI, nepouziva koprocesor, ma celkem 83 bytes a zde si ji muzete stahnout: map.asm.


Cviceni 10 (teoreticke):

Zohledneni realneho casu v assemblerovskych aplikacich, prace s citacem 8253-5. Aspekty pouziti 8253-5 vzhledem k vnitrnim hodinam DOSu a systemum Windows.

Priklad: U tabule budou reseny priklady na praci s realnym casem pomoci obsluhy preruseni od 8253-5. Zbytek cviceni bude venovan problemum ohledne reseni vasich semestralnich praci a nekterym castym chybam pri reseni uloh.


Cviceni 11 (laboratorni):

Prvni vlna odevzdani ulohy 5 z devateho cviceni. Take se pise paty, posledni z testu.

Test 5:

V testu dostane kazdy 5 otazek, kde ke kazde vzdy budou 4 moznosti a), b) c), d), z toho jedina spravna. Na vypracovani testu je 15 minut. Jako literatura je povoleno v podstate cokoliv. Jednotlive otazky se budou tykat:

- zpusoby pristupu do I/O prostoru (po bytu, wordu, dusledky)
- zohledneni realneho casu v programech na PC (casovac 8253, nevyhody ostatnich metod)
- priznaky a aritmetika (jak aritmeticke instrukce nastavuji priznaky)
- assembler versus vyssi programovaci jazyky (otazka zadarmo)
- kratka rutina zpracovavajici pole (poznat, co dela)


Cviceni 12 (teoreticke):

Odevzdani ulohy 5 z devateho cviceni. Take se pisi chybejici testy.

Dalsi cast cviceni bude venovana diskum v PC a jejich ovladani pomoci BIOSu a primeho pristupu. Dale limity kapacit disku, moznosti rozhrani IDE. Vyvraceni nekterych naprosto nesmyslnych ale o to vic zazitych fam o velkych discich a reseni problemu s pristupem k temto mediim. Pro ukazku primeho pristupu k disku si muzete stahnout program ideinf.asm, ktery analyzuje diskove a CD-ROM jednotky na primarnim kanalu, bezchybne a to az do kapacity 128GB, narozdil od BIOSu. Je treba jej spoustet v DOSu, Windows odstinuji porty IDE radice. Je psany v TASMu (jeden z mych hrichu mladi). Zbytek cviceni bude venovan problemum ohledne semestralnich praci a odevzdavani semestralek ci uloh.


Cviceni 13 (odevzdavaci):

Opozdene odevzdani ulohy 5 z devateho cviceni. Odevzdavaji se take semestralky (predposledni sance), nebo si doplnit, co vam chybi (tesy, ulohy), pripadne zkonzultovat problemy ohledne semestralek.


Cviceni 14 (odevzdavaci, zapoctove):

Posledni moznost odevzdani ulohy 5 z devateho cviceni. Odevzdavaji se take semestralky (oficialne posledni moznost, neoficialne pak ... ).