ÚÄÄÄ        ÚÄÄÄ     ÚÄ       ÚÄ
  ÚÄ  ÚÄ      ÚÄ   ÚÄ   ÚÄÚÄ   ÚÄÚÄ
 ÚÄ    ÚÄ     ÚÄ        ÚÄ  ÚÄÄ  ÚÄ
ÚÄÄ    ÚÄÄ      ÚÄÄ     ÚÄ   Ú   ÚÄ      ASSEMBLY RULEZ
ÚÄÄÄÄÄÄÄÄÄ         ÚÄ   ÚÄ       ÚÄ
ÚÄÄ    ÚÄÄ   ÚÄ    ÚÄ   ÚÄ       ÚÄ          V.rész
ÚÄÄ    ÚÄÄ     ÚÄÄÄÄ    ÚÄ       ÚÄ

 

AZ ELSÕ PROGRAM

 

     Azt hiszem mindent tudsz az elsõ assembly programod megírásához. Azaz mégsem, még kell pár DOS funkció ismerete. Ezek pedig a 09h és a 4ch függvények. Mint minden DOS függvényt, ezt is a 21h megszakításon lehet elérni. Ha még emlékszel a megszakításokra, akkor tudod hogy a funkció számot (függvény=funkció) az AH regiszterbe kell írni. Mivel a legtöbb ilyen függvénynek még más adat is kell a munkához, ezeket a regisztereken adjuk át. Lássuk tehát a medvét.

   A 09h DOS függvény (Print String):
   
     Meghívás elõtt a DS regiszterbe kell tölteni a kiírandó szöveg szegmensét és a DX-be az offszetjét. Ezt ezentúl úgy jelölöm, hogy DS:DX-be kell tölteni a sztring címét. A kiírandó szöveget egy dollár ($) jelnek meg követnie, ez jelzi a végét.


   
A 4ch DOS függvény (Terminate program):
     Egyszerûen meg kell hívni és a program befejezõdik.

     És még valami hiányzik. Nem tudod, hogy lehet egy változó offszetjét felhasználni, pldául betölteni DX-be. Ezt az offset paranccsal lehet megtenni. Tehát MOV AX,offset ciao a ciao címke offszetjét teszi AX-be.

   A program feladata klasszikus. Kiírja, hogy ki vagy és köszönt mindenkit. Mielõtt megnézed az én megoldásom, próbaképp te is megírhatod. Mindent ismersz hozzá.

   code segment para public 'code'
   assume cs:code;ds:code;es:code;ss:code
   org 100h
   start:
      mov ah,09h                  ; a 09h funkciót fogom hívni
      mov dx,offset hello         ; DX-be a hello offsetje
      int 21h                     ; ez írja ki a szöveget
      mov ah,4ch                  ; a 4ch funkció befejezi
      int 21h                     ; a programot
   hello db 'Helló mindenki, én Lucifer vagyok!','$' ; ez a kiírandó
   code ends
   end start

     A változókat érdemes a program elején definiálni, mert így mikor a TASM elér a programkódhoz, akkor már tudni fogja a változók típusait és nem fog bekavarni az alapértelmezett típusokkal. Ha így oldod meg akkor a program a következõ:

   code segment para public 'code'
   assume cs:code;ds:code;es:code;ss:code
   org 100h
   start:
      jmp program_code
   hello db 'Helló mindenki, én Lucifer vagyok!','$' ; ez a kiírandó
   program_code:
      mov ah,09h                  ; a 09h funkciót fogom hívni
      mov dx,offset hello         ; DX-be a hello offsetje
      int 21h                     ; ez írja ki a szöveget
      mov ah,4ch                  ; a 4ch funkció befejezi
      int 21h                     ; a programot
   code ends
   end start

     Remélem valami hasonló született a te kezed alatt is. Mindjárt le is fordítjuk.

     Következzen a fordítás menete. Ehhez elõzör tudni kell, hogy az assembly forrásfileok szabványos kiterjesztése ASM. így az általad megírt verziót egy .asm fileban helyezd el. Legyen mondjuk az neve elso.asm. A fordítást a TASM végzi el, de ez csak az elsõlépés. A parancssorba írd be TASM /z elso.asm és erre a fordító mûködni kezd. Remélhetõleg hiba nélkül befejezõdött a mûvelet. Ha esetleg hiba volt, akkor ki fogja írni a hibás sort, annak számát valamint a hibát szép angol nyelven. Ezért nem árt, ha kissé ismered az angol nyelvet. Ha végképp nem érted és senki nem tudja neked lefordítani, akkor írj nekem és a következõ KM-ben (meg persze levélben is) leírom a hibát. A /z kapcsoló engedélyezi a hibás sor kiírását, így könnyebb a hibakeresés. Szóval a hibamentességnél jártam. következõ szöveget kell a képernyõn látnod:

       Assembling file:   elso.asm
       Error messages:    none
       Warning messages:  none
       Passes:            1
       Remaining memory:  ...k

   Itt minket csak a hibák (error) és a figyelmeztetések (warning) érdekelnek. Ha hibát észlel akkor semmilyen filet nem csinál, ha csak warning, akkor lefordította a programot, de az esetleges hibás mûködés ennek a figyelmeztetésnek is betudható késõbb. A figyelmeztetések általában semmi bajt nem okoznak, de úgy szép, ha egy program mindenféle üzenet nélkül lefordítható. Kicsit bõbeszédû vagyok, de legalább sok mindent elmondok.

     A hibátlan fordítás után kaptál egy elso.obj filet. Ez egy úgynevezett Intel relokálható tárgykódú file, amirõl neked egyelõre semmit nem kell tudni, csak azt, hogy ebbõl lesz majd a program file. Mégpedig a TLINK program hathatós segítségével. Pötyögd be, hogy TLINK /t /x elso.obj. Ha itt is minden fasza, akkor a TLINK egy kopirájt üzeneten kívül mást nem ír ki. Ezzel készen van elsõ futtatható programod. Indítsd is el. És örülj mint kiskutya az ugatásnak.

     A TLINKnél a /t jelzi, hogy COM filet kérsz. A /x pedig az un. map filet felejteti el vele, aminek ilyen egyszerû programnál semmi értelme.

     Na mi is az a .obj file. Ez tartalmazza a program kódját, valamint a használt logikai szegmensek adatait és még néhány, az összeszerkesztéshez szükséges adatot. Az összeszerkesztés (linkelés) több ilyen obj filet fordít egy programmá. Ez akkor lehet hasznos, ha a rutinokat más proggyban is használni akarod, de nem akarod mindig beleírni a forráskódba ezeket. Ilyenkor csinálsz egy obj filet a rutinokból, amiben minden rutin kezdõcímét láthatóvá teszed a többi programrész számára és a több obj fileból a TLINK megcsinálja a programot. Persze még rengeteg mást is meg lehet tenni az obj fileokkal, de ismertetõül ennyi elég. Aki jobban érdeklõdik az keressen könyveket. Pethõ Ádám IBM PC/XT felhasználóknak és programozóknak címû sorozatának elsõ kötetében sok mindent megtudhatsz a linkelésrõl. Sok hasznos rutint is obj fileban terjeszt az írója.

     Végül néhány tipp a fordítás gyorsítására. Elõször is javaslom, hogy csinálj egy külön könyvtárat az assembly programjaidnak és a fejlesztésnek. Amennyiben az általad használt shell (gy.k.:Norton, Volkov, Dos Navi...) ismeri a kiterjesztés file fogalmát, akkor itt az idõ, hogy bõvítsd ezeket vagy csinálj ilyeneket, ha még nem lennének (szerencsétlen). Általában két féle kiterjesztés file (extension file) van: a main és a local.
   A mainbe a következõt írd be:
     asm:  tasm /z !.!
     obj:  tlink /t /x !.!

   Ezután ha egy asm fileon entert nyomsz, akkor az lefordul obj-já, ha pedig egy obj-on nyomsz entert, az commá fordul le. Ha valamilyen obj-on entert nyomva a TLINK azt mondja, hogy Cannot generate COM file és leírja az okot akkor próbáld meg a fordítást parancssorba beírva, hogy TLINK /x filenév. Ekkor EXE file fog készülni. A /t-t azért jó beírni az extension fileba, mer az assembly fileok nagy része commá fordítható. Ha neked mindig EXE  kell, akkor a /t-t ne írd be, de az EXE-vé fordított COMok gyakran fagyit csinálnak a gépbõl (gy.k: hardver, jobb esetben szoftver reset).

     Kezdetben, mikor még nem valószínû, hogy obj modulokat fogsz használni, a local extension filet is használhatod, mégpedig arra, hogy ha egy asm-ra entert nyomsz, akkor abból ne obj legyen hanem com és az obj törlõdjön le. Ehhez a következõ három sort kell az assembly könyvtáradba csinált kiterjesztés fileba írnod:

      asm:   tasm /z !.!
             tlink /t /x !.obj
             del !.obj

     Ja, a local extension file ugyanúgy vc.ext, csak az adott könyvtárban van. Ha nem akarod a file méretét túlságosan növelni (a Volkov csak 512 byteos vc.ext-et enged meg, nem tudom a többi mennyit), akkor a tasmhoz lehet csinálni egy tasm.cfg filet, amibe egyszerûen bele kell írni a kívánt paramétereket, mintha a parancssorba írnád be. A TLINKre is ugyanez vonatkozik csak itt tlink.cfg. TLINKnél nem javaslom, hogy a cfg fileba a /t-t beírd, mert ezáltal nem tudsz sehogy EXE filet csinálni.

     Na ennyi elég is fordításról és egyebekrõl. Most már csak programoznod kell. Elõször írj kis primitív proggykat, példál írjon ki egy egyszerû kis menüt (csak egymás alá felsorolva a dolgokat) és billentyû alapján tudjon a "felhasználó" választani.

     Legközelebb egy kis DOS lemezes alapokat tárgyalok. Addig is kitartás!

     Ahhoz, hogy el tudj indulni, kell néhány (jó néhány) DOS és BIOS funkció ismerete, valamint át kell nézned az proci utasításkészletét. Mindenképp nézd meg a DOS 00h-0ch-ig terjedõ funkcióit és a következõ utasításokat: ADD, CMP, DEC, INC, az összes J-vel kezdõdõ utasítás (ezekrõl biztos írok a következõ alkalommal), SUB, LOOP. Ezeket valószínûleg könnyen megérted, ha mégsem, akkor ne szégyeld és írj. A következõ számban elmagyarázom, amit nem értettetek. Egyébként mikor itt használni fogom valamelyiket, akkor röviden biztos leírom a feladatukat, csak azért kellene már most átnézned, hogy egyszerûbb programokat írhass. Ezeket a szuper helpekben lehet meglelni (persze könyvben is, de a rezidens helpeket én jobban szeretem).
   Ilyenek:

     A következõ alkalommal még mondok pár info forrást, de ezek már magasabb szintûek. Sajna (szerencsére) minden help angol így nem árt ha legalább olvasol (és értessz) angolul. Ha nem tudod megszerezni valamelyiket, akkor írj nekem és elküldöm.

   Ez az elsõ rész egy kicsit száraz lett, de az alapokat tisztázni kellett.

Sok sikert az elsõ lépésekhez az assembly birodalmában!

'Kimeríthetetlen' agyából kisajtolta:

Lucifer of ZeroBit