Mám dojem, že si stále nerozumíme.
Dáme si příklad:
- Napíši a odladím kousek programu v assembleru, který má za úkol číst data z nějaké klávesnice. Nazvu jej např. KLAV.ASM a pod tímto názvem si jej někam uložím.
- Napíši si a odladím kousek programu v assembleru, který má za úkol zobrazit obsah registru W na displeji. Nazvu jej např. DISP.ASM a pod tímto názvem si jej opět někam uložím.
- Napíši si a odladím kousek programu v assembleru, který má za úkol vyrobit krátký zvukový signál (pípnutí). Nazvu jej např. ZVUK.ASM a pod tímto názvem si jej opět někam uložím.
A nyní budu chtít napsat program, který něco dělá (je jedno co) a kromě toho má za úkol testovat klávesnici a pokud na ní něco zmáčknu, tak kód této klávesy zobrazit na displeji a krátce pípnout.
Tu část programu, která “něco dělá” samozřejmě musím napsat. Ale program, který umí číst klávesnici již mám hotov (klav.asm), rovněž tak program, obsluhující displej a zvuk (disp.asm, zvuk.asm), takže tyto již nemusím znovu psát, ale stačí, když je vložím do mého nově vytvářeného programu.
A to mohu udělat dvěma způsoby:
-
Zkopírují přes schránku obsah souborů klav.asm, disp.asm, zvuk.asm a ručně je vložím na správná místa do mého programu nebo
-
Na správná místa mého programu vložím:
#include <klav.asm>
#include <disp.asm>
#include <zvuk.asm>
Když pak spustím překladač (v MPLAB = Build All nebo Make) tak ten neudělá nic jiného, než že čte můj zdrojový text řádek po řádku a pokud mu rozumí, přidělí mu správný binární kód instrukcí a dat, kterému rozumí programovací zařízení, kterým se to pak “napálí” do procesoru.
V případě metody č. 1 je vše jednoduché, překladač pouze zkontroluje syntaxi zápisu a je hotov.
V případě metody č. 2, však překladač v určitém místě narazí na #include <klav.asm>, a udělá to, že najde na disku soubor klav.asm, jeho obsah vloží do mého zdrojového textu na místo, kde bylo toto directivum, totéž udělá se zbývajícími dvěmi soubory disp.asm, zvuk.asm a všechno to pak přeloží do jediného binárního souboru s koncovkou hex, kterou pak můžeš předhodit programátoru a ten jím nakrmí programovou paměť procesoru.
Rozdíl mezi těmito dvěmi metodami je tedy pouze v tom, že v prvém případě jeden jediný zdrojový text obsahuje kompletní text, který potřebuji ke správné funkci celého programu (včetně všech těch částí, které obsluhují klávesnici, displej a zvuk) kdežto v druhém případě obsahuje pouze nově napsaný text a neobsahuje ony již dříve vytvořené texty pro klávesnici, displej a zvuk (obsahuje jen odkazy na ně). Zdůrazňuji, že mluvím o zdrojových textových souborech, nikoliv o přeloženém binárním kódu, který je pochopitelně v obou případech stejný!
Takže ono se vlastně dá v tomto slova smyslu mluvit při práci v assembleru o knihovnách, protože já si takto mohu vytvořit zdrojové kódy (podprogramy) pro jednotlivé dílčí operace, které se při práci s uC často vyskytují a pokud je mám správně (= univerzálně) napsané, tak je pak mohu použít v libovolném nově vytvářeném programu.
Rozdíl od vyšších jazyků je v tom, že takto v assembleru vytvořená knihovna je pro všechny čitelná, což nemusí být vždy žádoucí. Na druhou stranu je v tom i určitá výhoda, protože velmi často se dostaneš do situace, kdy je podprogram napsán pro jiný typ mikrořadiče, což může znamenat, že zdrojový kód je použitelný (protože instrukční sada je shodná), ale nesouhlasí např. adresy portů. Pokud máme čitelný zdrojový kód, není nic snažšího, než přepsat pár řádků programu, které definují porty a jsme hotovi.
Myslím, že je v podsatě jedno, který z uvedených způsobů použiješ. Přiznám se, že já používám directivum #include pouze k připojení definičních souborů a všechny ostatní (i dříve vytvořené “knihovní” podprogramy) ručně vkládám (kopíruji) do svého programu. Dělám to proto, že chci mít v jednom jediném dokumentu kompletní zdrojový text. Zkušení programátoři sice určitě namítnou, že při rozsáhlejších projektech je pak zdrojový text měně přehledný, ale mně to takto vyhovuje. Navíc - programátorů, kteří píší rozsáhlejší projekty v assembleru bychom asi dneš už příliš nenašli .
Zdraví
Vl.