Blog:Programovanie v assembleri i8080 pre PMD 85

Z PMD 85 Infoserver

Zoznam častí seriálu
  1. Úvod, Čo je assembler, Mikroprocesor i8080
  2. Inštrukčná sada mikroprocesora - Inštrukcie pre presun dát
  3. Inštrukčná sada mikroprocesora - Aritmetické inštrukcie
  4. Inštrukčná sada mikroprocesora - Logické inštrukcie
  5. Inštrukčná sada mikroprocesora - Inštrukcie skokov
  6. Inštrukčná sada mikroprocesora - Inštrukcie pre prácu so zásobníkom, inštrukcie pre vstup/výstup, ostatné inštrukcie
  7. Príprava projektu a nástrojov na editáciu zdrojového textu a jeho kompilovanie
  8. Vypisujeme znaky na obrazovku
  9. Píšeme texty
  10. Vypisujeme čísla
Programovanie v assembleri i8080 pre PMD 85 (1)


Obsah

Úvod

V niekoľkých článkoch sa tu pokúsim priniesť základné informácie o programovaní v assembleri i8080 pre PMD 85. Na webe sa síce v oblasti programovania i8080 nachádza množstvo "tutoriálov" (aj v českom jazyku), takže to možno bude miestami nosenie dreva do lesa (hlavne v prvých kapitolách), budem sa ale snažiť viazať výklad na špecifiká PMD 85.

Pri spisovaní týchto článkov som samozrejme nevysypal všetko z hlavy, naopak, čerpal som z mnohých zdrojov, prípadne som sa nimi inšpiroval. V prvom rade mi bola pomocníkom dvojica knižiek Assembler a ZX Spectrum od Tomáša Vilíma, ďalej príručka Programovanie v jazyku symbolických adries na PMD 85, kniha Porty, byty, osmibity od Martina Malého, ale i ďalšie podobné články na internete.

Začneme stručným popisom toho, čo je assembler, popisom mikroprocesora i8080, jeho programátorským modelom a jeho inštrukčnej sady, naučíme sa vypisovať znaky, texty i čísla, testovať klávesnicu, vydávať jednoduché zvuky, vyhodnocovať aritmetické výrazy, kresliť čiary, zobrazovať sprity a možno sa dostane aj na nejakú jednoduchú hru. V neposlednom rade si popíšeme kompilátor i ďalšie utility, ktoré budeme používať na skúšanie našich príkladov.

Ak pre vás už Assembler nie neznámy pojem a poznáte aj inštrukčnú sadu i8080, môžete hneď preskočiť na kapitolu, kde popisujem, ako si pripraviť projekt a rôzne nástroje pre kompiláciu. Pri nejasnostiach sa však vždy môžete vrátiť k týmto všeobecným kapitolám.

Čo je assembler?

Slovo Assembler sa používa v dvoch významoch:

  • programovať v assembleri - assembler ako "nízkoúrovňový" jazyk (Jazyk symbolických adries (JSA) alebo Jazyk symbolických inštrukcií (JSI))
  • používať assembler - assembler ako nástroj (kompilátor JSA/JSI)

Programovanie v assembleri je teda napísanie programu v JSA a jeho skompilovanie do výslednej "binárnej formy", alebo tiež do strojového kódu, ktorému už priamo mikroprocesor rozumie.

symbolická forma číselná forma význam
mov a,b 01111000b 78h 120 B <-- A

Uvedená inštrukcia prenáša obsah registra B do registra A. Mnemonika (typ inštrukcie) - mov - hovorí, ČO sa má urobiť, a,b - operandy hovoria S ČÍM sa to má urobiť. Vo všeobecnosti, inštrukcia obsahuje mnemoniku vždy, operandy môžu byť jeden, dva alebo žiadne (v tom prípade operandy vyplývajú z mnemoniky alebo sú implicitné).
Popis všetkých inštrukcií i8080 i samotného assembleru (kompilátora) bude uvedený neskôr.

Mikroprocesor i8080

i8080 je 8 bitový mikroprocesor, ktorý bol uvedený na trh firmou Intel v roku 1974. Československá Tesla vyrábala tento mikroprocesor pod označením MHB 8080A.

Mikroprocesor komunikuje so svojim okolím prostredníctvom 8 bitovej dátovej zbernice a 16 bitovej adresovej zbernice za pomoci niekoľkých riadiacich signálov. Adresa vyberá bunku pamäte alebo periférne zariadenie, kam/odkiaľ sa bude zapisovať/čítať hodnota na dátovej zbernici. Po ôsmych bitoch dátovej zbernice môže prenášať hodnotu 0 až 255 (00h až 0FFh) a 16 bitová adresová zbernica umožňuje adresovať 65536 pamäťových buniek - 0 až 65535 (0000h až 0FFFFh). Mikroprocesor môže pristupovať k 256-tim vstupno/výstupným portom s adresami 0 až 255 (00h až 0FFh).

Registre mikroprocesora i8080

Mikroprocesor i8080 poskytuje pre programátora 7 všeobecných 8 bitových registrov (A, B, C, D, E, H, L), register príznakov F, 16 bitový programový čítač PC a 16 bitový ukazateľ zásobníka SP.

Registre mikroprocesora i8080
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Registrový pár
A F PSW (Processor Status Word)
B C B
D E D
H L H
SP - Ukazateľ zásobníka (Stack Pointer)
PC - Programový čítač (Program Counter)
Príznakový register F
7 6 5 4 3 2 1 0
S Z 0 AC 0 P 1 CY

Register A - akumulátor - je najdôležitejší register, pretože sa zúčastňuje väčšiny aritmetických a logických operácií.

Dvojice registrov B a C, D a E, H a L možno používať ako 16 bitové registre v pároch B, D a H. Registrový pár H sa používa ako "pseudo-register" M (Memory) pri presunoch údajov medzi pamäťou a registrami - nepriame adresovanie. Akumulátor A a register príznakov F tvoria spolu 16 bitový register PSW.
Je dôležité si uvedomiť, že ak pracujeme s registrovým párom, menia sa aj jeho jednotlivé registre. A naopak, zmena hodnoty jednotlivého registra zmení hodnotu registrového páru.
K registrovým párom ešte zostáva doplniť, ako je v nich hodnota uložená. Ak je v registri HL hodnota 42841, tak v registri H (vyšší byte) je hodnota 167 (celá časť podielu 42841/256) a v registri L (nižší byte) je hodnota 89 (zbytok po delení 42841/256). Opačne, ak naplníme jednotlivé registre nejakými hodnotami, tak v registrovom páre bude hodnota HL=256*H+L. Toto samozrejme platí aj pre ostatné registrové páry.
Niekedy sa v texte nepoužíva slovné spojenie registrový pár, ale priamo sa hovorí napr. o registri HL, čo je v danom kontexte často zrozumiteľnejšie. Naopak, v samotných inštrukciách sa používa vždy ako operand iba označenie napr. H a či sa jedná o jednoduchý register alebo o registrový pár je dané mnemonikou inštrukcie.

Čo sa týka 16 bitových čísel a ich uloženia v pamäti, tak sa používa tzv. Little Endian, čo znamená, že 2 byty hodnoty sú v pamäti uložené v poradí najprv nižší byte a potom vyšší byte. Takto ukladajú a čítajú 16 bitové hodnoty do/z pamäte všetky inštrukcie pracujúce so 16 bitovými hodnotami.

Príznakový register F obsahuje 5 príznakov, na základe ktorých sa môže program vetviť - inštrukcie podmienených skokov, volaní podprogramov a návratov z podprogramu. Stav príznakov sa mení po vykonaní inštrukcie. Niektoré inštrukcie nemenia žiadne príznaky.

  • S - Sign flag (znamienko) - Príznak záporného výsledku - kopíruje sa doň 7. bit výsledku v akumulátore. Čísla väčšie ako 127 sú chápané ako záporné. Príznak má hodnotu 0 (v podmienke sa označuje P (plus)) pre kladné číslo, alebo hodnotu 1 (v podmienke sa označuje M (minus)) pre záporné číslo.
  • Z - Zero flag - Príznak nulového výsledku - má hodnotu 1 pre nulový výsledok (v podmienke sa označuje Z (zero)), alebo hodnotu 0 pre nenulový výsledok (v podmienke sa označuje NZ (not zero)).
  • AC - Auxilliary Carry flag - Pomocný príznak prenosu z 3. bitu do 4. - nie je možné ho testovať priamo a využíva ho interne iba inštrukcia DAA pre desiatkovú korekciu.
  • P - Parity flag - Príznak parity - má hodnotu 1, ak je počet jednotiek v akumulátore párny (v podmienke sa označuje PE (parity even)), alebo hodnotu 0, ak je počet jednotiek v akumulátore nepárny (v podmienke sa označuje PO (parity odd)).
  • CY - Carry flag - Príznak pretečenia - má hodnotu 0, ak nedošlo k pretečeniu (v podmienke NC (No Carry)), alebo hodnotu 1, ak k pretečeniu došlo (v podmienke C (Carry)). K pretečeniu dôjde, ak sa sčítajú dve čísla, napr. 200 a 100. Výsledok by mal byť 300, avšak toto číslo sa nevojde do 8 bitov, výsledok teda bude 44 a bude nastavený príznak Carry. Obdobne je to pri odčítaní alebo pri sčítaní dvoj-registrov. Tento príznak možno individuálne nastaviť alebo jeho hodnotu zmeniť na opačnú. Je vhodný pri aritmetických operáciách s číslami väčšími ako 8/16 bitov. Príznak Carry tiež využívajú inštrukcie rotácií.

Čítač inštrukcií PC ukazuje vždy na inštrukciu, ktorá sa bude vykonávať. Jeho hodnota sa mení po vykonaní inštrukcie o 1 až 3, podľa dĺžky vykonanej inštrukcie. Ak sa jedná o inštrukciu skoku, volania podprogramu alebo návratu z podprogramu, PC nadobudne hodnotu v závislosti od konkrétnej inštrukcie, jej adresného argumentu alebo stavu príznakov.

Ukazateľ zásobníka SP obsahuje adresu vrcholu zásobníka. Zásobník slúži na uloženie návratovej adresy pri volaní podprogramu a dočasné odloženie údajov v registrových pároch. Zásobník "rastie" k nižším adresám, čo znamená, že pri vložení údaja do zásobníka sa adresa zásobníka zníži o 2 a pri vybraní údaja sa zvýši o 2.



Inštrukčná sada mikroprocesora - Inštrukcie pre presun dát >>