Základy assembleru

Ano, já vím, terminologicky to není správné označení, ale mí čtenáři mu rozumí. Půjde o Jazyk symbolických adres, všeobecně (a nesprávně) nazývaný assembler.

Procesor, jak jsme si už řekli, zpracovává instrukce tak, že čte z paměti jejich strojový kód po bajtech, ty dekóduje a podle nich provádí požadované činnosti.Zápis programů v číselných hodnotách by byl velmi nepohodlný, proto se používá zápis pomocí mnemotechnických názvů instrukcí. Takovému zápisu se říká „jazyk symbolických adres“, nebo (nesprávně, ale všeobecně srozumitelně) „zápis v assembleru“ (anglicky assembly language).

Definice JSA na Wikipedii.

Program se v JSA zapisuje jako v jiných jazycích do textového souboru po řádcích. Řádky mají přesně definovaný formát a skládají se z následujících prvků:

  1. Návěští: řetězec znaků [A-Z, 0-9, podtržítko], který nezačíná číslicí. Některé překladače rozlišují jen prvních 6 znaků, jiné prvních 8, další pak všechny. Návěští je zakončeno dvojtečkou.
  2. Instrukce: mnemotechnická zkratka instrukce, popřípadě pseudoinstrukce (direktivy)
  3. Parametry: Některé instrukce a direktivy vyžadují další údaje, se kterými musí instrukce pracovat. Zapisují se za mnemotechnické označení instrukce, od které se oddělí mezerou (nebo mezerami). Pokud je parametrů víc, oddělují se od sebe čárkami.
  4. Poznámka: Cokoli, co si potřebujete poznamenat. Na začátku je znak středník (;), vše, co je za tímto znakem, překladač ignoruje.

Ukažme si různé typy řádků.

  • Prázdný řádek překladač prostě ignoruje
  • Řádek, kde je jen poznámka. Pokud je prvním znakem na řádku (mezery nepočítáme) znak středník, bere se zbytek řádku jako poznámka a překladač jej ignoruje.
  • Řádek s instrukcí: Na řádku je uvedena existující (pseudo)instrukce, popřípadě její parametry, má-li nějaké. Překladač ji přeloží na odpovídající operační kód. Za parametry může být ještě poznámka, kterou překladač ignoruje
  • Řádek s návěštím: Libovolný typ výše uvedených řádků může ještě začínat návěštím, tj. řetězcem ukončeným dvojtečkou. V takovém případě překladač přiřadí tomuto řetězci adresu, která odpovídá internímu počítadlu adres. (K tomu se ještě vrátím.)

Podívejme se na ukázku kódu:

V tomto kódu najdete řádek s komentářem (1), prázdný řádek (3), řádky s instrukcemi i řádky s návěštím.

Použil jsem jen jednu instrukci, totiž instrukci NOP, kterou znají všechny tři procesory a její význam je prostý: Nedělej nic. Možná se vám zdá zbytečné mít instrukci, která nedělá nic, ale ona se docela dobře hodí – když potřebujete někde „chvilku počkat“, nebo když si chcete někde nechat místo pro budoucí změnu. U procesorů 8080 / Z80 je její kód 0, u procesoru 6502 je to 0EAh.

Instrukce „.org“ není instrukcí v pravém slova smyslu. Nemá totiž žádný operační kód. Pouze říká překladači: Teď se chovej tak a tak. Patří tedy mezi pseudoinstrukce (nebo taky „direktivy“). Org je zkratka pro „origin“, tedy počátek. Tady říká překladači: Ber to tak, že tady, jak jsem já, bude nějaká konkrétní adresa, a následující instrukce tedy ukládej od té adresy dál.

Pseudoinstrukce .org má jeden parametr – totiž tu adresu. Tady je zapsaná v hexadecimální podobě.

Jak lze zapsat konstanty v assembleru?

  • Hexadecimální zápis
    • Pomocí číslic 0-9 a znaků A-F. Číslo začíná vždycky číslicí a je ukončeno znakem H (h). Takže: 1234h, 00AAH, 23beh, 0cfh, 18H, …
    • Pomocí číslic 0-9 a znaků A-F, před kterým je znak $. Takže: $1234, $00AA, $23be, $cf, $18, …
    • Některé překladače umožňují i zápis v „céčkové“ syntaxi „0x…“
  • Binární zápis
    • Řetězec znaků 0,1 ukončený písmenem „b“
    • Řetězec znaků 0,1, před kterým je znak „%“
  • Desítkové číslo
    • Zapsáno tak, jak jsme zvyklí.
  • Znaková konstanta
    • Znak zapsaný v apostrofech nebo uvozovkách. Hodnotou je ASCII kód daného znaku. Např. „@“ = 64 = 40h

Tady je na místě připomenout, že konkrétní syntaxe jednotlivých překladačů se může lišit. V dalším popisu budu vycházet z tvaru, jaký jsem implementoval v překladači ASM80. Totéž platí i pro pseudoinstrukce – někde je správný zápis „org“, u jiného překladače je to důsledně „.org“ s tečkou. ASM80 povoluje oba tvary. Původní assemblery braly zápis bez tečky.

Listing

Když si vezmete výše zapsaný kód a zkusíte ho přeložit překladačem – např. výše zmíněným ASM80 – získáte na výstupu jednak binární podobu (která nebude moc zajímavá), jednak takzvaný listing, což je výpis programu spolu s adresami a instrukčními kódy.

Každý řádek začíná adresou, na jaké je daná instrukce uložena. Vidíte, že na prvním řádku ještě překladač neví, kde chceme program mít, a tak počítá s tím, že bude uložený od adresy 0. Na druhém řádku pseudoinstrukcí .org říkáme, že program bude v paměti uložen od adresy 0100h. Překladač si proto nastaví interní počítadlo adres (_PC) na hodnotu 0100h. Třetí řádek je „prázdný řádek s návěštím“. To znamená, že do tabulky návěští je zařazeno návěští se jménem ZACATEK a je mu přiřazena hodnota interního počítadla adres, tedy 0100h.

Čtvrtý řádek obsahuje konečně nějakou reálnou instrukci. Je to instrukce NOP, je přeložena na operační kód (00) a ten bude uložen na adrese 0100h. Počítadlo se posune na následující adresu, tedy 0101h.

Pátý řádek: NOP, kód je zase 00, je uložen na adrese 0101h a počítadlo se posouvá…

Šestý řádek: NOP, kód je zase 00, je uložen na adrese 0102h a počítadlo se posouvá…

Na sedmém řádku je návěští NAVEST. Je mu tedy přiřazena hodnota interního počítadla adres (0103h). Na tomtéž řádku je i instrukce. Její operační kód je uložen na tuto adresu a pokračujeme dál…

Na samotném konci listingu vidíte výpis všech návěští. _PC je interní počítadlo adres (které skončilo na hodnotě 0104h), no a návěští ZACATEK a NAVEST mají ty hodnoty, jaké jsme si popsali výše.

Základy jsou tedy jasné, pojďme na skutečné programování v assembleru!

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

Napsat komentář

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