OldComp.cz
http://oldcomp.cz/

Programování v assembleru Z80: jaké jsou "best practices"?
http://oldcomp.cz/viewtopic.php?f=113&t=1920
Stránka 111

Autor:  Jiiira [ 21.10.2014, 08:00 ]
Předmět příspěvku:  Programování v assembleru Z80: jaké jsou "best practices"?

Chtěl bych si něco naprogramovat a nerad bych to kazil hned od začátku, tak se chci zeptat:

1) Jaké je při programování v assembleru obvyklé/oblíbené/doporučené využití registrů Z80? Když pominu registry jako A nebo SP, které jsou dost nezastupitelné ;) , tak myslím třeba to, že BC se používá jako počet opakování cyklu, a podobné zažité zvyklosti...

2) A jak je to s voláním podprogramů, knihovních funkcí, či služeb OS, jestli je v tom taky nějaký léty osvědčený úsus. Předpokládám totiž, že se budu snažit, abych nemusel stejný kód psát víckrát, ;) a tudíž jaksi spontánně dospěju k tomu, že si budu budovat nějakou vlastní knihovnu funkcí... Takže mi jde o to, abych si položil solidní základ (také) v tom, že budu optimálním způsobem předávat parametry (a přebírat výsledky)...
Proto jsem si chtěl vzít příklad z nějaké knihovny, či operačního systému...

Předem díky za tipy... :)

Jiiira

Autor:  Busy [ 21.10.2014, 10:00 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Jiiira píše:
1) Jaké je při programování v assembleru obvyklé/oblíbené/doporučené využití registrů Z80? Když pominu registry jako A nebo SP, které jsou dost nezastupitelné ;) , tak myslím třeba to, že BC se používá jako počet opakování cyklu, a podobné zažité zvyklosti...
Nic take ako obvykle ci doporucene pouzitie registrov vo vseobecnosti neexistuje. Pokial to instrukcny subor umoznuje, mozes pouzit hocico na cokolvek. Napriklad v mojom rotazoomeri som pouzil SP pre uschovanie jednej suradnice vektora ktory definuje otocenie a zvecsenie obrazku. Takze ako registre pouzijes, je uplne na tvojej fantazii :)

Ale predsa len existuje zopar tipov, ktore vyplyvaju z instrukcneho suboru, a ktore tym padom umoznuju pisat efektivnejsie programy.
Napriklad:
B ... vdaka DJNZ je to vhodne 8-bitove pocitadlo v sluckach
HL ... vdaka adresovym moznostiam (HL) je vyhodne ho pouzivat na adresaciu pameti.
HL,DE ... vdaka ADD HL,rr... a EX DE,HL su vhodne pre pouzitie na 16-bitovu aritmetiku
HL=zdroj, DE=ciel, BC=dlzka ... takto je vyhodne pri praci s blokmi naplnat registre, aby si potom v pripade potreby presunu bloku mohol pouzit LDIR a pod.

Jiiira píše:
2) A jak je to s voláním podprogramů, knihovních funkcí, či služeb OS, jestli je v tom taky nějaký léty osvědčený úsus. Předpokládám totiž, že se budu snažit, abych nemusel stejný kód psát víckrát, ;) a tudíž jaksi spontánně dospěju k tomu, že si budu budovat nějakou vlastní knihovnu funkcí... Takže mi jde o to, abych si položil solidní základ (také) v tom, že budu optimálním způsobem předávat parametry (a přebírat výsledky)...
Proto jsem si chtěl vzít příklad z nějaké knihovny, či operačního systému...
Tu vo vseobecnosti existuju dva najpouzivanejsie modely predavania parametrov a vysledkov.
a) Vsetko v registroch - najefektivnejsie, najrychlejsie. 8 bitovy udaj obvykle v A, 16-bitovy v HL, 32 bitovy v nejakej dvojici 16-bit registrov. Ale pri vecsom mnozstve a rozsahu parametrov to zacne byt neprehladne.
b) Vsetko v pameti v presne specifikovanej strukture. Je to pomalsie, ale zase je to prehladne aj pri vela parametroch. Tento sposob pouzivaju niektore OS (betadisk, +d/disciple). Vyhodu je ze parametre mozno pohodlne nastavovat a citat pomocou (IX+offset).

Samozrejme oba sposoby mozno kombinovat a napr. jeden z parametrov v registroch bude adresa struktury v pameti s dalsimi parametrami.

Kompilery vyssich programovacich jazykov to robia tak, ze naPUSHuju vsetky hodnoty do zasobnika, kde si ich potom volana procedura preberie. Tento sposob je dobry na automaticky preklad, ale pre pisanie programov v asemebleri je tak trosku "kostrbaty" a neprehladny.

Autor:  Jiiira [ 21.10.2014, 14:29 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Busy píše:
Jiiira píše:
1) Jaké je při programování v assembleru obvyklé/oblíbené/doporučené využití registrů Z80? Když pominu registry jako A nebo SP, které jsou dost nezastupitelné ;) , tak myslím třeba to, že BC se používá jako počet opakování cyklu, a podobné zažité zvyklosti...
Nic take ako obvykle ci doporucene pouzitie registrov vo vseobecnosti neexistuje. Pokial to instrukcny subor umoznuje, mozes pouzit hocico na cokolvek. Napriklad v mojom rotazoomeri som pouzil SP pre uschovanie jednej suradnice vektora ktory definuje otocenie a zvecsenie obrazku. Takze ako registre pouzijes, je uplne na tvojej fantazii :)

Ale predsa len existuje zopar tipov, ktore vyplyvaju z instrukcneho suboru, a ktore tym padom umoznuju pisat efektivnejsie programy.

Přesně to jsem měl na mysli, právě na to jsem se ptal ;)

Busy píše:
Napriklad:
B ... vdaka DJNZ je to vhodne 8-bitove pocitadlo v sluckach
HL ... vdaka adresovym moznostiam (HL) je vyhodne ho pouzivat na adresaciu pameti.
HL,DE ... vdaka ADD HL,rr... a EX DE,HL su vhodne pre pouzitie na 16-bitovu aritmetiku
HL=zdroj, DE=ciel, BC=dlzka ... takto je vyhodne pri praci s blokmi naplnat registre, aby si potom v pripade potreby presunu bloku mohol pouzit LDIR a pod.

OK, a ještě co registry IX a IY ? A v jakých situacích se hodí využívat druhou sadu registrů (nebo se bez ní člověk ve většině případů obejde?)

Busy píše:
Jiiira píše:
2) A jak je to s voláním podprogramů, knihovních funkcí, či služeb OS, jestli je v tom taky nějaký léty osvědčený úsus. Předpokládám totiž, že se budu snažit, abych nemusel stejný kód psát víckrát, ;) a tudíž jaksi spontánně dospěju k tomu, že si budu budovat nějakou vlastní knihovnu funkcí... Takže mi jde o to, abych si položil solidní základ (také) v tom, že budu optimálním způsobem předávat parametry (a přebírat výsledky)...
Proto jsem si chtěl vzít příklad z nějaké knihovny, či operačního systému...
Tu vo vseobecnosti existuju dva najpouzivanejsie modely predavania parametrov a vysledkov.
a) Vsetko v registroch - najefektivnejsie, najrychlejsie. 8 bitovy udaj obvykle v A, 16-bitovy v HL, 32 bitovy v nejakej dvojici 16-bit registrov. Ale pri vecsom mnozstve a rozsahu parametrov to zacne byt neprehladne.
b) Vsetko v pameti v presne specifikovanej strukture. Je to pomalsie, ale zase je to prehladne aj pri vela parametroch. Tento sposob pouzivaju niektore OS (betadisk, +d/disciple). Vyhodu je ze parametre mozno pohodlne nastavovat a citat pomocou (IX+offset).

Samozrejme oba sposoby mozno kombinovat a napr. jeden z parametrov v registroch bude adresa struktury v pameti s dalsimi parametrami.

Takže se vlastně předává pointer na structuru... 8-)

Busy píše:
Kompilery vyssich programovacich jazykov to robia tak, ze naPUSHuju vsetky hodnoty do zasobnika, kde si ich potom volana procedura preberie. Tento sposob je dobry na automaticky preklad, ale pre pisanie programov v asemebleri je tak trosku "kostrbaty" a neprehladny.

Ale když se procedura volá CALLem, tak je na vrcholku zásobníku návratová adresa, ne? To se to vybírá "zpod ní"? :-o

Autor:  Busy [ 21.10.2014, 15:22 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Jiiira píše:
OK, a ještě co registry IX a IY ?
Indexove registry boli povodne navrhnute na spohodlnenie prace pre programatora, cosi ako vyssi programovaci jazyk. Mas v pameti nejaku oblast dat, smeruje do nej IX a ty teraz mozes adresovat lubovolny bajt dat presne ako pomocou (HL), ale bez toho, aby si musel registrom chodit po tych datach, pretoze mozes priamo do instrukcie napisat offset v rozsahu -128..+127: (IX+offset). Podobne ako vo vyssich jazykoch, umoznuje to pisat krasne a prehladne programy, avsak pododobne ako vo vyssich jazykoch, tieto programy bezia pomaly a zaberaju strasne moc pameti.

Preto napriklad v mojich 1k intrach nikdy konstrukciu (IX+offset) nepouzivam - ak som take potreboval, vzdy som to vyriesil nejak inak, kratsie, rychlejsie, efektivnejsie, a za cenu nizsej prehladnosti.

Indexove registre sa tiez zvyknu casto pouzivat pomocou neoficialnych instrukcii - ako dalsie vseobecne osembitove registre xh,xl,yh,yl. Napriklad ja ich casto pouzivam ako 8-bit pocitadla pre cykly, ked ostatne registre (vratane B-cka) su obsadene. Alebo ako priznak v ktorom prerusene nieco vracia do hlavneho programu a podobne.
Jiiira píše:
A v jakých situacích se hodí využívat druhou sadu registrů (nebo se bez ní člověk ve většině případů obejde?)
Druha sada bola navrhnuta povodne preto, aby sa zrychlila reakcia na prerusenie, alebo vo vseobecnosti rychlost volania lubovolneho podprogramu. Namiesto PUSHovania vsetkych registrov a nasledne ich POPovania sa len spravi EX AF,AF a EXX - co je ovela rychlejsie (no, indexove treba stale pushovat). Ale inak ich pouzitie je uplne lubovolne, kludne moze hlavny program pouzivat vsetky a podprogram ci prerusenie si potom poctivo pushne/popne co treba.

Dalsim zaujimavym pouzitim zaloznych registrov je velmi rychly prenos udajov. Na zaciatok zdrojoveho bloku nastavim SP, vyPOPujem vsetky registre, urobim EXX, EX AF,AF vypopujem zalozne registre, potom SP nastavim na koniec cieloveho bloku a vsetky registre zase naPUSHujem. Vdaka zaloznym registrom dokaze takto Z80 z pameti do seba naraz "nasat" az 20 bajtov, a nasledne ich vyklopit na miesto urcenia - prenos udajov je preto velmi rychly. Tento trik casto pouzivaju dema pre realizaciu zaujimavych grafickych efektov.
Jiiira píše:
Busy píše:
Kompilery vyssich programovacich jazykov to robia tak, ze naPUSHuju vsetky hodnoty do zasobnika, kde si ich potom volana procedura preberie. Tento sposob je dobry na automaticky preklad, ale pre pisanie programov v asemebleri je tak trosku "kostrbaty" a neprehladny.
Ale když se procedura volá CALLem, tak je na vrcholku zásobníku návratová adresa, ne? To se to vybírá "zpod ní"? :-o
To vobec nevadi :) Procedura si najprv zo zasobnika vyberie navratovu adresu, tu si niekde odlozi, potom povybera parametre, a na konci skoci na tuto navratovu adresu. A je to.

Autor:  hynek [ 21.10.2014, 18:05 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Pokud se parametry predavaji pres zasobnik ve vyssim jazyce, pak zpravidla jejich odstraneni ridi volajici funkce (vi, kolik toho na zasobnik ulozila a kolik toho tedy ma odstranit).
Jsou i jazyky (napr. pascal), kde to resi volana funkce, ale IMHO to je mene prehledne...
Pro adresaci promennych/parametru na zasobniku se casto pouziva prave IX/IY registr. Pokud navic jsou ve funkci jeste lokalni promenne na zasobniku, tak IX-neco jsou promenne a IX+neco jsou parametry.

Autor:  zxretrosoft [ 21.10.2014, 22:00 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Busy:
BTW Nechtěl bys třeba udělat nějaký miniseriál k Z80? Aby to mohl každý jednoduše vyzkoušet a trošku se to naučit. Byl by to ostatně velký počin :S

Autor:  mborik128 [ 21.10.2014, 23:32 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

zxretrosoft píše:
Nechtěl bys třeba udělat nějaký miniseriál k Z80?
Kolko tych serialov este bude musiet napisat, aby si to aj na oldcompe vsimli miestni retro-maniaci? :roll:

Autor:  zz_indigo [ 21.10.2014, 23:36 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

mborik128 píše:
zxretrosoft píše:
Nechtěl bys třeba udělat nějaký miniseriál k Z80?
Kolko tych serialov este bude musiet napisat, aby si to aj na oldcompe vsimli miestni retro-maniaci? :roll:


To vies dnes je kazdy zvyknuty na personalizaciu ;-)

Autor:  zxretrosoft [ 22.10.2014, 00:05 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Seriálů není nikdy dost. A když vidím, že tomu někdo takhle rozumí... díky za každý slovo! :thumbup:

Autor:  Busy [ 22.10.2014, 09:28 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

zxretrosoft píše:
Seriálů není nikdy dost. A když vidím, že tomu někdo takhle rozumí... díky za každý slovo! :thumbup:
No tak pouzivanie registrov by asi na serial nebolo, ale ak chces nejake serialy, tak kukni sem:
http://busy.speccy.cz/tvorba/clanky.htm
Najdes tam tieto serialy:
- Strojovy kod pre pokrocilych
- Rychle graficke rutinky
- Assembler 8086 (ak by si chcel nieco naprogramovat aj na PeCi)

Skvele stranky ma aj Martin Maly: http://strojak.cz/
Je tam sice iba 6502 a 8080 ale planuje tam doplnit aj Z80.

Autor:  zxretrosoft [ 22.10.2014, 09:35 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Díky!

Autor:  zxcygnus [ 22.10.2014, 19:00 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Assembler a ZX Spectrum od Universuma jsi už četl? Pro mne to byla velmi užitečná učebnice.

A mohu pomoct kdybys potřeboval s rozchozením ASu na Linuxu, nebo vysvětlit cokoli z mého webu (vzpomenu-li si po tak dlouhé době). Ke všem mým programům by tam měly být komentované zdrojáky. http://cygnus.speccy.cz/

Autor:  Busy [ 22.10.2014, 21:40 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

A ja ti zase mozem pomoct s rozchodenim SjASM - je opensource, takze v podstate na akejkolvek platforme (s C kompilerom) :) S Norom ho mame rozchodeny na Win a Mac.

Autor:  zxretrosoft [ 23.10.2014, 08:17 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

Chlapi díky, podívám se na to! ;)


Citace:
Assembler a ZX Spectrum od Universuma jsi už četl? Pro mne to byla velmi užitečná učebnice.

Ano, kdysi, ještě si to vytisknu a pořádně to zkusím prostudovat.

Autor:  Busy [ 23.10.2014, 08:31 ]
Předmět příspěvku:  Re: Programování v assembleru Z80: jaké jsou "best practices

zxcygnus píše:
Assembler a ZX Spectrum od Universuma jsi už četl? Pro mne to byla velmi užitečná učebnice.
Dalsia skvela knizka je Bity do bitu, autor Ladislav Zajicek. Sice nesuhlasim so vsetkym, co tam pise, ale celkove ju doporucujem.

Stránka 111 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/