Programujte přímo pomocí instrukcí procesoru. Aneb programování v Assembleru – 1. část

Programujte přímo pomocí instrukcí procesoru. Aneb programování v Assembleru – 1. část

Umíte už programovat v nějakém programovacím jazyce? Ovládáte základy jazyka C, Pascal nebo třeba Javy? Říká vám něco jazyk Assembler? Uměli byste vysvětlit, co všechno má společného s výše jmenovanými jazyky a čím se naopak liší? Nebo patříte mezi obyčejné zvídavé uživatele PC, kteří ještě programovat nezkoušeli? Tento seriál je určen i pro úplné začátečníky v programování.

Budeme postupovat po velmi malých krůčcích a nebudeme tudíž tento jazyk projíždět do detailů. Pokud by vás ale zaujal a chtěli byste ho poznat podrobněji, doporučuji publikaci od pana Rudolfa Marka – Učíme se programovat v Assembleru, která se ale naneštěstí přestala vydávat. Budete se po ní muset podívat v antikvariátu nebo v Aukru a podobných serverech. Jediná publikace v češtině, která je ještě dostupná, je Mistrovství v Assembleru od Cpress http://knihy.cpress.cz/mistrovstvi-v-jazyce-assembler.html. Další knihy už jsou dostupné pouze v cizích jazycích.

Teď už ale k samotnému seriálu. První díl bude spíše teoretický, představíme si principy Assembleru, jaký je rozdíl mezi dalšími programovacími jazyky, jeho výhody a nevýhody a hlavně základní věci, které potřebujete pro programování v tomto jazyce bezpodmínečně znát. V prvním díle se seznámíme s teoretickými základy jazyka, druhý díl naváže vysvětlením struktury programů v Assembleru, demonstrací překladu a užitím aritmetických instrukcí v praktických příkladech. V následujících dílech se budeme pomalu pouštět do náročnějších programů, v závěru pak vyzkoušíme i práci s řetězci, do které spadá hledání znaku v textu, uvedení četnosti vybraných znaků v souvětí, práci s ASCII tabulkou atd. Za každým dílem, vyjma prvního, bude následovat pár otázek a zadání praktických cvičení, abyste se mohli přesvědčit, zda vysvětlované problematice dobře rozumíte.

Co je Assembler zač?

Ilustrační foto: Architektura procesoru

Ilustrační foto: Architektura procesoru

Assembler je nízkoúrovňový programovací jazyk, užívající k tvorbě programů symbolické instrukce procesoru. Tyto instrukce se následně při spouštění za pomoci překladače převedou na „reálné“ instrukce procesoru, lidově řečeno na jedničky a nuly, a vykoná se požadovaná akce. Jednoduchá symbolická instrukce může obsahovat i několik řádků binárního kódu. Na rozdíl od vyšších programovacích jazyků (C, Pascal…) pracujeme přímo s registry procesoru.

Pro napsání požadované akce potřebujeme více řádků, neboť jeden příkaz v C oproti tomu může obsahovat několik desítek řádků v Assembleru. Vyšší programovací jazyky jsou nekompromisně vhodnější pro tvorbu složitějších programů. Oproti tomu programy napsané v Assembleru jsou mnohem rychleji překládány a méně náročné na systém. Nelze popřít fakt, že pokud se naučíte ovládat Assemblery, nikdy pro vás při programování nebude představovat problém práce se zásobníkem a s pamětí. Při programování nás překladače „nehlídají“ tak, jako tomu je např. u Céčka. Veškeré možné chyby, týkající se práce s pamětí a se zásobníkem si musíme důkladně ohlídat sami. Ještě při spuštění programu tedy nemůžeme zajásat, že program je hotový a správně, jak to znají např. programátoři, pracující ve vývojovém prostředí Microsoft Visual C++.

Mohou nás totiž ve výstupu z ničeho nic překvapit hrůzně dlouhá čísla, z důvodu špatné práce s pamětí či zásobníkem, v horším případě se ve výsledku může jednat o úplně jiný prográmek, než jsme chtěli vytvořit. Nebudeme ale malovat čerta na zeď. Cílem tohoto seriálu je pouze vás seznámit se základy a principy tohoto jazyka. Jak již bylo zmíněno na začátku, pro pokročilejší znalost tohoto jazyka si musíte zakoupit některou z odborných publikací, kde je práci s pamětí a zásobníkem věnováno několik kapitol.

Jak probíhá překlad instrukce v praxi

Učíme se programovat v Assembleru - Rudolf Marek

Zdroj: Učíme se programovat v Assembleru – Rudolf Marek

Nyní nahlédneme do nitra procesoru a zjednodušeně si vysvětlíme, jak procesor zpracovává jednotlivé instrukce. Hlavní jednotkou je řadič, který má na starosti dekódování jednotlivých instrukcí. Pro jejich zpracování pověří patřičnou jednotku, např. pro aritmetické operace slouží ALU (aritmeticko logická jednotka). Při překladu složitější instrukce, např. přehrání zvuku, může pomocí sběrnice komunikovat s ostatními součástkami na základní desce. Dále vidíme na obrázku ještě různé registry, o těch si více povíme v některé z dalších částí článku.

Číselné soustavy: naučte se pracovat s jedničkami a nulami

Pokud chcete začít psát prográmky, měli byste znát:

  • Jaké číselné soustavy existují.
  • Jak se převádí mezi jednotlivými soustavami.
  • Jak tvořit záporná čísla.
  • Jak se sčítají a odčítají binární čísla.
  • Logické operace AND, OR, XOR.

Pokud na některý z těchto bodů neznáte odpověď nebo si tyto souvislosti vybavujete jen letmo, prostudujte si tento materiál:

http://uloz.to/xisVCrZ/ciselne-soustavy-pdfv PDF

http://uloz.to/xnSEJ6y/ciselne-soustavy-ppsxjako předváděcí prezentace

V něm jsou veškeré výše zmíněné body vysvětleny a předvedeny na příkladech.

Nyní vysvětlím, jak tvoříme čísla záporná. Pro jejich tvorbu je možno použít 3 způsoby:

  • Přímý kód – první bit je znaménkový, 0 znamená kladné číslo, 1 záporné číslo. Jako příklad si uvedeme číslo (11)2, dekadicky 3 bez znaménka, znaménkově se jedná o číslo -1, neboť první bit nám určuje znaménko, v tomto případě bude záporné.
  • Kód transformované nuly – při užití tohoto kódu postupujeme úplně stejně, s tím rozdílem , že 0 na začátku znamená číslo záporné a 1 kladné.
  • Doplňkový kód – tato technika je nejpoužívanější. Záporné číslo z kladného vytvoříme znegováním, tj. zaměníme nuly za jedničky a naopak, ke znegovanému číslu přičteme jedničku. Příklad: (11)2….negace je (00)2 a po přičtení jedničky ke znegovanému číslu dostaneme 00+01 = (01)2.  Dekadické záporné číslo vytvoříme odečtením hodnoty od 256, např. -3 bude zapsáno jako 253 v doplňkovém kódu.

Je potřeba, abyste práce související s číselnými soustavami znali, pokud se chcete naučit v Assembleru pracovat.

Registry procesoru

Registry procesoru

Registry procesoru

Nebudeme zde kompletně rozebírat, k čemu jednotlivé registry slouží. Zájemci si tyto informace mohou nastudovat např. zde: http://cs.wikipedia.org/wiki/Registr_procesoru.

Nám stačí vědět, že existují registry dvojího typu, a sice speciální, na které nesmíme „sahat“, jelikož každý z nich má v systému svoji úlohu a jakýmkoliv zásahem bychom mohli způsobit velké škody. Druhá skupina jsou obecné registry. Jimi jsou právě registry, se kterými budeme pracovat. Tabulka uvádí seznam 16 – bitových registrů. 32 – bitové se liší pouze v tom, že před názvem mají písmeno E, např. 16 – bitový AX vs. 32 – bitový EAX. Sada (E)AX – (E)DX nám poslouží k provádění aritmetických operací. U těchto registrů si můžeme všimnout v tabulce, jsou uvnitř ještě nějaké další registry (AH, AL,…) – jedná se o osmibitové registry. Registry (E)SI a (E)DI budeme potřebovat pro práci s řetězci. Poslední dva v tabulce jsou tzv. ukazatele, s těmi se ale v tomto seriálu blíže seznamovat nebudeme.

Registr příznaků

K jeho nepostradatelnému využití dojdeme až v příštích dílech seriálu. Registr příznaků je posloupnost čísel, obsahující mnoho příznaků. Pro naše účely je důležité znát tyto základní příznaky:

  • ZF (zerro flag) – příznak nuly, je aktivní (hodnota je 1), pokud je výsledek operace 0
  • SF (signum flag) – pokud je aktivní, je výsledkem operace záporné číslo
  • CF (carry flag) – aktivuje se, pokud se výsledná hodnota nevejde do vyhrazeného místa, např. sčítáme- li dva osmibitové registry a výsledek nám vyjde devítibitový, nejvyšší bit se přesune do CF, (11111111+11111111)2 = (100000000)2 - > CF = 1

Pokračování článku: Jdeme programovat. Programování v Assembleru – 2. část

V prvním díle se seznámíme s teoretickými základy jazyka, druhý díl naváže vysvětlením struktury programů v Assembleru, demonstrací překladu a užitím aritmetických instrukcí v praktických příkladech. V následujících dílech se budeme pomalu pouštět do náročnějších programů, v závěru pak vyzkoušíme i práci s řetězci, do které spadá hledání znaku v textu, uvedení četnosti vybraných znaků v souvětí, práci s ASCII tabulkou atd. Za každým dílem, vyjma prvního, bude následovat pár otázek a zadání praktických cvičení, abyste se mohli přesvědčit, zda vysvětlované problematice dobře rozumíte.

Komentáře

Nahoru