Vítám vás u seriálu o jazyku symbolických instrukcí neboli Assembleru. Cílem tohoto seriálu bude seznámit vás ze základní strukturou a principem činnosti procesoru počítače a způsobem jak ho programovat. Pro naši práci budeme používat sady instrukcí pro procesory firmy Intel Pentium. Všechny jeho novější procesory jsou zpětně kompatibilní se staršími a tak netřeba se obávat jestli vám zrovna na tom či onom typu procesoru bude má ukázka fungovat. Ačkoliv začnu úplně od základů, předpokládám u čtenáře alespoň základní orientaci v programátorském světě a tedy znalost základních principů programování jako podmínky, cykly, logické výrazy, funkce a taky potřebné jazykové vybavení jakožto rozumění pojmům proměnná, binární kód atd. I přesto, že bych rád, aby se mohli s assemblerem naučit i lidé nemající vůbec potuchy o programování, musím se osobně přiznat, že nedokážu psát tak po lopatě, aby to bylo srozumitelné úplným začátečníkům, jelikož nedokážu posoudit co je ještě všeobecně jasné a co už pochopí jen člověk oboru zasvěcený, za což se předem omlouvám. Každopádně jakékoliv dotazy směřujte do komentářů, či mě na mail.
Assembler
Pojďme tedy už k samotnému Assembleru. Tento jazyk se řadí mezi programovací jazyky nižší úrovně, jelikož jeho instrukce přímo říkají procesoru co má kde a jak provést, stručně řečeno, na plnou hubu říkáme to vem z tama a dej to sem, to porvnej s tím, to zneguj, bez obalu bez jakýchkoliv kamufláží, přesně vidíme krok po kroku co program jak dělá. Zatímco v takovém C, jenž se řadí mezi vyšší programovací jazyky se nám naskytuje pohled pouze na funkčnost programu, tedy řekneme porovnej a s b a větší ulož, což zapíšeme taky instrukcemi, lépe příkazy, u těch nás ovšem nezajímá vnitřní struktura jak se to dělá, ale jen výsledná funkčnost. Můžeme tedy říct, že vyšší jazyky pracují ve více abstraktnějším prostředí a už ne přímo v prostředí s procesorem. Každopádně nižší i vyšší jazyky produkují ty samé programy a pracují s tím samým procesorem a z čehož logicky vyplývá, že vyšší jazyky musí být nejdříve přeloženy do nižšího jazyka a ono se tak vskutku při kompilaci programů děje, jak jistě ti z vás co pracují v C nebo podobném jazyku vědí.
Procesor není nic víc než jenom pekelně rychlý blbec co umí rozhazovat jedničky a nuly na všechny strany, říkával jeden náš učitel. Procesor opravdu neumí nic jiného než na základě vstupu daného v binárním kódu udělat výstup v tom samém formátu. A pokud si přejeme s ním přímo pracovat, musíme binární kód zvládnout na výbornou. Všechna data, se kterými pracujeme v reálné světě se skládají s písmen a čísel, pro nás běžné symboly, se kterými umíme pracovat a zpracovávat je, ovšem počítač to bohužel neumí. Je tedy nutné tyto data převést do pro něj srozumitelnější formy.
Číselné soustavy
Procesor pracuje čistě v binárním kódu, je sice fakt, že například adresy se píšou většinou hexadecimálně, ale tyto hodnoty se stejně převedou opět na binární kód, takže hexadecimální zápis je jen formou zdechlosti programátorů psát dlouhé binární čísla, samozřejmě to ale zpřehledňuje zápis a tedy má jakýsi funkční smysl. My se nyní naučíme převádět čísla do binárního kódu a co znaky možná ptáte se, znaky jsou pro počítač opět pouhopouhé čísla, pokud nevíte jak jsou v počítači reprezentovány, vygooglete si ASCII a tam se vše potřebné dozvíte. Pojďme se už konečně vrhnout na převody. Naučíme se převádět z desítkové soustavy do binární, osmičkové a hexadecimální. Pro ukázku budeme pracovat s číslem 586.246. Chceme-li číslo převést, musíme ho rozdělit na celou a desetinnou část. Celou část budeme dělit základem soustavy (2/8/16) a sepisovat zbytky po dělení, až dojdeme k číslu 0 skončíme a odzadu sepíšeme zbytky, což je naše výsledné číslo.
Pozn.: Jestliže pracujeme se soustavou obsahující více než 9 číslich, např. hexadecimální, zavádíme jako další číslice písmena tedy 10=A,11=B,…,15=F.
Desetinou část násobíme základem soustavy a sepisujeme výslednou celou část, opět postupujeme až do doby než máme výsledek 0. Je ale nutno poznamenat, že ne vždy se dá dobrat konečného výsledku a mohli bychom tak počítat do nekonečna, proto se výpočet prostě skončí a číslo bude mít bohužel chybu zkrácení (Truncation error). Pro ujasnění názorná ukázka na tabulce pro binární a hexadecimální soustavu:
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Číslo 586.248=1001001010.001111110111=24A.3F7 (se zmíněnou chybou ovšem).
Převod zpátky do desítkové soustavy je pak následující: číslice v dané soustavě na daném místě vlastně vyjadřuje kolikrát je v něm obsažena n-tá mocnina základu soustavy tedy:
1010.01=1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0)+0*(2^-1)+1*(2^-2)
A3.5C=10*(16^1)+3*(16^0)+5*(16^-1)+12*(16^-2)
Pokud bychom chtěli převádět číslo z binární soustavy do hexadecimální či osmičkové, pomůžeme si následující pomůckou. V pořadí od desetinné tečky si rozdělíme číslice po 4 (hexadecimální soustava) nebo 3 (osmičková) a převedeme jen tyto čtveřice/trojice do dané soustavy a zapíšeme:
| 1 1 0 1 | 0 1 1 0 | = (hexadecimální) D6
| 1 0 1 | 0 1 0 | = (osmičková) 52
Pozn.: Pokud nemáme počet číslic roven násobku 4/3 doplníme číslo zleva či nulami.
Tímto bych tento úvodní díl zakončil, příště si ukážeme přesnou formu binárního kódu, se kterou pracuje Assembler, základní aritmetické operace s binárními čísly a lehce naťukneme strukturu procesoru.
Na viděnou příště…



Na úvod mi chybí nějaká motivace, proč se assemblerem vůbec zabývat, jaké je jeho využití apod. Navíc pokec o převodu sem podle mě moc nepatří, spoustu lidí to, jakmile to uvidí, rychle odradí. Přitom o assembleru by se dalo psát čtivěji a zajímavěji, alespoň ze začátku.
Ovládat binární, hexadecimální a decimální soustavu a zvládat převody mezi nimi je podle mého nezbytný základ k pochopení assembleru, takže sem určitě patří. Uznávám, je to nezáživné, ale je to asi jako hrát na hudební nástroj aniž bys uměl noty – nic ti nebrání hrát, můžeš to zvládat, ale prostě ti uniká základní podstata a pro hlubší pochopení to budeš dřív nebo později stejně potřebovat, asi tak…
Je sice fakt, že je to trošičku hůř čtivé, ale základ je to dobrý. Kdo se o této problematice skutečně má zájem něco dozvědět, jistě si to rád přečte.
vím že tabulka je jen ilustrační, ale hned v první tabulce dole chybí mezi řádky 1 – 952 a 1 – 808 ještě jedna 1 – 904 … teda jestli nemám divnou kalkulačku… a nebo jsem to nepochopil? Ale jinak to myslím začalo zajímavě, těším se na případné pokračování, rád si to přečtu.
Máš pravdu, chybí to tam. Tu tabulku jsem opisoval a řádek přehlídl, dělení dvěma je práce pro počítač ne člověka, tak sem to nekontroloval, sorry