Assembler – 1.díl (číselné soustavy)

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:

0.248*2
0 496
0 992
1 984
1 968
1 936
1 872
1 744
1 488
0 976
1 952
1 808
0.248*16
3 968
15=F 488
7 808
586/2
div mod
293 0
293 0
146 1
73 0
37 1
18 1
9 0
4 1
2 0
1 0
0 1
586/16
div mod
36 10=A
2 4
0 2

Čí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ě…

O David Bambušek

Student FIT VUT Brno, zajímající se o všemožné webové technologie, programování a svět IT všeobecně. Svůj volný čas věnuje hlavně sportu, hraní na hudební nástroje a výrobě domácích vín.