.-=[ HIGH / low ]=-.

           Ohlasy na  moje příspěvky do  rubriky programování jsou  různé,
     někdo píše: "Dík,  právě tohle jsem potřeboval !",  ale jsou i ohlasy
     typu:  "No jo,  to je  všecho pěkný,  ale co  to tam  má bejt za změť
     třípísmenkovejch blbostí a vůbec tohle mi je nanic, když nevim jak to
     vlastně  funguje..."  Přívaly  dotazů   ohledně  minulého  článku  na
     scrolling v textovém režimu mě utvrdil v tom, že bude asi lepší, když
     začnu od  píky a vysvětlím význam  těch "třípísmenkovitejch blbostí",
     aby už podobné problémy nenastaly. V procedůrce SetTextLine byl jeden
     velice záludný překlep. Místo mov ax,ch mělo být mov ax,0ch. Ten, kdo
     alespoň  trochu programuje  v assembleru  ví, že  k podobným smrťákům
     dochází dosti  často. Je to problém  s zápisem hexadecimálních čísel.
     Jejichž přítomnost  se udává překladači pomocí  písmenka "h" na konci
     hexadecimálního zápisu,  ale aby bylo  při překládání poznat,  zda se
     jedná o jméno proměné nebo o  hexadecimální číslo, je nutné psát vždy
     před hexadecimální  číslo začínající nějakým  znakem z abecedy  nulu.
     Většinou se nic nestane a překladač ohlásí error, ale v tomto případě
     se nám do toho zapletlo ještě značení pro horní bajt registru cx, což
     se při překladu nepozná a vesle se při vykonávání instrukce přiřazuje
     do ax hodnota  z registru ch místo konstanty  12. Většina lidí, kteří
     mi psali, že jim scrolling nechodí na tuto chybu nepřišla, z čehož se
     dá usoudit,  že si buď nedali  práci jí odhalit a  nebo jim assembler
     nic neříká. Je více než jasné,že většina začínajících programátorů se
     učí nejprve nějaký  high-level jazyk a časem přestupují na assembler.
     O tom, jestli  je toto zrovna  vhodný způsob, jak se naučit efektivně
     programovat,  by   se   dalo   polemizovat.   Z   hlediska  pochopení
     problemiatiky  programování  je  bezpochyby  lepší,  když  se  začíná
     s názorným  a  přehledným  high-level  jazykem.  Jenže většina  takto
     poznamenaných  jedinců má  problémy s  přechodem na  assembler. Podle
     mého názoru nemá smysl programovat  100% v assembleru, jako je zvykem
     u některých demo-skupin, které zakládaájí spolky typu 100% asssembler
     rulez  atp.  Programátoři  sami  přiznávají,  že  programují v čistém
     assmbleru,  ale  hojně  používají  maker. Nějaký high-level jazyk  je
     v podstatě makrojazyk  assembleru. Ať je to  Pascal nebo C++, pokaždé
     se jedná  o určitou filozofii  zjednodušení programátorovi práci  při
     vytváření  složitých   programů.   Kdyby   si   všechno   musel  psát
     v assembleru,  asi  by  se  po  čase  zbláznil  z  nesčetného možství
     instrukcí a změti proměnných. A vůbec ani nechci  mulvit o problémech
     s odlaďováním,   které  jsou   v  high-level   jazycích  ve  srovnání
     s klasickým assembleroidním debugerem procházka růžovým sadem. Ale na
     druhou  stranu  jsou  tu   určité  problémy  týkající  se  generování
     výsledného  kódu high-level  jazyků, které  zpočívají v  neschopnosti
     algoritmizovat  některé fígle,  jimiž se  výrazně urychluje  výsledný
     kód. Většina low-level  operací se proto musí psát přímo v assembleru
     a záleží na překladači jakým  interfacem pro návaznost high/low-level
     jazyků   disponuje.  S   bombastickým  vývojem   stále  dokonalejších
     a rychlejších   procesorů  a   vůbec  všech   komponent  PC  začínají
     programátoři  lenivět  a  oddávají  se objektovjě-vizuálním choutkám.
     Borlandovské  Delphy  jsou  v  podstatě  dobrý  nápad  realizovaný na
     nechutně  mizerném   základu  Woken.  Pokud   by  se  něco   takového
     realizovalo  na  základě  naprogramovaných  knihoven, které vytvořili
     opravdoví profesionálové a ne  banda vychytralých příživníků, dalo by
     se  o  projektu Delphy  uvažovat  v  kladném  symslu, ale za takovéto
     situace je jeho  využívaní více méně sebevraždou. V  současné době je
     proto   kombinace  low/higih-level   jazyků  tím   nejprogresivnějším
     řešením.

                             .-= Turbo Assembler =-.

           Udělat  něco jako  učebnici assembleru,  ve které  by byly  jen
     příklady a žádná teorie, by  nemělo v podstatě  žádný smysl. Já  jsem
     vybral  menší  kompromis.  Beru  na  vědomí  vaše  názory na papírové
     publikace o assembleru, ale bez základních poznatků to opravdu nejde.
     Ale nebojte  se, teorie a  příklady budou půl  na půl, což  je myslím
     docela zajímavý poměr,  alespoň jsem se s něčím  podobným v minulosti
     nesetkal. Kdo umí programovat v Pascalu nebo v Céčku a když se podívá
     na assembler dělá  se mu mdlo, si musí  uvědomit jednu podstatou věc.
     High-level  jazyk  zajišťuje  programátorovi  stovky  různých funkcí,
     které  vytvářejí  jakýsi  neprůhledný  obal  pod  kterým  se skrývají
     instrukce,  které tyto  funkce vykonávají.  Programátor se  tedy může
     věnovat svým konkrétním problémům s tím, že se už nemusí starat o to,
     jak  vlastně   funguje  adresování  paměti   nebo  práce  s   vstupem
     a výstupem. Programovací jazyk mu  všechny tyto "neviditelné" operace
     obstará  sám. Pokud  chce programovat  v assembleru,  musí se  s chtě
     nechtě seznámit se vším, co se vlastně v počítači děje.  Začneme tedy
     pěkně  popořádku. Na  samém počátku  je paměťové  místo v  procesoru:
     registr IP,  který obsahuje offset adresy  právě prováděné instrukce.
     Tato instrukce se  nachází někde v operační paměti.  Její umístění je
     určeno  adresou  CS:IP,  kde  CS  je  segment  ve kterém jsou uloženy
     instrukce spuštěného programu, spolu s registrem IP určuje tedy místo
     v paměti,  kde se  nachází zpracovávaná  instrukce. Adresování paměti
     stylem  segment:offset  se  provádí   následovně:  jeden  segment  má
     velikost 64KB (65536 bajtů), procesor  jeho umístění určuje pomocí 16
     bitů (2 bajty). Offset je relativní ke svému segmentu a je určen také
     16 bity. Výslednou lineární adresu získáme tak, že segment vynásobíme
     16 a  přičteme hodnotu offsetu.  Procesor (v tomto  případě i8086) je
     pak  schopen mapovat  20-bitovou  fyzickou  adresou až  1MB. Spuštěný
     program má  obvykle část paměti vyhrazenou  pro instrukce (registr CS
     - code segment), část pro data (registr DS - data segment) a část pro
     zásobník  (registr  SS  -  stack  segment).  Do  datovém  segmentu si
     programátor naskládá statické proměnné nebo konstanty, které bude při
     práci  potřebovat.  Zásobník  slouží  pro  dočasné odkládání registrů
     například  při volání  podprogramu nebo  kdykoli, kdy  je to potřeba.
     Systém ukládání se  jmenuje LIFO (Last In First  Out). Pokud ukládáte
     do  zásobníku například  nějaký registr,  zapíše se  jeho hodnota  na
     adresu  SS:SP  a  SP  (registr  SP  -  stack  pointer) zmenší o délku
     ukládaného  registru.  Při  opačném  procesu  se  registr  SP  zvětší
     o velikost registru do kterého hodnotu  ukládáme a naplní ho hodnotou
     z adresy SS:SP. Procesory i8086  mají celkem 14 16-bitových registrů:
     AX, BX, CX, DX, CS, DS ,SS, ES, SP, BP, SI, DI, IP a stavový registr.
     Ten je  rozdělen  na 9 bitových  flagů, které se značí:  OF (Overflow
     Flag),  DF  (Direction  Flag),  IF  (Interupt  enable Flag), TF (Trap
     Flag), SF (Sign Flag), ZF (Zero  Flag), AF (Auxilary Flag), PF (Pariy
     Flag)  a konečně  CF (Carry  Flag). Jejich  funkci si  vysvětlíme při
     konkrétních případech.  Tak a teď  dost teorie a vrhnem se rovnou  na
     věc. Aby jste měli co studovat, připravil jsem pro vás dva prográmky.
     Ten první je zobrazovač formátu  CEL (Autodesk Animator) pro velikost
     obrázku  320x200  v  rozlišení  320x200x256.  A  druhý  je už funkční
     scrolling v  textovém režimu. U každé  instrukce je popis, co  se při
     jejím   vykonávání  bude   dít.  Na   konec  mého   prvního  povídání
     o programování  v assembleru  ještě zařazuji  seznam instrukcí, které
     v prográmcích používám a jejich stručný popis.  Tady to je. 

                                                    ReDox

       P.S.: Pokud si budete chtít příklady vyzkoušet, při práci budete
             potřebovat  kompilátor Turbo Assembleru a Linker. Dodávají
             se s Borland  Pascalem 7.0, taže by jejich schánění nemělo
             dělat veliké potíže.


            výheň