Pseudoinstrukce

A jestli vám vadí to „pseudo-„, nemáte rádi věci, co jsou jen „jako“ a raději chcete mít vše jasně nařízené, tak to nazývejte třeba „direktivy“.

Překladač (správně nazývaný assembler, ale už jsme si vysvětlili, že tohle slovo se taknějak přemigrovalo i na Jazyk Symbolických Adres, a já tentokrát potřebuju zdůraznit, že mám na mysli ne ten jazyk, ale opravdu překladač, přičemž jaksi mimochodem píšu asi nejdelší vsuvku na celém tomhle webu a doufám, že si vzpomenu, jak jsem chtěl tu větu dokončit…) plní hlavně dva úkoly:

  1. Překládá instrukce, zapsané v mnemotechnickém tvaru, tj. v podobě nějakých snadno zapamatovatelných názvů, na jejich instrukční kódy (MOV B, C => 41h).
  2. Počítá pozici v paměti a dovoluje je nazvat nějakým lidským jménem, abychom mohli napsat „CALL podprogram“ a nemuseli přemýšlet, na jaké že adrese ten podprogram je.

Kromě těchto instrukcí („pravých“ instrukcí) pracuje překladač ještě s takzvanými pseudoinstrukcemi. „Pseudo-“ proto, že se zapisují jako instrukce, ale ve skutečnosti je procesor nezná. Zná je překladač a nějak se podle nich zachová. Některé už jsme si ukázali.

ORG adresa

Oznámí prohlížeči, že toto místo programu bude na dané adrese a další instrukce se uloží za něj. Díky tomu si překladač správně spočítá adresy.

DB číslo [,číslo, …]

Uloží do výsledného kódu bajt (nebo bajty). Místo čísla můžeme zapsat i řetězec do uvozovek – překladač s ním naloží jako se seznamem ASCII kódů.

DW číslo [,číslo, …]

Uloží do výsledného kódu šestnáctibitové číslo jako dva bajty. Pokud je víc parametrů, uloží víc dvojbajtových hodnot.

DS počet

Řekne překladači, že má vynechat určitý počet bajtů. Používá se v případech, že chceme nechat nějaký prostor volný (např. pro buffer) a je nám jedno, jaký bude jeho obsah na začátku, stačí, když bude N bajtů dlouhý.

návěští EQU hodnota

Přiřadí jménu návěští nějakou hodnotu. Třeba z minulé lekce:

Od této chvíle už nemusíme řešit, jestli jsme nespletli adresu – prostě napíšeme CALL PRTOUT a překladač zjistí, že jsme PRTOUT nadefinovali takovouhle hodnotu, tak ji použije.

Poznámka k návěštím

Každé jméno návěští je unikátní. To znamená, že pokud použijete stejné jméno znovu k označení nějaké pozice v paměti, nebo pokud už nadefinovanému jménu budete přiřazovat hodnotu pomocí EQU, překladač vám vyhodí chybové hlášení. Je to logické – kdybyste si definovali dvakrát stejný název, překladač by nevěděl, jaká adresa platí…

Následující pseudoinstrukce jsou popsané tak, jak je implementuje překladač ASM80. V jiných překladačích se jejich syntax může lišit.

.INCLUDE jméno-souboru

Na místo této instrukce vloží obsah zadaného souboru, jako byste ho tam vložili pomocí copy-paste. Ale asi není potřeba vysvětlovat víc. Všimněte si tečky na začátku pseudoinstrukce… Správně by se měla psát u všech pseudoinstrukcí (je to taková docela užitečná konvence), ale z historických důvodů se u těch výše zmíněných nepoužívá.

.IF výraz – .ENDIF

Překladač vyhodnotí výraz, a pokud je nenulový, pokračuje v překladu. Pokud je nula, vynechá všechny řádky až do nejbližšího .ENDIF – obdoba podmíněných bloků třeba u preprocesoru jazyka C.

.IFN výraz – .ENDIF

Stejná konstrukce, jen obrácená podmínka: následující instrukce až do .ENDIF se překládají, pokud je výraz nulový!

Aktuální seznam pseudoinstrukcí naleznete v dokumentaci k ASM80.

 

 

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 *