Welcome, Guest. Please login or register.


Author Topic: Assembly programozás (Read 254495 times)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #345 on: 2012.March.22. 11:19:55 »
A csere után BFFC-re be kell írni a nulláslap számát, és akkor az EXOS nem veszi észre. Ezt csinálják az EP64 kompatibilis átirataim 64-es módban, a rendszerszegmens elejére költöztetik a nulláslap szükséges elejét, így a nulláslap felszabadul, meg lesz a szükséges 48K szabad memória. Resetnél meg vissza csinálja a költözést.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #346 on: 2012.October.29. 06:01:10 »
Az EP gépi kódú programokban láttatok-e már olyat, hogy a dinamikus változók tárolására a vermet használja, méghozzá oly módon, hogy az IX vagy IY regiszterek a báziscímek, és ahhoz képest helyezkednek el változók?

PL: (Zárójelben az IX-től való byte távolság van)
0200 00 ; "üres" - SP ide mutat
0201 0A ; 8bites "perc" változó (-3.)
0202 04 ; 8 bites "óra" változó  (-2.)
0203 12 ; 16 bites "év" változó felső byte  (-1.)
0204 20 ; 16 bites "év" változó alsó byte - IX ide mutat (0.)

És akkor a kód
LD L,(IX+0)
LD H,(IX-1) ; "év" változó betöltése a HL regiszterbe
ADD HL,1 ; "év" növelése 1-gyel
LD (IX+0),L
LD (IX-1),H ; "év" változó visszatöltése a memóriába

Azt akarom ezzel kérdezni tehát, hogy a Z80-nál ez a fajta veremhasználat mennyire volt szokásos?

Ha igen, akkor a következő kérdésem, hogy szubrutinhíváskor csinálnak-e ilyet?

 PUSH IX  ;Régi referenciapont eltárolása
 LD IX,SP ; Új referenciapont felvétele a verem következő üres pontjában
 PUSH DE ; néhány subrutin változó átadása
 PUSH HL ; szintén átadás
 CALL subrutin ; Visszatérési pont a verem tetején

;majd visszatérés
 RET
; ezután visszaállítás
 LD SP,IX ; A hívás előtti stack visszaállítása
 POP IX  ; A hívás előtti referenciapont visszaállítása


Na ki mit tud ezzel kapcsolatban mondani? Zozo? István?
« Last Edit: 2012.October.29. 06:23:58 by tubybb »

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #347 on: 2012.October.29. 09:32:10 »
Quote
Az EP gépi kódú programokban láttatok-e már olyat, hogy a dinamikus változók tárolására a vermet használja, méghozzá oly módon, hogy az IX vagy IY regiszterek a báziscímek, és ahhoz képest helyezkednek el változók?

Szerintem ez inkabb magasabb szintu programnyelveknel szokas, bar nyilva jol jon pure asm-ban is, ha olyan trukkos dolgok kellenek mint rekurzio stb. Peldaul a mostani jatszadozasom, ahol az sdcc C fordito (ami tud Z80-ra kodot generalni) kepes legyen EP-re alkotni valamit: ott egy primitiv programnak (mondjuk hasznaljon valami chat/string output-ot meg olvasson billenyuzetet) azt varja, hogy a putchar es getchar rutint implementald, ha ez megvan akkor std printf() stb menni fog csupan ezzel a ket fuggvennyel, amit neked kell megirnod viszont. No, ezt persze assembly-ben csinalom, EXOS hivasokkal, amde itt pl a C fordito miatt tartanom kell magamat a konvekciohoz: azaz pl putchar eseten a kiiradno char a veremben lesz, ami C szinten kb igy definialhato: void putchar (char data). (visszateresi ertek - ami mondjuk putchar-nal nincs, de getchar()-nal igen - meg siman pl az L regiszterben kell atadni, felteve ha az sima byte-ban reprezentalhato ertek.

Quote
...stb...
 LD SP,IX ; A hívás előtti stack visszaállítása
 POP IX  ; A hívás előtti referenciapont visszaállítása

Na egen, pl az altalam implementalt putchar() fuggveny, amit aztan sdcc forditott cucc stdio-ja kepes hasznalni:

        ; THIS IS putchar() function for the C runtime
        .globl  _putchar ; C syms are underscored in assembler
_putchar:
        push   ix ; SDCC uses IX to access params in stack. you must save it
        ld      ix,#0 ; ... and use ix=sp since Z80 lacks of sp relative addressing
        add    ix,sp
        ld      b,4(ix)
        ld      a,#MY_VIDEO_CHANNEL
        EXOS 7
        pop   ix
        ret


Valojaban itt az 'add' azert van igy, mert kiserleteztem a dologgal, es nem akartam az IX+...-nel offset-eket mindig atirni, van ahol meg tobb parameter is van. A +4 se feltetlen igaz a fenti megjegyzessel, azert +4 (es nem +2, a viszzateresi ertek is a stack-ban van mar), mivel a push-al mi is berakunk egy word-ot elotte. Az elejen egy kicsit bele is keveredtem, azert most a mostani kodom kisse kusza tobb helyen is. Az assembly formatum meg fura, mert az sdcc assembler-e igy tudja, azaz pl (ix+4) helyett 4(ix) kell neki.

Amugy van ezzel kapcsolatban azert egy erdekesseg. Alapbol az sdcc is - ahogy te is hozol peldakat, illetve en is irtam - az IX regisztert hasznalja kvazi stack pointer relativ cimzes megvalositasahoz. Amde, ez nem feltetlenul optimalis. Ugyanis kisse "lassu", ha jol saccolom fejbol valami 18 (? vagy 19) ciklus. Ellenben az ld a,(hl) az pl csak 7, igaz nem tudsz offset-et, de meg ha inc-et hasznalod mindig utana (6 ciklus), a ketto meg mindig gyorsabb! Es raadasul nem kell pop/push sem nagyon mert a hl-bol kivonsz a vegen. Ez ranezesre csunyabbnak, es korulmenyesebbnek tunik, de bizonyos felhasznalasi minta mellett meg mindig gyorsabb. Talan ezert is van, hogy ujabban az sdcc-ben talaltam, miszerint az un peephole optimalizatora atirja a C fordito altal generalt assembly forraskodban ilyenre a cuccot es utana ereszti ra csak az assemblert.

Osszefoglalva: imho egy asm only projecnel a stack allando hasznalata parameteratadasra (kovetkezetesen, mindig) nem feltetlenul a leggyorsabb, amde magasabb szintu programozasi nyelvek eseten kevesbe kikerulheto ...

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #348 on: 2012.October.29. 09:53:11 »
Konkrétan ilyet én még nem láttam, inkább ide-oda mozgatott HL-lel való címzés fordul elő.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #349 on: 2012.October.29. 10:01:02 »
Akkor beigazolódott a gyanum, miszerint ez annyira sok órajelet emészt fel, hogy EP-nél túlságosan lassan működne. Most éppen a C nyelv és Assembly utasítás közötti kapcsolatot vizsgálom, és végre meg tudom válaszolni a korábban már nem egyszer feltett kérdést, hogy a gépi kódban hogyan tároljuk a dinamikusan (futás közben) létrehozott változókat. Hát így.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #350 on: 2012.October.29. 11:36:42 »
Quote
Akkor beigazolódott a gyanum, miszerint ez annyira sok órajelet emészt fel, hogy EP-nél túlságosan lassan működne. Most éppen a C nyelv és Assembly utasítás közötti kapcsolatot vizsgálom, és végre meg tudom válaszolni a korábban már nem egyszer feltett kérdést, hogy a gépi kódban hogyan tároljuk a dinamikusan (futás közben) létrehozott változókat. Hát így.

Ha lesz idom "gatyaba razni" akkor igeny szerint kozkincse teszem esetleg munkamat, aminek celja az volt, hogy sdcc C forditoval lehessen EP-re fejleszteni C-ben, annak kapcsan "okositottam" fel magamat a kerdesben en is :) Btw, a Z88DK (z88dk.org) is erdekes, ez egy "C minus" fordito (alapvetoen C de egy-ket dolgot nem tud amit a C standard eloir), es van benne EP support. Mondjuk ahhoz erdemes up-to-date verziot lehuzni toluk, ami pl ubuntu linuxban volt, az "tul regi" ehhez. Viszont toluk lehuzva mukodni latszik, van par peldaprogram is, pl az egyik csupan EXOS hivasokon at mandelbrot halmazt rajzol ha jol emlekszem. Ezt en az sdcc-s jatszadozasom utan talaltam csak meg, kulonben az sem biztos, hogy nekialltam volna magam az scc-vel.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #351 on: 2012.October.29. 11:38:12 »
Quote
es van benne EP support
Na ez meglepett! Vajon ki volt olyan elszánt, hogy ezt megcsinálta?

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #352 on: 2012.October.29. 11:43:30 »
Quote
Na ez meglepett! Vajon ki volt olyan elszánt, hogy ezt megcsinálta?

=enterprise]http://www.z88dk.org/wiki/doku.php?id=platform:enterprise&s[]=enterprise
=enterprise]http://www.z88dk.org/wiki/doku.php?id=library:enterprise&s[]=enterprise

Latom linkeket kicsit elszurja mivel kapcsos zarojel van benne (az meg resze az post-ok markup nyelvenek, gondolom azert), de ha raklikkelek nekem legalabbis a bejonnek az oldalak amiket irtam.

Fri Apr 1 06:50:45 2011 UTC (18 months, 4 weeks ago) by stefano

Amugy. Marmint CSV repository szerint az egyik EP-specifikus file commitoloja, tehat valoszinuleg ez a stefano nevu ember kovette el a jelzett idopontban.
« Last Edit: 2012.October.29. 12:11:02 by lgb »

Offline Attus

  • EP addict
  • *
  • Posts: 1225
  • Country: hu
Re: Assembly programozás
« Reply #353 on: 2012.October.29. 13:49:12 »
Miért is kellene a C nyelv "nehézkes" zsákos adatátadási módszerét használni??

Számomra a "változók" fogalma a z80 assembler , mint más "magas" programnyelvek (C, pascal stb.) esetén eléggé megfoghatatlan, hisz csak írható/olvasható memóriarekeszek tartalmáról, vagy z80 regiszterek tartalmáról lehet szó, melyek mind változtathatók és mindig sima binárisak. Hogy mit látunk bennünk, string, oktális, decimális hossú egész, tömb, vagy logikai, vagy bármi más típusú "változót", az csak ezek értelmezésén múlik, mely nem a z80 dolga.

Ezeket a tároló rekeszeket, hogy hogyan szervezzük, használjuk, értelmezzük, szinte teljesen a Z80, sőt i8688 programozó szabadságán múlik.
Persze, hogy lehet a memória egy általunk meghatározott tartományában felépíteni egy adatok átadására használt részt, melyeken aztán különféle címzéssel, akár az SP, vagy indexregiszterek segítségével használunk, módosítunk.
Szerintem a legszebb és leghatékonyabb, melyet a magasabb programnyelvek nem nagyon képesek használni, hogy írható/olvasható memóriában futtatjuk a programkódot és magával a programmal építjük fel a később végrehajtandó program kódját, amire programunk rálép. Ez ROM-ban nem megvalósítható.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #354 on: 2012.October.29. 14:11:05 »
Quote
Miért is kellene a C nyelv "nehézkes" zsákos adatátadási módszerét használni??

Az en reszemrol azert kell hasznalni mivel C forditothoz irtam dolgokat (h az altala generalt kod menjen EP-n is), ott nehez kikerulni :) asm-only projectben nem tennem.

Quote
Szerintem a legszebb és leghatékonyabb, melyet a magasabb programnyelvek nem nagyon képesek használni, hogy írható/olvasható memóriában futtatjuk a programkódot és magával a programmal építjük fel a később végrehajtandó program kódját, amire programunk rálép. Ez ROM-ban nem megvalósítható.

Ez kb az onmodosito kod, bar esetunkben inkabb "oniro" :) Amugy ROM eseten sem elkepzelhetetlen: irhat az a RAM-ba, es atadja ra a vezerlest aztan :) Ilyet "modern" kornyezetben nem szokas hasznalni, hisz ott eleve alap hogy meg "diskrol betoltott" program kodja is read only (a CPU-k lapvedelme vagy egyeb MMU mechanizmusok miatt), tehat ha megprobalod atirni elszall a program (mondjuk UNIX-ok eseten SIGSEGV, windows-nal imho generalis protkos faliora). Ez azert is kell, mert ott pl egy program futthat tobb peldanyban (=multitasking), amikor a kod fizikailag egyetlen peldanyban fut: nyilvan ha a kod atirhato/modosithato, akkor ebbol total kaosz lenne. Nade ez kevesbe Z80 tema, hacsak nem ir az ember vmi advanced OS-t Z80-ra, akkor ott is lehet kerdes ez. Mondjuk Z80-al annyit (meg) nem foglalkoztam, de 6510-en C64-en imadom az onmodosito kodot, magas a "cool" faktor :)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #355 on: 2012.October.29. 14:19:00 »
Quote
imadom az onmodosito kodot, magas a "cool" faktor :)
Én is! :-)

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #356 on: 2012.October.29. 17:23:22 »
Btw, ha valakit erdekel, itt egy kis forumos beszelgetes a Z88DK es az SDCC C/asm parameteratadas kerdeseirol, a ket rendszer kozotti kulonbsegekrol, es hasonlokrol, amirol reszben szo volt itt "nalunk is" az elozo par post-ban. Szerintem erdekes elolvasni: ITT.

Offline Attus

  • EP addict
  • *
  • Posts: 1225
  • Country: hu
Re: Assembly programozás
« Reply #357 on: 2012.October.29. 17:25:57 »
Quote
Én is! :-)
Egyetértek. :)

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #358 on: 2012.October.29. 23:55:24 »
Nekem azért tetszik a zsákos módszer, mert ha a processzor támogatja az eljárást, és gyorsan is végrehajtja a memóriahozzáféréseket (ugyanolyan gyorsan mintha regiszterrel dolgozna) akkor a programfejlesztési idő az átláthatóság miatt töredékére csökken, sőt a kód újrafelhsználhatósága is javul. A legfontosabb pedig, hogy nem kell azzal foglalkozni, hogy visszatéréskor a regiszterek érékeit visszaállítsuk.
 Hátránya az, hogy sajnos csak olyan processzoroknál király ez a megoldás, ahol van cache, mert az elsődleges cache elérési ideje és a regiszter elérési ideje azonos.

 Kedvenc szubrutinom a mintakeresés, amikor van egy adott hosszúságú (jó hosszú) adathalmaz a memóriában, és keressük meg benne a "05 12 04 36 45" mintát. Visszatérési érték: A memóriacím, ahol a minta kezdődik, illetve NULLA ha nem volt benne. Itt jó dolog a zsák.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #359 on: 2012.December.07. 18:30:12 »
Hogy oldanátok meg egy 16 és egy 32 bites egész szám decimális (10-es számrendszerbeli) kiírását? Az egyszerűség kedvéért legyen előjel nélküli.

 Elmondom mi áll rendelkezésünkre.
1. Eset 16 bit:
 Adott egy memóriacím, ahol a szó alsó majd felső bájtja található
0200 B0 B1      ; ahol B0 az legalacsonybb helyiértékű bájt

Írjuk ki ezt a számot egy fájlba decimális formátumban szövegként.

2. Eset 32 bit:
 Adott egy memóriacím, ahol egymás után találhatóak a duplaszó egyes bájtjai
0200 B0 B1 B2 B3    ; ahol B0 az legalacsonybb helyiértékű bájt

Írjuk ki ezt a számot egy fájlba decimális formátumban szövegként.

 A Z80-nak nincs ilyen utasítása, tehát több utasításból kell megoldani, ebben biztos vagyok. Első kérdésem, hogy az EXOS-nak van-e erre saját rutinja? Második pedig, ki hogyan csinálná meg, és hány utasítást igényel a legrosszabb esetben?

 Egyetértetek azzal, hogy nagyon számításigényes a dolog (főleg 32 bites esetben) ?