Welcome, Guest. Please login or register.


Author Topic: ASM EP-n - hogyan kezdjem? (Read 56302 times)

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: ASM EP-n - hogyan kezdjem?
« Reply #30 on: 2012.February.08. 00:05:02 »
Szívesen a könyvet, te nagyobb hasznát veszed, mert amit itt írtál, abból semmit nem értettem. Én a könyvnek csak az elsõ oldalait olvastam ki, a sorparaméter tábla elsõ sorait nem, és szegmenst sem lapoztam be, legfeljebb a könyvbe lapoztam be(le).  :ds_icon_cheesygrin:
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #31 on: 2012.February.08. 09:09:27 »
Ekkor jöttem rá arra a Z80 hiányosságra, hogy pl. nincs relatív CALL utasítás. Egy gépi kódú progamot nem lehet úgy megírni, hogy bárhova teszem a memóriában, ugyanolyan jól mûködik. A JR utasítással a relatív ugrást még megoldja, de ha a program után elhelyezkedõ adatterületet akarom használni, akkor nem tudok rá hivatkozni, mert nem tudom az abszolút címét.
 Nincs olyan utasítás, amivel a programszámláló értékét ki tudom olvasni, sem olyan báziscím regiszter ami megmondaná merre vagyok. Adatok írásához/olvasásához pedig ez elengedhetetlen.
:shock: :?: :?: :?:

Ezt nagyon nem értem! Erre valók a címkék az assemblerben! Te egyszer a program elején megmondod, hova teszed, a többi a fordító dolga.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: ASM EP-n - hogyan kezdjem?
« Reply #32 on: 2012.February.08. 09:22:40 »
Szerintem Tuby128 arra gondolt, hogy befordítva bárhová betöltve teljesen jól működne a kód. Ha a kód számolná a betöltési címhez képest az CALL ugrási címkéit, és helyettesítené be, talán így megoldható, de akkor ezt a program indulásakor egy plusz kóddal kéne elvégezni, és az összes CALL ugrási címét helyettesíteni. Nagyban megnőne a kód.

HL értékét fel kell bontani alsó, és felső byte-ra, majd 30h-ht hozzáadni, így a karakteres képernyőre egyből kiírható az érték, ja, figyelni kell hogyha betű, akkor nem 30h-at, hanem 37h-t kell hozzáadni.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #33 on: 2012.February.08. 09:26:46 »
:shock: :?: :?: :?:

Ezt nagyon nem értem! Erre valók a címkék az assemblerben! Te egyszer a program elején megmondod, hova teszed, a többi a fordító dolga.

Szerintem o arra gondolt, hogy a mar _leforditott_ cuccot akarja mas-mas cimre betolteni. Ezt hivjak (legalabbis egyes korokben) PIC kodnak (Position Independent Code). Ez amugy a maskeppen "fejlettnek" mondott x86-on is problema, egy regisztert kvazi el kell pazarolnod, hogy az adatterulet cimet ott tarold is igy relativen legyen cimezheto (mert ugye nem csak a PC-relativ CALL is a kerdeses: mi van a hasznalt adatterulettel?!). Mondjuk ez imho Z80-on is menne, bar ott (is) ervagas hogy egy regiszter megy a levelesbe a PIC jelleg miatt. Es nem is biztos, hogy van ertelme, hogy ugyanazt a kesz kodot be lehet tolteni nemi loader-rel kulonbozo PC-kre is, es az adat is lehet mashol stb.

Ez "komolyabb" (pl multitask miegymas) OS-eknel felmerulo kerdes meg 8 bites gepeken is, pl C64 viszonylataban alkottak meg erre az o65 nevu formatumot ami relokacios tablakkal rendelkezik, es a loader feladata a megjelolt program/adat byte-ok modositasa a betoltesi cim fuggvenyeben, en jatszottam ilyenekkel a kis prototype OS-semmel C64 DTV-n. De amugy "normal" kornyezetben (gondolom EP, EXOS) nem biztos, hogy megeri azt a macerat ami jar ezzel ...

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #34 on: 2012.February.08. 09:30:40 »
Szerintem o arra gondolt, hogy a mar _leforditott_ cuccot akarja mas-mas cimre betolteni.
És minek akar ilyet csinálni? Egyébként erre van kitalálva a relokálható fájlformátum az EXOS-ban.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: ASM EP-n - hogyan kezdjem?
« Reply #35 on: 2012.February.08. 09:31:11 »
valahogy így, remélem nem szúrtam el semmit:
Code: [Select]
ld    a,h
call  conver1

ld    a,h
call  convert

ld    a,l
call  conver1

ld    a,l
jp    convert

conver1 rrca
rrca
rrca
rrca
convert and   0fh
add   30h
        cp    3ah
jr    c,number1
add   07h
number1 ld    (de),a
inc   de
ret

Offline Attus

  • EP addict
  • *
  • Posts: 1225
  • Country: hu
Re: ASM EP-n - hogyan kezdjem?
« Reply #36 on: 2012.February.08. 09:39:31 »
Ekkor jöttem rá arra a Z80 hiányosságra, hogy pl. nincs relatív CALL utasítás. Egy gépi kódú progamot nem lehet úgy megírni, hogy bárhova teszem a memóriában, ugyanolyan jól mûködik. A JR utasítással a relatív ugrást még megoldja, de ha a program után elhelyezkedõ adatterületet akarom használni, akkor nem tudok rá hivatkozni, mert nem tudom az abszolút címét.
 Nincs olyan utasítás, amivel a programszámláló értékét ki tudom olvasni, sem olyan báziscím regiszter ami megmondaná merre vagyok. Adatok írásához/olvasásához pedig ez elengedhetetlen.


Persze, hogy megoldható mindez egy kis ötletességgel.
A verem mindig megmutatja, hogy merre vagy.
Egy egyszerú pop push párral már benne is van az a cím a regiszteredbe, ahova majd  a call ból visszatérsz a ret -tel.
Azonkívül a call utasítás operandusa is megváltoztatható, ha írható memóriában lépked a proci.
Ha meg nem, akkor is lehet vele számolni, benyomni az értéket a stackba és annyi.
 :)

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #37 on: 2012.February.08. 09:59:41 »
És minek akar ilyet csinálni? Egyébként erre van kitalálva a relokálható fájlformátum az EXOS-ban.

Azt nem tudom, hogy minek akar, en csak valaszoltam ra, hogy van ilyen amugy :) Azt persze nem tudtam, hogy EXOS-ban van hasonlo, de nem is csoda: hw-n felul EXOS-sal ismerkedesem csak folyamatban levo project eppen :)

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: ASM EP-n - hogyan kezdjem?
« Reply #38 on: 2012.February.08. 16:31:11 »
Attus!

 Azért nem jó a CALL utasítás, mert ha nem tudod hol tartózkodsz a memóriában akkor hova adod ki az ugrás címét? Az a baj a CALL-lal, hogy nincs relatív párja.

 LGB nem érzem azt, hogy pocsékolás lenne egy regisztert elhasználni arra, hogy megmutassa a báziscímet. Én inkább azt hívnám pocsékolásnak, hogy egy kód csak egy adott helyrõl képes elindulni. Ettõl lesz egy SW erõsen op rendszer specifiukus, és nehezen lehet átvinni máshová. A relatív ugrás ráadásul még gyorsabb és kevesebb helyet igényel, mert egy elõjeles byte-tal tudod megmondani mennyit ugorjon, nem pedig egy 16 bites abszolút címmel. Processzorórajeleket lehet megtakarítani.

Mindenki:
Már a 80-as évek szakirodalmai is kihangsúlyozták, hogy igenis a legjobb gépi kódú program az, amely a memória bármely pontjára elhelyezve problémamentesen le tud futni. Mind az 80x86-os mind pedig a Motorola 68 processzorcsalád tartalmazott olyan lehetõségeket, amely ezt az elvet támogatták.

(Forrás: Michael Andrews: Mikroprocesszorok és illesztõegységek, Mûszaki Könyvkiadó 1985)

 Persze hozzáteszem, hogy ott az operációs rendszer volt az úr, továbbá a proceszor nagyobb címterületet érhetett el, és mivel egyszerre több szoftver futott nem mindegy, hova kerül a program.

 (Gondolatjáték: Megírok egy assembly kódot 1000h címtõl, ami a képernyõre ír. Megírok egy másikat 2000h címtõl, ami a hangot ad. Eladom valakinek a rutint egy lemezen, de a forráskódot nem mellékelem. A vevõ egyszerre akarná a két szoftvert használni. Kiderül, hogy az elsõ kód hosszabb mint 1000h (tehát belenyúlik a 2000h-s címterületbe), ezért nem lehet a kettõt egyszerre a memóriába tenni. Ezt meg lehetne oldani lapozgatással, de ha mind a két kódra egyfolytában szükség van párhuzamosan, akkor rengeteg idõt elvesz a lapozás plusz a 0.LAP-ot nem tanácsos cserélgetni. Pozíciófüggetlen kód esetén ez nem jelentett volna gondot.)

A Z80-at tudom nem erre tervezték, a maga 4MHz-es órajelével örülünk ha egy feladatot el tud látni. Ezek a kérdések akkor merültek fel bennem, amikor kitaláltam, hogy gondolatban továbbfejleszteném a Z80-at mondjuk 200Mhz-re és további extra utasítások kerülnének bele, és a teljes 4MB-os memóriatartományt meg tudná címezni egyedül.


Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: ASM EP-n - hogyan kezdjem?
« Reply #39 on: 2012.February.08. 18:29:26 »
LGB nem érzem azt, hogy pocsékolás lenne egy regisztert elhasználni arra, hogy megmutassa a báziscímet. Én inkább azt hívnám pocsékolásnak, hogy egy kód csak egy adott helyrõl képes elindulni. Ettõl lesz egy SW erõsen op rendszer specifiukus, és nehezen lehet átvinni máshová.

Ennek EP-n általában kevés jelentősége van, legfeljebb a rendszerbővítőknél fontos, amik áthelyezhető formátumba is fordíthatók.
PC-n is csak a .dll (Windows) és .so (Unix) file-ok áthelyezhetők - illetve ezek közül is csak az utóbbi valódi pozíció független kód 32 bites x86 rendszeren, a programok fix címre fordítódnak (de ez nem probléma, mert az operációs rendszer mindnek külön virtuális címterületet biztosít).

Quote
Processzorórajeleket lehet megtakarítani.

Csak akkor, ha a relatív ugrás nem történik meg. Az utasítások futásideje (memória várakozás nélkül):
  - JP (mindig): 10 ciklus
  - JR (nem teljesül a feltétel): 7 ciklus
  - JR (az ugrás megtörténik): 12 ciklus
« Last Edit: 2012.February.08. 18:32:38 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: ASM EP-n - hogyan kezdjem?
« Reply #40 on: 2012.February.08. 18:36:31 »
Ez amugy a maskeppen "fejlettnek" mondott x86-on is problema

A 64 bites módban már nem, ha jól tudom. x86_64-en már használható RIP-relatív címzés.

Offline Attus

  • EP addict
  • *
  • Posts: 1225
  • Country: hu
Re: ASM EP-n - hogyan kezdjem?
« Reply #41 on: 2012.February.08. 21:21:20 »
Attus!

Azért nem jó a CALL utasítás, mert ha nem tudod hol tartózkodsz a memóriában akkor hova adod ki az ugrás címét? Az a baj a CALL-lal, hogy nincs relatív párja.

Értem én, hogy mit hiányolsz, de programozástechnikailag megoldható a relatív call is, meg is oldották már rengetegszer.
Igaz kicsit körülményesen,  hardveresen tényleg kényelmesebb és gyorsabb lenne. Erre persze igen ritkán van szükség. A relokációt akár a program saját maga is eltudja végezni saját magán, mielõtt elkezdi végrehajtani, ha írható memóriában fut.

Hogy hol tartózkodsz megtudható a PC regiszterbõl, hisz arra lett kitalálva, hogy azt tartalmazza. Mondjuk call egy ismert fix memória részre, ahol mondjuk ez van:
ex (sp), hl
jp (hl)

És máris számolhatsz az értékkel a programod folytatásában, stackban meg ott a mentett hl, az sem vész el.
Ha meg az ix -et használod erre, akkor a relatívitás már egybõl adja magát.

Nekem pont ezek a csavarok tetszettek nagyon hajdanán.

De hát ez csak egy Z80...

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #42 on: 2012.February.09. 09:19:41 »
A 64 bites módban már nem, ha jól tudom. x86_64-en már használható RIP-relatív címzés.


Na ja, de x86-rol beszeltem, az alatt a 32 bitet ertem en legalabbis :) Amugy is a 32 bites x86 ISA az ugye meg a 8088, sot a 8080-ra nyulik vissza (ilyen modon kozos ose a Z80-al), es egy ilyen CPU-hoz kepest allatira elavult, rengeteg minden kell a kompatibilitas fenntartasahoz, millionyi tranzisztor csak arra van, amit mas fejlett RISC-nel lesz*rnak es elfogadjak: ez igy mux (pl hogy egy opcode esetleg ELOBB hajtodik vegre mint egy masik, annak ellenere hogy a kodban forditott a sorrend: ennek oka a pipeline-ok hosszusaga, x86-on ennek megelozese eleg sok ganyolast kivan, mivel belulrol amugy az is "RISC", csak user fele nem mutatja). Raadasul 64 bites modban van eleg regiszter is, 32 bites modban pl az adat offset-re fixen lefoglalt regiszter PIC kod eseten eleg komoly ervagas, mert nincs annyira sok regisztere mint egy klasszikus RISC masinerianak.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #43 on: 2012.February.09. 09:34:38 »
Ennek EP-n általában kevés jelentősége van, legfeljebb a rendszerbővítőknél fontos, amik áthelyezhető formátumba is fordíthatók.
PC-n is csak a .dll (Windows) és .so (Unix) file-ok áthelyezhetők - illetve ezek közül is csak az utóbbi valódi pozíció független kód 32 bites x86 rendszeren, a programok fix címre fordítódnak (de ez nem probléma, mert az operációs rendszer mindnek külön virtuális címterületet biztosít).

Csak akkor, ha a relatív ugrás nem történik meg. Az utasítások futásideje (memória várakozás nélkül):
  - JP (mindig): 10 ciklus
  - JR (nem teljesül a feltétel): 7 ciklus
  - JR (az ugrás megtörténik): 12 ciklus


A windows DLL az valojaban amugy a UNIX-okbol ismert COFF formatum, megfejelve egy EXE fejleccel :) Vagy hasonlo. Amugy erre irtam, hogy meg egy "modernnek mondott" 32 bites x86-on is merheto telejsitmenycsokkenest okoz az, hogy egy regisztert "elpazarolsz" mert PIC kodot forditasz (lasd pl gcc -fPIC kapcsolojat, es errol valo ertekezest benchmark-okban a kulonbozo ISA-k kapcsan).

De amugy igazad van, neha ettol ez meg fontos, es "be kell vallalni" a regiszter "elpazarlasat" (elpazarlas: masra hasznalhato lenne, igy kevesebb "szabad" regisztered van, tobb dolgot kell memoriaba lepakolni: ergo, valamivel lassabb lesz. Egy modern valodi "RISC" procin ez nem olyan nagy gond, mivel van regiszter dogivel).

Nem erzem ugy, hogy egy EP specifikus programnal ez annyira lenyeh, ha "szabalyosan" EXOS-al mux stb, azzal toltodik be,miegymas, akkor kb adott hova lehet tenni. Viszont azonnal igazad van, ha ennel tobbet akarsz, mondjuk Z80 peldat nem tudok sajat munkaimbol hozni, de 6502 (es compatible) eseten en csinaltam olyat hogy a kod maga legyen teljesen platform fuggetlen (ha I/O, kepernyore iras, barmi van, azt kvazi syscall-kent hasznalt BRK csinalja): ekkor ugyanaz a binaris kod futhat barmilyen 6502 (v compatible) alapu gepen, ha ott kesz van hozza a "syscall interface" (OS-nek nem hivnam, mert ahhoz nem eleg fejlett meg), nyilvan itt relokacio is van (nem lehet tudni h a target gep memoriaszervezese milyen: hol van RAM, stb). Amde en ezt pl nem PIC koddal oldottam meg, hanem az o65 nevu formatummal, amiben relokacios tablak vannak, hogy kb milyen cimen kell pl egy byte-ot modositani. Ja, es o65-nek van symbol tablaja is stb, az mas kerdes h en nem hasznalom jelenleg, lasd BRK-s trukk.

Lehet ilyet is, de nem hiszem hogy megeri annyira, ha egy adott hw "gyari" OS-e ala akarsz tolni dolgokat.

A kulon virtualis cimterulet egy modern OS eseten igaz, amde nem vonatkozik lib-ekre: hiszen annak linkelodnie kell ugye a programodhoz pl. Szoval itt kellhet a PIC. Nyilvan ha irsz egy programot ami kiirja "hello world" az pl Linux alatt nem PIC kod, tekintve hogy a process sajat virtualis cimteruletet lat, es ugyanaz a "memoriakiosztas" a process szemszogebol legalabb. Viszont van eset, amikor ez nem eleg, lasd pl lib-ek esete.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: ASM EP-n - hogyan kezdjem?
« Reply #44 on: 2012.February.12. 08:01:59 »
Hogy tudom rávenni az 1.5 Asmont, hogy fordítsa le a kódomat 0066H címre? Azt írja már az elsõ utasításnál, hogy Memory overwrite. De én akkor is oda akarom tenni.