Trocha assemblerové teorie

Tuhle jsem do rozhovoru pro programátorský magazín (ve skutečnosti Zdroják) říkal: ASM80 je dvouprůchodový assembler. Prý to mám vysvětlit, co to znamená…

V dobách osmibitů byl „dvouprůchodový assembler“ de facto standard. Ale co to znamená? Musíme si říct, jak vlastně překladač funguje.

Bere řádek po řádku a kouká se, jestli tam je instrukce nebo pseudoinstrukce. Pokud ano, začlení si její kód do připravovaného výsledného útvaru, popř. provede to, co pseudoinstrukce nařizuje. Tím, že už v téhle fázi připravuje kód, tak vlastně ví, jak dlouhá která instrukce bude. Takže si může průběžně vytvářet i tabulku adres, kde má ke každému symbolickému jménu uloženou jeho adresu (nebo hodnotu). To je první průchod.

Ve druhém průchodu tohle všechno už má připravené, takže jede znovu, a jen na místech, kde je potřeba vyčíslit nějakou konkrétní hodnotu s odkazem, spočítá jeho hodnotu a doplní do kódu.

Takhle tedy funguje ASM80. Fungoval stejně i GENS (např.) Něco podobného (podobného!) dělal i Prométheus, ale ten, nakolik jsem pochopil, dělal část prvního průchodu už při editaci textu, kdy si jednotlivé instrukce „předpřekládal“.

Co jiné počty průchodů? Tříprůchodový? Jasně, existují. Dokážou třeba vyřešit problém několikanásobné dopředné reference, navíc by mohly trošku optimalizovat (plné skoky nahradit relativním, dlouhé varianty instrukcí těmi se zero page u 6502 a podobně).

Šel by napsat jednoprůchodový assembler? No jasně, šel – představte si první průchod, při něm to vyhodnocování výrazů… Když narazí na adresu, kterou už zná, tak ji použije, když ji ale ještě nezná, zapíše si do tabulky symbolických názvů tenhle název s poznámkou: „Až na tohle návěští narazím, doplním ho tam a tam“.

Počet průchodů tedy dokáže ovlivnit některé aspekty chování překladače (dopředné reference by jednoprůchodový zvládnul).

A kolikaprůchodové se používají dneska?

Turbo assembler, poslední, který jsem na PC platformě používal, je „multiprůchodový“. Ale vzhledem k jeho komplexnosti to ani jinak nejde. Ten hlavní rozdíl proti „starým pákám“ je v tom, že assembler dneska (ani včera) nepřipraví hotový binární kód pro spuštění. Sestaví něco, čemu se říká „objektkód“, což je v podstatě výsledek posledního průchodu, ale nevadí mu, když nějaké adresy nerozpoznal. Pravděpodobně patří nějaké knihovní rutině. Objektkód pak dostane do spárů program, kterému se říká „linker“, a ten spojí vše potřebné – všechny části kódu, knihovní rutiny, data, vše. Teprve když tady nějaký symbol chybí, tak je zle. Překladač oddělený od linkeru má tu výhodu, že program může být napsaný v různých jazycích, v jednom třeba výpočty, v druhém UI, knihovny ve třetím – a linker to poslepuje dohromady. Toto rozdělení samozřejmě není nijaká novinka. Není to dokonce ani výmysl šestnáctibitového světa. I osmibity měly překladače a linkery zvlášť, např. u CP/M. Tohle rozdělení funguje tam, kde není problém pracovat se soubory. U osmibitového domácího počítače s kazeťákem by to moc smysl nedávalo.

Líbil se vám článek? Podpořte autora na Patreonu
Příspěvek byl publikován v rubrice 6502, 8080, Assembler, Obecně, Z80. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

1 komentář u Trocha assemblerové teorie

  1. Pingback: Martin Malý: Osmibity nemizí, podívejte se do MP3 přehrávačů | IT mag - novinky z IT

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *