ÚÄÄÄ ÚÄÄÄ
ÚÄ ÚÄ
ÚÄ ÚÄ ÚÄ
ÚÄ ÚÄÚÄ ÚÄÚÄ
ÚÄ ÚÄ ÚÄ
ÚÄ ÚÄÄ
ÚÄ
ÚÄÄ ÚÄÄ ÚÄÄ
ÚÄ Ú ÚÄ
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:
- Norton Guide, ez egy help driver, magyarul a megfelelõ formátumú fileokat meg tudja jeleníteni. Ezek a fileok nem egyszerû szövegek, hanem tele vannak cross referencekkel, így minden témához egy csomó plusz információt kaphatsz anélkül, hogy át kéne böngészned az egészet. Assembly programozáshoz az asm.ng és az int.ng fileokat ajánlom. Persze kell még maga az ng program is.
- Tech Help, hasonló mint az NG, de ez csak egy filet fogad el, mint bemenet, de ebben rengeteg minden benne van, portoktól kezdve a DOS-on át a CPU utasításokig minden benne van. Nagyon hasznos, de az utasításokat a NG jobban leírja, a TECH help viszont másban jó. Egyetlen hátránya, hogy nem bõvíthetö adatbázisokkal mint az NG.
- HelpPC, hasonló a Norton Guidehoz, több filet kezel és ezek vezérlõkarakterekkel ellátott SZÖVEGFILEok, így a program nélkül is olvashatóak
- LW286, ez a 286 utasításkészletét ismerteti, de benne van a 8086 is hiszen ez természetes is, tehát használható számodra is.
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