You are on page 1of 216

(ls:i'l)

.,'?.Y.' A
--~-,,,,,

~.1:-'f.~

A_~

l
l
~~~~~~d-~

ASSEM;BL-Y
Nyitott rendszer kpzs
-tvoktats -oktatsi segdlete
TANKNYV

LSI Oktatkzpont
A Mikroelektronika Alkalmazsnak
Kultrjrt Alaptvny

Lektorlta: Kovcs Istvn

ISBN

9635771177

Kiad: LSI Oktatkzpont


Felels vezet:

Dr. Kovcs Magda

Tmafelels: Flier Istvn


LIGATURA KFT VCI FSZ NYOMDA
Munkaszm: 264-94

Tartalomjegyzk

Elsz

...... ,.................................................................................. 5

Az assembly programozs alapjai ................................................. ?

Hogyan kzeltsk meg a gpikdot.. ...................................... 9


A gpikd s az assembly kapcsolata ....................................... 9
Mi is az a programozs ........................................................... 9
A programozs eszkzei ......................................................... 10
A regiszterek mkdse .......................................................... ll
A PC cmkpzse .................................................................... l2
Hogyan kezdjnk el megrni egy programot ............................ 13
EXE programszvegek felptse ............................................ 14
COM programszvegek felptse ........................................... l4
Kilps a DOS-ba ............................................................... 15
A MOV utasts hasznlata ..................................................... 16
Egy bet kiratsa a kpemyre .......................................... 19
Pozcinlt betkirats ....................................................... 20
Pozcinlt szvegkirats ................................................... 22
A logikai mveletek mkdse ................................................ 25
A logikai mveletek vizsglata ............................................ 30
Az adatforgat mveletek vizsglata ................................... 34
Hexadecimlis szmok kiratsa .......................................... 37
Egy szm decimlis kiratsa .............................................. .40
Real-Time id kiratsa ...................................................... .42
Menkezels ............................................. , ........................ 45
Memriakezels ...................................................................... 52
File kezels .................................................... , ........................ 53
Memria s file kezel program .......................................... 54
Szveg keres program .......... ,........................................... 58
Paramter tadsa a DOS-bl ............................................. 64
A PC hangkezelse ............................................................. 69
A memria rezidens programok mkdse .............................. 71
Hangos drive ...................................................................... 72
Assembly Grafika ........................................................................ 93
Grafikus zemmdok programozsa ....................................... 93
A CGA zemmd tehetsgei.
.. .................................... 93
CGA Sznbellts..
. ......................................... 94

Egy pont kiraksa .............................................................. 96


Grafikus bra kiraksa ....................................................... 99
Egrkezels ....................................................................... l 04
A CGA krtya bels regiszterei .......................................... 116
EGA s VGA zemmdok programozsa .............................. 117
EGA sznbellts ............................................................... 118
VGA sznbellts .............................................................. !23
EGA VGA O. rsi md CPU adattal .................................. 127
EGA VGA O. rsi md SET-RESET adattal ..................... 129
EGA VGA l. rsi md .................................................... 129
EGA VGA 2, rsi md ..................................................... 130
VGA 3. rsi md .............................................................. 131
EGA VGA O. olvassi md ................................................ 131
EGA VGA l. olvassi md ................................................ 132
Az EGA krtya grafikus vezrlregiszterei ......................... 132
Szvegkiraks VGA grafikus kpernyn ............................ !34
brakiraks sznbelltssal a 2 szn VGA zemmdba ..... 137
Az MCGA zemmd mkdse ............................................. !41
MCGA brakiraks sznbelltssal... .................................. !41
MCGA egrkezels ............................................................ !46
Rajzols a kpemyre ........................................................ !54
MCGA vonalrajzol eljrs ................................................ !55
MCGA Scroll rutinok ........................................................ 161
MCGA krrajzol rutin ..................................................... !71
Kpformtumok ..................................................................... 175
Az LBM formtum felptse ............................................. 176
Egy LBM kp megjelentse .............................................. 177
Az Svga zemmdok tulajdonsgai ........................................ !83
Svga zemmdok klnbz grafikus krtyknl... ............ 183
Svga rajzols kzvetlen memriakezelssel ........................ !88
Svga rajzols a R dM BIOS segtsgve!. ........................... !92
Fggelk.................... .............................................................. !95
A PSP felptse.... ................................................................ !95
A l Oh megszakts lehetsgei ............................................... !97
Trgymutat ............................................................................... 210

ELSZ
Ebben a knyvben megprblom egy kicsit mskppen
megkzelteni a gpi kd programozst mint ahogyan az az
eddig megjelent hasonl tmj kiadvnyokban trtnt. Nem
elssorban a programozs elmleti rszvel kvnok foglalkozni,
hanem sokkal inkbb annak gyakorlati oldalval. Clom az,
hogy mindenki, aki ezt a knyvet elolvassa, szert tehessen egy
olyan alaptudsra, amit mr sajt magtl tovbb tud fejleszteni
abba az irnyba, amire azt fel kvnja hasznlni. Ahhoz, hogy
valaki assembly nyelven programozzon lnyeges elnyt jelent
valamilyen magasabb szint (BASIC, PASCAL, stb.) nyelv
alapfok ismerete, mivel gy az itt lertak megrtse sokkal
egyszerbb vlik. Annak, aki mg soha nem programozott
szmtgpet azt tancsolom, hogy tegye vissza a polera ezt a
knyvet, s prblkezzon az elbb emltett nyelvek valamelyiknek megismersvel, gy biztosan sokkal hamarabb lesz
sikerlmnye. Annak pedig, aki gy dnt, hogy mgis belevg,
annak sok sikert kvnok.

Agrdi Gbor

AZ ASSEMBLY PROGRAMOZS ALAPJAl


Az assembly az, ahol nem elg csupn a nyelv ismerete
hanem a szmtgp bels felptsrl, mkdsrl is
viszonylag rszletes informcival kell rendelkeznnk.
Mibl

is ll a szmitgp:

A mi szmunkra legfontosabb elemek a

kvetkezk:

- CPU (Central Processing Unit) Processzor


- RAM (Random Access Memory) rhat-olvashat memria
Termszetesen egy szmtgp jval tbb rszbl ll, de a
kezdshez szmunkra e kett ismerete elegend s felttlenl
szksges. Mivel egy program nem ms, mint a memriban
trolt utastsok egymsutnja, amit a processzor rtelmez s
vgrehajt.
A CPU a szmtgpnek az a rsze, amelyik a memriban
trolt adatokat kiolvassa, rtelmezi s vgrehajtja. A CPU-ban
helyezkedik el egy msik egysg, az ALU (Arithmetical Logical
Unit) mely a klnbz aritmetikai (sszeads, kivons, szorzs,
oszts, forgats stb.) s logikai (s, vagy, nem, stb) mveleteket
vgzi. Tovbb itt kapott mg helyet nhny kiemeit adattrol,
melyeket regisztereknek neveznek s amiket a ksbbiekben ne
tvessznk ssze a vltozkkal. Ezek elnye, hogy a
mveletvgzs velk sokkal gyorsabb, mint a memria kzvetlen
elemeivel, valamint az utastsok tbbsge ezeken keresztl kap
adatokat illetve ezekbe kapjuk a mveletek eredmnyt.
A RAM egy olyan elsdleges adattrol eszkz, melyben a
programok s legtbb esetben a feldolgozand adatok trolsa
trtnik. A trolsi rendszer kialaktshoz a matematika kettes
(binris) szmrendszert vettk alapul, ugyanis itt az egyes helyi
rtkek mindssze ktfle rtket vehetnek fel a 0-t s az 1-et.
Ez olyan, mint egy kapcsol ki- illetve bekapcsolt llapota. A
szmtgp memrija is ilyen kapcsolkbl pl fel, a benne
trolt adatot pedig a kapcsolk helyzete hatrozza meg. Egy ilyen
7

IBM PC Gyakorlati As~-:-em_bl_._y_ _ _ _ __


kapcsolt neveznek a szmtstechnikban bitnek. Minden
nagyobb egysg erre fog felplni. A programozs sorn
kevesebbet fogjuk ugyan hasznlni a kettes szmrendszert, de
egyes utastsok megrtshez felttlen szksges. A memria
elrse szempontjbl nem lenne elnys azt bitenknt kezelni,
ezrt a biteket csoportokba szedjk, s ilyen formban dolgozzuk
fel. Minden egyes csoport 8 bitbl ll, s egy ilyen egysget
hvnak byte-nak. A memria ugyan bitekbl pl fel, de a
legkisebb elrhet (olvashat, vagy rhat) rsze a byte, ami nem
ms mint 8 egyms melletti bit. Egy ilyen 8 helyrtk binris
szmon a legnagyobb trolhat szm a 255. A ksbbiekben sz
lesz mg a memria nagyobb egysgeirl is. Ilyen egysg a word
(sz), ami kt egyms melletti byte-bl (16 bit) ll, s a dword
(kettssz), ami pedig kt szomszdos word-t (32 bit) fog ssze.
Teht a memria legkisebb egysge elrs szempontjbl a
byte, ami azt jelenti, hogy a memriba csak a byte-okat tudjuk rni
illetve olvasni, az egyes biteket csak gy tudjuk lltani, hogy
berunk a memriba egy olyan byte-ot, aminek a kvnt bitje a
megfelel rtk.

A memria byte-os szervezesu, azaz egyms utn ll


byte-ok sorozatbl ll. Az egyes memriabyte-okat gy rhetjk
el, hogy minden byte-hoz egy cm van hozzrendelve s rskor
vagy olvasskor ezen cm segtsgvel hivatkozhatunk r. A
processzor is ezen cmek alapjn ri el az egyes byte-okat, gy,
hogy egy cmbuszon s egy adatbuszon keresztl kapcsoldik a
memrihoz, ami valjban nem ms mint nhny vezetk (8 , 16,
vagy 32 db.) s mg egy kis elektronika. A cmbuszon megjelen
rtk vlasztja ki, hogy melyik memriabyte-ot akarjuk elrni s az
gy kivlasztott byte az adatbuszon fog mozogni.
Egy processzor memriakapacitst az szabja meg, hogy
milyen szles (hny bites) a cmbusza. Egy IBM XT-nek pldul 20
bites cmbusza van, ami azt jelenti, hogy maximum 2 20 azaz
1048576 byte-ot (1Mbyte-ot) kpes megcmezni. Ez egy 386-os
AT gpnl, ahol 32 bites cmbusz van (ez 4Gbyte). s mivel az
adatbusza is 32 bites, kpes az adatokat dword-sen elrni. Ez
azt jelenti, hogy egyszerre nem csak 1 byte-ot tud rni vagy

Az Assembly programozs alapjai


olvasni, hanem 4-et. De azrt, hogy az XT-re rt programok
magasabb szint gpeken is futtathatak legyenek, a szmtgp
kpes az adatbuszl tlltani az XT -nek megfelelre ekkor gy
viselkedik, mint egy XT csak egy rnyalatnyival gyorsabb.
Hogyan kzeltsk meg a gpikdot
Egy szmtgpben az sszes tulajdonsga mellett az az
egyik legcsodlatosabb, hogy brmit megvalsthatunk vele amit
csak el tudunk kpzelni. Termszetesen ma mg elg sok akadly
llja tjt szrnyal fantzinknak, de a szmtstechnika s a
programozs fejldsvel egyre kevesebb a megoldhatatlan
problma.
A gpikd programozs a programozk legnagyobb
fegyvere {mr akik ismerik), ugyanis csak gpikdban lehet a
szmtgp minden adottsgt teljes mrtkben kihasznlni.
Mindezek mellett ennek a nyelvnek a megtanulsa a legnehezebb
mivel ahhoz, hogy valaki kpes legyen gpikd programokat rni,
nem elg csak magt a programozsi nyelvet megtanulnia,
ismernie kell magt a szmtgpet is.
A gpikd s az assembly kapcsolata:
A gpi kd nyelv tulajdonkppen szmokbl ll. Ezek a
szmok troldnak a memriban s ezeket rtelmezi illetve hajtja
vgre a processzor. Azonban az utastsokat jelkpez sszes
szm bemagolsa egy kicsit szraz lenne, gy kitalltak egy
jelkpes nyelvet, melyet gy alkottak meg, hogy csoportokba
szedtk az egyes utastsokat s ezeknek a csoportoknak
knnyen tanulhat neveket adtak. Ezekbl az utastsokbl ll
nyelvet neveztk el ASSEMBLY-nek.
Mi is az a programozs:
Egy program nem ms, mint a megvalstand feladat a gp
nyelvn. Amihez gy juthatunk el, hogy a feladatot elkezdjk
felbontani egysgekre, majd azokat tovbb olyan apr rszekre,
melyek mr helyettesthetk a gp szavaival, utastsaival.
Egy-egy program megrst mindig klnbz szempontok

IBM PC Gyakorlati Assembly


irnytjk, melyek nagy mrtkben fggnek az adott feladattl, de
vannak olyan szempontok is, melyek ltalnosthatk. Ezek
hatrozzk meg a szmtgpes programozs jellegt, s ezek
miatt szksges az programozshoz ms gondolkods, mint ami
ltalban megszokott. Ezek az ltalnosthat szempontok alkotjk
egyben a programozs eszkzeit, melyek ms megvilgtsba
helyezik a feladatot.
A programozs eszkzei:
Eljrsok: ezek olyan programrszek melyek a feladatban
tbbszr elfordul, ismtld folyamatokat takarnak. Ilyenkor ezt
csak egyszer rja meg az ember gy, hogy brhonnan elrhet s
ha szksges, megfelelen paramterezhet legyen. Ilyen eset
pldul egy keretrajzols, ahol bemen paramternek megadjuk a
keret bal fels sarknak koordintit, szlessgt s magassgt.
Vgrehajtva az eljrst, a megfelel mretekkel kirajzolja a
keretet
Vltozk: Egy olyan eszkzei a programozsnak, melyek
segtsgvel adatokat trolhatunk a memriban. Bizonyos
feladatok megoldsa elkpzelhetetlen lenne vltozk hasznlata
nlkl mivel a regiszterek szma korltozott, nem trolhatunk
minden informcit ezekben, de mivel a memria mrete
nagysgrendekkel nagyobb, ezrt kijellhetnk rszeket ahol a
szmunkra fontos informcit trolhatjuk. Ezen informci nagyon
sokfle lehet (szm, szveg, kp, stb.). Ezek, mint azt ksbb ltni
fogjuk, csak felhasznlsukban klnbznek, trolsukban nem.
Ciklusok: Ez egyike a legfontosabb eszkzknek, ugyanis
ezek segtsgvel a feladatban egyms utn tbbszr ismtld
mveleteket egyszersthetnk le. Ha pldul az a feladat, hogy
rjuk ki 10-szer egyms utn a nevnket a kpernyre, akkor azt
meg lehet oldani gy is, hogy tzszer egyms utn megrjuk az
adott programot, de gy is, hogy csak egyszer rjuk meg s egy
ciklus segtsgvel tzszer egyms utn lefuttatjuk. Az eredmny
ugyanaz, csak a program hossza az utbbi esetben tredke a
msiknak, emellett egyszerbb, ttekinthetbb is vlik.

10

Az Assembly programozs alapjai


Elgazsok, felttelek vizsglata: Taln ez az egyik
legegyrtelmbb eszkze a programozsnak, ugyanis szmtalan
olyan eset van, amikor meg kell vizsglni egy mvelet
eredmnyt, egy visszarkez vlaszt s ennek megfelelen
vlasztani kell adott lehetsgek kzl.
A regiszterek

mkdse:

A regiszterek kztt vannak ltalnos rendeltetsek illetve


specilisak. Az ltalnos rendeltetsek az AX, BX, CX, DX
neveket viselik. Ezekbe 0-65535-ig brmilyen szmot berhatunk.
Egy ilyen regiszter tulajdonkppen nem ms mint egy 16 bites
adat trolsra alkalmas rekesz. Ezeket hasznlhatjuk 16 illetve
2*8 bitesknt mivel egy ilyen rekesznek van egy als illetve egy
fels rsze. Ez pldul az AX regiszternl AL illetve AH. Az AL az
als AH a fels rsz. Ezt a kvetkez tblzatbl knnyen
megrthetjk:
Decimlis

AX
46

5
1649
655 36

Hexadecimlis

Binris

AH

AL

00000000 0010111 o b
00000000 00000101 b
0000011 o 01110001 b
1111111111111111 b

AHAL
002Eh
0005h
06 71 h

OFF FF h

Mint azt lthatjuk, alaprtelmezs szerint decimlis szmokat


hasznlunk. Ettl eltr esetben jellni kell a szm tpust,
tovbb ha egy hexadecimlis szm betvel kezddik, el egy
vezet nullt kell tenni, teht a hexadecimlis szmnak mindig
szmjeggyel kell kezddnie.
Egy 16 bites szmmal megcmezhet legnagyobb memria
cm rtke 65535. Egy szmtgpben azonban nem csak 65535
byte memria lehet, hanem tbb. A legkevesebb ami egy XT -ben
lenni szokott, az 512 Kbyte de ennl ltalban tbb (640 Kbyte, 1
Mbyte) a gp alapmemrija. Hogy ne csak 64 Kbyte legyen
elrhet egy gp szmra, ezrt talltk ki a szegmens- s az
indexregisztereket
(az
indexregisztereket
esetenknt
offsetregiszternek nevezik). Ezek lnyege az, hogy a
rendelkezsre ll memribl kivlaszthatunk egy 64 Kbyte
ll

IBM PC Gyakorlati Assembly


mret

szegmenst amit mr kpes kezelni a processzor. Ahhoz,


hogy ezt megrtsk, legegyszerbb a szmtgp memrijt gy
elkpzelni, mint egy nagy knyvet, amibl olvasni, illetve amibe
rni szeretnnk. Mivel az egsz knyvet egyszerre nem lthatjuk, ki
kell nyitnunk azt valamelyik oldalon. Ez az oldal jelkpezi azt a
szegmenst,
amivel
egyidben
dolgozni
tudunk.
A
szegmensregiszter hatrozza meg, hogy melyik memriarszlettel
foglalkozunk (melyik oldalon van nyitva a knyv), az indexregiszter
pedig azt mutatja, hogy a kijellt rszleten bell melyik cmen (az
oldal melyik sorban) van a szksges adat. A szegmensek
egymstl 16 byte (paragrafus) tvolsgra lehetnek, gy egy
cimet sszesen 20 biten brzolhatunk. Ez a megolds tfedst
okoz az egyes szegmensek kztt. Egy cm meghatrozshoz
szksges 20 bites szm, a kvetkezkppen nz ki:
Tegyk fel, hogy az 5A09Dh cimet szeretnnk elrni. Ebben
az esetben a regiszterek rtkei gy alakulnnak:
Szegmensreg iszter:
lndexregiszter:

0101110000001001b
0000000000001101b

A cm:

(5A09h)
(OOO Dh)

01011100000010010000b (5A090h)

+
0000000000001101b ( OOODh)
= 01010110000010011101b (5A09Dh)
Ugyanezt rhetjk el gy is:
Szegmensregiszter:
lndexregiszter:

A cm:

0101011010110101b
0011010101001101b

(56B5h)
(354 Dh)

01010110101101010000b (56B50h)
0011010101001101b ( 354Dh)
= 01010110000010011101b (5A09Dh)

A megolds htrnya, hogy a memriban csak un.


paragrafus hatron kezddhet egy szegmens. A hinyossg oka,
hogy a cm als 4 bitjt nem, a szegmensregiszter hatrozza meg.
De az gy kivlasztott lapon bell mr minden byte elrhet az
indexregiszter segitsgvel. A szegmensregiszterek szerepe egy
kivtelvel meghatrozott, ettl eltrni nem clszer:

12

Az Assembly programozs alapjai

cs
DS
ES

ss

Code Segment
Data Segment
Extra Segment
Stack Segment

Kdszegmens
Adatszegmens
Extraszegmens
Veremszegmens

Az indexregiszterek pedig:

SI

Dl

Source Index
Destinatien Index

Forrsindex
Clindex

Utbbiak szerepe szintn elre meghatrozott, de ha a


feladat megkvnja, nyugodtan eltrhetnk tle.
A processzornak van mg tovbbi kt 16 bites regisztere a
BP BasePointer (bzismutat) illetve a Flag regiszter. Ez
utbbinak kln szerepe van, mivel az egyes bitjeinek jelentse
meghatrozott de errl ksbb.
Hogyan kezdjnk el megrni egy programot:
prograrnek rshoz szksg van egy
-ez brmilyen DOS formtum szerkeszt
lehet (pldul Norton Editor)- s egy fordt programra (pldul
MASM, TASM stb.), illetve a hozz tartoz linkerre, ami az
elksztett
llomnybl ellltja a futtathat programot.
Tancsolom a TASM illetve TUNK hasznlatt mivel a knyvben
szerepl mintaprogramok is ezzel kszltek. A ksbbiekben nem
rt, ha beszerznk mg egy Debugger programot (AFD, TD stb.}
is, ami sokat segthet az esetleges hibk kijavtsban. A program
rsnak menete a szvegszerkesztben kezddik, ahol
elksztjk annak forrsszvegt. A ksz szvegfile-t (.ASM) els
lpsben lefordtjuk egy objectfile-ra (.OBJ) s ezutn EXE vagy
COM tpus futtathat programot ksztnk belle a linker
segitsgvel. Egy program felptsnek klnfle formai
szablyai vannak.
Az

assembly

szvegszerkesztre

13

IBM PC Gyakorlati Assembly


Egy .EXE programnl a forrs valahogy gy fest:
Kd

Segment
assume CS:Kd, DS:Adat, SS:Stack

Start:

Kd

Ends

Adat

Segment

Adat

Ends

Stack

Segment

Stack

Ends
End

Start

Egy .COM programnl pedig:


Kd

Segment
assume CS:Kd, Ds:Kd
Org
100h

Start:

Kd

14

En ds
End

Start

Az Assembly programozs alapjai


A klnbsg a COM s az EXE program kztt, hogy mg az
EXE brmilyen hossz lehet, a COM-nak bele kell frnie egy
szegmensbe teht nem lehet 64Kbyte-nl hosszabb. A
programszvegekben a Segment jelli a szegmens kezdett
aminek az eltte ll cmke a neve, ami tetszs szerint brmi
lehet. Az adott szegmens vgt az Ends jelzi. Az assume
szerepe, hogy a szegmensregiszterekbe a hozztartoz
szegmenscimet tltse. Lehetsg van egy kis egyszerstsre is,
mivel az SS regiszternek nem ktelez rtket adni teht ezt a
cmkt elhagyhatjuk s az assume sorbl is trlhetjk. Ezenkvl
ahogyan az a COM felptsnl lthat, CS rtke megegyezhet
DS rtkveL Ilyenkor ugyan az lesz a kd illetve adatszegmensnk. Az Org szerepe, hogy meghatrozza a program
kezdeimt a szegmensen
bell. Ezt clszer 100h-nak
vlasztani, ugyanis az ez alatti memriaterleten az opercis
rendszer programunkra vonatkoz panimterei, s adatai vannak.
Az EXE programoknl van mg egy fontos dolog, hogy az assume
a DS regiszterbe nem azt az rtket tlti, amit mi ksbb hasznlni
szeretnnk, gy a programunkban kln be kell azt lltani, de errl
majd ksbb.
A feladatok megoldsa sorn van mg egy segtsgnk,
ugyanis a szmtgp tartalmaz egy ROM BIOS felirat alkatrszt
amiben elre elksztett prograrnek vannak klnfle feladatok
megoldsra. Ezek hasznlata az els idkben egyszerbb teheti
a programozst, ksbbiekben azonban prbljuk meg egyre
ritkbban hasznlni.

Az els mintaprogram mindssze annyit fog csinlni, hogy ha


elindtjuk, visszatr a DOS-hoz egy BIOS rutin segitsgvel.
[Program 1]
PeldaOI

Segment
;Szegmensdefinci.
assume Cs:PeldaOI, Ds:PeldaOI ;Cs s ds regis2terek belltsa
;a szegmens elejre.

Start:

mov
mov

u,PeldaOI
ds,u

;A ds regiszter belltsa.

IS

IBM PC Gyakorlati Assembly


mov
int
PeldaOI

ax,4c00h
21h

En ds
End Start

;Kilps a DOS-ba

;A szegmens vge.
;A program vge.

Amint az lthat, lehetsg van a programszvegben


megjegyzsek elhelyezsre egy pontosvessz utn. Az gy
elhelyezett szveget a fordt nem rtelmezi.
A mov utasts segtsgvel adatokat mozgathatunk egy
forrsbl egy clba, pldul gy lehet rtket adni az egyes
regisztereknek. A mov utastst kt paramter kveti, elszr a
cl majd egy vesszvei elvlasztva a forrs. Ha gy egy cmkt
runk az adat helyre, akkor a cmke szegmenseimt fogja a
regiszterbe rni. a mov ds,ax sorra azrt van szksg, mivel a
ds-be kzvetlenl nem tlthetnk adatot, csak egy msik
regiszteren keresztl. A mov utasts segtsgvel lehetsgnk
van egy regiszterbe egy szmot, egy msik regiszter rtkt, egy
cmke szegmens illetve offseteimt vagy egy memriarekesz
tartalmt tlteni vagy fordtva.
mov
mov
mov
mov
mov
mov
mov
mov
mov
mov
mov
mov
mov

16

ax,42527
;Ax regiszterhe tlti a 42527 szmot.
ax,52h
;Ax regiszterhe tlti a 52h (82) szmot.
al,62
;Al regiszterhe tlti a 62 szmot.
ax,bx
;Ax regiszterhe tlti bx rtkt
al,bh
;AI regiszterhe tlti bh rtkt
ax,cmke
;Ax regiszterhe tlti a cmke szegmenseimt
ax,word ptr lcmkel
;Ax regiszterhe tlti a cmke 16 bites
;tartal mt.
al,byte ptr [cmke)
;Ax regiszterhe tlti a cmke 8 bites
;tartalmt
ax,[si)
;Ax regiszterhe tlti az indexregiszter
;ltal mutatott 16 bites rtket.
al,[si)
;AI regiszterhe tlti az indexregiszter
;ltal mutatott 8 bites rtket.
ax,[si+2J
;Az indexregiszter+2 cm ltal
;mutatott adat kerl ax-he.
ax,[si+bx+2)
;Mint elbb. de si+bx+2 cmen lev.
ax,es:[si)
;Ha nem az alaprtelmezs szerinti ds
;ltal mutatott szegmensbl kvnunk
adatot tlteni a regiszterhe. akkor azt gy
;kell jellni.

Az Assembly programozs alapjai


mov

u,es:[si+2)

;Az. es szegmens si+ 2 ltal mutatott eimn

mov

u,es:(si+bx+2)

;Az. es szegmens si+bx+2 ltal mutatott

;lv

adat kerl ax-be.

;eimn lv adat kerl ax-be.


mov

ax.,offset cmke

mov

word ptr [cimke),ax

mov

byte ptr [cmke),al

mov

[si),ax

mov

[si),al

mov

[si+2J,ax

mov

(si+bx+2J,ax

mov

es:[si),ax

mov

es:(si+bx),ax

mov

es:[si+bx+2),ax

;A cmke szegmensen belli "offset" cme


;kerl ax-be.
;Ax tartalmt a cmke ltal mutatott helyre
;rja
;Al tartalmt a cmke ltal mutatott helyre
;rja
;Ax tartalmt ds: si ltal mutatott helyre
;rja
;Al tartalmt ds: si ltal mutatott helyre
;rja
;Ax tartalmt ds:si+2 ltal mutatott helyre
;rja
;Ax tartallllt ds: si+bx+2 ltal mutatott
;helyre rja
;Ax tartalmt es:si ltal mutatott helyre
;rja
;Ax tartalmt es:si+bx ltal mutatott helyre
;rja
;Ax tartalmt es:si+bx+2 ltal mutatott
;helyre rja

Mint az lthat, elg sokfle varicis lehetsge van ezen


utastsnak, hogy mgis knnyebb legyen ezeket
megtanulni, egy pr alapszably: a mov utasts utni 2
operandus kzl legalbb az egyiknek regiszternek kell lenni. Ha
mamriban lev adatra hivatkozunk, a cmet mutat regiszter
vagy cmke mindig szgletes zrjelben van. ezenkvl ha a cmet
nem regiszter hanem egy cmke hatrozza meg, el kell rni az
elrend adat tpust (word ptr, byte ptr, dword ptr). Ezenkvl a
kt operandus tpusnak meg kell egyeznie (pldul ha a forrs 8
bites akkor a clnak is 8 bitesnek kell lennie). A mov ax,52h
sornl ez egy kicsit csalka, de a gp ezt mov ax,0052h alakban
trolja. Ha ezeket az alapszablyokat betartjuk, klnsebb
problma nem trtnhet, ha mgis elkvetnk valami nagyobb
bakit, azt a fordt program jelezni fogja.
egyszer

17

IBM PC Gyakorlati Assembly


Amint azt emltettem, ez a program hvs utn visszalp a
DOS-hoz. A ROM BIOS szolgltatsait az int utastssal lehet
elrni. Az utna lev szm egy beptett rutin hivatkozsi szma,
melynek memriacmt egy tblzatbl olvassa ki, az ax-ben
tadott rtk pedig egy gynevezett bemen paramter. Erre azrt
van szksg, mert ez a rutin sokkal tbbre kpes annl, minthogy
visszatrjen az opercis rendszerhez, de hogy melyik
szolgltatst szerelnnk ignybe venni, azt ennek segtsgvel
kell meghatroznunk. Azzal, hogy az ax regiszterbe 4c00h rtket
rtunk, arra utastottuk, hogy hibazenet nlkl lpjen ki. Ez a kt
sor csaknem minden programban szerepel. Ezzel elkszlt els
mkd programunk.
Ahhoz, hogy tovbblphessnk, meg kell ismerni a
karakteres kperny felptst mivel a kvetkez program a
kpernyre val rst mutatja be. A kpernyn ltott szveg nem
ms mint a memrinak egy rsze megjelentve. Egy bet
kiratsa karakteres kpernyn gy trtnik, hogy a bet kdjt
(ASCII kdjt) s sznt a kpemy-memria megfelel helyre
rjuk. Ennek a memrinak is van egy szegmenscme, ami jelen
esetben Ob800h. Ez a kperny bal fels karakter pozcijnak
cme. Ha nem ebbe a sarokba kvnunk rni, akkor a
szegmenscmhez hozz kell adni egy eltolsi (offset) rtket.
Ennek rtkt knnyen ki lehet kiszmolni, mivel tudjuk, hogy egy
karakterhez 2 byte tartozik, az els a karakter kdja, a msodik a
sznkd. Megnzzk, hogy egy sorban hny bet fr el (a
mintaprogramnl 80), ezt megszorozzuk 2-vel, gy megkaptuk egy
sor hosszt. Ha pldul a 7. sor 13. oszlopba kvnunk rni,
annak cme 80 karakteres mdban 7*80*2+13*2=1146=47Ah teht
a teljes cm: OB800h:47Ah. gy brmely pozci eimt ki tudjuk
szmolni. Ezutn mr csak az a dolgunk, hogy a kiszmolt cmre
rjuk a kvnt adatot. Itt kell figyelembe venni, hogy a 16 bites
regiszternek az als 8 bitje troldik elbb s utna a fels rsz.
gy a sznkdot az ah a karakterkdot az al regiszterbe kell tenni
(vagy brmelyik msikba, de ilyen sorrendben). A sznkd byte
minden kln bitjnek megvan a maga jelentse:

18

Az Assembly programozs alapjai


O.bit: Az eltr kk sznsszetevje,
1.bit: Az eltr zld sznsszetevje,
2.bit: Az eltr piros sznsszetevje,
3.bit: Az eltr intenzitsa,
4.bit: A httr kk sznsszetevje,
5.bit: A httr zld sznsszetevje,
6.bit: A httr piros sznsszetevje,
7.bit: Villogs ki- bekapcsolsa (a bit 1 rtke jelenti a villogst).
A kvnt sznt gy tudjuk ellltani. hogy a megfelel
szneket sszekeverjk. A 8 fle eltrszint kiegszti egy
intenzits bit amit ha 1 llapotba lltunk, a szn fnyesebb lesz. A
httr sznt egy villogs bittel egsztettk ki, amit ha
bekapcsolunk, a bet villogni fog.
[Program 2]
Pelda02

Segment
assume cs:Pelda02,ds:Pelda02

;Szegmensdefinci.
;Cs s ds regiszterek bell;!sa a szegmens elejre.

Start:

mov
mov

ax,Pelda02
ds,ax

;A ds regiszter belltsa.

mov
mov

ax,Ob800h
es,a:x

;A kperny-memria szegmens;cmt es regiszterhe tlti.

mov

di,ll46

;A di indexregiszterbe
;belltja az offsetcmet.

mov

ai,"A"

;Al regiszterhe az "A" bet


;ascii kdjt tlti.

mov

ah,7

;A bet sznt fekete alapon


;fehr sznre lltja.

mov

es:[di[,ax

;Az es:di ltal mutatott


;cmre rja ax tartalmat azaz
;a fekete alapon fehr "A"
;bett.

19

IBM PC Gyakorlati Assembly


mov
int
Pelda02

as,4c00b
2lb

En ds
End Start

;Kilps a DOS-ba.

;A szegmens vge.
;A program vge

A program eleje s vge azonos az elzvel, de kz lett


iktatva a bet kiratsa. Els lpsben belltjuk a kpernymemria szegmenscmt az es szegmensregiszterbe. Amint azt a
ds lltsnl is tapasztalhattuk, a szegmensregisztereket
kzvetlenl nem lehet lltani, gy az ax regiszteren keresztl rjuk
bele a megfelel rtket. Ezutn a mr emltett offset rtket a di
indexregiszterbe tesszk s az gy kialakul memriacmre kirjuk
ax rtkt majd visszatrnk a DOS-hoz. A kvetkez lpsben
egy ltalunk meghatrozott xy koordintra fog kirni egy letrolt
karaktert. Ennek lnyege, hogy az eltolsi rtket a program fogja
kiszmolni a megadott rtkek alapj,n:
[Program 3)
Pelda03

Segment
assume cs:Pelda03,ds:Pelda03

;Szegmensdefinci.
;Cs s ds regiszterek bell;tsa a szegmens elejre.

Start:

mov
mov

as,Pelda03
ds,ax

;A ds regiszter belltsa.

mov
mov

as,Ob800b

es,as:

;A kpemy-memria szegmens;eimt es regiszterhe tlti.

mov

al,byte ptr [KOORD_Y]

;Al regiszterhe a KOORD_Y cmke


;alatti nket tlti.

mov

ab,O

;Ah regiszten nullzza.

mov

bl,160

;81 regiszterhe 160-at tlt mivel


;egy sor hossza 160 byte.

mul

bl

;Al regiszter rtkt sszeswrozza


;bl tartalmval, az eredmnyt ax-ben
;kapjuk.

20

Az Assembly programozs alapjai


mov

di,ax

;A:z. gy kiszmolt rtket di


indexregiszterbe tltjk.

mov

al,byte ptr [KOORD_X)

;A vzszintes koordinta rtkt


;al regiszteibe tesszle

mov

ab,O

;Nullzza ab-t

mov
mul
add

bl,l
bl
di,ax

;A vzszintes koordinta rtkt


;megszorozzuk kettvel
;s ezt hozzadjuk az
;indexregiszterhez.

mov
mov

al,byte ptr (BETU)


ah1byte ptr (SZIN)

;Al-be a bet kdjt,


;ab-ba a sznkdot tltjk.

mov

es:(diJ,ax

;Az es: di ltal mutatott


;cmre rja ax tartalmat azaz
;a fekete alapon fehr "A"
;bett.

mov
int
KOORD_X: db
KOORD_Y:db
BETU:
db
SZIN:
db
Pelda03

ax,4c00b
l lb

;Kilps a DOS-ba.

40
ll

"A"
7

Eo ds
End Start

;A szegmens vge.
;A program vge

A mintaprogramban bemutatsra kerlt a memriavltozk


hasznlata is. Ezeket a program egy ltalunk adatok szmra
elklntett rszn kell elhelyezni. A memriavltozkat egy
cmkvel azonosthatjuk (KOORD_X: stb.), amik utn egy
kettspont ll. Ezutn meg kell jellni az adat tpust (db - byte-os,
dw - words, dd - doublewords adat), majd el kell helyezni a
troland adatot. Ha egy bett vagy szveget idzjelek kz
tesznk, annak ascii kdja troldik, gy pldul az "A" helyn 65
lesz letrolva. A programban szerepel mg egy j utasts is. A
mul vgrehajtsa sorn ha utna 8 bites adat ll

21

IBM PC Gyakorlati Assembly


(bl), az al regisztert szorozza meg a megadott regiszter
tartalmval s az eredmnyt ax-ben kapjuk. Amennyiben 16 bites
adattal szorzunk (bx), az AX regiszter tartalma szorzdik s az
eredmnyt DX s AX regiszterekben kapjuk. A magasabbik
helyirtk rszt a dx-ben, az alacsonyabbat az ax-ben. Teht ha
pldul ax regiszter tartalma 26e5h bx tartalma pedig 76ah akkor
a mul bx vgrehajtsa sorn ax regiszterben 5dd2h dx-ben pedig
0120h rtket kapnnk. A programban a szorzst a karakter
memriacmnek kiszmtsra hasznltuk a 2. program eltt
lertak szerint. A regiszter nullzsra s a 2-vel val szorzsra
ksbb majd egyszerbb mdszert is lthatunk. Az utastsnl egy
dologra kell vigyzni, hogy a szmmal val szorzs nem
megvalsthat (mul 3), de ennek a kivtelvel brmilyen adatot
hasznlhatunk szorznak. Tallhat mg egy j utasts is a
szvegben, az add sszead mvelet. Ennek lnyege, hogy az
els operandushoz adja a msodikat. A mov utastsnl lertak itt
is rvnyesek illetve itt is legalbb az egyik tagnak regiszternek
kell lennie.
A kvetkez pldban egy szveg pozcinlt kiratst
mutatom be. Ez annyiban klnbzik az elztl, hogy itt nem elg
egy karaktert kiolvasni, hanem egy meghatrozott szveget vgig
ki kell rni. Ennek kt megoldsa lehetsges, az egyik, hogy
megszmoljuk hny bett akarunk kiratni s egy ciklus
segtsgvel rjuk a kpemyre a szveget, de ennek a
mdszemek htrnya, hogy ha megvltoztatjuk a szveget, a
ciklus hosszt is vltoztaini kell. A msik mdszer, hogy a szveg
vgre elhelyeznk egy olyan kdot, amit a szvegben biztos
hogy nem hasznlunk pl.: 255 s a kiratskor figyeljk, a
kirakand karakter kdjt. Ha nem 255, akkor kitehet, ha az,
akkor vge a kiratsnak. gyelni kell, hogy egy bet kiraksa
utn a kvetkez karaktert kell olvasni, s a kvetkez
karakterpozciba kell tenni azt.
[Program 4]
Pelda04

22

Segment
assume cs:Pelda04,ds:Pelda04

;Szegmensdefinci.
;Cs s ds regiszterek bell;tsa a szegmens elejre.

Az Assembly programozs alapjai


mov
mov

ax,Pelda04
ds,ax

;A ds regiszter belltsa

mov
mov

ax,Ob800b

es,u

;A kpemy-memria szegmens;eimt es regiszterhe tlti.

mov

al,byte ptr [KOORD_YI

;Al regiszteibe tlti a


;KOORD_Y cmke alatt trolt
;rtket.

mov

bl,l60

;BI-be 160-at tlt, mivel


;egy sor 160 byte.

mul

bl

;Al rtkt megszarazza bl


;rtkvel.

mov

di,ax

;Az. igy kapott eredmnyt


;di indexregisztelbe tlti.

mov
mov
mul

al,byte ptr [KOORD_XJ


b1,2
bl

;A vzszintes pozci rtkt


;al regiszteibe tlti
;s megszarazza 2-vel

add

di,ax

;majd hozzadja di-hez.

mov

ah,byte ptr (SZIN]

;Ah-ba a sznkdot tlti.

mov

si, offset SZOVEG

;Si-be a szveg offseteimt


;tlti.

.l_Pelda04: mov

al,(siJ

;Al regiszteibe az si ltal


;mutatott cmen lv adatot
;tlti.

cmp

al,255

;Al rtkt sszehasonltja


;255-el.

jz

V ege

;Ha egyezik, ugrik a Vge


;cmkhez.

mov

es:(diJ,ax

;Az es: d i ltal mutatott


;cmre rja ax tattalmt

Start:

23

ffiM PC Gyakorlati Assembly


add

di,l

;A kvetkez kperny-pozci

inc

si

;A kvetkez bet.

jmp

. l_Pelda04

;Ugrik a .l_Pelda04 cmkhez.

V ege:

mov
int

all,4c00h
2lh

:Kilps a DOS-ba.

KOORD_X:
KOORD_Y:
SZOVEG:
SZIN:

db
db
db
db

30
12
"A kiratand szveg",2SS
7

Pelda04

En ds
End Start

;A szegmens vge.
;A program vge

Ez a program mr egy teljes szveg kiratst el tudja


vgezni. Innen mr csak egy lps lenne klnfle vezrlkdokat
beleiktatni a szvegbe s gy lehetsg lenne pldul a kpernypozci letraisa a szvegben illetve lehetne tbb mondatot
kiratni klnbz helyekre, mindssze annyit kell tenni, hogy
elhelyezni a vezrlkdot amit a programbl figyelnk, s utna az
j koordintkat amibl a program kiszmalja a szveg cmt. De
ezt a feladatot mr az olvasra bzom, az eddig hasznltakon kvl
ms utasts nem szksges a program megrshoz. Ebben
azonban szerepel t j dolog is. A legegyszerbb a cmkk
hasznlata. Ezek hasonltanak a memriavltozknl hasznlt
cmkkhez, csak ezeket nem adattrolsra hasznljuk, hanem
ltalban ugrshoz, mint azt pldul a jmp .1_Pelda04 sor is
teszi. Fontos, hogy a cmkk utn kettspontot kell tenni. Kivtelt
kpeznek a szegmens nevek illetve a memriavltozk, ha az
adatszegmens nem egyezik meg a kdszegmenssel. A jmp egy
felttel nlkli vezrlstad utasts. Ha a program ehhez a
sorhoz r, a vgrehajtst az utasts utn megadott helyen
folytatja. Ez lehet egy cmke mint jelen esetben, de lehet egy
regiszter is (si, di, bx) vagy a jmp far utasts segtsgvel egy
msik szegmensbe is tugorhatunk, mivel a norml jmp-vel csak
az adott 64K-n bell ugrndozhatunk.

24

Az Assembly programozs alapjai


A kirats sorn sor kerl a karakterkd vizsglatra is a cm p
utastssal, ami kt rtk sszehasonltsra szolgl. Hasznlata
sorn elszr az az adat ll, amit ssze akarunk hasonltani s
utna amivel. A dolog mkdse tulajdonkppen egy kivonsen
alapszik, amit a gp csak magban vgez el, a regiszterek
tartalmt nem vltoztatja meg. E mvelet elvgzse utn a flag
regiszter egyes bitjei az eredmnytl fggen llnak be. A
leggyakrabban hasznlt kt jelzbit a carry s a zero. A carry az
gynevezett tviteli jelzbit rtke O ha a msodik szm nem
nagyobb az elsnl, azaz ha az els szmbl kivonnnk a
msodikat nem negatv szmot kapnnk. Ha az rtke 1, akkor az
eredmny negatv teht a msodik szm az sszehasonlts sorn
nagyobb volt. A msik jelzbit a zero, rtke akkor 1, ha a kivons
eredmnye nulla lenne, azaz a kt szm azonos. Minden ms
esetben rtke O. Ezeket a jelzbiteket klnbz mdon tudjuk
vizsgin i. Az egyik lehetsg a feltteles elgazs. Ajz csak akkor
ugrik a megadott helyre, ha a z bit rtke 1. Ha a bit O rtkt
szeretnnk figyelni, akkor a jnz utastst kne hasznlni. Ezeknl
a feltteles ugrsoknl figyelembe kell venni, hogy ezek
gynevezett relatv ugrsok azaz elre s visszafel is 127 byte-ot
tudnak ugrani alapesetben. Ez a legtbbszr elegend, azonban
ha mgsem, akkor ms megoldshoz kell folyamodnunk.
A programban szerepel meg egy egyszer de j dolog, az
inc. Ez nem csinl mst, mnt nveli eggyel az utna ll
operandus rtkt Ez lehet regiszter illetve memriatartalom is.
Az inc utasts prja a dec ami cskkenti eggyel az utna ll
adat rtkt
Logikai

mveletek:

Elg sokat beszltnk mr a bitekrl de eddig sehol sem volt


rjuk klnsebben szksgnk. A kvetkezkben ismertetsre
kerl
utastsok
mkdsnek
megrtshez
azonban
elengedhetetlen a bitek fogalmnak ismerete. Ugyanis a most
kvetkez logikai mveletek hatsa legegyszerbben az egyes
bitek viselkedsnek vizsglatval rthet meg.

25

IBM PC Gyakorlati Assembly


legegyszerbb
ilyen mvelet a bitek invertlsa
{ellenkezjre val fordtsa). Ezt a not utastssal vgezhetjk el.

A not mvelet

mkdse:

A not mvelet utni rtk: 10110101

Kiindul rtk: 01001010

A pldn jl lthat, hogy az egyes helyirtkek tartalma az


vltott. Felhasznlhatjuk ezt pldul 255-bl val
kivons helyett, mivel az eredmny ugyan az. Ezenkvl mg sok
ms helyen alkalmazhat.
ellenkezjre

Egy az elzhz nagyon hasonl a neg mvelet. Az eltrs


csupn annyi, hogy mg not un. egyes komplemenst szmol addig
ez a szm kettes komplemenst adja eredmnyl, ami az eredeti
rtk -1-szerese, ezt legegyszerbben gy szmolhatjuk ki, ha
invertljuk a biteket s az eredmnyhez hozzadunk egyet.
A neg mvelet

mkdse:

A neg mve/et utni rtk: 10110110

Kiindul rtk: 01001010

Ezt a tmrt eljrsnl fogjuk hasznlni, de errl majd ott. A


mveletnek egybknt negatv szmok kezelsnl lenne

szerepe, de ezzel nem foglalkozunk.


A kvetkez logikai mveletekhez mr kt adatra lesz
szksg, mivel az egyes bitek tallkozstl fgg az eredmny
rtke. Ezek az and, or illetve xor utastsok.

Az and (s) mvelet sorn az eredmnyben csak ott lesz az


eredmny adott bitje 1 rtk, ahol a kiindul rtkben mindkt
adatban 1 az adott bit rtke.
Az and mvelet mkdse:
/_adat:
2_adat:

eredmny_-

26

1100
1010
1000

Az Assembly programozs alapjai

-------------"-~-=----.0..:....------

Az. or (vagy) mveletnl minden bit 1 rtk az


eredmnyben, ahol a forrs adatok kzl brmelyikben 1 az adott
bit rtke.
Az or mvelet mkdse:
/.adat:
2.adat:
eredmny:

1100
1010
1110

A xor (kizr vagy) utasts hsonlt az or mkdshez,


annyi klnbsggel, hogy itt a kt darab egyes tallkozsa is
nullt ad eredmnyl.
Az xor mvelet mkdse:
/.adat:
2.adat:
eredmny:

1100
1010
0110

Ezek kombinlsval brmilyen logikai mvelet elllthat.


Pldul kt szmot and kapcsolatba hozunk egymssal s az
eredmnyt invertljuk stb. A xor mveletnek szoktk kihasznlni
azt a tulajdonsgt, hogy kt azonos bitre mindig nullt ad. gy ha
egy szmot sajt magval xor-olok, annak eredmnye biztos,
hogy nulla lesz. Ezt a trkkt regiszterek nullzsra szoktk
felhasznlni, mivel a mov ax,O utasts sor a memriban 3, a xor
ax,ax csak 2 Byte-ot foglal el. Ez hosszabb programoknl jelents
lehet. Illetve az or, and utastsokat lehet pldul arra
felhasznlni, hogy egy regiszter stb. tartalmrl megtudjunk pr
dolgot, mivel az or illetve and mvelet vgrehajtsakor a flag
egyes bitjei az eredmnynek megfelelen llnak be. Ha pldul ax
regiszter rtke nulla akkor az or ax,ax utastssor vgrehajtsa
utn a z flag rtke 1 lesz. Ez a sor szintn rvidebb a cmp ax,O
megoldsnL
A kvetkez mvelet, ami ebbe a tmakrbe tartozik. az a
forgats. Lehetsg van ugyanis a byte, word tartalmnak
forgatsra tbbfle mdon. Ami kzs mindegyik megoldsnl,
hogy a byte vagy word szlrl kicssz bit mindig berdik a
carry flagbe.

27

IBM PC Gyakorlati Assembly


A sz szerinti forgatst a ror {rotate right) illetve rol {rotate
left} utastsok vgzik. A forgatskor az utasts utn kell rni, amit
forgatni akarunk {regiszter, memriatartalom) s egy vessz utn,
hogy mennyit. Ez a 8086 alap gpeknl {XT) vagy 1 vagy cl.
Utbbi esetben cl regiszterben megadott rtkkel forgat. 80286-tl
flfel
megadhat
nagyobb
szm
is,
de
ekkor
a
programszvegben jellni kell a fordtnak, hogy a programot nem
XT-re rtuk. Ez gy trtnik, hogy az els sorba egy .286 sort
helyeznk el. Innen a fordt tudni fogja, hogy a program 80286
utastst is tartalmaz.
A ror utasts

mkdse:

forgats eltt: 01100101


forgats utn: 10110010
cany rtke: l mivel a byte jobb szln kicssz bit rtke l.

A rol utasts

mkdse:

forgats eltt: 01100101


fargats utn: 11001010
cany rtke: O mivel a byte bal szln kicssz bit rtke O.

Teht a byte forgatsa sorn a kiforg bit berdik a carry


fiagbe s a byte msik szln befordul mind a rol mind a ror
utastsn l.
Hasonl mdon mkdik az rcr illetve rel utastsok, de itt a
forgatott adatot megtoldja egy bittel a carry flag. Teht mint a byte
kilencedik bitje mkdik ugyanis a kifordul bit a carry fiagbe
kerl s a carry elz rtke fordul be a byte msik oldaln.
Az rcr utasts mkdse:
cany rtke forgats ellt: O
a byte forgats eltt: 01100101
forgats utn: 00110010
cany rtke: l mivel a byte jobb szln kicssz bit rtke l.
cany rtke fargats ellt: l
a byte fargats eltt: 01100101
fargats utn: 10110010
cany rtke: l mrvel a byte jobb szln kicssz bit rtke l.

28

Az Assembly programozs alapjai


Az rel utasts mkdse:
cany rtke forgats eltt: O
a byte forgats eltt: 01100101
forgats utn: 11001010
cany rtke: O mivel a byte bal szln kicssz bit rtke O.
cany rtke forgats eltt: l
a byte forgats eltt: 01100101
forgats utn: 11001011
cany rtke: O mivel a byte bal szln kicssz bit rtke O.

A harmadik forgatsi lehetsg, amikor az adat kicssz bitje


szintn a c fiagbe rdik, de a msik oldalrl becssz bit rtke
minden esetben O.
Az shr utasts mkdse:
forgats eltt: 01100101
forgats utn: 00110010
cany rtke: l mivel a byte jobb szln kicssz bit rtke l.

Az shl utasts mkdse:


forgats eltt: 01100101
forgats utn: ll001010
cany rtke: O mivel a byte bal szln kicssz bit rtke O.

Egy byte illetve word forgatsra mg egy lehetsg van,


amikor a jobbra forgatsnl a signum (eljel) flag rtke rdik az
adat bal szlre. A jobb szls bit forgatskor szintn c-be rdik.
A mvelet fordtoltja azonos az shl mkdsvel.
A sar utasts mkdse:
signum rtke forgats eltt: O
a byte forgats eltt: 01100101
forgats utn: OOllOOlO
cany rtke forgats utn: l mivel a byte jabb szln kicssz bit rtke l.
ignum rtke forgats eltt: l
a byte forgats eltt: 01100101
forgats utn: 10110010
cany ertke forgats utn: l mi1el a byte.fabb szln kics.z bit rtke l.

29

IBM PC Gyakorlati Assembly _ _ _ _ __


Az sal utasts mkdse:
forgats eltt: OUOOlOl
fargats utn: UOOlOlO
carry rtke: O mivel a byte bal szln kicssz bit rtke O.

Mindezeket a mveleteket kiprblhatjuk a kvetkez kt


mintaprogram segtsgve!, ha a megfelel helyre az ltalunk
kiprblni kvnt utastst rjuk. Ennek helye a szvegben kln
jellve van.
[Program 5]
PeldaOS

Segment
assume cs:PeldaOS,ds:PeldaOS

;Szegmensdefinei
;Cs, ds belltsa

Start:

mov
mov

u,PeldaOS
ds,u

;Ds regiszter belltsa


;a kd elejre

mov
mov

u.,Ob800h
es.u

;A kperny-memria szegmens;eimt es regiszterbe tlti.

mov
int

u.,3
l Oh

;80*25 karakteres md be;lltsa, kpemytrls.

xo r

di,di

;Di nullzsa.

mov

si,offset SZOVEGl

;Si mutatja a szveg kezd;eimt.

call

Kiirol

;Meghvja a Kir l eljrst.

mov
call

bl,byte ptr [SZAMl[


Kiiro2

:81-ben a kirand S2m van


;s ezt a Kir2 rutin
;rja ki a kpemyre.

mov di,l60

:A kvetkezszveg
;kezdcme.

mov
call
mov
call

30

si,offset SZOVEG2
Kiirol
bl,byte ptr [SZAM2[
Kiiro2

;Ugyan az mint elbb.

Az Assembly programozs alapjai

Kiirol

.l_Kiirol:

Kiirol

mov
mov
call

di,3:ZO
si,otfset SZOVEG3
Kiirol

mov
and
call

bl,byte ptr [SZAMI)


bl,byte ptr [SZAMl)
Kiirol

;Az els S7mot bl


;regiszterbe teszi s
;vgrehl\ilja a kijellt
;mveletet a msodik szmmal
;amit utna kir a
;kpemyre. Itt kell a
;kivnt mveletet belltani.

mr
int

u,ax

;Billen~.

mov
int

u,4c00b
l lb

16b

Proc

;Kilps a DOS-ba.

;Kir l rutin kezdete.

mov

ex, l 6

;A szveg 16 karakterbl ll.

mov

ab,l5

;Fekete alapon fehr szn.

mov

al,[si)

mov

es:[di),ax

;A Itiratand bett al
;regiszterbe tlti, Dlllid
;kirja es:[di) ltal
;mutatott cmre.

add
inc

di,l
si

;A kvetkez karakterpozc.
;A kvetkez karakter.

loop

.t_Kiirol

;Cskkenti ex rtkt s ugrik


;a meg;ldott helyre ha ex nem O

ret

;Visszatrs a hv
;programrszhez.

bdp

;A rutin vge.

31

ffiM PC Gyakorlati Assembly


Kiirol

.l_Kiirol:

.l_Kiirol:

;Kir2 rutin kezdete.

Proc
add

di,6

;Hrom karakterpozcival
;arrbb lp. l

mov

cx,B

;Az adat 8 bitbl ll.

mov

ab, lS

;Fekete alapon fehr szn.

mov

ai,"O"

;Al regiszterbe a "O" ascii


;kdjt tlti.

sbl

b l, l

;A:z. adatot egyel balra


;lpteti, igy a kicsordul
;bit a carry fiagbe kerl.

j ne

.l_Kiirol

;Ha ez a bit O, akkor ugrs


;a .2_Kir cmkhez.

mov

al,"l"

;Ha l, akkor az al-be az


;"l" ascii kdjt tltjk.

mov

es:(diJ,u

;A szmjegyet a kpemyre
;rjuk.

add

di,l

;Egy hellyel arrbb.

loop

. l_Kiirol

;Ismtls CI-nek megfelelen .

ret

; Visszatrs a rutinbl.

Kiirol

End p

;A rutin vge.

SZOVEGI:
SZOVEGl:
SZOVEGJ:
SZAMl:
SZAMl:

db
db
db
db
db

PeldaOS

En ds
End Start

32

"Az els byte :"


"A msodik byte:"
"Az eredmny "
0101110lb
10101011b
;A szegmens vge.
;A program vge.

Az Assembly programozs alapjai

------=-==-=-=-=-~.:.....=..--"---'-'='.------'------'--"-"-''------

------ -- -

Ez a program mr sokkal sszetettebb mhit az elz ngy.


Ebben mr megtallhatk a ciklusok, eljrsok, felttelek stb. Mint
az lthat is a regiszterek nullzsra itt mr a xor mvelet lett
hasznlva.

A knyv elejn emltettem, hogy ha egy feladatra tbbszr


van szksgnk, akkor azt elg egyszer megrni, majd a programbl egy call utastssal vgrehajtatni. Ez hasonlt a jmp utastsra, de itt a gp megjegyzi a call utasts eimt a ksbbi
visszatrshez. Erre mutat kt pldt is az 5. program. Az eljrs
(procedure) kezdett egy Proc sz jelzi. Termszetesen ahogy a
szegmenseknek, gy az eljrsoknak is kell egy nevet adni, amivel
ksbb hivatkozhatunk r. Ez a nv a Proc eltti cmke. A rutint a
cmkenv s az Endp zrja. Nagyon fontos sor a rutinunkban a
ret. Ugyanis ez az utasts jelenti a gpnek, hogy trjen vissza a
call utni sorra, ahonnan elindtottk a rutint. Nagyon fontos
dolog, hogy ne prbljunk meg eljrsbl kilpni a DOS-ba. mert
ez nagy valsznsggel egy lefagyst fog eredmnyezni. Ennek
oka. hogy a szmtgp kezel egy gynevezett stacket. ahov
adatokat lehet elmenteni illetve onnan visszaolvasni. Ez a stack
egy a mamriban visszafel nvekv terlet, ha nem adunk meg
az ss regiszternek kln rtket. akkor a stack eleje a szegmensnk legvge lesz. Ha adatot mentnk ide, akkor azt berja s
cskkenti a stack mutat rtkt. ami mindig az utoljra bert adatra mutat. Ugyangy kiolvasskor is a legutoljra beirt szmot kapjuk meg elszr s utna az elzt stb. Nos visszatrve a lefagys
okra, a program indtsakor a visszatrsi eim berdik a stackbe amit kilpskor kiolvasva tudja, hova kell visszatrni. A call
utasts is a stacket hasznlja a visszatrsi cm trolsra amit a
ret-hez rve olvas ki s ugrik a trolt eimre. Ha a rutinbl prblnnk meg kilpni, nem a DOS-hoz val visszatrs cmt alvasn
ki a gp, hanem a call cmt. Termszetesen van megolds, de ez
egy kicsit bonyolultabb, ugyanis megtehetjk, hogy kiolvassuk a
staekbl a call visszatrsi crnt s ekkor a legutols trolt adat
a DOS-hoz val visszatrsi cimet fogja mutatni.
A msik fontos dolog ami megtallhat a programban az a
ciklus. A ciklusok mkdse azon az elven alapszik, hogy egy
regiszterbe berjuk a vgrehajtsok szmt. s a programrszlet
vgn eskkeltjk a regiszter rtkt s ha mg nem nulla, akkor

33

IBM PC Gyakorlati Assembly


megismteljk a programot mindaddig mg a regiszter rtke nulla
nem lesz. A PC-n ezt a feladatot egyszeren megoldhatjuk, mivel
kln utasts van erre a clra a loop. A ciklus lefutsnak szmt
ex regiszterben kell megadni s amikor a program a loop
utastssorhoz r, cskkenti ex rtkt, s ha az mg nem nulla,
akkor ugrik a megadott cmre, ami hasonlkppen a jmp-hez lehet
cmke illetve regiszter.
A programban a kilpsen kvl kt ROM BIOS funkci is
hasznlva lett. Az 1Oh megszakts a kpernyt kezeli. Ha ah-ba O
van, akkor a kperny zemmdjt lltja be al rtknek
megfelelen. Jelen esetben a 80*25 karakteres mdot. A 16h rutin
a billentyzet kezelst vgzi. Ha ah-ban nulla van, akkor a gp vr
egy billenty lenyomsra, s annak ascii kdjt al illetve scan
kdjt ah regiszterben adja vissza. Itt a visszarkez adatot nem
hasznljuk fel, mivel a dolog szerepe csak egy billentyvrs,
hogy ne azonnal trjen vissza a DOS-hoz.
A program mkdst illeten a binris szmkirats ami j.
Ezt gy oldja meg, hogy az adatot tartalmaz byte-ot eggyel balra
forgatja, gy abbl a bal szls bit rtke a carry fiagbe kerl. A
mvelet vgrehajtsa eltt al regiszterbe a nulls szmjegy kdjt
tltttk be. Ha a forgats sorn a c rtke 1 lenne, akkor al
tartalmt az egyes szmjegy kdjra vltoztatjuk. Ha nulla, akkor
tugorjuk a vltoztatst. Az gy kialakult szmjegyet a mr
megszakott mdon a kpernyre rjuk. Mindezt megismteljk az
sszes bitre (azaz 8-szor).
A kvetkez program semmi jdonsgot nem fog tartalmazni,
mindssze nem kt forrsadat lesz, csak egy mivel a forgatshoz
csak egy adat szksges.
[Program 6]
Pelda06

Segment
assume cs:Pelda06,ds:Pelda06

;Szegmensdefinici
;Cs, ds bellitsa

Start:

mov
mov

ax.,Pelda06
ds,ax

;Ds regiszter bellitsa


;a kd elejre

mov
mov

ax.,Ob800h
es,ax

;A kperny-memria szegmens;eimt es regiszterhe tlti.

34

Az Assembly programozs alapjai


mov
int

u,3
l Oh

;80*25 karakteres md be;lltsa, kpemytrls.

xo r

di,di

;Di nullzsa.

mov

si,oft'set SZOVEGI

call

Kiirol

;Si mutatja a szveg kezd;cmt.


;Meghvja a Kir! eljrst.

mov
call

bl,byte ptr [SZAMl)


Kiirol

mov di,160

;81-ben a kirand szm van


;s ezt a Kir2 rutin
;ija ki a kpernyre.
;A kvetkez szveg
;kezdcme.

Kiirol

.l_Kiirol:

mov
call

si,oft'set SZOVEG2
Kiirol

;Ugyan az mint elbb.

mov

cl, l

;A forgats nkt egyre


;lltja.

mov
ro r
call

bl,byte ptr [SZAMl)


bl,cl
Kiirol

;A szmot bl regiszterbe tlti


;s vgrehajtja a kijellt
;mveletet, amit utna kir a
;kpernyre. Itt kell a
;kvnt mveletet belltani.

xo r
int

ax,ax
16h

;Billentyvrs.

mov
int

ax,4c00h
ll h

;Kilps a DOS-ba.

Proc

;Kir l rutin kezdete.


karakterbl

mov

cx,ll

;A szveg 21

mov

ah, l 5

;Fekete alapon fehr szn.

mov

al,[ si)

mov

es:[di),ax

;A kiratand bett al
;regiszterbe tlti, majd
;kiilja es: [d i) ltal
;mutatott cmre.

ll.

35

IBM PC Gyakorlati Assembly


add
inc

di,l
si

;A kvetkez karakterpozci.
;A kvetkez karakter

loop

.I_Kiirol

;Cskkenti ex rtkt s ugrik


;a megadott helyre ha ex nem O

ret

;Visszatrs a hiv
;programrszhez.

Kiirol

End p

;A rutin vge.

Kiirol

Proc

;Kirl rutin kezdete.

.I_Kiirol:

.l_Kiirol:

Kiirol

36

add

di,6

;Hrom karakterpozcival
;arrbb lep.

mov

cx,S

;Az adat 8 bitbl ll.

mov

ah,l5

;Fekete alapon fehr szn.

mov

ai,"O"

;Al regiszterhe a O ascii


;kdjt tlti.

shl

bl,l

;Az adatot egyel balra


;lepteti, igy a kicsordul
;bit a carry fiagbe kerl.

j ne

.l_Kiirol

;Ha ez a bit O, akkor ugrs


;a .2_Kir cmkhez.

mov

al,"l"

;Ha l, akkor az al-be az


; l ascii kdjt tltjk.

mov

es:(di),ax

;A szmjegyet a kpemyre
;rjuk.

add

d i,l

;Egy hellyel arrbb.

loop

.l_Kiirol

;Ismtls ex-nek megfelelen.

re t

;Visszatrs a rutinbl.

End p

;A rutin vge.

Az Assembly programozs alapjai


SZOVEGI: db
SZOVEG2: db
SZAMI:
db
Pelda06

"Az eredeti szm "


"A mvelet eredmnye:"
OlOlllOlb

En ds
End Start

;A szegmens vge.
;A program vge.

Az eddigi pldkban megismerhettk a szvegkirats


mdjait illetve a binris szmok kiratsnak egy mdjval. A
kvetkezkben ismertetsre kerl a szmok hexadecimlis,
decimlis kiratsa.

A hexa szmok kiratsnl problmt jelent, hogy a


szmjegyeken kvl A-F-ig betket is tartalmazhat a szm. s a
kilences szm s az A bet kztt vannak tovbbi karakterek,
melyek kiratsa nem clravezet. A megolds, hogy egy
tblzatba helyezzk a lehetsges karaktereket s a szmnak
megfelel jelet olvassuk ki innen s rjuk ki a kpernyre. A PC-n
az ilyen tblzatkezelsre van egy specilis utasts, ami a
belltott tblzat al-edik lemt tlti al-be, ez az xlat. A tblzat
offsetcmt (kezdcmt a szegmens elejhez kpest) bx
regiszterbe kell tenni a mvelet vgrehajtsa eltt.
[Program 7]
Pelda07

Segment
assume cs:Pelda07,ds:Pelda07

;Szegmensdefinci
;Cs, ds belltsa

Start:

mov
mov

ax,Pelda07
ds,ax

;Ds regiszter belltsa


;a kd elejre

mov
mov

ax,Ob800h

es, u

;A kperny-memria szegmens;cmt es regiszterhe tlti.

mov
int

ax,J
l Oh

;80*25 karakteres md be;lltsa, kpernytrls.

xo r

d i, d i

;Di nullazsa.

mov

bx,offset HEXTABLE

;Bx regiszterhe a konvertl


;tbla eltolsi rtkt hja.

37

IBM PC Gyakorlati Assembly


mov

dx,word ptr [HEXSZAM] ;Dll regiszterhe tlti a


;kirand szmot.

mov

ah,l5

;A szmok szne fekete alapon


;fnyes fehr.

mov

cx,4

;A szm ngy szmjegybl ll.

.I_Pelda07: push Cll

;Cll rtkt a verembe menti.

mov

cx,4

;Egy szmjegyet ngy bit


;hatroz meg.

llOr

al,al

;Trli az al regisztert.

dx,l
al, l
l_Pelda07

;A dll regiszter fels ngy


;bitjt al regiszterhe
;forgatjuk.

.l_Pelda07: shl
rel
loop

;A szmjegynek megfelel
;karakterkdot tlti al
;regiszterhe

x! at

kpemyre.

mov

es: [di],ax

;s ezt kirja a

add

di,l

;A kvetkez rsi pozci.

pop

Cll

;Cll elz rtkt kiolvassuk


;verembl.

loop

.l_Pelda07

;A kvetkez szmjegy
;kiratsa.

llOr
int

ax,ax
16h

;Billentyvrs.

mov
int

ax,4c00h
ll h

;Kilps a DOS-ba

HEXSZAM:dw

5bleh

;A kirand szm.

HEXTABLE: db

"Oil3456789ABCDEF"

;Konvertl tbla.

Pelda07

38

Ends
End Start

;A szegmens vge.
;A program vge.

Az Assembly programozs alapjai


Mint az lthat, a program lelke a HEXTABLE cmke alatt
letrolt pr bet, ugyanis ha pldul a kirand szmjegy decimlis
rtke 13 akkor a tblzat 13. elemt fogja kirni a kpernyre,
azaz egy D bett. Ezt a mveletet hajtja vgre az xlat utasts. A
programban egy 16 bites szmot runk ki. Egy hexadecimlis
szmjegy 0-15-ig vehet fel rtket, amit 4 biten lehet brzolni.
Teht 4 egyenknt 4 bites szmjegyet kell kirni a kpernyre. Ez
kt egymsba gyazott ciklussal lett megoldva. Viszont ha egy
regiszternek egyms utn ktszer adunk rtket, (mivel a loop
utastshoz csak a ex regisztert lehet hasznlni) akkor az a
msodik rtket veszi fel s az elst elfelejti. Ellenben neknk az
els ciklusunk szmolja a 4 karaktert s a msodik a 4 bitet. Teht
mindkettre szksg van. A megolds, hogy mieltt a msodik
ciklusnak rtket adnnk, ideiglenesen eitraijuk a ex regisztert a
veremben, majd a msodik ciklus lefutsa utn kiolvassuk innen
s az rtkt cskkentve visszaugrunk az elmentsre mindaddig
mg nem raktuk ki a teljes szmot.
A stack (verem) mkdsrl mr esett pr sz, de itt azrt
mg egy kis rszletezs, hogy mi is trtnik amikor a push
utastssal elmentnk egy adatot vagy a pop segtsgvel
kiolvasunk egyet. A stack, mint azt emltettem az ss
szegmensregiszter ltal meghatrozott szegmens vgtl
kezdden lefel nvekszik. A legutoljra bert rtk helyt az sp
(stack pointer) regiszter mutalja. Ennek kls befolysolsa nem
clszer. csak felttlenl szksges esetben tegyk, mivel a gp
adatmentskor illetve kiolvasskor automatikusan trja az rtkt
A tovbbiakban egybknt ahol lehet kerljk a veremmveletek
hasznlatt, mivel vgrehajtsa a tbbi utastshoz kpest
meglehetsen lass. Termszetesen ez nem azt jelenti, hogy tilos
hasznlni, de ott ahol fontos a program gyorsasga, ott kerlend.
A most kvetkez mintaprogram a szmok decimlis
formban val kiratst mutatja be. melynek legegyszerbb
megoldsa a tzzel val osztogats mindaddig, mg a szm nem
kisebb tznl. Az egyes szmjegyeket nem az oszts eredmnye,
hanem a maradk adja, mivel gy brmekkora szmot kirhatunk,
mg ha a msik lehetsges mdszert alkalmazzuk, hogy elosztjuk
a szmot pl 1000-el, az eredmnyt kirjuk, utna 100-al s gy
tovbb, akkor a jelen esetben a legnagyobb kirhat szm a 9999.
39

IBM PC Gyakorlati Assembly


A programban alkalmazott mdszer htrnya, hogy a
szmjegyeket fordtott sorrendben kapjuk meg, de a problma
knnyen megoldhat, ha nem egybl a kpernyre rjuk az adatot,
hanem letraijuk a mamriban s kzben szmoljuk a
szmjegyek szmt. Ha vgeztnk, fordtott sorrendben kirhatjuk
a teljes szmot.
A szmjegyek szmkarakterr val talaktsa itt sokkal
mivel ha a O szmjegy ascii kdja 48, ezrt csak
hozzadunk a szmhoz 48-at s mr rhatjuk is a kpernyre.
egyszerbb,

[Program 8)
Pelda08

Segment
assume cs:Pelda08,ds:Pelda08

;Szegmensdefinici
;Cs, ds belltsa

Start:

mov
mov

ax,Pelda08
ds,ax

:Ds regiszter belltsa


;a kd elejre

mov
mov

ax,Ob800h

es,ax

;A kpemy-memria szegmens;eimt es regiszterhe tlti.

mov
int

ax,3
tO h

;80*25 karakteres md be;lltsa, kpernytrls.

mov

di,otfset SZAMHELY

:Erre a eimre fogja letroini


;a szmot kirs eltt.

mov

ax,word ptr [DECSZAM) ;A kirakand szm.

mov

bx,lO

; Az oszts mrtke.

xor

cx,cx

;A szmll nullzsa.

.t_Pelda08: xor
div

dx,dx
bx

;A div utasils a jelen


;esetben dx:ax regiszter
;tartalmat osztja, de
;szmunkra hasznos adat csak
;az ax regiszterben van,
;ezrt a dx regisztert
;trlni kell.

[di),dl

;Az oszts maradknak als

mov

40

Az Assembly programozs alapjai


;byte-jt a memriba
;mentjk.
inc

ex

;A szmll nvelse.

inc

di

;A kvetkez cmre hja a


;kV"!tkez szmot.

or
jnz

ax,ax

l_Pelda08

;Ax vizsglata.
;ha nem O, ugrs vissza.

mov
dec

si,di
si

;Si regiszterbe di-1-et


;tltnk, mivel ez az utols
;rtkes szm.

xo r

di,di

;Di nullzsa.

mov

ab, IS

;Sznbellts.

.2_Pelda08: mov

al,[si)

;Al-be tlti az utoljra


;letrolt szmjegyet ami
;valjban az els.

edd
mov

a1,48
es:[di),ax

;Ascii szmjeggy alaktja


;s kihja a kpemyre.

add

d i,2

;Kvetkez

dec

si

;Elz

too p

.2_Pelda08

;Ismtls a szmjegyek
;szmnak megfelelen.

xo r
int

ax,ax
16b

;Billentyvrs.

mov
int

ax,4c00b
2 lb

;Kilps a DOS-ba.

DECSZAM: dw

34576

;Az brzoland szm.

SZAMHELY:db

;A szm tmeneti trolsra


;szolgl hely

Pelda08

En ds
End Start

pozci.

szmjegy.

;Szegmens vge
;Program vge

41

ffiM PC Gyakorlati Assembly


A programban a dv utasts segtsgvel osztjuk el ax
rtkt tzzel, amit a bx-ben troltunk. Azrt kell 16 bites osztsi
mveletet hasznlni, mert ha bi-t hasznlnnk osztnak, az
eredmnyt al, a maradkot ah regiszterben kapnnk s ha egy
2559-nl nagyobb szmot osztannk tzzel, a maradk nem frne
el ah regiszterben. De gy, hogy a dx:ax tartalmt osztjuk bx-el s
dx rtkt az oszts eltt nullra lltjuk, a maradkot dx-ben
kapjuk, ami biztos, hogy el fog ott frni (65535--ig).
Ezzel tulajdonkppen a szmok kiratsi lehetsgeit tbb
kevsb letrgyaltuk, az sszes tbbi mr ezek kombinlsa. Van
azonban a szmok trolsnak mg egy nagyon gyakori fajtja az
gynevezett BCD szmbrzols. Ez nem ms mint a decimlis s
a hexadecimlis brzols keverke. Itt a hexa szmban a
legmagasabb hasznlhat rtk a 9. Ilyen mdon legtkppen a
ROM BIOS programjai kezelik a szmokat. A most bemutatsra
kerl plda is erre tmaszkodik, a pontos idt fogjuk a
kpernyre rni. Itt pldul a 16 ra 42 perc 1642h szmknt
troldik. Hasznlatuk igen egyszer, hasonlt a decimlis szmok
kiratsra, mivel itt is hozz kell adni a szmhoz 48-at a kirs
eltt, de itt is egyszerre csak egy szmjegyet tesznk ki.
A ROM program elindtsa utn az eredmnyt az egyes
regiszterekben kapjuk mgpedig ch-ban az rt, cl-ben a percet
s dh-ban pedig a msodpercet BCD formtumban.
[Program 9]
Pelda09

Segment
assume cs:Pelda09,ds:Pelda09

;Szegmensdefinci
;Cs, ds belltsa

Start:

mov
mov

ax,Pelda09
ds,u

;Ds regiszter belltsa


;a kd elejre

mov
mov

u,Ob800h

es,ax

;A kperny-memria szegmens;eimt es regiszterbe tlti.

mov
int

ax,J
l Oh

;80*25 karakteres md be;lltsa, kpemytrls.

u,200h
l ah

;A:z id lekrdezse

.l_Pelda09: mov
int

42

Az Assembly programozs alapjai

Kiiro

Kiiro

call

Kiiro

;s kirsa.

mov
int

u,lOOb
16b

;Figyeli, hogy van-e


;lenyomott billenty.

jz

. l_Pelda09

;Ha nincs, ugrik az elejre .

xo r

u,ax
16b

;Ha van, akkor kiolvassa azt

int
mov
int

ax,4c00b
ll b

;s visszatr a DOS-boz.

;A rutin kezdete.

Proc
mov

di,1670

;A kperny kzepe tja.

mov

ab, lS

;Sznbellts

mov

bx,cx

;Az ra,perc rtkt ttlti


;bx-be.

call

Kiirol

;kirja az ra rtkt

add

d i,l

;Helyet hagy a

call

Kiirol

;Kirja a percet

add

di,l

;A kettspont helye.

mov
call

bb,db
Kiirol

;A msodperc rtkt bb-ba


;tlti s kiratja.

mov
mov
mov

al,":"
es:[di-6),ax
es: [di-ll),ax

;Al regiszterhe a ":" jel


;kdjt teszi s kirja
;azt a kt megadott helyre.

kettspontnak

ret

;Visszatrs a rutinbl.

End p

;A kir rutin vge.

43

ffiM PC Gyakorlati Assembly


Kiiro2

Proc

;A kir2 rutin kezdete.

.l_Kiiro2:

mov cll,l
push Cll

;Egyszerre 2 szmjegyet
;runk ki.

.2_Kiiro2:

mov

u,4

;Ami egyenknt 4 bitbl ll.

xo r

al,al

;Al nullzsa.

shl
rel
Ioop

bx,l
al, l
.2_Kiiro2

;Bx fels 4 bitjt tforgatja


;al regiszterbe.

add
mov

al,48
es:[di),ax

;talaktja karakterkdd
;s kilja a kpemyre.

add

di,2

;A kvetkez kphely.

pop
loop

Cll

;A kvetkez szmjegy.

.l_Kiiro2

rel

;Visszatrs a rutinbl.

Kiiro2

End p

;Az eljrs vge.

Pelda09

En ds
End Start

;A szegmens vge.
;A program vge.

A program j utastsokat nem tartalmaz, ami mgis j az a


REAL TIME ra kezelse. Ez nem ms, mint egy a szmtgp
ltal kezelt ra amit software ton lekrdezhetnk, bellthatunk
stb. Ennek a kezelsre most az 1Ah BIOS program 02 funkcija
lett alkalmazva. A hvs utn a mr emltett regiszterekben kapjuk
az id rtkt A feladat csak annyi, hogy ezt kirjuk a kpernyre.
Persze ahhoz, hogy valami formja is legyen a dolognak, ne rt
elvlaszt kettspontokat rakni az ra perc illetve a perc
msodperc rtkek kz. Ezenkvl meg kell oldani. hogy az ra
jrjon, de mgis ki lehessen lpni belle. Ha az eddigi billentyzet
figyelst alkalmaztuk volna, az ra nem jrna, csak kirn az
aktulis rtket s egy gombnyomsra kilpne. Ha egy jmp
utastssal visszaugrlnnk a kiratshoz, akkor az ra jrna, de
billentyfigyels nlkl nem lehetne kiszllni a program futsbl.
A megolds egy msik fajta figyels kombinlsa a

44

Az Assembly programozs alapjai


visszaugrssaL A 16h rutinnak a 01 funkcija nem vr egy
billenty lenyomsra, csak az aktulis llapotrl ad informcit
az ax regiszteren illetve a fiagen keresztl. A z jelzbit 1 rtke
jelenti, hogy nincs lenyomott gomb teht visszaugorhatunk az
ralekrdezsre. Amennyiben van, azt ki kell olvasni a billentyzet
pufferbl az eddig is hasznlt rutinnal de itt a klnbsg annyi,
hogy nem vr mivel mr van lenyomott billenty, ha ezt a
kiolvasst kihagynnk akkor kilps utn kirn azt a bett amit
lenyomtunk. Ezutn a megszekott mdon visszatrnk a DOS-hoz.
A program egyszerstse rdekben a kirats egy eljrssal lett
megoldva amit egy msik eljrs kezel. A fprogram csak az
idinformcik lehvst illetve a billentyzetkezelst vgzi. A
megjelentsi egy rutin vezrli, hogy minden a megfelel helyre
kerljn.
A prograrnek msik fontos eleme a megjelentsek mellett a
vezrls. Az, hogy a felhasznl hogyan tudja irnytani a program
menett, vlasztani adott lehetsgek kzl. Az egyik
legkulturltabb megolds a menvezrls, amikor a kpernyn
felsorolt lehetsgek kzl gy vlaszthatunk, hogy pldul egy
ms httrszn svval mozoghatunk az egyes lehetsgek kztt,
s az enter vagy ms billenty lenyomsval lehet kivlasztani a
megfelel funkeit Egy msik mdszer, amikor a vlaszts egy
bet lenyomsval trtnik, ilyen pldul az i/n vlasztsi
lehetsg. Termszetesen az kevs, hogy kirjuk a kpernyre a
menpontokat, s kzttk mozgunk, br ez is feladat, de a
vlaszts utn el kell tudnunk dnteni, hogy melyik lehetsget
vlasztottuk s azt kell vgrehajtani. Erre lthatunk egy pldt a
kvetkez programban, ami egy kicsit mr hosszabb az
eddigieknl s a bonyolultsga is nagyobb egy kicsit.
[Program 1O]
PeldalO

Segment
assume cs:PeldalO,ds:PeldalO

;Szegmensdefinci.
;Cs, ds belltsa."

Start:

mov
mov

ax,PeldalO
ds,ax

;Ds belltsa a kd elejre.

mov
mov

ax,Ob800h
es,ax

;Videomemria szegmenseimt
;es regiszterhe tlti.

45

ffiM PC Gyakorlati Assembly


mov
int

u,3
lOb

;Kpernytrls.

call

Kiiro

;A menpontok kiratsa.

.l_PeldalO: call

Cs ik

;A mutat kiraksa.

.l_PeldalO: mov
int
jz
IOr
int

u,lOOb
l 6b
.l_PeldalO

;Billentyzet

figyels.

U,Bll

l6b

cm p
jz

ab,lcb
Enter

;Enter figyelse
;Ugrs ba az.

cmp
joz

ab,48b
.3_Peldal0

;Ha nem az akkor a kvetkez

;A felfel nyl figyelse.


;vizsgalatra ugrik.

cm p
jz
dec

byte ptr [MUTATO),l


.2_Peldal0
byte ptr (MUTATO)

;Ha a mutat rtke mg nem l

jmp

l_PeldalO

;jabb billenty figyelse .

.J_PeldalO: cm p
joz

ab,50h
.2_Peldal0

:A lefel nyl figyelse,


;Ha nem az, vissza a
;billentyzet figyelsre.

byte ptr (MUTATO),S


.2_PeldalO
byte ptr [MUTATO)
.l_PeldalO

;Ha aMUrATOmgnem az

cm p
jz
inc
jmp
Enter:

.l_Enter:

46

mov

;akkor cskkenti aMUrATO


;pozcijt egyel.

;tdik helyen ll, nveli


;az rtkt
:Vissza a figyels elejre.

;Cl ciklusvltozha a
el,byte ptr [MUTATO)
;MUI'ATO rtkt tlti.

mov
mov
add
loop

si,otfset ClMEK
bx,[si)
si ,2
.l_Enter

;A CIMEK cmknl trolt


;otJsetcmek kzl azt
;tlti a bx regiszterbe.
;amelyiken a mutat llt.

jmp

bx

;Ugrik a b x ltal mutatott


;programrszre.

Az Assembly programozs alapjai


.l_Enter:

mov si,offset KERDES


call Kiirol

.J_Enter:

mov
int
jz
mr
int
cm p
jz
cmp

u,lOOb
16b
.J_Enter
u, u
l 6b
ab,llb
.4_Enter
ab,l7b

jnz

.J_Enter

jmp

Start

;A KERDES alatti szveg


;ki ratsa
;Az igeninem vlasztsi
;lebetsgek vizsglata

;Ha nem, ugrs a kilpsre.

;Ha nem az igen, akkor


;jabb billenty beolvassa,
;mert a lenyomott gomb
;rvnytelen.
;Ha az i lett lenyomva,
;ugrik a program elejre.

.4_Enter:

mov u,4c00b
int
l lb

;Klps a DOS-hoz.

Menul:

mov si,offset SZOVEGl


call Kiirol
jmp .l_Enter

;Az egyes vlasztsok


;eseten vgrehajtand
;programok.

Menu2:

mov
call
jmp

si,offset SZOVEG2
Kiirol
.l_Enter

Menu3:

mov
call
jmp

si,offset SZOVEGJ
Kiirol
.l_Enter

Menu4:

mov si,offset SZOVEG4


call Kiirol
jmp .l_Enter

Menu5:

mov
call
jmp

Cs ik

Proc
mov
mov

si,offset SZOVEG5
Kiirol
.l_Enter

al,byte ptr [MUTAT02) ;A mutat rgi rtkt


bt, l 60
;al, egy sor hosszt a bl
;regiszterbe tlti,

47

IBM PC Gyakorlati Assembly

.l_Csik:

.2_Csik:

xo r
mul
add
mov
mov
mov
mov
add
loop

ah,ah
bl
ax,l499
di,ax
cx,ll
al,7
es:[di),al
d i,2
.l_Csik

mov
mov
mov
xo r
mul
add
mov
mov
mov
mov
add
loop

al,byte ptr [MUTATO)


byte ptr [MUTAT02),al
bl,l60
ah,ah
bl
8ll,l499
di,ax
cx,ll
al,47
es:[di[,al
di,2
.2_Csik

;Ugyan az, mint az elbb,


;de most mr az j pozcival
;s a kiemell httr sznnel
;rajzolja a cskot.

si,offset MENUK
ah,7
di,l660

;A mr ismert szveg
;kirat rutin azzal a
;kiegsztssel, hogy a
;O kdra az eltrolt di
;rtk! kiolvassa, hozzad
;160-at (igy sort emel),
;majd ismt elmenti .
;A 255 kd jelenti a szveg
;vgt s a rutinbl val
;visszatrst.

;s kiszmalja a mutat
;kezdcmt.

;Fekete alapon fehr szn.


;A szninforrncik bersa
;a kperny-memriba,
;ezltal trli az elz
;csikot.

ret
C sik

End p

Kiiro

Proc
mov
mov
mov

.l_Kiiro:

push d i

.2_Kiiro:

mov
inc
cm p
jz
cm p
jz
mov
add
jmp

48

al,[ si)
si
ai,O
.J_Kiiro
al,255
.4_Kiiro
es:[di[,ax
d i,2
.2_Kiiro

Az Assembly programozs alapjai


.J_Kiiro:

.4_Kiiro:

pop
add
jmp

di
di,l60
.l_Kiiro

pop

di

ret
Kiiro

Endp

Kiiro2

Proc
mov
xo r
shl
mov
mov
mov
mul
add
add
mov

al,[si)
ah,ah
ax,l
di,ax
al,[ si +l)
b l, l 60
bl
di,ax
si,2
ah,12

.l_Kiiro2:

mov
inc
cm p
jz
mov
add
jmp

al,[ si)
si
ai,O
.2_Kiiro2
es:[di),ax
d i,2
.l_Kiiro2

.2_Kiiro2:

ret

Kiiro2

End p

;Ez a kir csak az els


Jelben klnbzik az
;elztl, ugyanis itt a
;kirand szveg els kt
;byte-ja a koordinta,
;arnibl a program kiszmalja
;az aktulis memriacimet.
;Az eljrs a tovbbiakban
;azonos az elzvel, de itt
;nincs soremels.

MUTATO: db
MUTAT02:db

MENUK:

db
db
db
db
db

"Az els menpont",O


"A msodik menpont",O
"A harmadik menpont",O
"A negyedik menpont",O
"Az tdik menpont",255

49

IBM PC Gyakorlati Assembly


SZOVEGl:
SZOVEG2:
SZOVEGJ:
SZOVEG4:
SZOVEG5:

db
db
db
db
db

22,5, "Az els menpont lett kivlasztva." ,O


21,5,"A msodik menpont lett kivlasztva.",O
21,5, "A harmadik menpont lett kivlasztva." ,O
21,5,"A negyedik menpont lett kivlasztva.",O
22,5," A tdik menpont lett kivlasztva." ,O

KERDES:

db

28,20,"Akar ujra vlasztani (iln)",O

CIMEK:

dw
dw
dw
dw
dw

offset Menu l
offset Menu2
offset Menu3
offset Menu4
offset Menu5

PeldalO

En ds
End Start

Nos a program mrettl nem szabad megijedni, mert rszegysgeiben vizsglva nagyon sok minden ismersnek tnhet.
Egybknt ez valjban egy parnyi program, a gyakorlatban ilyen
rvid feladattal ritkn tallkozunk.
Egy program mkdsnek elemzsekor az egyik megkzelts az, amikor a programot rszegysgeiben vizsgljuk s csak az
egyik programrszbl a msikba tvitt paramtereket kell szmontartani a pontos mkds megrtshez. Ez a mdszer itt is clravezet.

Vegyk akkor sorra ennek a programnak a rszegysgeit a


a kperny belltsa a megfelel zemmdba, de ez mr
teljesen termszetes. Ezutn kirjuk a kpernyre az egyes menpontokat. Nzzk, hogyan is trtnik ez: Ugyebr egy call utastssal meghvjuk a Kiiro rutint, ami elszr is si indexregiszterbe
tlti a kirakand szveg kezdcmt, ah-ba a sznt s di-be a kpernycmet, ahonnan a kirst el kell majd kezdeni. Itt ezt a program nem szmolja, mivel ez egy fix rtk ami nem vltozik, ezrt a
cimet kzvetlenl a regiszterbe tltjk. De mivel a legritkbb esetben ll egy sorbl egy men, ezrt a di rtkt elmentjk a verembe, hogy ksbb knnyebben tudjuk kiszmolni a kvetkez sor
kezdcmt. Ha mindezzel megvagyunk, kvetkezhet a karakterek
beolvassa a memribl, s kpernyre rsa, hacsak nem velegels,

50

Az Assembly programozs alapjai


zrlkd. A rutin a O-t s a 255-t hasznlja vezrlsre. A nulla hatsra elveszi a verembl a di elmentett rtkt ami az ppen rt

sor elejre mutat. Ha ehhez hozzadunk 160-at, ppen egy sorral


lejjebb jutunk, gy az egyes menpontok pontosan egyms alatt
lesznek s ugyanabban az oszlopban fognak kezddni. Termszetesen a regiszter tartalmt ismt el kell trolni egy jabb sor cmnek kiszmtshoz. Ha nem nullval tallkozik, hanem 255-el, akkor a rutin befejezsre ugrik ami abbl ll, hogy a di tartalmt kiolvassa a verembl, nehogy benne maradjon a mr emltett lefagysi lehetsgek miatt s egy ret utastssal visszatr oda, ahonnan elindtottuk.
A program tovbbi teendje mr tbbszr fog ismtldni, gy
ide egy cmke is kerlt, amire ksbb ugrani lehet. A legels lps
itt, hogy a vlasztst jelz cskot kitesszk valamelyik menpontra
(ez alapesetben a legels, de ezen lehet vltoztatni). Ezt a Csik
nev szubrutin vgzi el, ami kt majdnem egyforma rszbl ll. Az
elsben eltnteti a kpernyn lv cskot, majd kirakja az jat. Ez
a kvetkezkppen trtnik: a MUTAT02 rtkt ha megszarozzuk a sor hosszval (160) s hozzadjuk az els mensor eimt
(160-at), akkor pontosan annak a mennek a helyt kapjuk,
amelyiken ppen ll a mutatnk. Azrt kell 160-al kevesebbet hozzadni, mert a mutat kezdrtke 1 s ha ezt megszorozzuk a
sorhosszal, akkor a 160-at kapunk. A kezdrtk egyrl val indtsnak oka, hogy a ksbbiek sorn amikor ezt az rtket egy
ciklusban hasznljuk, akkor ha cx=O rtkkel indul, akkor nem
egyszer fog lefutni a ciklus, hanem 65536-szor (ez a loop mk
dsbl addik). Ha kiszmoltuk a csk kezdcmt, elkezdhetjk a
csk kirakst. Ezt a csk hossznak s sznnek belltsval
kezdjk. Itt a szn az eredeti, fekete htter a trls cljbl. Ezutn a mr kiszmolt memriacmre, ami most nem egy karakterhely, hanem egy sznhely mert most a szveget nem kvnjuk
megvltoztatn i, csak a sznt, kitesszk a mutatt jelkpez cskot.
Teht egy ciklussal minden msodik helyre berjuk a megadott
sznbyte-ot. Ha ezzel megvagyunk, megismteljk a mveletet, de
most mr az j pozcival s sznnel. Majd a mutat helyt a
MUTAT02 vltozba rjuk, hogy a kvetkez elmozdtsnl le tudjuk trlni a jelenlegit. Ezutn termszetesen egy ret segtsgvel
visszatr a rutinbl. A most kvetkez BIOS rutin ellenrzi, hogy
van-e lenyomott billenty. Ha van, akkor kiolvassa azt s megvizs-

51

IBM PC Gyakorlati Assembly


glja, hogy a szmunkra van-e jelentse. Ha nincs, akkor vissza a
figyelshez. Ha a felfel nylat nyomtuk meg, akkor ellenrizni kell,
hogy a mutat nem ll-e a legfels soron, mert innen fljebb mr
nem lphetnk. Ha nem ott llt. akkor a mutat rtkt cskkentjk
eggyel. Hasonlan a lefel nylnl is megvizsgljuk a csk helyt
s ha lehet, nveljk a mutat rtkt Amennyiben a menpont
kivlasztsra hasznlt enter-t nyomtuk le, akkor kilp a krbl s
az Enter cmknl folytatja a program futst. Itt a cl regiszterbe
tlti a MUTATO rtkt, si-be pedig azt a cmet, ahonnan kezdve
le lettek trolva az esetlegesen indthat programok cmei. Ez gy
trtnt, hogy a CIMEK cmke utn words formban az egyes
programok offsetcmei kerltek letrolsra. Innen egy mov utastssal a bx regiszterbe tltjk elszr az els cmet, nveljk si rtkt kettvel, majd a loop utasts a ex-nek megfelelen megismtli ezt a mveletet. Ha ex-ben 1 volt. akkor a ciklus nem kerl
ismtlsre s a bx regiszterben marad az els cm. Ha nem egy,
akkor a ex-tl fggen a megfelel rtket kerl a bx-be. Ezzel
megkerestk a kivlasztott menpont ltal vgrehajtand program
cmt. A feladat mr csak annyi, hogy vgrehajtsuk. Ezt egy jmp
bx utastssal tehetjk meg. Ezek a rutinok most csak annyit csinlnak, hogy si-be belltjk a kiratand szveg kezdcmt (termszetesen a menponttl fggen) s egy msik kir rutin segtsgvel kirjk azt, majd visszaugranak a .2_Enter cmkhez. Az
itt hasznlt szvegkirak eljrs csak annyiban klnbzik az el
ztl, hogy a szveg elejn tallhat 2 byte, ami a kirakand szveg koordintjt tartalmazza. Ebbl a program a mr megszakott
mdon kiszmalja a kpernycmet. A szveg vgt a O kd jelzi.
Visszatrs utn egy krds kerl kiraksra, mgpedig, hogy akarunk-e jbl vlasztani. Itt figyeli, ha az n gombot nyomtuk le, ugrik
a kilpsre, ha az i gombot akkor ellrl kezdi a programot,
egybknt jabb billenty vrsa kvetkezik. A programban nem a
karakterek ascii kdja lett figyelve, hanem a scan kd mivel elfor
dulhat, hogy be van nyomva a Caps Lock s ekkor az n billentyt
hiba figyeljk mivel letsekor N kerlne beolvassra. Ellenben a
scan kd a billentyzet gombjait jelenti, nem pedig a rajtuk lv bett.
Memriakezels:
A programozsnak egy msik fontos eleme a memria
kezelse. Gyakran elfordulhat ugyanis, hogy egy program

S2

Az Assembly programozs alapjai


mkdse

kzben pldul a lemezrl egy hosszabb szveget akar


beolvasni, ami az adott programszegmensbe mr nem frne bele,
vagy ms egyb mvelethez memrira lenne szksge. Ekkor
jnnek a bonyodalmak, ugyanis ki tudja mirt, de amikor a DOS
betlt a memriba egy programot, akkor az sszes szabad
memrit lefoglalja, majd betlti a programot, de a nem hasznlt
memriaterletet nem szabadtja fel. Ez azt jelenti, hogy ott van az
res memriaterlet. de hasznlhatatlan. Ahhoz teht, hogy a
memria egy rszt sajt cljainkra le tudjuk foglalni, elbb fel kell
szabadtani a nem hasznlt rszeket. Ez egy egyszer BIOS
mvelet,
ahol megadjuk az ltalunk hasznlt program
szegmenscmt s hosszt, a tbbit mr elvgzi a gp. Ezutn a
maradk memria a rendelkezsnkre ll. gyelm kell, hogy a
program hosszt nem byte-ban kell megadni. mert !=JY maximum
64K terletet hasznlhatnnk, hanem paragrafusban. Egy
paragrafus nem ms mint 16 byte, teht a programunk mrett, el
kell osztani 16-al s megkapjuk a hosszt. Nem rt azonban egy
kicsivel tbbet lefoglalni. fleg ha egy szegmensen bell van a
kd, az adat s a stack, mivel gy egy pr veremmvelet utn
fellrhatjuk a programunkat. Teht mindig annyival tbbet
clszer megtartani a sajt programunk. amennyit maximlisan
hasznlhat. A megmaradt terlettel ezutn mr szabadon
garzdlkodhatunk. Az els lps a felszabadts utn. hogy
lefoglalunk egy ltalunk meghatrozott mret rszt a szabad
memribl. amit azutn majd felhasznlhatunk cljainkra. Ez
szintn egy BIOS hvssal trtnik, meg kell adni, hogy mennyi
memrit akarunk a gptl, s ezt kiutalja neknk ha van anny1.
Ha nincs, akkor a legnagyobb lefoglalhat memriablokk mrett
kapjuk vlaszknt. Egybknt pedig a lefoglalt blokk mrett a
szegmenscmvel egytt. Ha ez is megvan. mink a lehetsg,
hogy azt kezdjnk vele amit akarunk. A tovbbiakban ezt majd
arra fogjuk felhasznlni. hogy a lemezrl betltnk egy szveget,
amit majd kirunk a kpernyre. De ahhoz, hogy ezt meg tudjuk
tenni, meg kell mg ismerni a file kezelst.
File kezels:
A lemezen lv file-okat tbbflekppen kezelhetjk. Ezek a
kzl most a legegyszerbbel fogunk ismerkedni. Ezt
szintn a BIOS vgzi hrom lpsben. Az els a file megnyitsa. a
lehetsgek

SJ

IBM PC Gyakorlati Assembly


msodik az rs vagy olvass s a harmadik a file lezrsa. A
mvelet vgzse sorn fontos informcit tartalmaz a file
azonost (handle), amit a file megnyitsa utn kapunk a gptl,
s a msik kt mvelet szmra felttlenl szksges. A
megnyitshoz nem szksges ms, mint a file neve s egy
megnyitsi md, ami meghatrozza, hogy milyen mveletet
akarunk vgezni a file-al. A rutinbl val visszatrskor ax
regiszterbe adja a file azonost szmot, amit majd hasznlni
fognak a tovbbi rutinok. Ezutn kvetkezik az rs vagy olvass
ahol meg kell adni a mozgatand byte-ok szmt s helyt. Ha
elvgeztk a mveletet, le kell zrni a file-t!
A most kvetkez program lefoglal a memribl egy 64K
hossz terletet, ahov a lemezrl be fog tlteni egy neveket
tartalmaz adatfile-t, amit egy rvid program segtsgvel kiratunk
a kpernyre.
[Program 11]
Peldall

Segment
assume cs:Peldall,ds:Peldall

;Szegmensdefinci.
;Cs s ds regiszterek
;Hozzrendelse a crnkkhez.

Start:

mov
mov

ax,Peldall
ds,ax

;Ds regiszter belltsa a


;kd elejre.

mov
int

ax,J
l Oh

;Kpernytrls.

mov
mov
int
mov
mov
int
mov

ax,4a00h
;A program ltal lefoglalt
;memriaterletet 16K
bx,l024
21 h
;mretre vltoztatjuk
ax,4800h
Xrnk a DOS-tl egy
;64K mret memrialapot
bx,4096
21 h
word ptr [MEMOCIMJ,ax;Ennek szegmenseimt a
;memriavltozba tesszk_

mov
mov
int
mov

ax,JdOOh
;A FILENEV alatt trolt nev
dx,offset FILENEV
;file megnyitsa olvassra.
2lh
word ptr [FILESZAM[,ax;A visszakapott file azonost
;informcit a memriba mentjk.

54

Az Assembly programozs alapjai


push
mov
mov
mov
mov
xo r
mov
int

;A ds regiszter rtkt
ds
;elmentjk, mivel mi nem
bx,ax
ax,word ptr [MEMOCIM);a ds ltal mutatott
;szegmensre kvnunk betlteni
ds,ax
;hanem az ltalunk lefoglaltax,JfliOb
;ra. A DOS htrnya viszont,
dx,dx
;hogy a betltend file
cx,Oftlh
;helyet a ds :dx regiszterben
2lh
;kell megadni a rutinnak.

pop

ds

mov
mov
int

;A file lezrsa.
ax,JeOOh
bx,word ptr [Fll..ESZAM]
2lh

xo r
xo r
mov
mov
push
mov
mov
mov
xo r

;A kirats eimt es:di,


;az olvassta ds:si
ax,Ob800h
;fogja tartalmami, de ehhez
;ds rtkt ismt el kell
es,ax
;menteni.
ds
ax,word ptr [MEMOCIM)
ds,ax
ah, l 4
;Sznbellts.
bx, bx

.l_Peldall: mov
inc
cm p
jz

di,di

si,si

al,ds:[si)
si
al,l3
.2_Peldall

;A kiral rutin.

cm p
jz

al,255
Kilepes

;Ha enter kddal tallkozik,


;ugrik a soremel program;rszhez.
;A 255 aszveg vgt jelenti.
;Ekkor kilps.

mov
add
jmp

es:[di+bx),ax
bx,2
.l - Peldall

;A bet kiratsa s a
;pozcik lltsa.
;j bet.

add
jmp

bx,bx
si
d i, l 60
.I_Peldall

;A 13 utni Oah kdot tlpve


;a kvetkez sor elejre
;lltja az rs eimt.

pop

ds

;A ds eredeti rtknek
;visszalltsa.

.2_Peldall: xo r
inc

Kilepes:

;A ds visszalltsa.

55

IBM PC Gyakorlati Assembly


xo r
int

8li,8X

mov
int

&ll,4c00h
21 h

FILESZAM:dw
MEMOCIM:dw
FILENEV: db
Peldall

;Billentyvrs.

16h

?
?
"nevek.txt",O

En ds
End Start

;Kilps a DOS-hoz

;A betltend file neve.


;A szegmens vge.
;A program vge.

Mint az lthat, a program hasonlkppen kezddik, mint az


eddigiek. A kpernytrls utn azonban meghvsra kerl a 21h
rutin. ami tulajdonkppen nem ms, mint a DOS-nak egy rsze.
Ugyanis ez a megszakts kezeli a legtbb DOS funkcit. Ezek
kzl mi most a 4ah alfunkcit hasznljuk, ami a lefoglalt memria
mretnek megvltoztatsra szolgl. Bx regiszterben kell
megadni az j hosszt (paragrafusokban) s es regiszterben a
szegmenscimet Nos ezt hiba keresnnk, nem lett megadva
mivel a program indulskor ds s es regiszterekbe az gynevezett
PSP (majd ksbb) -ami a program eltt tallhat- szegmenseimt
rakja. Ezrt nem kell kln belltani ezt az rtket, s a ds-t ezrt
llitjuk be .exe programoknl kln a kd elejre. A program ltal
hasznlhat memria hosszt 1024 paragrafusra azaz 16K-ra
llitottuk be, Ennyi biztos elg lesz.
Ezutn a file betltse cljra krnk a gptl egy kis
rnemrit, mghozz 64K-t. s ha megkaptuk, eitraijuk a
szegmenseimt hogy ksbb tudjuk hasznlni.
Most kvetkezik a hasznland szvegfile megnyitsa. Ezt a
mveletet a 3dh DOS funkci vgzi. Az al regiszterbe nullt
tltnk, ami azt jelenti, hogy a file-t csak olvassra nyitjuk meg. Ha
iti 1 lenne az a csak irst. a 2 az rs-olvasst jelenti. Az al
r.<giszter tbbi bitjvel nem foglalkozok, mivel az ms knyvekben
sli.>. is megtallhat. A dx regiszterbe pedig azt a cimet kell rakni,
al1ol megtallhat a betltend file elrsi tja, neve a kiterjesztssei aminek a vgt egy nulla jelzi. A rutinbl val visszatrs-

56

Az Assembly programozs alapjai


kor ax regiszter fogja tartalmazni a file azonost szmot amit
elmentnk, mivel ksbb is szksg lesz r. A kvetkez lps a
szveg betltse. Ehhez ds:dx regiszterbe be kell lltani annak a
helynek a eimt, ahov be akarjuk tlteni az adatot s ex-be az
adatblokk hosszt. Ez itt most nem lett pontosan belltva, de ha
tbbet runk be ide, nem trtnik nagy katasztrfa, legfeljebb nem
tlt be annyit, csak amilyen hossz a file. Egybknt a betlttt
byte-ok szmt megadja a rutin visszatrskor, de erre most
semmi szksg. Ami viszont fontos, hogy ha ds rtkt
megvltoztattuk, semmi olyan mveletet nem vgezhetnk, ami a
memriavltozkat s egyb a rgi adatszegmensben lv adatot
befolysolna, mivel a ds most mshov mutat. Ezrt a
szegmensregiszter rtkt is a verembe kell lementennk mivel
ezt a vltoztats nem befolysolja. A file betltse utn
visszalltjuk az eredeti ds rtket mivel a fileszm egy
memriavltozban lett eltrolva, s ezt. csak gy tudjuk kiolvasni a
file lezrshoz. Ezzel a file betltse megtrtnt, most mr a
rendelkezsnkre ll szveg a lefoglalt memriaterleten.
Tovbbi tennivalnk, hogy a beolvasott neveket a kpernyn
megjelentsk sorban egyms alatt. Ehhez nem rt, ha ismerjk a
DOS alap szvegszerkesztk ltal ksztett szvegformtumokat.
Tudni kell rluk, hogy minden sor vgre ahol entert nyomtunk,
egy 13 s egy 10 kdot rak. Ebbl a 13 az enter a 10 pedig a
nyomtatk szmra az j sort jelentik. A szveg vgre egy 255
kdot helyeztem, amit a programbl figyelve jelzi a felsorols
vgt.
A kirat rutin hasonlkppen mkdik, mint az mr rgebben
trtnt, azzal a klnbsggel, hogy a sorokon belli cimet a bx
regiszter nvelsvel vltoztatjuk, ez megknnyti a soremelst
mivel gy csak nullzni kell a bx regisztert s hozzadni di-hez a
sorhosszt. Az egyetlen dolog, amire oda kell figyelni hasonl
esetekben, hogy a ds regiszter rtkt megvltoztattuk, gy
memriavltozk hasznlata nem ajnlott.
Addhat olyan esemny, amikor egy sz, mondat helyt kell
meghatroznunk egy hosszabb szvegben, adatbzisban stb.
Illetve vizsglnunk kll, hogy egyltaln megtallhat-e az adott
szveg. Ilyenkor a megolds, hogy letraijuk a keresend

57

ffiM PC Gyakorlati Assembly


kifejezst s sorban sszehasonltjuk a dokumentum minden
rszvel mindaddig, mg r nem lelnk a kvnt szvegre. Ezen
feladat megoldsnl nagyon hasznos a cmpsb l cmpsw illetve a
scasb l scasw utastsok a rep kiegsztssel. A jelentskre
majd a mintaprogram ismertetse utn trek ki. A most kvetkez
program egy eltrolt mondatban keres egy szt, s kirja, hogy a
mondat hnyadik karaktertl kezddik.
[Program 12]
Peldall

Segment
assume cs:Peldall,ds:Peldall

Start:

mov
mov
mov

es,ax

eid
mov
mov
mov
mov

cx,47
di,offset SZOVEG
si,offset SZO
al,[si]

u,Peldall
ds,ax

.l_Peldall: repnz scasb

joz

Nincs

;Szegmensdefinci
;Cs,ds kijellse
;Ds,es regiszter belltsa
;a kd elejre.

;A d jelzhitet tri.
;A vizsglt szveg hossza.
;A szveg s a keresett
;sz cmnek belltsa.
;Al regiszterbe a keresett
;sz kezdbetjt tlti.
;Es:di cmen lv karaktert
;sszehasonltja al rtkvel
;s ha nem egyezik, nveli
;di-t,cskkenti ex-et s
;ismtli mindezt, mg nem
;tall egyez bett, vagy ex
;rtke nem O.
;Ha a vizsglatbl val
;kilpskor z flag rtke
;O, akkor vgignzte a
;szveget s nem tallt
;egyez bett.

dec

di

push ex di si

58

;Egy betvel visszbb lp


;mivel a scasb nvelte a
;tallt bet utn is eggyel.
;A regiszterek elmentse.
;mivel a kvetkez rutin
;megvltoztatja azokat.

Az Assembly programozs alapjai

Nincs:

TalaJt:

Kilepes:

Kiiro

.l_Kiiro:

movcx,6

;A keresett sz 6 bet hossz.

repz cmpsb

;Es:di s ds:si ltal


;mutatott terletek sszeha;sonltsa egymssal.

pop

si di ex

;A regiszterek visszatltse.

jz

Talalt

;Ha a rep cmpsb vgrehajtsa


;utn zero flag l, az azt
jelenti, hogy a kt szveg
;megegyezik egymssal.

inc
jmp

di
.l_Peldal2

;Ha nem, akkor a kvetkez


;bettl folytatni a keresst.

mov
call
jmp

si,offset UZENETl
Kiiro
Kilepes

;UZENETI szveg kiratsa

mov
mov
sub
push
call

si,offset UZENET2
ax,di
ax,offset SzOVEG
ax
Kiiro

;UZENET2 kiratsa,
;a megtallsi pozcibl
;kivonjuk a szveg offsetcmt
;s ezt elmentjk a szmkir
;rutin szmra.

pop
call

ax
Kiiro2

;Ax elhvsa,
;a szm kiratsa.

xo r
int
mov
int

ax,ax
16h
ax,4c00h
21 h

;s kilps.

;Billentyvrs.

;Kilps a DOS-ba.

Proc
mov
mov
mov
int
xo r
mov

ax,Ob800h
es,ax
ax,J
l Oh
di,di
ah,l5

;Kperny-bellts.

mov
inc

al,[si)
si

;Az Si cmen
;kiratsa.

lv

szveg

59

ffiM PC Gyakorlati Assembly


cmp
jz
mov
add
jmp
.l_Kiiro:

ret

Kiiro

Eodp

Kiirol

Proc

.l_Kiirol:

60

ai,O
.l_Kiiro
es:[di[,u
di,l
.l_Kiiro

mov

di,otrset SZAMHELY

;Erre a cmre fogja letroini


;a szmot a kirs eltt.

mov

bx,lO

;A:z. oszts mrtke.

xo r

Cli,CX

;A szmll nullzsa.

xo r
div

dx,dx
bx

mov

[di),dl

;A div utasts a jelen


;esetben dx:u regiszter
;tartalmat osztja, de
;szmunkra hasznos adat csak
;az u regiszterben van,
;ezrt a dx regisztert
;torolni kell.
;A:z. oszts maradknak als
;byte-jt a memriba
;mentjk.

inc

ex

;A szmll nvelse.

inc

di

;A kvetkez cmre hja a


;kvetkez szmot.

or
joz

ax,ax
.l_Kiirol

;Ax vizsglata,
;ha nem O, ugrs vissza.

mov
dec

si,di
si

;Si regiszterbe di-1-et


;tlnk, mivel ez az utols
;rtkes szm.

mov

di,44

;Kirsi pozci belltsa.

mov

ah, lS

;Sznbellts.

Az Assembly programozs alapjai


.l_Kiirol:

mov

al,(si(

;Al-be tlti az utoljra


;letrolt szmjegyet ami
;valjban az els.

add
mov

al,48
es:(di(,ax

;Ascii szmjeggy alaktja


;s kilja a kpernyre.

add

d i,l

;Kvetkez

dec

si

;Elz

loop

.l_Kiirol

;Ismtls a szmjegyek
;szmnak megfelelen.

xo r
int

ax,ax
16h

;Billentyvrs.

mov
int

ax,4cOOh
ll h

;Kilps a DOS-ba.

pozci.

szmjegy.

ret
Kiirol

End p

SZOVEG:

db

"Ez az a szveg, amiben keresni fogunk egy szt."

SZO:

db

"amiben"

;A keresett sz.

UZENETl: db

"Nincs ilyen sz a vizsglt szvegben; ,u

UZENETl: db

"A keresett sz helye:" ,O

SZAMHELY:db

5 dup (O)

Peldall

;A szm tmeneti trolsra


;szolgl hely

En ds
End Start

Korbbi programokban mr hasznltuk a cmp utastst,


1nellyel kt adatot hasonlthattunk ssze. Az imnti plda is
megoldhat lett volna ezzel, de sokkal hosszabb, bonyolultabb lett
volna a program. A PC rendelkezik egy olyan utasts csoporttal
ami egy kicsit sszetettebben mkdik az eddig megismerteknL
Nos nzzk, hogy is mkdnek ezek: amikor a gp a scasb
61

IBM PC Gyakorlati Assembly


utastssal tallkozik, sszehasonltja az es:di cmen trolt adatot
(jelen esetben byte-ot) al regiszter tartalmval s a jelzbiteket a
mvelet eredmnytl fggen lltja be. Tovbb a vgrehajts
utn nveli (cskkenti) di regisztert a d flag rtktl fggen
(d=O esetn nveli). gy ha ismtelgetjk a seasb utastst,
megkereshetjk az adott szvegben az al tartalmnak elfordulsi
helyt. Ezt az ismtelgetst oldja meg a rep kiegszts ami a
vgrehajts sorn cskkenti ex rtkt s mindaddig ismtli a
mg rt mveletet, mg ex el nem ri a nullt. A mi esetnkben ez
nem elegend, mivel figyelni kell, hogy egyez-e a bet vagy sem.
Ezt oldja meg a repnz ami mindaddig ismtel, amg a z bit nulla
illetve a ex regiszter nagyobb nullnl. Teht ha egyez bett tall
a seasb, akkor a zero flag 1 rtkre vlt, minek hatsra a repnz
abbahagyja az ismtlst. A ex regiszterbe a vizsgland szveg
hosszt lltjuk, mivel a keresst a szveg vghez rve be kell
fejezni. A keressi ciklusbl val kilpskor a z bit rtke mutatja
a kilps okt. Ha 1 akkor egyez bett tallt, ha O akkor a ex
rtke rte el a nullt.
A msik utasts amit a keresett sz sszehasonltsra
hasznltunk, az a empsb, ami a ds:si s az es:di ltal cmzett kt
byte-ot hasonltja ssze, majd nveli si s di rtkt A flag itt is a
mvelet eredmnytl fggen ll be. Az itt hasznlt kiegszts, a
repz csak addig ismtel, amg a mvelet eredmnye egyenl azaz
zero flag rtke 1. Illetve mg ex nem nulla.
Ezen kt utasts segtsgvel
brmilyen hossz szveg keresse.

nagyon

egyszer

egy

A mintaprogram tartalmaz mg egy j utastst is, ami


befolysolja az elz kett mkdst. Ugyanis az, hogy a rep
hatsra a ex rtke cskken vagy n, azt a d jelzbit hatrozza
meg. Ha rtke 1, akkor cskkenteni fogja. Ezrt a d bitet nullba
kell lltani. Ezt a eid utasts vgzi el. Ezutn a programban
belltjuk a szveg hosszt, eimt s a keresett sz eimt. Ezutn
a sz els betjt al regiszterbe tltjk. Ezzel a kiindulsi
paramtereket belltottuk, kvetkezhet a keress. Jelen esetben
a keresett sz az "amiben" ezrt a repnz seasb megkeresi a
szvegben elfordul els "a" bett. A keres ciklusbl val
kilpskor ha z=O akkor a szveg vghez rtnk, ami azt jelenti,

62

Az Assembly programozs alapjai


hogy a keresett sz nincs a szvegben. Amennyiben tallt a
program al-ben trolt bett, akkor kvetkezik az sszehasonlts.
Els lpsben cskkentjk di rtkt, hogy arra a helyre
mutasson, ahol egyez bett tallt, majd elmentjk a hasznlt
regisztereket, mivel a kvetkez programrsz is hasznlja ezeket
s neknk a keress esetleges folytatshoz a jelenlegi rtkek
szksgesek.
A vizsglt sz sszehasonltst a szhossz belltsval
kezdjk, majd a repz cmpsb sszehasonltja a tallt bet cmtl
kezdd rszt az ltalunk keresett szval. Amennyiben a 6
karakter brmelyiknl eltrst tall, kilp a repz ciklusbL A
vizsglat utn visszatltjk az elmentett regisztereket s
megvizsgljuk a kilps okt. Ha z=1 akkor a vizsglt sz
megegyezik az ltalunk megadottaL Ha nem, akkor a kvetkez
karaktertl {inc di) folytatdik a keress egy jabb "a" betig.
Amennyiben a ciklus vgigfutott gy, hogy nem tallta meg a
kvnt adatot, a Nincs cmkre ugrik, ahol a Kiiro rutin segtsgvel kzli ezt velnk.
Hasonlkppen a Talalt esetben, de itt a sz helyt is kirja
neknk a mr ismert szveg s szkkir rutinok segitsgvel.
Termszetesen, ha egy gigantikus mret adathalmazban
akarunk megkeresni valamit, az idbe telhet. Ezrt pldul
adatbzis szer adatok kztt sokkal knnyebben keresglhetnk,
ha az adatainkat fix hosszsg terleteken troljuk. Mit is jelent
ez? Vegynk pldnak egy telefon reg!szter programot. Ha nv
szerint akarunk keresglni, akkor teljesen f(ilsleges azt a
telefonszmok s a cmek kztt is megnzni. Ezrt azt szoktk
csinlni, hogy meghatrozzk, hogy a nv maximlisan pl.: 30
karaktert, a telefonszm 15-t, a cm pedig 100 karakter helyet
foglalhat el, ezrt minden adat szmra egy ekkora terletet
foglalnak le mg ha rvidebb is ennl. Ezekutn a keress
annyibl ll, hogy megnzzk a nv els betjt s ha nem
stimmel, akkor 145 karakterrel arrbb lpnk, ami a kvetkez nv
els betjt tartalmazza. Ugyangy a telefonszm s a cm
esetben is. Elnye a dolognak, hogy a flsleges informcit
nem vizsgltuk meg, s ezzel rengeteg idt megsproltunk.

63

IBM PC Gyakorlati Assembly


Ha mr sz esett az adatbzisokrl, egy kis elmleti informciknt a rendezsrl: az adatok valamilyen szempont szerinti sorbarendezsnek alapveten kt tpusa van. A vals s a ltszlagos. A vals rendezsnl az adatokat fizikailag sorbarendezzk a
megadott szempont szerint, mg a ltszlagos esetben csak egy
sorrendet ksztnk, ahol a helyes sorrendet troljuk le s az adatbzis sorrendjt nem vltoztatjuk meg. Elnye az utbbinak, hogy
gyorsabb rendezst lehet elrni vele. Az adatok sorbaraksra
egy tlet, ami ugyan valsznleg nem a leggyorsabb, de kiprbltan jl mkdik. A teendnk, hogy sszehasonltjuk az els s a
msodik bejegyzst egymssal. Amennyiben nem megfelel a sorrendjk, egyszeren megcserljk a kettt. Ezutn megtesszk ezt
a 2. s a 3. adattal s gy tovbb egszen az utolsig. Ezzel azonban mg nem lesznek sorban az adatok, mivel egy lpsben nem
lehet ezzel a mdszerrel az utols bejegyzst az els helyre varzsolni, ezrt a teljes mveletet meg kell ismtelni a bejegyzsek
szma-1-szer ahhoz, hogy biztosan a megfelel sorrendet kapjuk.
Elfordulhat. hogy a programunknak a DOS-bl akarunk
valamilyen paramtert tadni. Lsd pldul DIR /P stb. esetben a
l jel utn valamilyen paramtert lehet megadni. Az elvlasztst
szolgl jel feladata csupn annyi, hogy a programbl
knnyebben meg tudjuk keresni a paramtert, mivel az utasts s
a paramter kztt nem biztos, hogy csak egy szkz van. A
pldaprogram mindssze annyit csinl, hogy a paramterknt rt
rszt kirja a kpernyre a megadott koordintkra. A program
hasznlata: pelda13 /1 0,12,kirand szveg. fontos, hogy flsleges szneteket ne rakjunk a l utn mivel a program ott a koordintt fogja keresni.

[Program 13)
PeldalJ

Segment
assume cs:PeldalJ,ds:nothing

Start:

mov

si,80h

;A OTA
;teszi.

mov
inc

cl,lsil
si

;A paramterrsz hosszat u
;regiszterbe teszi s a
;mutatt eggyel nveli.

64

kezdeimt

si-be

Az Assembly programozs alapjai


mov
mov

u,Ob800b

es,u

;A videomemria kezdeimt
;es regiszterile tlti.

.l_Pelda13: mov
call
mov

ab,"/"
Keres
dx,si

;A l jel keresse.

mov
call

ab,","
Keres

;A , karakter keresse.

push ex
mov
mov
sub
sub
dec
call
pop
push
mov
mov
call

cx,si
di,si
di,l
C:l,dx
ex
Szamito
ex
dx
dx,si
ab,","
Keres

push
mov
mov
sub
sub
dec
call

ex
C:I,S
di,si
di,l
ex
Szamito

pop
pop

ex
di

sbl

di,l

mov
mov
mul
add

u,dx
bl,160
bl
di,ax

;Ox regiszterile teszi a


;rutin ltal megadott cmet.

;Cx ideiglenes elmentse.


;Cx regiszterben kiszmoljuk
;a koordinta szmjegyeinek
;szmt, di-ben pedig az
;utols szmjegy cme lesz.
;Majd kiszmoljuk a koordinta
;szmrtkt.
;Hasonlkppen mint az elbb
;tettiik, megismteljk a
;mveletet a fggleges
;koordinta rtkkel is.

c:~,dx

;Di-be az elzleg elmenten


;dx rtkt tlgk s
;megszorozzuk: kettvel. Ezzel
;kiszmoltuk a koordinta
;vizszintes eimt.
;A fgglegest a szokott
;mdon megszorozzuk 160-al
;s hozzadjuk di-bez.

65

IBM PC Gyakorlati Assembly


as,3
l Oh

;Kpemytrls.

ah,15
al,[si)
es:[di),ax
si
di,2
.2_Pelda13

:Fekete alapon fnyes fehr


;sznnel cx ltal mutatott
;szrn karaktert runk
;es:[di) cmtl kezdden.

xo r
int

ax,ax
16h

;Billentyvrs.

mov
int

ax,4c00h
21 h

;Kilps.

al,[si)
si
cl
al, ah
.l_Keres

;Ds:[si) cmen lv karaktert


;sszehasonltja ah rtkveL
;nveli si-t s cskkenti a
;mg htralv karakterek
;szmt. Ha nem egyezett a
;kt karakter, akkor ismtli
;a ciklust mindaddig mg meg
;nem tallja a keresett
;karaktert.

bl,l
dx,dx
al,[di)

;A legkisebb helyirtk.
;Ox nullzsa.
;A di ltal mutatott szmjegyet
;al regiszterhe tlti.

dec

di

;Cskkenti di-t

sub

al,48

;Mivel al-ben nem egy szmjegy


;van, hanem annak ascii kdja,
;ezrt abbl ki kell vonni
;48-at, hogy a szmjegyet

mov
int
mov
.2_Pelda13: mov
mov
inc
add
loop

Keres

Proc

.l_Keres:

mov
inc
dec
cm p
jnz

re t
Keres

End p

Szamito

Proc

mov
xo r
.I_Szamito: mov

66

Az Assembly programozs alapjai


;kapjuk eredmnyl.
mul

bl

add

dx,ax

;Ezt az rtket megszorozzuk


;az aktulis helyirtknek
:megfelel szorzszmmal
;s hozzadjuk dx-hez.

mov
mul
mov

ax,IO
bl
bll,ax

;A kvetkez helyirtket
;gy kapjuk, hogy a jelenlegit
:megszorozzuk 10-el.

loop

.l_Szamito

;Ha van mg szmjegy, ugrs


;vissza.

ret
Szamito

En dp

Peldall

En ds
End Start

Amint arrl a memriakezelsnl mr sz esett, a program


betltse utn a ds s es regiszterekbe nem a program cme,
hanem egy gynevezett PSP szegmenscme kerl. A PSP teljes
lersa megtallhat a fggelkben, itt csak az un. DTA rdekes a
szmunkra, ami a PSP 128. byte-jtl kezddik s hosszt a
legels byte-on trolt rtk mutatja. Ez a terlet azt a clt
szolglja, hogy a DOS parancs utn begpelt paramtereket
eltrolja. A most kvetkez programban a DOS parancs utni els
karakter a 81 h cmen lesz. Ezt kihasznlva cl regiszterbe betltjk
a paramterrsz hosszt s megkeressk az elvlaszt "f' jelet
ami a paramterek kezdett jelzi. Ha ezt megtalltuk, akkor meg
kell keresni az es"," karaktert, s a kt cm kztti karakterekbl
kell egy szmot kszteni. Mivel megkerestk a szm elejt is s a
vgt is. meg tudjuk hatrozni. hogy hny karakterbl ll.
Amennyiben egynl tbb, akkor az egyes helyirtkeket a
megfelel szorzszmmal meg kell szorozni s ezeket sszeadni.
hogy a vals szmrtket kapjuk. Ezt termszetesen meg kell
tenni a msodik szmmal is s ha mr mindkettt ismerjk, ebbl
ki kell szmolni a kirsi cimet. Ezutn a msodik vessz utntl
kezdden ki kell rni a szveget a kiszmolt cmre. A szveg
hosszt a ex rtke mutatja, amit az egyes keresseknl term67

IBM PC Gyakorlati Assembly


szelesen cskkenteni kellett, hogy mindig az aktulis rtket mutassa.
Ilyen mdon rhatunk akr decimlis-hexadecimlis szm
konvertert vagy brmilyen kls paramterrel mkd programot.
Programjainkban nem rt, ha pldul egy hibra nem csak
egy szveggel, hanem egy hangjelzssel is felhvjuk a felhasznl
figyeimt Ugyan a PC beptett hangszrja tlzott zenlgetsre
nem ad lehetsget, azrt egy kis gyessggel egszen szp
hatsok csikarhatk ki belle.
A szmtgpben tallhat egy 8253 jelzs integrlt ramkr, ami hrom 16 bites osztt foglal magba. Az els csatornja a
8259-es megszakts kezelre lett ktve, ami gy msodpercenknt 18.2-szer aktivizldik.
A msodik csatorna a 8237-es DMA vezrlre van ktve. Ezt
mdostani nem clszer, mivel a memriafrisstst is ez vgzi s
ha megvltoztatjuk, elveszhet az sszes adatunk.
A szmunkra most a harmadik csatornja fontos, ami a
beptett hangszrra lett ktve. Teht ha belltunk egy adott
osztsi arnyt s bekapcsoljuk a hangszrt, akkor ott az oszcilltor frekvencia (1.19318 MHz) megfelelen leosztott rtke jelenik meg.
A hangszr bekapcsolst, az osztsi arny belltst stb.
gynevezett portmveletek segtsgvel rhetjk el. Egy po'rtra
val adat rs hasonlt a memriba val rshoz, csak itt nem egy
RAM van a vezetk vgn, hanem egy ramkri egysg, ami
figyeli az adott portcmet, s ha az neki szl, akkor az
adatvezetkrl kiolvassa a kldtt rtket.
gy a 8253-as programozsra a 43h port szolgl. Az ide rt
adat egyes bitjeinek jelentse:
O.bit:
O esetn binris, 1 esetn BCD szmlls.
1-3. bitek: A kvnt zemmd szma.
4-5. bitek: 00- A szmll rtkt regiszterbe rja.

68

Az Assembly programozs alapjai


01 - Az oszt als byte-jnak rsa/olvassa.
10- Az oszt fels byte-jnak rsa/olvassa.
11 - Az oszt als majd fels byte-jnak
rsa/olvassa
6-7. bitek: A kivlasztott csatorna szma (0-2)
A szmll rtkt akkor rdemes regiszterbe mentetni
kiolvass eltt, ha mind az als, fels byte rtkt ki kvnjuk
olvasni gy, hogy azok kzben ne vltozhassanak meg. Ilyenkor a
gp az aktulis rtket egy bels regiszterbe menti, amit azutn
kiolvashatunk. De a szmll yrogra_mc;>z~sa rszletesebben
megtallhat Az IBM PC-k BELSO FELEPITESE cm knyvben
s mg sok msikban. Az egyes csatornk osztsi arnyt a
40h-42h portokon keresztl llthatjuk.
A kvetkez feladatunk a bellts utn, hogy bekapcsoljuk a
hangszrt. Ezt a 8255 tpus 24 bites programozhat 110
kentroller megfelel programozsval tehetjk meg. A PC-ben ez
az ramkr 3 darab 8 bites rszre van bontva, amibl a
msodiknak az als kt bifje befolysolja a hangszrt. A msik 6
a billentyzetet, RAM paritst stb. Ezrt gyelni kell arra, hogy
ezen biteket ne vltoztassuk meg. Ezt gy rhetjk el, hogy rs
eltt kiolvassuk a port rtkt, az als kt bitet AND vagy OR
mvelettel megfelelen belltjuk s ezutn rjuk vissza az rtket.
gy csak a hangszrt vezrl biteket befolysoljuk. A 8255 lersa
szintn megtallhat az emltett knyvben vagy ms szakirodalomban.
Nos ezek utn a program, ami nem tesz mst, mint csippan
egyet kb. 1 kHz-es frekvencival.
[Program 14]
Peldal 4

Segment
assume cs:Pelda14,ds:nothing

Prg_SlSS
Prg_timer
Timer

equ
equ
equ

6lb
43b
4lb

;A 8255 portcme
;A:z oszt programozsnak
;s belltsnak portcme.

69

ffiM PC Gyakorlati Assembly


Start:

mov ai,IOllOllOb
out Prg_timer,al
mov
out
mov
out

u, ll 93
Timer,al
al,ah
Timer,al

;Az osztsi arny belltsa


;kb l OOO Hz-re.

in
or
out

ai,Prg_8l55
ai,OOOOOOllb
Prg_8l55,al

;A hangszr bekapcsolsa

cs,Oflllh
.l_Peldal4

;Offtlh rtk holtciklus


;ami a csippans hosszt
;hatrozza meg.

ai,Prg_8155
al,llllllOOb
Prg_8l55,al
u,4c00h
ll h

;A hangszr kikapcsolsa.

mov
.I_Peldal4: loop

in
and
out
mov
int

Peldal 4

;A Timer2 kijellse osztnak.

;Kilps a DOS-ba.

En ds
End Start

A lista elejn mindjrt egy jdonsg, amit eddig mg nem


hasznltunk, az equ egy cmkvel. Ez nem csinl mst, mint a
magasabb szint nyelvekben a konstans. Teht fordtskor a
program, ha a szvegben az equ eltt ll cmkvel tallkozik
valahol, akkor az equ utn rt szmot fogja oda befordtani. Elnye
csak az ttekinthetsg szempontjbl van, mivel gy mindig
tudjuk, hogy az adott portcm mihez tartozik. Tovbb van kt j
assembly utasts is, az in segtsgvel egy portrl olvashatunk
be egy rtket, az out pedig ennek az ellenkezje, vele egy adatot
kldhetnk a kivlasztott porton keresztl.
A programban semmi klnlegessg nincs ezeken kvl. Els
lpsben felprogramazza az osztt, majd belllja az osztsi
arnYt s bekapcsolja a hangszrt. Ezutn egy holtciklus segtsgvel vr egy kicsit majd kikapcsolja s kilp.

70

Az Assembly programozs alapjai


A memria rezidens programok

mkdse:

A memria rezidens programok annyiban klnbznek az


eddig megismertektl, hogy a programbl val kilpskor nem
trldik ki a memribl, hanem ott marad. Kombinlni szaktk a
dolgot valamelyik int rutin tirnytsvaL Mint arrl mr
felletesen sz esett, az int rutinok cmei egy tblzatban vannak
letrolva. Minden rutinhoz egy szegmens s egy offsetcm, azaz
sszesen 4 byte tartozik. Ha ezt a cimet mi megvltoztatjuk, akkor
nem az adott funkci hajtdik vgre, hanem az a program, aminek
a eimt megadtuk. Ezen mdon tirnythatjuk a sajt programunkra is. Ilyenkor gondoskodni kell arrl, hogy a sajt programunk vgezze el az adott rutin feladatt, vagy pedig a programunk
vgrehajtsa eltt vagy utn indtsa el az eredeti BIOS rutint is.
Egy int hvskor els lpsben a verembe mentdik az llapolregiszter (flag) s a hv program int utni sornak cme a
visszatrs cljbl, majd a tblzatbl kiolvassa a rutin eimt s
egy tvoli ugrssal tadja a vezrlst neki. A BIOS rutin vgn
egy iret utastssal tr vissza a hv programhoz, minek hatsra
visszatltdik a flag is.
A memria rezidens programoknl alapvet szempont a
rvidsg. Ezrt rdemes a programot .com formtumra rni. A
programbl val kilps is egy kicsit msknt trtnik akkor, ha
azt szeretnnk, hogy tovbbra is maradjon a memriban a kd
lnyeges rsze. Ilyenkor meg kell adni a programunk szegmenseimt s az els olyan byte offsetcmt, amire mr nincsen szksgnk, ezutn nem egy int21h hanem egy int27h ROM BIOS hvssal lpnk ki, melynek hatsra a megadott rsz a memriban marad.
A vezrlstadsra gyakran hasznljk az 1ch BIOS rutin
tirnytst, amit a gp msodpercenknt 18.2-szer vgrehajt. Ez
alkalmazhat pldul akkor is, ha azt szeretnnk, hogy a pontos
id mindig ki legyen rva a kperny valamely rszre. Vigyzni
kell azonban, hogy egy int rutinbl egy msik int rutin nem
hvhat, ezrt ha rezidens programot runk s mgis szksg
lenne egy BIOS hvsra akkor vagy megrjuk azt a mveletet, amit
a BIOS rutin vgezne, vagy hasonl mdon hajtjuk vgre, mint az
eredeti rutint, azaz szimullunk egy int hvst, ami abbl ll, hogy
71

ffiM PC Gyakorlati Assembly


egy pushf utastssal elmentjk a fiaget s egy tvoli call
utastssal indtjuk el a kvnt rutint.
A 15. programban egy gyakori problmra adok egy
megoldsi lehetsget, mivel velem is gyakran elfordul az, hogy
figyelem a winchester mkdst visszajelz ledet, hogy tudjam,
l-e mg a rendszer, vagy lefagyott. Egyes vrusok tevkenysgl
is ki lehet szmi gy. A megolds, amit ez a rvidke rutin knl az,
hogy minden lemezmveletnl csippan egy rvidet a gp. Ez egy
kicsit furcsn hat, amikor a gp keres egy programot, s egy raks
tartalomjegyzket vgignz, vagy egyb olyan mveletnl, ahol
egyms utn srn fordul a lemezegysghez, ekkor ugyanis egy
sorozatos csipogst, esetenknt recsegst produkl, de a
programot kedvnkre megvltoztathatjuk, csipogs helyett akr a
kpemyre rhatunk egy jelet vagy kinek mi tetszik.

[Program 15]
PeldalS

Segment
assume cs:PeldalS, ds:PeldalS
org lOOh

;Szegmensdefinci
;Cs,ds hozzrendelse.
;A program kezdcme.

Start:

jmp

Init

;Az installl program


;indtsa.

Drive_lnt

dd

;Az eredeti ROM rutin cmnek


;kihagyott 4 byte-os rsz.

Rutin

Proc Far
assume cs:PeldalS,ds:Nothing

pushf
push u: ex

72

mov
out

al,10110110b
43h,al

mov
out
mov
out

ax,SOO
4lh,al
al,ab
4lb,al

;Tvoli rutin kezdete.


;A rutinban nem hasznlunk
;adatszegmenst.
;A ftag s a programunkban
;hasznlt regiszterek mentse.

;A Timer2 kijellse osztnak.

;Az osztsi arny belltsa

Az Assembly programozs alapjai


in
or
out

al,61h
ai,OOOOOOllb
61h,al

;A hangszr bekapcsolsa

cx,Oft'tb
.l_Pelda15

;Ofilh rtk holtciklus


;ami a csippans hosszt
;hatrozza meg.

in
and
out

al,61h
al,llllllOOb
61h,al

;A hangszr kikapcsolsa.

pop

ex ax

;Az ltalunk hasznlt


;regiszterek eredeti rtknek
;visszatltse

call

Drive_lnt

iret

;Az eredeti BIOS rutin


;indtsa
;Visszatrs a megszaktsbL

Rutin

En dp

;A tvoli rutin vge.

Init:

eli

;Kls megszaktskrsek
;engedlyezsnek tiltsa.

mov
.l_Peldal5: loop

mov
int
mov
mov

ax,3513h
;Az lntlJ rutin eimt
21 h
;ES:BX-be tlti
word ptr [Drive_lnt),bx ;s a Drive_lnt cmre rja.
word ptr [Drive_lnt+l),es

mov
mov
int

ax,2513h
dx,otfset Rutin
21 h

sti
mov
int

Peldal 5

;Az intlJh rutin eimt lltsa


;t a Rutin eimre.

;Megszaktst engedlyezi
dx,offset Init
27h

En ds
End Start

;Az els flsleges byte cme.


;A program befejezse gy.
;hogy maradjon rezidens.
;A szegmens vge
;A program vge

73

IBM PC Gyakorlati Assembly


A programban a 13h rutint csapoltuk meg egy kicsit, amirl
tudni kell, hogy az sszes lemezmvelet vgrehajtsa ezen keresztl hajtdik trtnik. Teht ha a rutin ugrsi eimt ideiglenesen
tirnytjuk a csippan rutinra, akkor minden lemezmvelet vgrehajtsakor elindul az ltalunk rt kd is.
A program egy jmp utastssal kezddik aminek hatsra
tugorja a rezidens csipog rszt, ugy~nis az els feladat az, hogy
a program rezidenss vlsa eltt kiolvassuk az eredeti rutin
ugrsi eimt ahhoz. hogy egy call utastssal el tudjuk majd
indtani azt. Tovbb t kell rnunk azt a cmet a mi rutinunkra.
Vigyzni kell azonban arra, hogy a cm trsa kzben nem
rkezhet semmilyen megszaktskrs a kivlasztott funkcihoz,
mivel ekkor problms dolgok trtnhetnek. A megolds az, hogy
egy eli utastssal letiltjuk a megszaktskrsek elfogadst majd
az trs befejeztvel egy sti segtsgvel engedlyezzk azt.
Ha az trs megtrtnt, cs regiszterben megadjuk a kd
szegmenseimt (azaz ezt mr belltottuk a program elejn) s dx
regiszterben pedig az els olyan byte eimt, ami mr nem
szksges, teht az installl rsz kezdeimt Ezutn a 27h DOS
hvssal gy lpnk ki a programbl, hogy az az elejtl a kijellt
rszig a mamriban marad. Termszetesen ezutn visszatr a
DOS-hoz. Mint lthat, a program aktv rszt nem indtottuk el.
Ennek oka. hogy ezt a gp vgzi el ha valamilyen lemezmveletet
vgznk, ekkor ugyanis meghvsra kerl a 13h rutin, ami.Y'lk
eimt az installl programrsz trta, ennek hatsra a megadott
cmtl elindul a rutin.
A fprogram legfontosabb lpse a hasznlt regiszterek
elmentse, ugyanis a megszakts kezel rutinnak nem szabad
szrevennie, hogy mi bepltnk el. Ezt gy tehetjk meg, hogy
azokat a regisztereket, amiket a hang kiadsa sorn hasznlunk,
eitesszk a verembe s a hang kiadsa utn kiolvasva onnan, a
13h rutin gy fut le, mintha semmi sem trtnt volna eltte. A hang
kiadsa gy trtnik, mint az elz programban. Fontos, hogy a
program elejn elmentjk a fiaget s kt hasznlt regisztert. A
hang kiadsa utn csak a regisztereket olvassuk vissza. Ennek
lnyege, hogy gy csapjuk be a gpet, mivel egy int vgrehajtsakor is elmentdik a flag az ugrs eltt, ami trtnhet egy jmp

74

Az Assembly programozs alapjai


utastssal is, de ekkor az utna kvetkez iret nem szksges
mivel a program egybl a DOS-hoz tr vissza. Formai kvetel
mny, hogy a vgrehajtand rutinnl jellni kell, hogy az egy tvoli
rutin {nem abban a szegmensben fog elhelyezkedni, ahol az
int13h-t hv program). Ezt jellhetjk egy label far cmkvel vagy
ahogyan az a programban is megtrtnt
Assembly utastsok sszefoglalsa:
Az eddig ismertetett pldaprogramokbl elg sok utastst
meg lehetett ismerni, azonban ez mg kornt sem az sszes.
Azrt, hogy ne legyen olyan, ami ebben a knyvben nem szerepel,
a most kvetkez utasts ismertetbe a 8086-os processzor teljes
kszlele bemutatsra kerl s egy-kt 286-os is, malyekhez nem
szksges a vdett md ismerete. Ezen ismertetbe megtallhat
az utastsok lersa, vgrehajtsnak kzelt idtartama illetve
az ltala befolysolt flag bitek.
AAA

"Ascii Adjust after Addition" azaz kt ascii szamJegy


sszeadsa utn az eredmnybl az AAA utasts al ah
regiszterekben kt pakolatlan BCD szmot hoz ltre. Ha
teht pldul mi a "8"-hoz adtuk a "7"-et, akkor az az
sszeads a kvetkezkppen trtnik: 38h+37h=6Fh,
az AAA mvelet vgrehajtsa utn ah regiszterben 1
al-ben pedig 5 lesz. Azaz ax regiszterben az 15
pakolatlan BCD szmot kapjuk.
Mdostott flagek: ef af {a tbbit nem meghatrozhat
mdon befolysolja)
Vgrehajtsi id {rajel ciklus): 4

AAS

"Ascii Adjust after Subtraction" Kt ascii szam]egy


kivonsa utn az eredmnyt az elz utastshoz
hasonlan BCD formtumra hozza.
Mdostott flagek: ef af {a tbbit nem meghatrozhat
mdon befolysolja)
Vgrehajtsi id {rajel ciklus): 4

75

IBM PC Gyakorlati Assembly


AAD

"Ascii Adjust betore Division" azaz BCD szmok


elksztse osztshoz oly mdon, hogy az ah al
regiszterekben lv pakolatlan BCD szm nagyobbik
helyirtkt (ah) megszorozza Oah-val s hozzadja
al-hez. gy a szm hexadecimlis alakjt kaptuk.
Mdostott flagek: sf zf pf
Vgrehajtsi

AAM

id

(rajel ciklus): 60

"Ascii Adjust after Multiplication" az AAD utasts


fordtottja, ez a szorzs utn kapott hexa szmot alaktja
t pakolatlan BCD szmm.
Mdostott flagek: sf zf pf
Vgrehajtsi id (rajel ciklus): 80

DAA

"Decimal Adjust after Addition" Kt BCD szm


sszeadsa sorn is elfordulhat, hogy az eredmny
nem felel meg a valsgnak, mivel a szmtgp a kt
szmot nem BCD hanem hexa szmnak kezeli, gy
pldul a 28h s a 39h szmok sszeadsa sorn a
kapott eredmny 61 h. Ha ezutn vgrehajtjuk a DAA
mveletet, akkor a gp kiigaztja ezt s 67h-t csinl
belle.

Mdostott flagek: sf zf af pf ef
Vgrehajtsi
DAS

id

(rajel ciklus): 4

"Decimal Adjust after Subtraction" kt BCD szm


kivonsa utn az eredmnyt BCD alakra igaztja mint a
DAA.
Mdostott flagek: sf zf af pf ef
Vgrehajtsi id (rajel ciklus): 4

76

DEC

Az Assembly programozs alapjai


"Decrement" operandus rtknek cskkentse eggyel.
Mdostott flagek: of sf zf af pf
Vgrehajtsi

INC

id

(rajel ciklus): 2-13

"lncrement" operandus rtknek nvelse eggyel.


Mdostott flagek: of sf zf af pf
Vgrehajtsi

ADD

id

(rajel ciklus): 2-23

"Addition" a msodik operandus rtkt az


adja.

elshz

Mdostott flagek: of sf zf af pf ef
Vgrehajtsi
SUB

id

(rajel ciklus): 3-25

"Subtraction" a msodik operandus rtkt kivonja az


elsbL
Mdostott flagek: of sf zf af pf ef
Vgrehajtsi id (rajel ciklus): 3-37

ADC

"Add with Carry" az els operandushoz hozzadja a


msodikat s a carry flag tarta Imt.
Mdostott flagek: of sf zf af pf ef
Vgrehajtsi id (rajel ciklus): 3-25

SBB

"Subtraction with Borrow" op1 rtkbl kivonja op2


rtkt s a carry bit tartalmt
Mdostott flagek: of sf zf af pf ef
Vgrehajtsi id (rajel ciklus): 3-37

77

IBM PC Gyakorlati Assembly


DIV

"unsigned Division" eljel nlkli oszts. 8 bites mvelet


eseln az osztand szmot ax regiszter tartalmazza az
osztt pedig bl s az eredmnyt al-be a maradkot
pedig ah-ba kapjuk, 16 bites mvelet eseln az
osztandt dx:ax tartalmazza az osztt pedig a bx
regiszter, az eredmnyt az ax, a maradkot pedig dx
regiszterben kapjuk.
Mdostott flagek: nem meghatrozott.
Vgrehajtsi

MUL

id

(rajel ciklus}: 0-162

"unsigned Multiplication" eljel nlkli szorzs,


hasonlan az osztshoz 8 bites szm eseln a szorzt
bl a szorzandt al tartalmazza, az eredmnyt ax
regiszterben kapjuk.
Mdostott flagek: of ef
Vgrehajtsi

IDIV

id

(rajel ciklus}: 70-143

"integer signed Division" eljeles oszts azonosan az


eljel nlklihez, de az eljelek figyelembevtelvel.
(az eljelet az adat legmagasabb rtk bitje jelzi}
Mdostott flagek: nem meghatrozott.
Vgrehajtsi

IMUL

id

(rajel ciklus}: 101-194

"integer signed multiplication" eljeles szorzs mint az


eljel nlkli, csak az eljelek figyelembevtelvel.
Mdostott flagek: of ef
Vgrehajtsi

MOV

78

id

(rajel ciklus}: 80-164

"Move" adatmozgats, a msodik operandus tartalmt


az elsbe rja. Rszletesebb ismertetse megtallhat a
knyvben.

Az Assembly programozs alapjai


Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

id

(rajel ciklus): 2-26

MOVS
MOVSB
MOVSW "Move String Byte/Word" 05:51 ltal cmzett byte-ot
illetve wordt E5:DI cmre ~a majd Diraction flag
rtktl fggen nveli (d=O) illetve cskkenti (d=1) di
s si regisztereket byte-os mveletnl eggyel
wordsnl pedig kettvel.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 9+17 (25)/rep
STOS
STOS B
STOSW "Store String Byte/Word" al illetve ax tartalmt E5:DI
cmre rja, majd d flagtl fggen nveli illetve
cskkenti di rtkt
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 9+10 (14)/rep
LODS
LODSB
LODSW "LOaD String Byte/Word 05:51 ltal cmzett byte vagy
word tartalmt al illetve ah regiszterbe tlti s az si
rtkt a d flagtl fggen vltoztatja.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 9+13 (17)/rep
LEA

"Load Effectiv Addres" a kijellt cl operandusba tlti a


forrsoperandus offsetcmt, mkdse megegyezik a
MOV reg, offset cm utastssal.

79

IBM PC Gyakorlati Assembly


Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi
LDS

id

(rajel ciklus): 8-14

"Load pointer using DS" egy ngy byte-os memona


operandus els s msodi byte-ja kerl a megadott
regiszterbe, 3. s 4. byte-ja pedig a ds regiszterbe.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

LES

id

(rajel ciklus): 30-36

"Load pointer usign ES" egy ngy byte-os memona


operandus els s msodi byte-ja kerl a megadott
regiszterbe, 3. s 4. byte-ja pedig az es regiszterbe.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

XLAT

id

(rajel ciklus): 30-36

"trans(X)LATe byte" a bx+al cmen lv adatot tlti al


regiszterbe. Segtsgvel knnyedn olvashatunk ki
egy maximum 256 byte hossz tblzatbl egy adatot
mivel csak annyit kell tenni, hogy bx regiszterbe
belltjuk a tblzat kezdcmt, majd al-be a kiolvasand elem sorszmt s az utasts vgrehajtsa utn a
kivlasztott elem rtke al-ben lesz.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

XCHG

id

(rajel ciklus): 11

"eXCHanGe" megcserli a forrs s a cloperandus


rtkt.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 3-37

80

Az Assembly programozs alapjai


LAHF

"Load AH from Flags" a flag regisztert az ah regiszterbe


msolja.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

SAHF

id

(rajel ciklus): 4

"Store AH in Flags" ah regiszter rtkt a flag


regiszterbe msolja.
Mdostott flagek: zf sf af pf ef
Vgrehajtsi

CBW

id

(rajel ciklus): 4

"Convert BYte into Word" az ah regisztert feltlti az al


regiszter fels bitjvel. Ez a mvelet fknt eljeles
mveletek vgzsnl hasznlatos.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 2

CWD

"Convert Word to Doubleword" hasonlan az elzhz,


de itt egy wordt alakt dupla wordd DX:AX-be.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 5

CMP

"CoMPare integers" kt operandus sszehasonltsa


egy
ltszlagosan
elvgzett
kivonsi
eljrs
segitsgvel s a flag regiszter egyes bitjeit ennek
megfelelen lltja be.
Mdostott flagek: of sf zf af pf ef
Vgrehajtsi id (rajel ciklus): 3-14

81

IBM PC Gyakorlati Assembly


CMPS
CMPSB
CMPSW "CoMPare String Byte/Word" DS:SI s ES:DI ltal mutatott memria rekesz tartalmnak sszehasonltsa majd
si s di regisztereket d flagtl fggen nveli vagy
cskkenti.
Mdostott flagek: ef af pf of sf zf
Vgrehajtsi

id

(rajel ciklus): 9+22 (30)/rep

SCAS
SCASB
SCASW "SCAn String Byte/Word" al illetve ax tartalmt sszehasonltja ES:DI ltal mutatott memriarekesz tartalmval s a jelzbiteket ennek megfelelen lltja be. Az
utasts segtsgvel knnyen megtallhat egy adat
elfordulsi helye.
Mdostott flagek: of zf ef pf sf af
Vgrehajtsi
TEST

id

(rajel ciklus): 9+15 (19)/rep

"TEST" hatsa azonos az AND mvelettel, de a regiszterek rtkt nem vltoztatja meg, csak a flaget.
Mdostott flagek: of ef sf zf pf
Vgrehajtsi

CLC

id

(rajel ciklus): 3-25

"C Lear Carry flag" az tviteli jelzbitet nullra lltja.


Mdostott flagek: ef
Vgrehajtsi

STC

id

(rajel ciklus): 2

"SeT Carry flag" az tviteli jelzbitet 1-be lltja.


Mdostott flagek: ef
Vgrehajtsi

82

id

(rajel ciklus): 2

Az Assembly programozs alapjai


CMC

"CoMplement Carry" komplementlja a carry flaget.


Mdostott flagek: ef
Vgrehajtsi

CLD

id

(rajel ciklus): 2

"C Lear Direction flag" az

irnyjelz

fiaget nullra lltja.

Mdostott flagek: df
Vgrehajtsi
STD

id

(rajel ciklus): 2

"SeT Direction flag" az

irnyjelz

flag 1-be lltsa.

Mdostott flagek: df
Vgrehajtsi
Cll

id

(rajel ciklus): 2

"Clear lnterrupt flag" a hardware megszaktskrsek


fogadsnak tiltasa (kivtel az NMI).
Mdostott flagek: if
Vgrehajtsi id (rajel ciklus): 2

STI

"SeT
lnterrupt
engedlyezse.

flag"

hardware

megszaktsok

Mdostott flagek: if
Vgrehajtsi
IN

id

(rajel ciklus): 2

"INput from i/o port" adott porton lv adat beolvassa.


Az olvass trtnhet al vagy ax regiszterbe, tovbb 8
illetve 16 bites portcmrL Utbbi eseln a cmet dx
regiszterbe kell tlteni. Egybknt szmmal kirhat.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 8-14
83

IBM PC Gyakorlati Assembly


INS
INSB
INSW

"INput String Byte/Word from i/o port" byte vagy word


beolvassa dx ltal mutatott portrl ES:DI cmre, majd
nveli vagy cskkenti di rtkt d flagtl fggen.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

OUT

id

(rajel ciklus): 9+ 14(17)/rep

"OUTput to ilo port'' hasonlan mint az IN utastsnl, csak


itt nem adat beolvassa trtnik a portrl, hanem egy al
vagy ax llata tartalmazott adat kldse a kijellt portra.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

id

(rajel ciklus): 8-14.

OUTS
OUTSB
OUTSW "OUTput String Byte-Word to i/o port" DS:SI ltal cmzett adat kldse a kijellt porton keresztl, majd si regiszter nvelse vagy cskkentse.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi
PUSH

id

(rajel ciklus): 9+14 (17)/rep

"PUSH" cskkenti sp rtkt kettvel s a kivlasztott


16 bites regisztert a verem tetejre rja (sp mindig az
utoljra bert adatra mutat).
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

PUSHF

id

(rajel ciklus): 15-36

"PUSH Flag" a flag regiszter tartalmt rja a stackre.


Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 14

84

Az Assembly programozs alapjai


POP

"POP" kiolvassa az sp ltal mutatott rtket s a


kivlasztott regiszterbe tlti, majd nveli sp rtkt
kettvel.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

POPF

id

(rajel ciklus): 12-37

"POP Flag" a veremrl leemelt rtket a flag regiszterbe


tlti majd nveli sp rtkt kettvel.
Mdostott flagek: of df if tf sf zf af pf ef

JMP

Vgrehajtsi id (rajel ciklus): 12


"JuMP" felttel nlkli vezrlstads a megadott cmre
(kzeli -near illetve tvoli -far).
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 11-24

JA

"Jump if Above" ugrs, ha

eljel

nlkl nagyobb.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi id (rajel ciklus): 4-16
JNA

"Jump if Not Above" ugrs, ha eljel nlkl kisebb vagy


egyenl.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi id (rajel ciklus): 4-16
JNC

"Jump if No Carry" ugrik, ha eljel nlkl nagyobb vagy


egyenl.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi id (rajel ciklus): 4-16

85

IBM PC Gyakorlati Assembly


JC

"Jump if Carry" Ugrik ha

eljel

nlkl kisebb.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi
JZ

id

(rajel ciklus): 4-16

"Jump if Zero" ugrs ha egyenl.


Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

JNZ

id

(rajel ciklus): 4-16

"Jump if Not Zero" ugrik ha nem

egyenl.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi
JG

id

(rajel ciklus): 4-16

"Jump if Greater" ugrik. ha

eljelesen

nagyobb.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi
JNG

id

(rajel ciklus): 4-16

"Jump if Not Greater" ugrik, ha

eljelesen

kisebb vagy

egyenl.

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi
JGE

id

(rajel ciklus): 4-16

"Jump if Greater or Equal" ugrik, ha


vagy egyenl.

eljelesen

nagyobb

Mdostott flagek: nem befolysolja a flagek llsat


Vgrehajtsi

86

id

(rajel ciklus): 4-16

Az Assembly programozs alapjai


JNGE

"Jump if Not Greater or Equal" ugrik, ha


kisebb.

eljelesen

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi
LOOP

id

(rajel ciklus): 4-16

"LOOP" cskkenti ex rtkt s ha mg nem rte el a


nullt, ugrik a megadott cmre. Segtsgvel ex hosszsg ciklust szervezhetnk.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

LOOPZ

id

(rajel ciklus): 5-17

"LOOP while Zero" a ciklus addg tart, mg ex el nem ri


a nullt, vagy a z bit nullra nem vlt. (z=O eseln kilp
a ciklusbl)
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 6-18

LOOPNZ "LOOP while Not Zero" az elz utasts ellentte, a


ciklus addig tart, mg z=O s ex nem O egybknt vge.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 6-18
REP

"REPeat string prefix" a karakterlnc mveletek


ismtlse amg ex nem nulla. Tovbb cskkenti ex
rtk t.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 2

87

IBM PC Gyakorlati Assembly


REPZ
REPNZ

"REPeat string prefix while Zero/Not Zero" a kiegszts


hatsa azonos a LOOP utastsnl emltettekkel.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

CALL

id

{rajel ciklus): 2

"CALL" szubrutin hvsa gy, hogy ip jelenlegi rtkt a


verembe menti {rvid ugrsnl) illetve tvoli ugrsnl a
cs szegmensregiszter rtkt is menti.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

INT

id

{rajel ciklus): 16-57

"softwarte INTerrupt" software megszaktsi eljrs


indtsa.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

INTO

id

{rajel ciklus): 51-52

"INTerrupt if Overflow" megszaktsi rutin indtsa ha az


overflow flag rtke 1.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

RET
RETF

id

{rajel ciklus): 53-54

"nearlfar RETurn from subrotine" kiolvassa a verembl


a rutin elzleg elmentett visszatrsi eimt s berjk a
megfelel regiszterekbe, ezzel tadjk a vezrlst a
rutint hv utasts utni sorra.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

88

id

{rajel ciklus): 20-32

Az Assembly programozs alapjai


IRET

"lnterrupt RETurn" visszatrs megszaktsi rutinbl.


Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

NOT

"Not"

id

logikai

(rajel ciklus): 32

nem mvelet.
lltja.

az

operandus

bitjeit

ellenkez rtkre

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi
NEG

id

(rajel ciklus): 3-24

"Negate" az operandus kettes komplemenst kpzi azaz


invertlja az op. bitjeit s hozzad egyet.
Mdostott flagek: of sf zf af ef pf
Vgrehajtsi

AND

id

"AND" logikai s

(rajel ciklus): 3-24


mvelet.

eredmnyei:

00
01
1o
11

o
o
o

00
o1
1o
11

Mdostott flagek: of sf zf pf ef
Vgrehajtsi
OR

id

(rajel ciklus): 3-25

"OR" logikai vagy mvelet. eredmnyei:

1
1

Mdostott flagek: of sf zf pf ef
Vgrehajtsi

id

(rajel ciklus): 3-27


89

IBM PC Gyakorlati Assembly


XOR

"eXclusive OR" logikai kizr vagy:

00
o1
1o
11

o
1
1

Mdostott flagek: of sf zf pf ef
Vgrehajtsi
ROL

id

(rajel ciklus}: 3-37

"ROtate Left" operandus forgatsa balra, a kifordul bit


az adat msik szlre s a c fiagbe rdik.
Mdostott flagek: ef of
Vgrehajtsi

ROR

id

(rajel ciklus}: 2-36

"ROtate Right" az elz mvelet


forgats jobbra trtnik.

ellenkezje.

itt a

Mdostott flagek: ef of
Vgrehajtsi id (rajel ciklus): 2-36
RCL
RCR

"Rotate through Carry Left/Right" az adat forgatsa


jobbra vagy balra a carry biten keresztl. A kicsordul
bit c-be kerl s az operandus msik szelre innen
fordul be.
Mdostott flagek: of ef
Vgrehajtsi id (rajel ciklus}: 2-36

SHL
SHR

"SHift Left/Right" az adat balra illetve jobbra tolsa gy,


hogy a msik oldalrl befordul bit rtke O.
Termszetesen a kicsordul bit itt is a carry-be kerl.
Mdostott flagek: ef zf of pf sf
Vgrehajtsi

90

id

(rajel ciklus}: 2-36

Az Assembly programozs alapjai


SAL

"Shift Aritmetic Left"


utastsvaL

mkdse

megegyezik az SHL

Mdostott flagek: ef zf of pf sf
Vgrehajtsi
SAR

id

(rajel ciklus): 2-36

"Shift Aritmetical Right" az adatot jobbra tolja s bal oldalra a signum bit rtke rdik.
Mdostott flagek: ef zf of pf sf
Vgrehajtsi

HLT

id

(rajel ciklus): 2-36

"Halt" lelltja a processzor mkdst, innen csak egy


reset vagy egy hardware nterrupt billentheti ki. Az utbbi esetben a program a megszakts lekezelse utn a
HLT utastst kvet sortl folytatdik.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

LOCK

id

(rajel ciklus): 2

"LOCK" egy tetszleges utasts eltt hasznlva a mvelet


vgrehajtsnak idejre lezrja a processzor buszait Ez
fknt tbbprocesszoros rendszereknl hasznlatos, amikor nem kvnatos, hogy egy mvelet vgrehajtsnak
ideje alatt a processzor ms (kls) utastst is fogadjon.
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi id (rajel ciklus): 2

W AIT

"WAIT" a processzort vrakoz llsba helyezi, mg a


TEST kivezetsen alacsony szintet nem kap. Ezt akkor
szektk alkalmazni. amikor a gpben eltr sebessg
rszegysgek tallhatk illetve fontos szerepe van a
matematikai processzorok kezelsnL
Mdostott flagek: nem befolysolja a flagek llst.
Vgrehajtsi

id

(rajel ciklus): 3
91

IBM PC Gyakorlati Assembly


NOP

"No OPeration" nincs mveletvgzs,


pontos idztsre hasznljk stb.

fknt

ciklusok

Mdostott flagek: nem befolysolja a flagek llst.


Vgrehajtsi

92

id

(rajel ciklus): 3

GRAFIKA
Az IBM PC prograrnak manapsg egyre ritkbban
hasznlnak szveges zemmdot. helyette inkbb kis grafikus
brkkal. ikonokkal segtik a program hasznlatt s teszik
eszttikusabb Ezek programozshoz ismerni kell a grafikus
kperny kezelst, s egyb grafikus eljrsokat. Ebben a
fejezetben errl lesz sz.
A PC-k grafikai kpessge alapveten hardware fgg. Ezt
grafikus
krtya
van
a
meghatrozza,
hogy milyen
szmtgpben no s persze. hogy milyen a monitor. Ezek i!
krtyk elg sok paramterben klnbznek egymstl. ezek
kzl a fontosabbak: felbonts, sznmegjelent kpessg,
memria s egyb hardware programozsi paramterek. A
legegyszerbb ami
mg hasznlatos, azaz gynevezett
HERCULES tpus, melynek felbontsa 720*348 kppont. A
manitor szne ltalban borostyn vagy zld szakott lenni.
Tulajdonsgaira kln nem trnk ki. A knyvben rszletesen
trgyalt manitor krtya tpusok a CGA. EGA, VGA, SVGA.

GRAFIKUS ZEMMDOK PROGRAMOZSA


A grafikus krtyk programozsa tbb lpsbl ll s tbb
mdszerrel is elvgezhet. Az egyszerbb megolds a ROM
BIOS ltal biztostott lehetsgek kihasznlsa. A nehezebbik,
de a gyorsabb s hatkonyabb, a direkt programozs portokon
keresztl OUT utastssal.
Valamilyen alakzat vagy pont kiraksa gy trtnik, hogy a
memriaterletekre a megfelel adatot rjuk. Hogy
hova s mit, az a kperny-memria helytl s felptstl is
fgg.
megfelel

A CGA ZEMMD
A legelszr ismertetsre kerl krtya a CGA melynek.
grafikus felbontsa 320*200 kppont egyszerre maximum ngy
93

IBM PC Gyakorlati Assembly


sznnel, amit 16 szn kzl lehet kivlasztani. Illetve van a krtynak egy nagyobb felbonts zemmdja is a 640*200 kppont de itt csak egy httr illetve egy eltr sznt hasznlhatunk.
A krtya sajtossga, hogy a kpernyt kt egyforma rszre
bontja. Az els felben a pros sorok, a msodikban a pratlan
sorok tartalmt trolja.

A kperny-memria szegmenscme OBBOOh. Az egyes lapok hossza knnyen kiszmolhat, mivel 4 fle szn kivlasztshoz legalbb 2 bit szksges, igy 1 byte-on 4 kppontot trolhatunk. Egy lapon 320*1 00 kppont van, aminek memriaignye
32000/4 Byte azaz 8000. Mivel a 16000 a szmtstechnikban
nem egy kerek szm, ezrt a 16384-hez fennmarad 384-et kt
egyenl rszre osztottk, igy a pros sorok OBBOO:OOOOh cmen,
a pratlanok pedig a OB800:2000h cmen kezddnek. Mndez
640*200-as felbontsnl annyiban vltozik, hogy egy kppontot
nem 2 hanem 1 bit hatroz meg, de mivel vzszintesen ktszerese a felbonts, ezrt semmi ms nem trtnik.
Sajnos a sznkioszts elre meghatrozott, 2 fix paletta
kzllehet vlasztani.

Az

els

paletta sznei:

O- Httrszn 1 -Zld 2- Piros 3- Srga/Barna

A msodik kioszts:
O- Httrszn 1 -Trkiz 2- Lila 3- Fehr/Szrke
A 16 szn gy alakul ki. hogy egy gynevezett intenzits
belltsra is sor kerl ( gy lesz a barnbl srga s a
szrkbl fehr).

[Proqram 16]
C!!& l

segment
ass u me cs:cga l,ds:cga t

;Szegmensdefinici.
;A cs illetve ds regiszterek
;bellitasa.

Grafika programozsa Assembly nyelven


start:

mov
mov

u..cgal
ds,ax

;Ds belltsa a szegmens elejre.

mov
mov

ax,Ob800h

es,ax

;A CGA kperny memri;jnak kezdcimt es


;szegmensregiszterbe tlti.

mov
int

ax,4
l Oh

;A lOb BIOS rutin segitsgvel


;belltja a 320*200/4-es
;grafikus iizemmdot.
;ab=G jelenti, hogy a kper;ny zemmdot akllljuk
;lltani s al=4 jelenti a
;CGAmdot.

mov
mov
mov
int

ab,Obb
bb, l
bl,l
l Oh

;Szintn a l Ob rutin
;segitsgvel, de most annak
;a Obb funkcijval belltjuk,
;hogy az l-es palettakiosztst
;hasznlja. bb=l jelenti,
;hogy palettallts
;kvetkezik, bi-be pedig a
;paletta sorszmt kell rni
;(Ovagy 1).

mov
mov
mov
mov
mov
mov

ai,OIOIOIOib
es:)O),al
ai,IOIOIOIOb
es:)l),al
al,llllllllb
es:)l),al

xo r
int

8ll,8ll

mov
mov
mov
int
xo r
int

ah,Obh
bh, l
bi,O
l Oh

mov
mov
mov
int

;A kperny bal fels sarkba


;runk egyms mell nyolc l-es,
;2-es s 3-as sznkdot,
; igy mindhrom palettaszn
; s a httrszn is ltszani fog.

;Billentyvrs

16

8ll,3ll

; A O. paletta belltsa.

;jabb billenty vrs.

16

ah,Obh
bh.O
b l, l
!Oh

;Ha bh-ba O van s gy


:hjuk meg a Obh funkcii,
;akkor a bl regiszterben a
:httr szint lehet megadm.
;Jelen esetben l azaz stetkk.

95

IBM PC Gyakorlati Assembly

cgal

xo r
int

ax,ax
16

;Billentyvrs.

mov
mov
mov
int

ah,Obh
bh,O
bl,l+l6
lOb

;A httrszn 4. bitje az eltr


;szn intenztsa. Itt ezt
;lltja aktv llapotba (igy
;lesz a barnbl srga s a
;szrkbl fehr).

xo r
int

8li,8X
16

;Billentyvrs.

mov
int

ax,J
lOb

;80*25 karakteres szveges


;md visszalltsa.

mov
int

8li,4C00h
21 h

;A 4ch DOS funkci hvsa


;(visszatrs a DOS-hoz).

en ds
end

start

;Szegmens vge.
;Program vge.

A program indtskor alaprtkeknek megfelel httrszn


mellett kirak a bal fels sarokba egyms mell egy kk, egy lila
egy fehr vonalat, s vr egy billenty lenyomsra. Ezutn tltja a palettt, gy a sznek zldre, pirosra, srgra vltoznak.
jabb billentynyoms utn a sznek sttre vltanak, s a httr kk szn lesz. Utols lpsben ismt nagyobb intenzitssal
jelennek meg a vonalak, majd visszatr a DOS-hoz.
Egy grafikus pont megjelentshez az els lps, hogy
meghatrozzuk a helyt s sznt. Erre lthatunk pldt a kvetkez programban.
[Program 17]
cga2

segment
assume cs:cga2,ds:cga2

;Szegmimsdefinci.
;A cs, ds regiszterek
;belltsa.

start:

mov
mov

;A ds regiszter belltsa
;a szegmens elejre.

96

&ll,cga2
ds,ax

Grafika programozsa Assembly nyelven

.l_cga2:

mov
mov

ax.Ob800h
es.ax

;A videomemria kezdeimt
;az es szegmensregiszterbe
;tlti.

xo r

di,di

;lndexregisztert nullzza.

mov
int

ax,4
l Oh

;A 320*200-as grafikus
;felbonts belltsa.

mov
mov
mov
int

ah,Obh
bh,l
bl,byte ptr [PALETTAJ
lOh

;A paletta cmke alatt trolt


;szm palettt vlasztja ki.

mov
mov
mov
mov
mov
shl
add
int

ah,Obh
;A httr cmknl lv sznt
bh,O
;lltja be paprsznnek.
bl,byte ptr [HATTERJ
dl,byte ptr [FENYESSEGJ
cl,4
;Az intenzts a httrszn 4. btje
dl,cl
;ezrt azt 4 bittel balra
bl,dl
;kell lptetn, hogy utna
l Oh
;hozz lehessen adni a sznkdhoz.

mov
test
jz
mov

bl,byte ptr [KOORD_YI


b l, l
.l_cga2
di,2000h

;A bl regiszterbe tlti a fggleges


;koordintt s megnzi, hogy
;pros illetve pratlan sorrl van-e
;sz s ennek megfelelen

shr
mov
mul
add

bl,l
ax.SO
bl
di,ax

;belltja a

mov
mov
and
shl
shr
shr
add

bx,word ptr (KOORD_XI ;A vzszintes koordinta elllt;snl figyelembe kell venni,


cl,bl
cl,OOOOOO ll b
;hogy egy byte 4 pont adatait
cl, l
;hordozza. Ezrt a cmkiszmitsbx,l
;nl ez az als 2 bit nem kell.
bx,l
;Annak a 2 bitnek a pontkiraksnl
di,bx
;van szerepe. ugyanis az hatrozza
;meg a pont helyt a byte-ban
;cl forgatsra azrt van sziiksg,
;mert egy kppont 2 bit helyet
;foglal.

;Innentl

megfelel kezdcimet

mr csak fl kppel

;kell szmolni, ezrt osztja 2-vel.


;s mivel 320 pont 80 byte-on fr
;el. megszorozzuk 80-nal, s ezt
;adjuk a di-hez.

97

IBM PC Gyakorlati Assembly


mov
ro r

al,byte ptr [SZIN]


al, l

;Mivel egy byte-ban a bal szls


;2 bit, tanalmazza a kisebb

ro r
ro r
mov

al, l
al,cl
es:[di),al

;pontot, ezrt a sznbyte als 2


;bitjt fellre forgatjuk, ezutn
;cl-ben kiszmolt rtkkel jobbra
;toljuk s kirjuk a mr kiszmolt
;memria cmre.

xo r
int

ax,ax
l 6h

;Billentyvrs.

mov
int

ax,J
l Oh

;80*25 soros karakteres md


;visszalltsa.

mov
n t

ax,4c00h
21 h

;Visszatrs a DOS-hoz.

160
100
3

;Vzszintes koordinta (0-319)


;Fggleges koord. (0-199)
;Szinkd (0-3)
;Palettakd (0,1)
;Httrszn (0-7)
;Intenzits (0,!)

sorszm

KOORD_X: dw
KOORD_Y: db
SZIN:
db
PALETTA: db
HATT ER: db
FENYESSEG:db
cga2

o
o

en ds
end start

;Szegmensvg
;Programvg

Brmilyen kppel, brval is dolgozunk, az mindig klnbz szn pontokbl tevdik ssze. Ahhoz, hogy a kvnt kpet
lssuk. minden pontnak a helyn kell lennie. Egy egyedlll
pont kiraksramutat pldt a 17. program. Itt be lehet lltani a
pont koordintit s a sznt.
A kpernyn val tjkozdsnl segtsget nyjt egy
kpzeletbeli koordinta rendszer. melynek [0;0) pontja a bal fels sarok. A memriban egy sor trolsa linerisan trtnik. teht kpernyn egyms mellett lv pontok a memriban egyms utn helyezkednek el. A pros s pratlan sorokat a CGA
zemmdban kln troljk. A kperny-memria kezdeimn
helyezkedik el a O. sor O. byte-ja. A O. sor jobb szls pontja
utn a 2. sor els pontja tallhat s gy tovbb. Az 1. sor a kezdcm+2000h cmtl kezddik s a sor utols pontjt a 3. sor el-

98

Grafika programozsa Assembly nyelven


s pontja kveti. A kppont cmnek kiszmtsakor az els lps meghatrozni, hogy a pont pros vagy pratlan sorban
van-e. Ezt el lehet vgezni egy 2-vel val osztssal Oobbra lptetssel) s ha a c flag 1, akkor a sor pratlan, a kezdcm
OB800:2000h. A tovbbiakban a kperny felvel kell csak szmolni. Ezt meg lehet oldani gy, hogy a fggleges koordintt
osztjuk 2-vel, vagy a sor hosszt vesszk 160 pontra. Az eredmny ugyan az, de az els mdszer annyiban egyszerbb, hogy
a fggleges osztis mir egyszer megtrtnt amikor meghatroztuk, hogy a sor pros-e vagy pratlan s ennek az eredmnyt szorozzuk meg 80-nal, mivel en(lyi byte szksges egy
kpsor trolshoz. Ehhez mg hozz kell adni a vzszintes
koordinlnak megfelel rtket. A pont vzszintes pozcijt
osztjuk nggyel s ezt adjuk az elbb kiszmolt rtkhez. Az
osztsnl kapott maradk hatrozza meg, hogy a byte-on bell
hnyadik pontot kell kitenni.
Egy grafika viszont ltalban nem egy pontbl ll, hanem
sokbL Ennek kiraksa mr egy kicsit lass lenne, ha minden
pontnak kln meg kne adni a koordintjt. Helyette azt szaktk csinlni, hogy egy tglalap alak befoglal formba helyezik
az alakzatot, s annak minden pontjt eltroljk. gy egy kicsit
tbb pont kerl ugyan trolsra, de nem kell megadni a pontok
koordintjt. csak az alakzat szlessgt s magassgt.
Ezekbl a paramterekbl a kirak program automatikusan kiszmolja a pontok helyt. Ilyen elven vannak trolva az
gynevezett ikonok. sprite-ok, brush-ok. A kvetkez pldban
egy klasszikus esetrl lesz sz, mgpedig az egrkurzor kiraksrl s mozgatsrl. Els lpsben csak egy alakzatot fogunk
kitenni a kpernyre. Ez az alapja az egrkezelsnek. Ha mr
van egy program, ami egy adott koordinlra ki tud rakni egy
valamekkora alakzatot. akkor mr csak egy lps a mozgats.
Bonyoltja a dolgot, hogy ha kirakunk egy brt, az alatta lv
kpet el kell trolni, hogy a ksbbiekben vissza tudjuk rakni. ha
az egr mr mshol van. A megolds, hogy az egr kiraksa
eltt eitraijuk az alatta lv kpet. s amikor elmozdtjuk az
brt, az alakzat trlsa helyett ezt a kpet rakjuk vissza.

99

IBM PC Gyakorlati Assembly


[Program 18]
;Szegmensdefinci.
;A cs. ds regiszterek
;belltsa.

cga3

segment
assume cs:cga3,ds:cga3

start:

mov
mov

ax,cga3
ds,ax

;A ds regiszter belltsa
;a szegmens elejre.

mov
mov

ax,Ob800h

es,ax

:A videomeria kezdeimt
:az es szegmensregiszterbe
;tlti.

xo r

di,di

:lndexregiszter trlse.

mov
int

ax,4
l Oh

;A 320*200-as grafikus
;felbonts belltsa.

mov
mov
mov
int

ah,Obh
bh, l
bl,byte ptr [PALETTA]
l Oh

,A paletta cmke alatt trolt


;szm palettt vlasztja ki.

mov
mov
mov
mov
mov
shl
add
int

ah,Obh
:A httr cmknl lv sznt
bh,O
:lltja be paprsznnek.
bl,byte ptr (HATTER]
dl,byte ptr (FENYESSEG]
cl,4
:Intenzits belltsa.
dl,cl
bl,dl
l Oh

mov
test
jz
mov

bl,byte ptr (KOORD_Y] ;Az ikon bal fels pontjnak


b l, l
;kiszmtsa.
.l_cga3
di,lOOOh

shr
mov
mul
add
mov
mov
and
shl
shr

b l, l
ax,80
bl
di,ax
bx,word ptr (KOORD_X]
cl, b l
cl, ll b
cl, l
bx,l

.l_cga3:

100

Grafika programozsa Assembly nyelven

.2_cga3:

.3_cga3:

.4_cga3:
bit

shr
add
mov
mov
shr
shr

bx,l
d i,b x
dl,lOOOOOOOb
dh,Olllllllb
dl,cl
dh,cl

mov

si,offset [IKONJ

mov

cx,8

;Belltmaszk.
;Trlmaszk.
;A byte-on belli bitcm
;belltsa.
;Az ikon tblzatcimt si-be
;rakja.
;Az bra 8 kpsor magas.

push di dx ex

;A regiszterek elmentse a
;ksbbi felhasznls
;cljbl.

mov

ex, l 6

;8*2 bit szles az ikon.

mov

ax,[si)

;Ax regiszterhe tlt egy


;sort az alakzatbl.

push
shl
je
and
jmp.

ex
ax,l
es:[di),dh
.s_cga3

;Ax balra lptetsvel


;megvizsgljuk, hogy kirakni
;kell-e a pontot, vagy trlni.
;Az AND mvelet hatsra mivel

or

es:[di),dl

;a dh regiszter l bitje O ezrt az a

.4~cga3

;trldik. Az OR mveletnl a dl
;regiszter l bitje segitsgvel
; l-be lltjuk es: [d i) cmen
; lv byte egyik bitjt

.s_cga3:

.6_cga3:

ro r
ro r
j ne
inc

dh, l
dl, l
.6_cga3
di

pop
loop
pop

ex
.3_cga3
ex dx di

;A soronkvetkez bit figyelse.


;A ROR utastsnl a kicssz
;bit c fiagbe kerl. Ha dl
;forgatsakor c flag l-be ll,
;az azt jelenti, hogy dl s dh
;krbefordult. Ilyenkor di-t
;nvelni kell eggyel .

101

IBM PC Gyakorlati Assembly


cm p
j ne
add
jmp

di,2000h
.7_cga3
di,2000h
.8_cga3

;A program megvizsglja, hogy


;pros avagy pratlan sor
;kvetkezik. s ettl fuggen
;kivon vagy hozzad di-hez

.7_cga3:

sub

di,2000h-80

;2000h-t. Illetve kivonilsnl


;80-nal kevesebbet. hogy a
;kvetkez sorra ugorjon.

.B_cgaJ:

add
loop

si,2
.2_cga3

;A kvetkez ikonsor olvasasa.

xo r
int

ax.ax
l 6h

;Billentyvras.

mov
int

a:x,J
l Oh

;80*25 soros karakteres moo


;visszallitasa.

mov
int

ax,4c00h
21 h

:Visszatrs a DOS-hoz.

160
100

;Vzszintes koordinta (0-319)


;Fggleges koord. (0-199)
:Palettakoo (0.1)
;Httrszn (0-7)
Jntenzitas (O, l)
;Ez egy 8*8 kppont mret
:2 szin nyil.
;A nyl alakjt azrt nem
Jehet tkletesen kivenni.
;mert l pontot 2 szm hataroz
:meg.

KOORD_X: dw
KOORD_Y: db
PALETTA: db
HATTER: db
FENYESSEG:db
IKON:
dw
dw
dw
dw
dw
dw
dw
dw
cg aJ

en ds
end

o
o
1010101010100000b
lOIIIIIIIOOOOOOOb
IOIIIIIOOOOOOOOOb
1011101110000000b
1010001011100000b
lOOOOOOOIOiliOOOb
OOOOOOOOOOlOIIIOb
OOOOOOOOOOOOIOOOb

start

:Szegmensvg
:Programvg

A program mkdst illeten a sznek belltsig teljesen megegyezik az elz pldval. Az eltrs ott kezddik, hogy
a koordinta szmtsnl a kapott memria cm az ikon bal fels
sarknak memriacme lesz. Innentl kvetkezik a 8*8 kppont
mret ikon kiraksa (ez lehetne ms mret is). Mivel PC-n a
memria egyes bitjeit egyenknt nem lehet lltani. ezrt erre
egy trkkt alkalmazunk, mgpedig az OR s az AND mvelet
102

Grafika programozsa Assembly nyelven


tulajdonsgait hasznljuk ki. Ha kt egyenknt nyolc bites
szmot OR kapcsolatba hozunk egymssal, az eredmnyben
azon bitek lesznek 1-es rtkek, ahol a kt byte valamelyikbe
1 rtke volt az adott bitnek. Ezt a programban gy hasznljuk
fel, hogy az egyik byte a mvelet sorn egy a kpernyn lv
adat, a msik pedig egy elre elksztett rtk, melyben csak az
egyik bit 1-es rtk, a tbbi O. Ha kt byte gy tallkozik, a
kvetkez eredmnyt kapjuk:

OR

00100110b
00001000b

(Kperny adat)
(Segd Byte)

0010111 Ob

(Eredmny)

Ezen mdszerrel egy byte brmely bilje 1-be llthat. A


bitek trlse igen hasonl, csak ott az AND mveletet
hasznljuk. Ugyanis itt az eredmny csak akkor lesz 1, ha
mindkt bit 1:

AND

00100110b
11111011b

(Kperny adat)
(Segd Byte)

00100010b

(Eredmny)

Teht most mr egy byte tetszleges bitjt 1-be illetve 0-ba


tudjuk lltani. Ennek segtsgvel bitenknt ki lehet rakni a
kvnt brt. Mindssze annyit tesznk, hogy vesszk az ikon
egy sort, megvizsgljuk az egyes bitek rtkt s ezeket belltjuk a kpernyn. Figyelni kell arra, hogy a megfelel memria
bitjeit lltsuk. mert az ikon nem biztos, hogy ppen egy byte els bitjtl kezddik s biztos, hogy nem fr ki egy byte-on. Ezrt
a megfelel idben a kvetkez byte-ra kell ugrani. Ennek megoldsa gy trtnt. hogy a segd byte forgatsakor ha az 1-es
bit a byte szln volt. s innen tovbbforgattuk. akkor carry jelzbit 1-es szintje jelzi ezt s egy jc/jnc utastssal ettl fggen
irnythatjuk a program tovbbi futst. Amennyiben vgzett a
program az ikon egy sornak kiraksvaL kiszmalja a kvetkez sor kezdeimt s megismtli a mr emltetteket sszesen
nyolcszor. mivel 8 kppont magas az bra. Ezekutn egy billentyvrs s visszatrs a DOS-hoz.
103

IBM PC Gyakorlati Assembly


Ha mozgatni is akarjuk az alakzatot, akkor nmileg megvltozik a program felptse. Ugyanis itt mr nem szabad a O
biteket kirakni, mivel ezzel trlnnk a kpernyn lv kpet.
Addig, amg csak a nyl alatti rsz trldik, addig nincs semmi
problma, mivel azt eltte eltrolja a program, de egy ikon kiraksa sorn nem csak a hasznos rszt rakja ki, Oelen esetben a
nyl) hanem a befoglal tglalap tbbi pontjt is, ami nem tartalmaz rtkes adatot. Ezltal ha azokat a O-kat is kirakn a program akkor a nyl krli tglalapot is megjelenten. Ebbl mr
ltszik. hogy csakis OR mvelettel szabad majd adatot kitenni,
de igy nem biztos. hogy a nyl mindenhol a megfelel szn lesz.
Ez az OR mvelet elbbi ismertetsbl knnyen belthat. A
megolds, hogy a nyl alatti rszt elbb ki kell trlni (minden
bitjt O-ba kell lltani) s ezutn mr nyugodtan ki lehet tenni az
ikont OR mvelettel. Ezt a trlst egy egrmaszk segtsgvel
vgezzk el. aminek minden bitje 1 kivve a nyl helyt. Ha ezt
AND mvelettel tesszk ki, akkor az 1-es bitek alatti memriatartalmak nem vltoznak, de a O alattiak kinullzdnak. gy a teljes
mveletsor: kptartalom lementse ; egrmaszk kiraksa ; egr
kiraksa ; elmozduls figyelse, ha van akkor az eredeti kptartalom kiraksa ; koordintk megvltoztatsa ; vissza az elejre. A
programbl kilpni valamelyik egrgomb megnyomsval lehet.
[Program 19]
cg a 4

segment
lJSSume cs:cga4,ds:cga4

;Szegmensdefinci.
;A cs, ds regiszterek
;belltsa.

start:

mov
mov

ax,cga4
ds,ax

;A ds regiszter belltsa
;a szegmens elejre.

mov
mov

ax,Ob800h

es,ax

;A videomeria kezdcmt
;az es szegmensreg1szterbe
;tlti.

call
jnz

egerinstall
.l_cga4

;Az egr installlsa


;Ha nincs hiba, akkor
;elkezddhet a program.

mov
int

ax,l
lOb

;80*25 karakteres kp
;belltsa.

104

Grafika programozsa Assembly nyelven


;O. sor 26. karaktere.
Jekete alapon fehr
;betk lesznek

mov
mov

di,52
ali,7

mov
mov
cm p
jz
mov
add
jmp

si,offset HIBATEXT
al,(si)
ai,O
.2_hiba
es:(di),ax
di,2
si
. !_hiba

.2_hiba:

xo r
int
jmp

8li,8X
l 6h
kilepes

;billenty

.l_cga4:

mov
int
mov
mov
mov
int

all,4
!Oh
ah,Obh
bh,l
bl,byte ptr [PALETTA)
!Oh

;A 320*200-as grafikus
;felbonts belltsa.
;A paletta cmke alatt trolt
;szm palettt vlasztja ki.

mov
mov
mov
mov
mov
shl
add
int

ah,Obh
;A httr cmknl lv sznt
bh,O
:lltja be paprsznnek.
bl,byte ptr IHATTERI
dl,byte ptr [FENYESSEG)
cl,4
:Intenzits belltsa'
dl,cl
bl,dl
!Oh

mov
mov
mov

di,2025
ai,OIOIOIOib
cx.50

.!_hiba:

inc

.2_cga4:

push ex
mov cll,25
re p stosb
add
mov
rep
sub
pop

di,2000h-25
cx.25
stos b
di,2000h+25-80
ex

;Az egrhiba szveg kiratsa.


;Ha a szvegbe O kd van.
;az a szveg vgt jelenti.
;Ha nem, akkor kirhat a
;karakter.
;Kvetkez karakter mindaddig,
;mg a O kodhoz nem r a program .

vrs. majd kilps .

;A kperny kzepe Ilijra kirakunk


;egy l 00*1 00 kppont mret l-es
;sznkd ngyzetet.

;es:[di( cmre rja al-t s nveli


:di-t annyiszor. arnennyi ex ertke.
;A kvetkez pratlan sorra ugrik.
:A -25 azrt kell, mert aSTOSB
;utasts megnvelte di rtkt
;A kvetkez pros sor.

tOS

IBM PC Gyakorlati Assembly


loop

.2_cga4

;C x rtknek megfelelen
;ismtli a ciklust.

.J_cga4:

call
call
call

mentes
mask
eger

; Vezrlrutinok hivsa a
;megfelel sorrendben.

.4_cga4:

call
jnz
call

gombtest
kilepes
mozgas

jz
call
mov
int

.4_cga4
kirakas
ax,J
JJh

cm p
je

cx,624
.5_cga4

;Az egrkezel az aktulis


;zemmd legnagyobb felbontst
;(640*200) veszi alapul. s mivel
;az ikon 8 kppont szles ezrt,
;hogy ne lghasson ki a kpbl
;640-16-nl le kell tiltani.

mov
mov
int

ax.4
cx,624
JJh

:Ha ennl nagyobb lenne. akkor


:ide lltja vissza.

.s_cga4:

cm p
je
mov
mov
int

dx,l92
.6_cga4
a x,4
dx,l92
JJh

:Ugyan az, mint a vzszintes


:koordintnl, de itt nem
;kell a pozicit dupln
:szmolni.

.6_cga4:

shr
mov
mov
jmp

ex, l
wo~d

.A megvaltozott rtket
:berjuk a memria vltozkba.

mov
int

ax,J
l Oh

:80*25 soros karakteres md


:visszaalltsa.

mov

ax,4c00h
21 h

:Visszatrs a DOS-hoz.

kilepes:

int

mentes

106

proc

ptr (koord_x),cx
byt'e ptr (koord_y(,dl
.J_cga4

:Ha nincs mozgs, vissza .


:Az egr koordintinak
;lekrdezse.

Grafika programozsa Assembly nyelven

.l_mentes:

~l_mentes:

;Forrsindex regiszter
;nullzasa

xo r

si,si

mov
test
jz
add

bl,byte ptr (koord_y)


b l, l
.l_kepmentes
si,2000h

mov
shr
mul
add
mov
mov
shr
shr
and
shl
xo r
add

ax,80
bl,l
bl

;Kiszmoljuk a fggleges
;memriacimet.

si,ax

;s ezt si-hez adjuk.

bx,word ptr (koord_x)


cl,bl
b x, l
bx,l
cl ,3
cl, l
bh,bh
si,bx

mov

bl,cl

;Cl tartalmt azaz a byte-on


;belli pozci rtkt a bl
;regiszterben troljuk, mivel ex
;regisztert tbb ms helyen is
;hasznlni fogjuk.

mov
mov

cx,8
di,offset kephely

;Az ikon 8 kpsor magas

push si ex
mov

dh,es:(si)

mov
mov

cl,bl
dl, l 28

;Ha az y koordinta pratlan,


;akkor si-hez hozz kell
;adni lOOOh-t.

;A vzszintes pozici als


;2 btje a byte-on belli
;cm.

;A vzszintes pozicit is
;si-hez adjuk.

;A kphely memriacimtl
;kezdden lesz letarolva
;a kp
;ex s si verembe mentse.
;Az es:(si( eimen lv byte
;tartalmt. ami a kperny
;egy rsze dh-ba teszi.

;Dl regiszter 7. bit-jt


J-be lltom. Ezt forgatva
;fogom tudni. hogy mikor kell
;a kvetkez eimen lev byte-ot
;beolvasni.

107

ffiM PC Gyakorlati Assembly


shl
ro r

dh,cl
dl,cl

;A beolvasott memriatartalom
;s a segdbyte forgatsa gy,
;hogy az rtkes bitek kerlnek
;a byte szlre.

mov

ex, l 6

;A troland rsz 16 bit szles.

shl

dh, l

rel

ax,l

;A kiolvasott byte rtkt balra


Joljuk eggyel. igy a kicssz
;bit a carry fiagbe kerl.
; Az rel hatilsara az ax regtsztert
;balra forgatja. s a O. bit
;helyre a c flag rtkt
;forgatja be.

ro r
j ne

dl, l
.4_mentes

inc
mov

si
dh.es:(si(

loop
mov

.J_kepmentes
(di(,ax

pop
cm p
je
sub
jmp

ex si
si,2000h
.S_mentes
si,lOOOh-80
.6_mentes

.S_mentes:

add

si,2000h

.6_mentes:

add

di,2

;Ax kvetkez rtkt 2


;byte-al arrbb kell
;letarol ni.

loop

.2_mentes

;A kvetkez kpsor olvasasa


:ha van meg. Ha mncs.
;akkor visszatres a hivo
.programhoz.

.J_mentes:

.4_mentes:

rel

mentes

108

end p

;A segdbyte forgatsa. Ha
;a kifordul bit O akkor a
;kvetkez bit atrasa
;kvetkezik, ha I akkor a
;byte vgre rt az olvasas
;s egy j byte-ot kell
;beolvasni.

;Ha ax mind a 16 bit-jbe


;betltdtt a megfelel
;adat. akkor azt a memriaba
;rjuk (kphely).

;A kvetkez sor eimnek


;kiszamitasa (paros utan
;paratlan s fordtva l

Grafika programozsa Assembly nyelven


kirakas

proc

xo r
mov
test
jz
mov
.l_kirakas: sbr
mov
mul
add
mov
mov
and
sbl
sbr
sbr
add
mov
mov
ro r
ro r

bx,word ptr [koord_x)


cl,bl
cl, ll b
cl, l
bx,l
bx,l
di,bx
dl,lOOOOOOOb
db,Olllllllb
dl,cl
db,cl

mov

si,offset kephely

mov
.2_kirakas:

di,di
bl,byte ptr [koord_y)
bl,l
.l_kirakas
di,lOOOb
bl,l
ax,80
bl
di,ax

cx,S

push di dx ex

mov

ex, l 6

mov

ax,(si)

.J_kirakas: push
shl
je
and
jmp

ex
ax,l
.4_kirakas
es:(di),dh
.5_kirakas

.4_kirakas: or

es:(di),dl

;Az ikon bal fels pontjnak


;kiszrntilsa.

;Belltmaszk.
;Trlmaszk.
;A byte-on belli bitcm
:belltsa.

;Az ikon tblzatcimt si-be


;rakjuk.
;Az bra 8 kpsor magas.
;A regiszterek elmentse a
:ksbbi felhasznls
;celjbl.
:2*8 bit szles az ikon.
:Ax regiszterhe tltnk egy
:sort az alakzatbL

:Ax balra lptetsvel


:megvizsglja, hogy kirakni
:kell-e a pontot, vagy trlni.
:az AND mvelet hatsra mivel
:a dh regiszter l bitje O ezrt az
:a bit trldik. Az OR mveletnl a
:dl regiszter l bitje segtsgvel

109

IBM PC Gyakorlati Assembly


J-be lltja es:(di] cmen
:byte rtk!.
.5_kirakas:

ror
ror
j ne
inc

.6_ki ra kas:

dh.l
dl,l
.6_ki ra.kas
di

pop
loop
pop
cmp
j ne
add
jmp
.7_kirakas: sub

ex
.3_ki ra kas
ex dx di
di,2000h
.7_kirakas
di,2000h
.S_kirakas
di,2000h-80

.S_kirakas:

si,2
.2_kiraks

add
loop

lv

:A kvetkez bit figyelse .


:A ROR utastsnl a kicsusz
:bit c fiagbe kerl. Ha dl
:forgatsakor c flag l-be ll.
:az azt jelenti. hogy dl s dh
:krbefordult. Ilyenkor di-t
:nvelni kell egyel.

:A program megvizsglja. hogy


;pros avagy pratlan sor
;kvetkezik. es ettl fiiggen
;kivon vagy hozzad di-hez
;2000h-t. Illetve kivonsnl
:80-nal kevesebbet. hogy a
;kvetkez sora ugol)on
:A kvetkez ikonsor olvasasa
:kvetkezik.

ret
kirakas

endp

mask

proc

.J_mask:

110

mov
xor
mov
mov
test
jz
add

si.offset IKONMASK
di.di
bl,byte ptr (KOORD_Y]
ax,SO
bl,l
.J_mask
di.2000h

shr
mul
add
mov
mov
shr
shr

bi,J
bl
di,ax
bx.word ptr (KOORD_X(
cl,bl
bx,t
bx,l

:Az ikon bal fels sarknak


:kiszmtsa

Grafika programozsa Assembly nyelven


and
shl
add
mov
mov

cl ,J
cl, l
di,bx
bl,cl
cx,8

push
mov
mov
mov
ro r
mov

di ex
ax,(si(
di,Olllllllb
cl,bl
dl,cl
ex, l 6

.3_mask:

shl
je
and

ax,l
.4_mask
es:(di),dl

.4_mask:

ro r
je
inc

dl, l
.5_mask
di

.5_mask:

loop
pop
cm p
j ne
add
jmp

.3_mask
ex di
di,2000h
.6_mask
di,2000h
.7_mask

.6_mask:

sub

di,2000h-80

.7_mask:

add
loop
re t

si,2
.2_mask

mask

end p

eger

pror

.2_mask:

mov
xo r
mov
mov
test

:Trlmaszk

:Ahol az egrmaszkban
:O van. ott trli a kpet
;igy helyet csinl a nylnak.
:Ahol l. ott az eredeti
:kpernytartalmat hagyja .

si,offset IKON
di,di
bl,byte ptr (KOORD_Y(
ax,80
bl,l

lll

IBM PC Gyakorlati Assembly


jz
add

.l_eger
di,2000h

.l_eger:

shr
mul
add
mov
mov
shr
shr
and
shl
add
mov
mov

b l, l
bl
di,ax
bx,word ptr [KOORD_XJ
cl,bl
b x., l
b x., l
cl ,J
cl. l
di,bx
bl,cl
cx.8

.2_eger:

push
mov
mov
mov
ro r
mov

di ex
ax,(siJ
di,IOOOOOOOb
cl,bl
dl,cl
ex, l 6

.J_eger:

shl
j ne
or

ax,l
4_eger
es:JdiJ,dl

.4_eger:

ro r
jn c
inc

dl. l
.S_eger
di

.S_eger:

loop
pop
cm p
j ne
add
jmp

.J_eger
ex di
di,2000h
.6_eger
di,2000h
.7_eger

.6_eger:

sub

di,2000h-80

.7_eger:

add
loop

si,2
.2_eger

re t

112

;Hasonl mdon mint az elbb


;csak most pont fordtva
;ahol az ikonban l van azt OR
;mvelettel kiteszi. Ha O-val
;tallkozik, akkor tCivbblp.

Grafika programozsa Assembly nyelven


eger

endp

egerinstall

proc
xor

ax,ax

int

JJh

cm p

a x.O

;A 33h megszakts kezeli az


;egr sszes funkcijt.
;ebbl a O. az egr mstalllsa.
;A rutinbl val visszatrskor
;Ax=O jelenti. hogy az egr
;nem inicializlhat.
:255 jelenti a sikeres
;installlst.

ret
egerinstall

end p

mozgas

proc
mov

ax,J

int

33 h

shr
cm p
jnz
cmp

cx.l
ex,word ptr (KOORD_XI ;Ha eltrs van az eddigi
.l_mozgas
;koordinta s a mostani kzlt
dl,byte ptr JKOORD_YJ ;Zero flag nke O lesz.

. l_ mozgas:

re t

mozgas

endp

gombtest

proc
mov
int
test

ax,J
JJh
bl.llb

;Ha Ax=J paramterrel hvom


;meg az egrkezel rutint.
;VIsszatrskor BX reg.szter
;O. bitje a bal, l. bitje a JObb
;2. bltJe a kzps gomb llapott,
;ex a vzszintes koordintt
;DX a fggleges koordintt
;tanalmazza.

;Ha le van nyomva a jobb


;vagy bal gomb. a teszt utn

113

IBM PC Gyakorlati Assembly


;Z flag Olesz. Ha mind a O. s
;az l. bit is O, azaz nincs
Jenyornott billenty. a Z flag
,l-be ll.
re t

gombtest

endp
;Vizszintes koordinta
;Fggleges koord.
;Palettakd (0, l)
;Httrszn (0-7)
;Intenzits (0, l)

KOORD_X: dw
KOORD_Y: db
PALETTA: db
HATTER: db
FENYESSEG:db
dw
IKON:
dw
dw
dw
dw
dw
dw
dw

160
100
0
0

IKONMASK:dw
dw
dw
dw
dw
dw
dw
dw

OOOOOOOOOOOOllllb
OOOOOOOOOOllllllb
OOOOOOOOIIIIIIIIb
OOOOOOOOOOIIllllb
OOOOIIOOOOOOIIIIb
OOllllllOOOOOOIIb
llllllllllOOOOOOb
llllllllllllOOllb

KEPHELY: dw
HIBA TEXT:

0,0,0,0,0,0,0,0
db
"Az egr nem installlhat !".O

cg a4

1010101010100000b
IOIIIIIIIOOOOOOOb
IOIIIIIOOOOOOOOOb
IOIIIOIIIOOOOOOOb
1010001011100000b
IOOOOOOOIOillOOOb
OOOOOOOOOOIOiliOb
OOOOOOOOOOOOIOOOb

en ds
end start

;Szegmensvg
;Programvg

A ksbbiek folyamn lesz mg sz hasonl eljrsokrl,


rutinokrL Sajt program rskor azonban nem tancsolom ezek
kzvetlen felhasznlst, mivel ezek a pldk programozs
technikai tleteket nem nagyon tartalmaznak, ezltal ennl gyorsabbat, rvidebbet is lehet rni. Ezek clja csupn, hogy ismer114

Grafika programozsa Assembly nyelven


tessem az zemmd sajtossgait s egy-kt tletet adjak a felhasznlshoz. A msik ok, amirt nem rdemes ezeket a rutinokat programba gyazni, mert CGA monitort mr elg kevs helyen hasznlnak. Van mg tovbbi szpsghibja is a dolognak,
mint pldul az utols programnl az egeret mozgatva nha vibrl a nyl. Ennek oka a manitorok mkdsbl addik. Mgpedig, hogy a monitor a kp kirajzelst a bal fels sarokban kezdi, vgigmegy azon a soron s rajzols nlkl a kvetkez sor
elejre tr vissza. A kp jobb als sarkt elrve szintn rajzols
nlkl ismt a bal fels sarokba tr vissza az elektronsugr.
Problma akkor addik, ha kinn van a kpernyn egy bra. az
elektronsugr a kp kzepn tart s ekkor mi megvltoztatjuk a
kinnlev kpet. Az eredmny egy rvid idre a rgi kp els fele
s az j kp msodik fele. Sajnos erre nem minden programban
figyelnek oda. A megolds, hogy azalatt a bizonyos fggleges
visszatrsi id alatt kell az brt kirakni. Egybknt ezt a
visszatrst hvjk Vertical Bianknek s msodpercenkint manitortpustl fggen 50 60 70-szer trtnik. Ezt az IBM PC gpeknl figyelemmel lehet ksrni, mivel van egy portcm, aminek
egyik bitje a vzszintes. egy msik pedig a fggleges visszatrst jelzi. Errl majd nemsokra.
A fejezet elejn sz esett arrl, hogy a grafikus zemmdokat kzvetlenl is lehet programozni. Az eredmny ugyan az. mivel a BIOS is ezt teszi. csak eltte mg sok olyan dolgot is elvgez. amire nem biztos. hogy az adott helyen szksg van. Ez a
direkt programozs alapveten kt mdon trtnik. Vagy egy
megfelel porton keresztl kikldnk egy adatot. amit a kpernyvezrl rtelmez, illetve kt lpsbl gy, hogy egy portcmen egy bels regisztert cmznk meg s utna egy msik csatornn kldjk az adatot. Vannak ugyanis olyan portok, ahol
tbbfle dolgot is lehet lltani s ezek kzl ki kell vlasztani
azt amelyikre ppen szksg van. Ellenben ennek is van egy
htrnya ami fkppen akkor jelentkezik, ha pldul egy CGA
krtyra irt programot VGA krtyval zemel gpen futtatunk.
Ugyanis itt azoknak a regisztereknek. amiket a CGA krtynl
hasznlnnk lehet, hogy egszen ms jelentsk van. Ezrt ezt
csak akkor rdemes hasznlni, ha azonos krtya tpussal lesz
hasznlva a program. Vannak termszetesen kivtelek, amik
minden tpusnl megegyeznek. Ilyen pldul a vertical blank.
115

IBM PC Gyakorlati Assembly


A most kvetkez krtya regiszter ismertetben azok a cmek, ahol kln cm s adatregiszter szerepel, ott a vltoztats
gy trtnik, hogy a cmregiszterre az elrend regiszter sorszmt rjuk. s ezutn az adatregiszter eimn kldjk az adatot:
OUT cmregiszter.regszterszm ; OUT adatreg~szter.adat
Portcm

Tpus

Funkc

3d4h

Csak rhat

MC6845 kpernyvezerl cimregisztere

3d5 h

lrhato, olvashat

A kpernyvezerl adatregisztere

OOh
Ol h
02h
03 h
04h
05 h
06h
07 h
08 h
09h
Oah
Ob h
Oc h

Csak
Csak
Csak
Csak
Csak
Csak
Csak
Csak
Csak
Csak
Csak
Csak
Csak

Od h

Csak rhat

Oe h

lrhat, olvashat

Olll

i rhat, olvashat

l Oh

Csak olvashato

ll h

Csak olvashat

Vzszintes felbonts karakteregysgben


Egy sor hossza karakteregysgben
Vzszmtes ktolts kezdetenek karakterpozicija
Vtzszintes kiolts vege
Karaktersarok szma
Fggleges igazits
megjelentett sorok szma
Fggleges kiolts kezdete
Interiace md
Karakten alkot pontsarok szilma
Kurzor kezd pontsora
kurzor utols pontsora
A megjelents kezdeti memriacimnek magas
helyink byte-ja
A megjelents kezdeti memriacimnek
alacsony helyink byte-Ja
A kurzor pozcijnak magas helyink
byte-ja
A kurzor pozcijnak alacsony helyink
byte-ja
Fnyceruza helynek magas helyinek
byte-Ja
Fnyceruza helynek alacsony helyink
byte-ja

3d8 h

116

rhat
rhat
rhat
rhat
rhat
rhat
rhat
rhat
rhat
rhat
rhat
uhato
rhat

Csak rhat

zemmd regiszter
7-6: Nem hasznlt
5: Villogs engedlyezese
O- Az attribtum 7. bitje a
httrszn intenzitst
engedlyezt
l - Az attribtum 7. bitje a

Grafika programozsa Assembly nyelven


vi llogst engedlyezi
4: Nagyfelbonts grafikus
md bellitsa
3: Megjelents engedlyezse
2 Fekete fehr md beililitsa
O - Fekete - fehr md
l - Sz nes md
l: Grafikus md belltsa
O: 80*25 karakteres zemmd
belltsa

3d 9h

Csak rhat

Sznkivlaszts regiszter
7-6: Nem hasznlt
5: Paletta sorszam
4: Sznkszlet kivlasztsa
3: Intenzits engedlyezse
2-1-0: Karakteres mdban a keret szne
320*200 mdnl a httr szne
640*200 mdnl az eltr szint
hatrozza meg (RGB)

J da h

Csak olvashat

Sttuszregiszter
7-4: Nem hasznlt
3: Fggleges visszatrs alatt l az
rtke
2: Fnyceruza kapcsolja zilrva van
l: Fnyceruza engedlyezett
O: 6845 nem hasznlja a kpernyt
(vzszintes vagy fggleges visszatrts)

3d bh

Csak rhat

Fnyceruza latch trlse

3dch

Csakirhato

Fnyceruza regiszteremek bellitsa

EGA S VGA ZEMMDOK PROGRAMOZSA


A tovbbiakban ismertetsre kerl manitor krtya tpusok
az EGA s a VGA Az EGA krtyval rszletesen foglalkozni
nem fogok, mivel a mkdse kis eltrssel azonos a VGA
krtya mkdsvel. Az eltrseket termszetesen megemltem.
Ezek kzl a legalapvetbb a grafikai felbontsban jelentkezik.
Az EGA krtya maximlis felbontsa 640*350 kppont 16
szmnel. amit egy 64 elem palettbl lehet kivlasztani. Eltrs

117

IBM PC Gyakorlati Assembly


a CGA krtyhoz kpest, hogy itt a krtyba mr van beptve
kls RAM memria. Hogy mekkora az vltoz, ltalban
128K-ti2M-ig szekott elfordulni. De az. alap VGA zemmdokhoz maximlisan 256K elg. Ennl tbb csak az SVGA zemmdokhoz kell. Ezenkvl az EGA, VGA krtyknak van sajt karakterkszletk.
Az EGA krtya szeigitatsa a mr emltett zemmdon s
a CGA mdjain kvl mg tovbbi hron lehetsg, mgpedig a
320*200/16, 640*200/16, 640*350/2 mc'ok.

A videomemria kezdcme itt nem OB800h hanem


OAOOOh. Egyszerre 64K RAMterlethez ehet hozzfrni, ha egy
msik v ideo lapra szerelnk rni, akkor a !l lapozni kell.
A CGA krtya azon htrnyt. hoJy a pros s pratlan
sorok kln vannak trolva. azt itt mr l ikszbltk, az adatol:
folytonosan vannak trolva a memrb m. Ellenben a 16 szn
zemmdoknl bejn egy jdonsg. A 1 5 szn kivlasztshoz 4
bitre van szksg. Ez a ngy bit azonb3n nem egyms mellett
van trolva ahogyan a CGA krtynl a 2 bit, hanem egyms
mgtt. Ez elsre elg furcsnak tnhe a helyzet azonban az.
hogy ngy klnll lapra van bontva a kperny. Ezeket hvjk
plane-eknek. gy egy kperny ngy egyms mgtt elhelyezked plane-bl ll, melyekre egyenknt vagy egyszerre lehet adatot rni, illetve rluk olvasni. Egy plane egy byte-ja nyolc egyms
melletti kppont valamely bitjt tartalmazzl.
A legegyszerbb mdszer egy pontot kiraksra a ROM
BIOS hasznlata. Ugyangy httrsziP megvltoztatsra stb.
Ennek htrnya, hogy esetenknt lass.., lehet. Termszetesen,
amikor nem kvetelmny a nagy sebessg tkletesen megfelelnek ezek a rutinok. Hasznlatuk knny s egyszer.

Az els pldaprogramban itt is az zemmd sznpalettjt


mutatom be. Elszr az alapbellts kiosztst majd az EGA 64
sznlehetsgt.

118

Grafika programozsa Assembly nyelven


(Program 20)
egal

segment
assume cs:egal,ds:ega l

:Szegmensdefinci.
:Cs s ds belltsa.

start:

mov
mov

ax,egal
ds,ax

:Ds regiszter belltsa


:a szegmens elejre.

mov
int

ax.IOh
!Oh

:640*350/16 EGA. md
:bellitasa.

mov

ex, l 6

; 16 sznpaletta van.

.l_egal:

.:Z_egal:

.J_egal:

push ex
mov cx.8

:Egy csk 8 pont magas

push ex
mov ex, l 40

;s 140 pont szles.

push ex
mov ex,word ptr [KOORD_XI :A kirakand pont X
;koordintja.
mov
mov
mov

dx,word ptr [KOORD_YI :Az Y koordinta.


al,byte ptr [SZINJ
:A kirakand pont szine.
bh,byte ptr [LAPJ
:A videolap sorszma.

mov
int

ah,Och
l Oh

:Pontkiraks rutin
:hvsa.

inc
pop
loop
mov
sub
inc
pop
loop
pop

:Egy 140* 8 pont mret


:tglalapot rajzolunk a
:megadott palettaszinnel.

loop

word ptr [KOORD_XJ


ex
.J_egal
ax,l40
word ptr [KOORD_X),ax
word ptr [KOORD_YI
ex
.:Z_egal
ex
byte ptr [SZINJ
.l_egal

xo r
int

ax.ax
l 6h

inc

:Ezt az sszes paletta:szinnel is megismteljk.


:billentyvrs

119

IBM PC Gyakorlati Assembly


.4_egal:

mov

ex, IS

;A 16 palettbl a O.
.a httr. ezrt azt nem
;llitjuk, csak a tbbit.

b l, l
bh,byte ptr [ELSO)
ex bx
ax,lOOOh
lOb

;Az els lltand paletta.


:Az els sznkd

.s_egal:

mov
mov
push
mov
int
pop
inc
inc
loop

bx ex
bl
bh
.5_egal

xo r
int

ax,ax
16h

;billentyfigyels

cm p
jnz

ah,48h
.7_egal

;A felfle nyl volt?

mov
cm p
j ne
inc
jmp

al,byte ptr [ELSO]


al,48
.6_egal
byte ptr [ELSO)
.4_egal

;Ha igen, s az els


;palettaszn meg nem
;rte el a 48-at, akkor
;nveljk a kezdsznt
;s vissza a paletta;belltshoz.

.7_egal:.

em p
jnz
mov
cm p
jz
dec
jmp

ah,50h
.S_egal
al,byte ptr [ELSO)
al,O
.6_egal
byte ptr [ELSO)
.4_egal

;Ha a lefel nyl volt.


;hasonlan mint az elbb
;megvizsglja a kezd
;rteket s ha nem O,
;cskkenti egyel, majd
;vissza a paletta-belltshoz

.S_egal:

cm p
jnz

ah, Ich
.6_egal

;Az ENTER lett lenyomva?


;Ha nem, jabb bet olvassa.

mov
int

ax,J

;Ha igen, 80*25 text

mov

ax.4c00h
21 h

.6_egal:

int

120

;Az adott paletta belltsa


;a megfelel sznre
. A paletta sorszm s a
:szinkd nvelse 15-szr

kperny

lOb
:s visszatrs a DOS-hoz

Grafika programozsa Assembly nyelven


250
100

KOORD_X:dw
KOORD_Y: dw
SZIN:
db
ELSO:
db

o
o

LAP:

db

egal

ends
end start

;A kirakand pont X
;illetve Y koordintja
;s a pont szne.
;Paletta-belltsnl az els
;csk szne.
;A grafikus videalap sorszma.
;A szegmens vge.
;A program vge.

Els

lpsben kirak a program 16 darab 8*140 kppont


klnbz szn cskot egyms al. Ez az EGA illetve
VGA krtyk 16 szn felbontsainak alap paletta-belltsa.
Ezek a sznek sorrendben:
mret

o
l
2
3
4
5
6
7

Fekete
Kk
Zld
Trkiz
Vrs
Lila
Narancs
Vilgos szrke

8
9
10
ll
12
13
14
15

Sttszrke
Vilgoskk
Vilgoszld
Vilgos trkiz
Piros 2
Vilgoslila
Srga
Fehr

Ellenttben a CGA mddal, itt lehetsg nylik a palettasznek megvltoztatsra egyenkint illetve az egszet egyszerre. A
belltsnl az egyes bitek jelentse a kvetkez:
7

6
5
4

3
2
l

Nem hasznlt
Nem hasznlt
Msodlagos vrs
Msodlagos zld
Msodlagos kk
Vrs
Zld
Kk

A pldaprogramban az egyenknti bellts lett alkalmazva, mgpedig gy,hogy egy ENTER lenyomsa utn grgetni lehet a szneket a fl-le nyilakkal. A paletta mdostsnl a BIOS
1Oh megszaktsnak 1O. programjnak O. funkcijt hasznljuk
(ah=10; ai=O), itt a belpsnl bl regiszterbe kell tenni a mdostand paletta sorszmt bh-ba pedig a sznkdot. Az egyszer121

IBM PC Gyakorlati Assembly


re trtn vltoztatsnl al-be kettt kell rni, s es:dx cmen le
kell trolni a 16 palettasznt s egy keretsznt. A O. paletta a httr sznt hatrozza meg. Ha a keret sznt kln akarjuk lltani,
ahhoz al-be egyet bh-ba pedig a keret sznt kell rni.
Lthat, hogy a program elg lass s darabos. Valamennyire lehetne gyorstani a dolgot, ha a palettaszneket nem
egyenknt lltannk, hanem egyszerre, de ez a sorok kirajzelst nem gyorstja. A megolds a kzvetlen programozs. Ezt
VGA felbonts mellett mutatom be egy kis vltoztatssal. A vltoztats oka, hogy mg az EGA felbonts mellett a 16 sznt egy
64 elem sznsklbl lehet kivlasztani, addig a VGA krtyknl 64 fle piros zld s kk sznt lehet belltani. Ezek varici it
egy kicsit sokig tartana vgiggrgetni, mivel 262144 fle sznt
lehet belltani. Ahhoz, hogy mgis be tudjam mutatni az sszes
sznlehetsget, a szneket egyenknt lehet lltani. A piros
sszelevt a q a, a zldet a w s, a kket pedig a e d billentyk
kel pozitv illetve negatv irnyba. s mindez a httrszn vltozsban jelentkezik. A kilps az ENTER billentyvel trtnik. A
VGA 16 szn felbontsnl van egy kis furcsasg ami itt a
programnl ugyan nem szrevehet, de a programozs sorn
esetleg gondot okozhatna. Ugyanis itt egy 256 elem palettban
helyezkedik el az a 16 szn amit hasznlhatunk, de ez nem az
els 16, hanem a kvetkez sorrendben helyezkedik el:

1
2
3
4
5
6
7

1
2
3

5
20
7

8
9
10
11
12
13
14
15

56
57
58
59
60
61
62
63

Teht ha pldul a 12. palettakdot akarjuk lltani, akkor a


60. palettasznt kell megvltoztatni. A tovbbiakban minden
program VGA kpernyre rdik, de kisebb vltoztatsokkal
(sznbellts, felbonts stb.) EGA zemmdra is ttehetk.

122

Grafika programozsa Assembly nyelven


A direkt programozsnl lehetsg nylik a krtya sszes
a kihasznlsra. Itt a legegyszerbb alkalmazst mutatom be, amikor a kivlasztott plane-ekre a megfelel
adatokat rjuk. Az els lpsben a VGA zemmdot lltjuk be.
Ezt mg a BIOS segitsgvel. Ezutn kivlasztjuk a legegyszerbb rsi mdot: SET-RESET funkci tiltsa; adatkiraks i md
belltsa fellrsra; adatvltoztats engedlyezse az sszes
bitre; a cskok kirakshoz kivlasztjuk minden csknl a megfelel bitskot Ezzel ellltottuk ugyanazt a kpet, amit az elz
program a BIOS pontkirak rutinja segitsgvel. Azt hiszem, a
sebessg megvltozsa magrt beszl. A palettasznek vltoztatsa direkt ton gy trtnik, hogy a 3C8h portcmen kikldjk
a vltoztatni kvnt paletta sorszmt s ezutn a 3C9h porton a
piros, zld, kk sszetevket. gyelni kell arra, hogy 3*6 bitnek
kezeli a gp a szneket, ezrt ha egy sszetevnl 63-nl nagyobb szmot kldnk ki, annak is csak az els 6 bitjt fogja rtelmezni. A program mkdse a tovbbiakban hasonlt az elzre, csak itt tbb billentyt figyelnk.
lehetsgnek

[Program 21]
vga l
start:

segment
assume cs:vgal,ds:vgal
mov Bll,vgal
mov ds,ax

;Szegmensdefinci.
;Cs s ds belltsa.
;Ds regiszter belltsa
;a szegmens elejre.

mov
int

ax,12b
lOb

;640*480/16 VGA md
;belltsa.

mov
mov
out
inc
mov
out

dx,3ceb
al, l
dx,al
dx
al,O
dx,al

;SET-RESET funkci tiltsa.

dec
mov
out
inc

dx
al,5
dx,al
dx
ax,ax
dx,al

;A O. rsi md kivlasztsa.

xor
out

123

ffiM PC Gyakorlati Assembly

.l_vgal:

.2_vgal:

.3_vgal:

124

dec
mov
out
inc
mov
out

dx
al,3
dx,al
dx
al,O
dx,al

;Fellrsi md kivlasztsa.

dec
mov
out
inc
mov
out

dx
ai,S
dll,&l
dx
al,llllllllb
dx,al

;Adatvltoztats engedlyezse
;az sszes bitre.

mov
mov
mov

8ll,0a000b
es, u
di,8031

;Videomemria kezdcme.

mov
push
mov
mov
out
inc
mov
out
mov

Cll, l 5
Cll
dll,3c4b
al ,2
dx,al
dx
al,byte ptr [SZIN]
dx,al
Cll,8

push
mov
mov
re p
sub
pop
add
loop

Cll
Cll,17
al,255
stos b
di,17
Cll
di,SO
.2_vgal

pop
inc
loop

Cll
byte ptr [SZIN]
l_vgal

mov
mov
out
inc
mov

dll,3c8h
al,O
dx,al
dll
al,byte ptr [PIROS)

;A megfelel plane-ek
;kivlasztsa.

;A szncskok kirajzolsa.

;A kvetkez palettaszn
;kivlasztsa.

;A httrszn lltsa a
;megfelel sznre.

Grafika programozsa Assembly nyelven

4_vgal:

.S_vgal:

.6_vgal:

7_vgal:

.B_vgal:

out
mov
out
mov
out

lb, al
al,byte ptr (ZOLD)
lb,al
al,byte ptr [KEK)
lb,al

mr
int

u,ax

;Billentyfigyels .

16h

cmp
joz
mov
cm p
j ne
inc
jmp

al,"q"

;A q billenty figyelse.

.S_vgal
a1,63
byte ptr (PIROS),al
.4_vgal
byte ptr (PIROS)
.3_vgal

;Piros sszetev nvelse


;ha mg nem 63 .

cm p
joz
mov
cm p
jz
dec
jmp

al,"a"

;Az a

.6_vgal
al,O
byte ptr (PIROS),al
.4_vgal
byte ptr (PIROS)
.3_vgal

cm p
jnz
mov
cm p
j ne
inc
jmp

al,"w"

;A w

.7_vgal
a1,63
byte ptr (ZOLD),al
.4_vgal
byte ptr (ZOLD)
.3_vgal

;Zld sszetev nvelse


;ha mg nem 63 .

cm p
joz
mov
cm p

al,"s"

;A s billenty figyelse.

.S_vgal
ai,O
byte ptr (ZOLD),al

;Cskkentse ha nem O.

jz
dec
jmp

.4_vgal
byte ptr (ZOLD)
.3_vgal

cm p
joz
mov
cm p

.9_vgal
al,63
byte ptr (KEK),al

al,"e"

billenty

figyelse.

;Cskkentse ha nem O.

billenty

figyelse.

;A e billenty figyelse.

125

ffiM PC Gyakorlati Assembly


joe
inc
jmp

.4_vgal
byte ptr [KEK)
.J_vgal

;Kk sszetev nvelse


;ha mg nem 63 .

cm p
joz
mov
cm p

al,"d"

;A d

.lO_vgal
al,O
byte ptr [KEK),al

;Cskkentse ha nem O.

jz
dec
jmp

.4_vgal
byte ptr [KEK)
.3_vgal

cm p
joz
mov
int

al,l3
.4_vgal
u,3
lOb

;EN1ER billenty figyelse.

mov
int

ax,4c00h
21 h

;Visszatrs a DOS-hoz

SZIN:
PIROS:
ZOLD:
KEK:

db
db
db
db

o
o
o

vga l

en ds
end start

.9_vgal:

.lO_vgal:

billenty

figyelse.

;Ha tgen, 80*25 text kperny

l
;Az egyes sznsszetevk
;kiindul rtke.

;A szegmens vge.
;A program vge.

Amint azt mr emltettem, ebben az zemmdban tbbfle


lehetsgnk van a kpemyre val rskor. A legegyszerubb,
amit itt is hasznltunk, a kvetkezkppen mkdik:
Mveleti kd reg.
XXXOOOOO (Fellrs)

PianeJ
Plane2
Pianel
PlaneO

Eredeti adat

Memria lapoz reg.

xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx

j adat

xxxxxxxx
XXXXIOII
XXXXIOII

xxxxxxxx
00001111
Adatvltoztats
engedlyezs

126

Grafika programozsa Assembly nyelven


XXXXlOll
Felhasznli
adat
EGA - VGA krtyk O. rsi mdja a felhasznli adat hasznlatval

A szmtgpen az rsi mdot a grafikus


regiszternek 0-1 bitje hatrozza meg. Hasznlata:

vezrl

5.

OUT 3deh,5; OUT 3dfh,XXXXXXOOb (a O. mdhoz).


A tovbbiakban ki kell vlasztani, hogy melyik plane-re
kvnunk adatot rni, ettl fgg a leend pont(ok) szne. Ez
hasonlkppen mkdik, mint az elz, de ezt nem a grafikus
vezrl regisztereivel lehet lltani, hanem egy un. Sequencer
segtsgvel aminek szintn van adat s cmregisztere. Neknk
most a 2. bels regiszterre van szksgnk, annak is az als 4
bitjre, ugyanis ezek rtke hatrozza meg, hogy egy plane-re
lehet-e rni vagy sem. A O rtk jelenti a tiltott llapotot
OUT 3c4h,2; OUT 3c5h,}O<XX011 Ob
(az 1. s a 2. plane lett engedlyezve.)
Tovbb, mivel az ltalunk beirt adatot kvnjuk, hogy
megjelenjen a kpernyn, a SET-RESET funkcit le kell tiltani.
Ezt a grafikus vezrl 1. regiszterre irt O-val lehet elrni:
OUT 3deh, 1; OUT 3dfh,XXXX0000b
(ezzel az sszes bitskon tiltottuk a SET-RESET funkcit)
Van mg egy-kt dolog amit be kell lltani, kztk az is,
hogy milyen mdon kvnjuk azt az adatot kitenni a kpernyre,
lehetsg van ugyanis fellrsi, AND, OR s XOR mdok kivlasztsra a vezrl 3. regisztern keresztl. Itt lehet mg belltani azt is, hogy ha az adatot nem egy az egybe akarjuk kirakni,
hanem mondjuk el kvnjuk forgatni valahny bitteL A regiszter
als 3 bitje a rotls rtkt a 4-5. bit a kiraksi mdot hatrozza meg. Mgpedig a kvetkez mdon:
00 - fellrs
01 -AND kapcsolat
10- OR kapcsolat
11 - XOR kapcsolat

127

ffiM PC Gyakorlati Assembly


Ellenben ezen funkci miatt clszer a MOV utastst kerlni a kpernyre val rskor, helyette inkbb hasznljuk az
OR mveletet a 16 szn zemmdokban, mivel ha a mveleti
kd regisztert fellrsra lltottuk, akkor az biztos, hogy fellrst fog vgezni, brmilyen mvelettel tettk is ki az adott adatot. Ha azonban pldul OR vagy ms logikai mveletre lltottuk s MOV utastssal tesznk ki adatot a kpernyre, annak
eredmnye nehezen kiszmthat. Ez egy kicsit furcsa ugyan,
de ha nem a MOV utastst hasznljuk, akkor mindig a mveleti
kd regiszterben meghatrozott mveletet fogja vgrehajtani.
Lehetsg nylik tovbb arra is, hogy ne csak azt hatrozzuk meg, hogy melyik plane-re lehessen rni, hanem azt is, hogy
egy byte-on bell mely bitek legyenek rhatk s melyek rtkt
ne lehessen megvltoztatni. Ezt az adatvltoztats engedlyezse nev regiszter lltja, mely a vezrl 8. regisztere.

OUT 3deh,8; OUT 3dfh,00001111 b


Ezek utn mr nincs is ms dolgunk, mint a megfelel cmre a kvnt adatot kirakni. Ez a mdszer lett alkalmazva a 6.
programnl is.
A O. rsi mdban lehetsg van egy bels adat segtsgvel rni a kpernyre. Ekkor az ltalunk bert adaton kvl egy
elre belltott adatot is a kpernyre r a kvetkez mdon:
Mveleti kd reg.
XXXOOOOO (Fellrs)

Set-Reset
engedlyez

Eredeti adat
Plane3
Plane2
Pianel
PlaneO

Memria
lapoz reg.

Set-Reset
adat

x
l

jadat

xxxxxxxx

XXXXIIII

xxxxoooo
XXXXIOII
00001111
Adatvltoztats
engedlyezs

128

Grafika programozsa Assembly nyelven


XXXXlOll
Felhasznli
adat
EGA- VGA krtyk O. rsi mdja a SET-RESET hasznlatval

Ekkor tulajdonkppen az trtnik, hogy ha mveletet vgznk a kperny valamely rszn, a mvelet vgrehajtdik s a
SET-RESET engedlyez regiszter ltal kijellt plane-ek kzl
azok ahol az rs engedlyezett, a SET-RES ET adatregiszterben belltott rtket veszik fel, ahogyan ez az elz brn is jl
lthat.
A kvetkez rsi mdot leginkbb kiolvasskor rdemes
hasznlni, vagy pedig ha azt szeretnnk, hogy a kperny tartalmt vletlenl se lehessen megvltoztatni. Az 1-es rsi md lnyege ugyanis az, hogy azt az adatot rja a kpernyre, ami el
zleg is ott volt, ezltal semmi vltozs nem trtnik.
Mkdse:

Eredeti adat
Plane3
Plane2
Pianel
PlaneO

jadat

ll 00 l 00 l
00011001
o l o ll o l o
10000011

11001001
00011001
01011010
10000011

EGA - VGA krtyk 1. rsi mdja

A kvetkez rsi md hasonlt a O. md SET-RESET mdjhoz, de itt az adat, ami a bitskokba berdik, az a felhasznl
ltal bert adat, nem pedig egy elre belltott. Mkdse sorn
az engedlyezett plane-ek irhat bitjeit a hasznlt rtkekkel tlti
fel. Mkdse:
Mveleti kd reg.
XXXOOOOO (Fellrs)
Memria
lapoz reg.

Felhasznli adat
als 4 bitje

j adat

129

ffiM PC Gyakorlati Assembly


PianeJ
Plane2
Pianel
PlaneO

xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx

xxxxxxxx

XXXXIIII

xxxxoooo

XXXXII ll
00001111
Adatvltoztats
engedlyezse

EGA - VGA krtyk 2. rsi mdja

A VGA krtyknak van mg tovbbi egy rsi mdja, amikor az adatvltoztats engedlyezst nem csak a regiszter hatrozza meg, hanem a felhasznl ltal bert rtk s a regiszter
egyttesen hatrozza meg. A plane-ekre berd adatot pedig a
SET-RESET adat hatrozza meg a kvetkez mdon:
Mve/eti kd reg.
XXX 00 010 (Fel/rsi md 2 bitnyi forgatssalj

Set-Reset
engedlyez

Eredeti adat
Plane3
Plane2
Pianel
PlaneO

Memria
lapoz reg.

xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx

Set-Reset
adat

jadat

XXXIIXII
XXXIIXII

xxxooxoo

xxxxxxxx
OOO 11111
Adatvltoztats
engedlyezs
AND

o ll o lll

l
Felhasznli
adat

ll o ll o ll
A felhasznli adat
forgats utn

VGA krtyk 3. rsi mdja

Lthat, hogy az adatvltoztatst engedlyez regisztert


AND kapcsolatba hoztuk az ltalunk bert adat elforgatott rtkvel, s a SET-RESET adat csak arra a plane-re rdott be,
amely biteken a mvelet eredmnye 1 volt. a tbbit vltozatlanul

130

Grafika programozsa Assembly nyelven


hagyja. A forgats mrtkt a mveleti kd regiszter als 3 bitje
hatrozza meg. Jelen esetben 2 bit.
A 16 szn mdokban nem csak az rs trtnik a megszakottl eltren, hanem az olvass is. Ez kvetkezik abbl, hogy
itt egy byte-hoz nem 8 bit informci tartozik, hanem 32. Az egyszerbbik md, ahogyan ezeket olvasni lehet, hogy kivlasztunk
egy plane-t amelyik tartalmra szksgnk van, s egy egyszer MOV utastssal egy regiszterbe tltjk. Van azonban egy
msik lehetsg is, mgpedig egyszerre olvasni mind a 32 bitet.
No igen, ez nem frne bele egy byte-ba, de erre talltk ki, hogy
nem a bitek tartalmt kapjuk meg informcinak, hanem egy
elre belltott szn elfordulsnak helyt. Teht ha neknk egy
piros sznt kell keresni, egyszeren belltjuk a piros sznt a
sznfigyel regiszterben s a kpernytartalom olvassakor nem
az ott lev adatokat kapjuk eredmnynek, hanem azt, hogy az
olvasott kppontok kzl melyik piros. Ezenkvl lehetsgnk
nylik lapokat kizrni a figyelsbL Teht lehet, hogy a kpernyn van vilgos s stt piros is amik pldul egy bitjkben klnbznek. Ennek figyelst letilthatjuk, s mind a stt, mind a
vilgos piros sznre egyezst fog mutatni a gp olvasskor.
Ezen kt olvassi md mkdse:
Kperny

tartalom

Plane3
Plane2
Pianel
PlaneO

Kiolvassi
lapoz regiszter
XXXXXX ll

00 l o ll o l
01101010
00101010
ll o l 00 ll

A kiolvass
eredmnye

00 l

o ll o l

EGA - VGA krtyk O. kiolvassi mdja


Kperny

tartalom
Plane3
Plane2
Pianel
PlaneO

00 l o ll o l
ollllll o
00101010
ll o l o lll

Sznfigyels
maszkregiszter

Sz nfigyel
regiszter

131

IBM PC Gyakorlati Assembly


01010100

A kiolvass
eredmnye

EGA - VGA krtyk 1. kiolvasisi mdja

Amint az lthat, a 3. bitsk ki lett tiltva a figyelsbl igy


mindazon helyekre egyez rtket adott, ahol a 101 kombincit
tallta.
fikus

A kvetkezkben ismertetsre kerl az EGA zemmd gravezrljnek regiszterkiosztsa:

Portcm

Tipus

Funkci

JCEh

Csak rhat

Grafikus vezrl cmregisztere

JCFh

rhat. olvashat

Grafikus vezrl adatregisztere

OOh

csak rhat

SET-RESET adat regiszter


7-4: Nemhasmlt
3:
A 3. plane adata
2:
A 2. plane adata
Az l. plane adata
1:
A O. plane adata
O:

Ol h

csak rhat

SET-RESET engedlyez regiszter


7-4: Nem hasmlt
3:
A 3. plane engedlyezse
2:
A 2. plane engedlyezse
Az l. plane engedlyezse
1:
A O. plane engedlyezse
O:

02h

csak rhat

Sznfigyel

7-4:
3:
2:
1:
O:
Ol h

132

csak rhat

regiszter
Nem hasmlt
A 3. plane adata
A 2. plane adata
Az l. plane adata
A O. plane adata

Mveleti kd regiszter
7-5: Nem hasznlt
4-3: rsi mvelet kivlasztsa
00: Fellrs

Grafika programozsa Assembly nyelven

2-0:

Ol: AND kapcsolat


l O: OR kapcsolat
ll: XOR kapcsolat
Rotls rtke

04b

Csak rhat

Kiolvassi lapoz regiszter


7-2:
Nem hasznlt
1-0: Olvasni kvnt bitsk szma

OSb

Csak rhat

Mdregiszter
7-6: Nem hasznlt
5:
A video shiftregiszter vezrlse
O- Folytonos adattrols
l - Pros; pratlan adattrols
4:
Cmzsi md belltsa
O - Folyamatos memria cmzs
l - Pros; pratlan cmzs
3:
Kiolvassi md belltsa
O - Kzvetlen kiolvass
l - A sznfigyels eredmnye
2:
Grafikus vezrl kimeneteinek tiltsa
l - O: rsi md belltsa
00: O. rsi md
Ol: l. rsi md
l O: 2. rsi md
ll: 3. rsi md(Csak VGA krtyn)

06b

Csak rhat

Grafikus parancsregiszter
7 - 4: Nem hasznlt
3 - 2: Memriatartomny belltsa
Kezdcm
Hossz
00- OAOOO:OOOO
l28K
Ol- OAOOO:OOOO
64K
10- OBOOO:OOOO
32K
ll - OBSOO:OOOO
32K
l:
Pros; pratlan cmzs kezels
O:
Grafikus cmzsi md

07b

Csak rhat

Sznfigyels maszkregiszter
7-4: Nem hasznlt
3:
A 3. plane engedlyezse
2:
A 2. plane engedlyezse
l:
Az l. plane engedlyezse
o: A O. plane engedlyezse

133

ffiM PC Gyakorlati Assembly


08h

Csak rhat

Adatvltoztats engedlyezse
Az adatvltoztats engedlyezett azon
helyeken, ahol az engedlyez regiszter
rtke l

A VGA krtykon ezen regiszterek annyiban mdosulnak,


hogy nem csak rhatk, hanem rtkket ki is lehet olvasni.
Sz esett mr arrl, hogy az EGA illetve VGA krtyknak
van sajt karakterkszletk. A grafikus kpernyra trtn rs
azonban egy kicsit eltr a szveges zemmdtl, mivel itt nem
elg a bet kdjt kirni a kpernyre. Egy karakter megjelentse hasonl mdon trtnik, mint ahogyan egy bra kiraksa trtnt, valahol le van trolva a betk kpe, s a bet kdjtl fg
gen kivlasztjuk, hogy melyik alak felel meg az adott betnek
s azt kitesszk a kpernyre. gy brmilyen formj karakterkszlelet elllthatunk, de hasznlhatjuk a videokrtyban lv
ket is. Ezek cmnek meghatrozsra segtsgl szolgl a
BIOS 10h rutinjnak egyik funkcija. Egy szveg kiraksra van
egy egyszerbb, kevsb ignyes, rvidebb mdszer is. Ez termszetesen a ROM BIOS hasznlata. Erre lthatunk pldt a
kvetkez pldaprogramban:
[Program 22]
vga2

segment
assume cs :vga2,ds :vga2

start:

mov
mov

ds,ax

mov
int
mov
int

8ll,12h
l Oh
8ll,l123h
l Oh

;640*480/16 VGA md
;belltsa.
;8*8 pontos grafikus
;karakterkszlet betltse
;a ROM-bl

&ll,dS

;Ds regiszter rteket


;es-be is berjuk
;AO. lapra
;8 pontos betmrettel
;piros sznnel
;a l O, l O koordinlba

mov
mov
mov
mov
mov
mov

134

a:~~,vga2

es,ax
bh,O
bl,12
di,IO
dh, l O

;Szegmensdefinci.
;Cs s ds belltsa.
;Ds regiszter belltsa
;a szegmens elejre.

Grafika programozsa Assembly nyelven

TEXTI:
TEXT2:
TEXTJ:

mov
mov.
mov
int

Cll,59
bp,offset TEXTI
8ll,l300h
l Oh

;kirakjuk a TEXT! cmke


;alatt trolt 59 bets
;szveget.

mov
int

8ll,ll22h
l Oh

;8*14 pontos grafikus


;karakterkszlet betltse
;a ROM-bl

mov
mov
mov
mov
mov
mov
mov
int

8ll,l300h
bh,O
bl,l2
dl, l O
dh, l O
Cll,60
bp,offset TEXT2
l Oh

mov
int

8ll,ll24h
l Oh

mov
mov
mov
mov
mov
mov
mov
int

8ll,l300h
bb,O
bl,l2
dl, l O
dh, lJ
cx,60
bp,offset TEXTJ
l Oh

xo r
int
mov
int

Bli,BX
l6h
all,l
l Oh

mov
int

8li,4C00h
21 h

db
db
db
db
db
db

"Ez egy szveg a VGA grafikus "


"kpernyn 8*8 pontos betiikkel."
"Ez egy szveg a VGA grafikus "
"kpernyn 8*14 pontos betkkel."
"Ez egy szveg a VGA grafikus "
"kpernyn 8*16 pontos betkkel."

; 14 pontos betmrettel
;piros sznnel
;a 10,10 koordinlba
;kirakjuk a TEXT2 cmke
;alatt trolt 60 bets
;szveget.

;8* 16 pontos grafikus


;karakterkszlet betltse
;a ROM-bl

; 16 pontos betmrettel
;piros sznnel
;a 10,13 koordinlba
;kirakjuk a TEXT3 cmke
;alatt trolt 60 bets
;szveget.

;billentyvrs

;80*25 text kperny.

;Visszatrs a DOS-hoz

135

IBM PC Gyakorlati Assembly


vga2

eods
end start

;A szegmens vge.
;A program vge.

A program mkdse sorn a 10h BIOS rutin 2 alfunkcijt


hasznlja a szveg megjelentsre. Az egyikkel betlti a hasznlni kvnt karakterkszletet, a msikkal pedig kirakja a megadott szveget a kivlasztott lapra (ez a lap nem azonos a
plane-nel) a megfelel koordinlba a megfelel sznnel. A
program futtatsa sorn megfigyelhet, hogy a szvegeket
nagyjbl azonos tvolsgra teszi egymstl pedig az els kt
szveg koordintja megegyezik, csak a harmadik fggleges
pozcija lett kettvel megnvelve. Ennek oka, hogy a koordinta kiszmtsnl az adott bettpus mrett veszi alapul a gp.
s gy az els szveg 8 pont magas, a 2. mr 14 kppont magas
betkbl ll. Egy szveg ilyen mdon trtn kiraksnl az els lps, hogy betltsk a hasznlni kvnt karakterkszlelet
Ezt a 1Oh BIOS rutin 11 h programja vgzi. Al regiszterben megadaljuk, hogy melyik kszletet tltse be:
Al = 22h - 8*14 pontos grafikus karakterkszlet betltse
Al = 22h - 8*8 pontos grafikus karakterkszlet betltse
Al = 23h - 8*16 pontos grafikus karakterkszlet betltse
(csak VGA krtykon)
Ezutn jhet a kirats. Az es szegmensregiszterben kell
megadni a kirand szveg szegmenseimt bp regiszterben pedig az offsetcmt. A kiratst a 1Oh megszakts 13h rutinja vgzi. Al regiszterben klnfle alfunkcikat lehet belltani:
Al = OOh - A szveg csak a karakterek kdjait tartalmazza,
a sznt bl regiszterben kell belltani, a kurzort
nem mozgatja.
Al = 01 h - A szveg csak a karakterek kdjait tartalmazza,
a sznt bl regiszterben kell belltani, A kurzort
mozgatja.

136

Grafika programozsa Assembly nyelven


Al = 1Oh - A szveg a karakter s sznkdokatfelvltva
tartalmazza, a kurzort nem mozgatja.
Al = 11 h - A szveg a karakter s sznkdokat felvltva
tartalmazza, a kurzort mozgatja.
A tovbbiakban brmilyen 16 szn zemmdot hasznljunk is, az itt emltett informcik tbb-kevsb igazak, minimlis mdostssal alkalmazhatk.
Most a VGA krtyk egy jabb lehetsgrl, a 640*480/2
zemmdjrllesz sz. Ha mr tudjuk kezelni a 16 szn mdot.
akkor ezzel biztos, hogy nem lesznek problmink, mivel a felptse azonos a 16 szn md egy plane-jvel. Egy byte 8 kppontot tartalmaz, teht az adatok bittrkpesen troldnak, O a
httrszn, 1 a kivlasztott tintaszn. A mamriban a pontok trolsa linerisan egyms utn trtnik s az egyik sor utols
pontjt a kvetkez sor els pontja kveti. Az rs s olvass teljesen htkznapi mdon trtnik, egy egyszer MOV utastssal. Elnye, a gyors s egyszer kezelhetsg. A pldaprogramban egy bra kirakst mutatom be a 16 szn felbontsnl
hasznlt sznlltssal kombinlva:
[Program 23]
vga3

segment
assume cs:vgaJ,ds:vgaJ

;Szegmensdefinici.
;Cs s ds bellitsa.

start:

mov
mov

ax,vga3
ds,ax

;Ds regiszter bellitsa


;szegmens elejre.

mov
int

ax,llh
l Oh

;640*480/2 md belltsa.

mov
mov

ax,OaOOOh
es,ax

;A videomemria kezdeimt es
;szegmensregiszterbe tltjk.

mov
mov
mul
mov
mov

bx,word ptr [KOORD_YI ;Az bra bal fels sarknak


ax,80
;kiszmtsa
bx
di,ax
bi,S

137

IBM PC Gyakorlati Assembly


mov
div
mov
xo r
add
mov
mov
ro r
ro r
mov
mov

ax,word ptr [KOORD_X[


bl
cl,ab
ah,ah
di,ax
dl,lOOOOOOOb
;Beltmaszk
db,Olllllllb
;Trlmaszk
dl,cl
dh,cl
si,offset IKON
ex, l 6

.2_vga3:

push
mov
mov
sbl
je
and
jmp

di ex
c:x,16
a:x,[si)
a:x,l
.3_vga3
es:[di),dh
.4_vga3

.3_vga3:

or

es:[di),dl

.4_vga3:

ro r
ro r
je
inc

dl, l
db, l
.5_vga3
di

.5_vga3:

loop
pop
add
add
loop

.2_vga3
ex di
si,2
di,SO
. l_vga3

mov
mov
out
inc
mov
out
mov
out
mov
out

d:x,Jc8b
al,63
d:x,al
dx
al,byte ptr [PIROS)
d:x,al
al,byte ptr [ZOLD)
d:x,al
al,byte ptr [KEK)
d:x,al

.l_vga3:

.6_vga3:

138

;A CGA brakirak rutinhoz


;hasonlan ax regiszter
;forgatsval l-be illetve
;O-ba lltom a kperny;memria megfelel bitjeit

;A mveletet mind a 16 soron


;elvgzem.

;A:z bra belltsa a


;megfelel sznre.

Grafika programozsa Assembly nyelven


.7_vga3:

.8_vga3:

.9_vga3:

.lO_vgaJ:

.ll_vgaJ:

. 12_vga3:

xo r
int

ax,ax
l6h

cm p
jnz
mov
cm p
jnc
inc
jmp

al,"q"

;A q

.8_vga3
&1,63
byte ptr [PIROS),al
.7_vga3
byte ptr [PIROS)
6_vga3

;Piros sszetev nvelse


;ha mg nem 63 .

cm p
jnz
mov
cm p
jz
dec
jmp

al,"a"

;Az a

.9_vga3
ai,O
byte ptr [PIROS),al
.7_vga3
byte ptr [PIROS)
.6_vga3

cmp
joz
mov
cm p
jnc
inc
jmp

al,"w"

;A w billenty figyelse.

.lO_vgaJ
al,63
byte ptr [ZOLD),al
.7_vga3
byte ptr [ZOLD)
.6_vga3

;Zld sszetev nvelse


;ha mg nem 63 .

cm p
joz
mov
cm p
jz
dec
jmp

al,"s"

;Az s billenty figyelse.

.ll_vgaJ
al,O
byte ptr [ZOLD),al
.7_vga3
byte ptr [ZOLDJ
.6_vga3

cm p
joz
mov
cm p
jnc
inc
jmp

al,"e"

;Az e billenty figyelse.

.l2_vga3
al,63
byte ptr [KEK),al
.7_vga3
byte ptr [KEK)
.6_vga3

;Kk sszetev nvelse


;ha mg nem 63 .

cm p
joz
mov

al,"d"
.lJ_vgaJ
ai,O

billenty

figyelse.

billenty

figyelse.

;Cskkentse ha nem O.

;Cskkentese ha nem O.

;A d billenty figyelse.

139

IBM PC Gyakorlati Assembly


cm p
jz
dec
jmp
.13_vga3:

byte ptr (KEK),al


.7_vga3
byte ptr (KEK)
.6_vga3

cm p al,13
jnz .7_vga3

;ENTER billenty figyelse.

mov ax,J
10h
int

;Ha igen, 80*25 text kpemy.

mov ax,4c00h
21 h
int

;Visszatrs a DOS-hoz.
;Az egyes sznsszetevk

PIROS:
ZOLD:
KEK:

db
db
db

31
31
31

IKON:

dw
dw
dw
dw
dw
dw
dw
dw
dw
dw
dw
dw
dw
dw
dw
dw

0000011111100000b
OOOllOOOOOOllOOOb
OOlOOOOOOOOOOlOOb
0100110000110010b
Ol01011001011010b
1000110000110001b
1000000010000001b
l000000101000001b
1000000101000001b
1000001001000001b
1001000110001001b
0100110000110010b
0100011111100010b
0010001111000100b
0001100000011000b
OOOOOllllllOOOOOb

KOORD_X: dw
KOORD_Y: dw
vga3

;Cskkentse ha nem O.

312
232

en ds
end start

;kiindul rtke.

;Az bra X s Y koordintja

;A szegmens vge
;A program vge

Amint az lthat, a program egy kicsit egyszerbb mint a


CGA zemmdnl bemutatott kirak rutin. Mkdse szinte azonos vele, csak a cmkiszmts sokkal egyszerbb. Itt a kpernycimet gy kapjuk meg, hogy a fggleges koordinta rtkt

140

Grafika programozsa Assembly nyelven


megszorozzuk 80-nal, a vzszintes rtket elosztjuk 8-al s a
kettt sszeadjuk. A byte-on belli pozicit pedig az osztsnl
kapott maradk hatrozza meg. Itt ezt betltjk cl regiszterbe, s
a maszkregisztereket cl rtknek megfelelen forgatjuk. A httrszint itt is a O. paletta hatrozza meg, az eltr sznt azonban a 63. paletta vltoztatsval tudjuk befolysolni.

Az MCGA zemmd mkdse:


A kvetkezkben szmomra s sok programoz szmra is
az egyik legszimpatikusabb VGA md ismertetse kvetkezik.
Ez a 320"200-as felbonts 256 fle sznnel. Hogy mirt tetszik
olyan sok embernek ez az zemmd? Nos eddig a eimkiszmtsoknl a vzszintes koordintt osztani kellett, azutn a maradkkal forgatni, figyelni, hogy az brakiraksnl mikor rnk a
byte szlre stb. Nos itt ez nincs. Itt egy kppontot egy byte hatroz meg. Ugyanis csak gy lehet 256 fle sznt kirakni egy kpernyre. A sznek sorszma itt megegyezik a paletta sorszmval. A O. a httrszn, az psszes tbbi pedig tintasznknt alkalmazhat. A felbonts ugyan nem a legjobb, de a 256 fle sznlehetsg valamelyest krptol minket. A kperny-memria kezdcme itt is OAOOOh s a sorok linerisan egyms utn vannak
letrolva a memriban. A kvetkez mintaprogram egy sznes
bra kirakst mutatja be a hozz tartoz paletta belltssaL A
ksbbiekben ezt a rutint fogjuk tovbbfejleszteni egy komplett
egrkezel rutinn:
[Program 24]
vga4

segment
assume cs:vga4,ds:vga4

;Szegmensdefinicio.
;Cs s ds belltsa.

start:

mov
mov

ax,vga4
ds,ax

;Ds regiszter belltsa a


;szegmens elejre.

mov
mov

ax,OaOOOh

es,ax

;A videomemria kezdeimt
;es regiszterhe rjuk.

mov
int

ax,l3h
l Oh

;A 320*200/256 zemmd
;belltsa

141

IBM PC Gyakorlati Assembly

.l_vga4:

mov
xo r
out
inc
out

dx,Jc8h
ax,ax
dx,al
dx
d x, al

;Fekete httrszn
;belltsa

mov
mov
mov

ex, lJ
al, l
si,offset PALETTA

;A hasznlt 13 eltrszn
;belltsa a letrolt
;rtkeknek megfelelen.

push
dec
out
inc
mov
out
mov
out
mov
out
add
pop
inc
loop

ax
dx
dx,al
dx
al,[si)
dx,al
al,l[si)
dx,al
al,2[si)
dx,al
si,J
ax
al
.l_vga4

mov
mov
mul
mov
add
mov
mov

bx,word ptr (KOORD_Y]


ax,320
;A bal fels sarok cmnek
bx
;kiszmtsa.
di,ax
di,word ptr [KOORD_X)
si,offset IKON
;Az bra kiraksa.
cx,8

.2_vga4:

push ex di
mov cx,8

.J_vga4:

mov
mov
inc
inc
loop
pop
add
loop

142

al,[ si)
es:[di),al
di
si
.J_vga4
di ex
di,320
.2_vga4

Grafika programozsa Assembly nyelven

.4_vga4:

.S_vga4:

.6_vga4:

.7_vga4:

xo r
int

ax,ax
.16h

;billentyvrs.

xo r
mov
mov
mov

bx,bx
si,otJset PALETT A
u, l
cx,13

;A palettk grgetse.
;Si+b:x az els palettasznre
;mutat.
; 13 palettaszint kell
;lltani.

push b x

;A kezdrtket elmentjk,
;hogy tudjuk majd vlltoz;tatni az rtkt

push ax

;lltand paletta sorsz;mitak elmentse, hogy ksbb


;innen tudjuk folytatni.

mov
out
inc
mov
out
mov
out
mov
out
pop
inc
add
cm p
je
xo r

;A megfelel palettaszin
;vltoztatsa.

dx,3c8h
dx,al
dx
al,[si+bx)
dx,al
al,l[si+bx)
dx,al
al,l[si+bx)
dx,al

ax
ax
bx,3
bx,S4
.6_vga4
b x, b x

loop .S_vga4
pop bx
add bx,3
cm p bx,S4
je
.7_vga4
xo r
b x, b x
mov
int
jnz
mov

ax,lOOh
16h
.10_vga4
cx,02ftlh

;A kvetkez 3 sznkomponens.
;Ha a vgre rt, akkor jra
;elrl.

;A kezdrtket eggyel
;eltoljuk, ettl futnak a
;sznek. Ha elrte a vget,
;ismt elrl.

;Ha van lenyomott billenty,


;a befejezsre ugrik.
;Egy holtciklus beiktatsval

143

IBM PC Gyakorlati Assembly


.8_vga4:

loop
mov

.8_vga4
ds,Jdah

;lassitjuk a program futst.


;A program futsa csak akkor

.9_vga4:

in
test
jz
jmp

al,dx
al, l OOO b
.9_vga4
.4_vga4

;folytatdik, ha az elektron;sugr ppen a fggleges


;visszatrtst vgzi .

.IO_vga4:

xo r
int

ax,ax
l 6h

;A lenyomott billenty
;kiolvassa

mov
int

as,J
l Oh

;80*25 szveges kperny

mov
int

ax,4c00h
:ZI h

;Kilps a DOS-ba

db
db
db
db
db
db
db
db

l,:Z,3,4,5,6,7,8
2,3,4,5,6,7,8,0
3,4,5,6, 7,8,0,0
4,5,6,7,8,9,0,0
5,6,7,8,9,10,11,0
6,7,8,9,10,11,ll,l3
7,8,0,0,Il,l:Z,l3,0
8,0,0,0,0,13,0,0

IKON:

PALETTA: db
db
db

40,10,1 0,35,15,1 0,30,20,1 0,25,25,1 0,20,30,1 0,15,35,10


l 0,40,1 0,1 0,35,15,1 0,30,20,1 0,25,25,1 0,20,30,10,15,35
10,10,40,15,10,35,20,10,30,:Z5,10,25,30,10,20,35,10,15

KOORD_X: dw
KOORD_Y: dw

156
96

vga4

en ds
end start

;Az bra X s Y koordintja

;Szegmens vge
;Program vge

A program egy paletta-belltssal kezddik, feketre lltja


a htteret s az elre letrolt rtkeknek megfelelen belltja
az els 13 eltrsznt. Ezutn jn az ikon koordintinak kiszmtsa egy szorzssal s egy sszeadssaL Az igy kapott cmre
egy 8*8-as ciklus segtsgvel kirakjuk a trolt brt. Hogy ne a
mr megszakott ltvny truljon elnk, egy gombnyoms utn
egy ltvnyos m igen egyszer rutin lp mkdsbe. A trkk
lnyege, hogy grgeti az els 13 palettt s igy egy rdekes ef144

Grafika programozsa Assembly nyelven


fektust hoz ltre. A grgets itt gy lett megoldva, hogy le van
trolva egy 18 -elem paletta s ebbl kivlasztunk 13-at. El
szr a 1-13-ig utna 2-14-ig. Az 5-18 utn mivel nincsen 19. szn
letrolva, a 6-18,1 palettaszneket fogja az els 13 sznhelyre
berni. A lnyeg, hogy mindig 13 egyms utni sznt vlasztunk
ki, s a kezdpontot egy sznnel mindig arrbb toljuk. Ebben a
programban a billentyzetfigyels is mskppen lett megoldva,
mivel az eddiginl addig vrt a program, mg le nem nyomtunk
egy gombot. Itt ez nem megoldhat, mivel a program folyamatosan fut, csak egy billenty lenyomsakor kell hogy meglljon,
ezrt a 16h rutin egy msik lehetsge lett alkalmazva, mgpedig a billentyzet sttusz figyelse. A rutinbl val visszatrskor z jelzbit 1-es rtke mutatja ha nincs lenyomott billenty, O
ha van, ekkor kilps a programbl, de elbb ki kell olvasni a lenyomott billenty kdjt, mert klnben ez benne maradna a
billentyzet pufferben. Hogy a sznek futsa ne legyen darabos,
tredezett be lett ptve egy vertical blank figyels, gy biztos,
hogy akkor fogja a gp megvltoztatn i az bra szneit, amikor az
elektronsugr ppen visszafel halad a jobb als sarokbl a bal
felsbe.

Ezt a sznvarilst az egrkezel rutinban nem fogjuk alkalmazni, de aki gy gondolja, beleteheti. A program a koordintaszmtsig azonos az elzveL Az egrkezelst azonban egy
kicsit msknt fogjuk megoldani mint a 19. programban, mivel itt
elg ha arra figyelnk, hogy ne rakjunk nullkat a kpernyre.
Ha egy pontot kirakunk a kpernyre, az biztos hogy olyan szn
lesz amilyet akartunk, mivel itt lehet a MOV utastst hasznlni
az bra kirakshoz mert egy kppont egy teljes byte-ot foglal
s gy nem vltoztatja a krltte lev pontokat. Term~~tesen
az alatta lev kpet itt is el kell trolnunk mert az egr mozgatsa kvetkeztben elveszne. Egy tovbbi vltoztats teszi teljesebb a rutint, mgpedig, hogy a kpernyn kinn lesz ngy msik bra is, ezek valamelyikre rkattintva lehet a programbl kilpni. Ezzel a mdszerrel akrhny helyet lehet figyelni, mivel az
ellenrizni kvnt mezk bal fels s jobb als koordinlait kell
csak megadni felsorolsszeren egy tblzatban. A programba
a vertical biank-hez idzts mr szintn be van ptve:

145

ffiM PC Gyakorlati Assembly


[Program 25]
;Szegmensdefinicio.
;Cs s ds belltsa.

vga 5

segment
assume cs:vgaS,ds:vgaS

start:

mov
mov

ds,ax

;Ds regiszter belltsa a


;szegmens elejre.

xo r
int

8li,8X

;Az egr installlsa.

33 h

cm p
jnz

&ll,O
.l_vgaS

mov
int

ali,J
l Oh

;80*25 karakteres kp
;belltsa.

mov
mov

a:~~,Ob800h

;A szveges kperny

es,ax

;kezdcme

mov
mov

d i,52
ah,7

;O. sor 26. karaktere


;fekete alapon fehr
;betk lesznek.

mov
mov
cm p
jz
mov
add
inc
jmp

si,offset HIBATEXT
al,[si[
al,O
.2_hiba
es:[di[,ax
di,2
si
.l_hiba

xor
int
jmp

8li,8X

16h
kilepes

mov
mov

es,ax

;A videomemria kezdcimet
;es regiszterhe rjuk.

mov
int

3ll,l3h
l Oh

;A 320*200/256 zemmd
;belltsa

mov

dll,3c8h

;Fekete httrszn

.l_hiba:

.2_hiba:

.l_vgaS:

146

a:~~,vgaS

a:~~,OaOOOh

;Ha nincs hiba, akkor


;elkezddhet a program.

;Az egrhiba szveg kiratsa.


;Ha a szvegbe O kd van,
;az a szveg vgt jelenti.
;Ha nem, akkor kirhat a
;karakter.
;Kvetkez karakter mindaddig,
;mg a O kdhoz nem
;r a program
;billentyvrs

Grafika programozsa Assembly nyelven

.2_vga5:

.3_vga5:

.4_vga5:

xo r
out
inc
out

u, u
lb, al
dx
lh,al

;belltsa

mov
mov
mov

cx,l4
al, l
si,oft'set PALETTA

;A hasznlt 14 eltrszn
;belltsa a letrolt
;rtkeknek megfelelen.

push
dec
out
inc
mov
out
mov
out
mov
out
add
pop
inc

u
dx
dx,al
dx
al,[ si)
dx,al
al,l[si)
d x, al
al,2[si)
dx,al
si,3
u
al

loop

.2_vga5

mov
mov
cm p

si,oft'set ITABLA
ax,[si)
ax,Offflh

jz
mov
mov
mov
push
mov
call
call
pop
add
jmp

.4_vga5
;A Offffb kd jelzi a
bx,2[si)
;koordinta felsorols vgt.
word ptr [KOORD_X),u
word ptr [KOORD_ YJ,bx
si
si,oft'set IKON2
cimki
;Az ikon memriacmnek
kirako
;kiszmtsa s kiraksa.
si
si,4
.3_vga5

mov
int
mov
mgv

all,3
;Az egr kezd koordintinak
33 h
;belltsa
word ptr [KOORD_X[,cx
word ptr [KOORD_Y[,dx

;Az ITABLA cmke alatt


;trolt koordintkra
;kirakja a kilp ikonokat.

147

ffiM PC Gyakorlati Assembly


.S_vga5:

.6_vga5:

. 7_vga5:

.8_vga5:

.9_vga5:

kilepes:

148

call

cimki

;Az egr memriacmnek


;kiszmtsa.

call

elrako

;Az ikon alatti kp


;eltrolsa

call

eger

;Az ger kiraksa

mov
int
test
jz
call

8JI,3
33 h
bx,J
.7_vga5
gombok

;Figyeli, hogy van-e


;lenyomott gomb

joe

ki lepes

;Ha a rutinbl val vissza;trskor c flag O rtk,


;az azt jelenti, hogy egy
;bra terletn nyomtuk
;le az egr valamelyik
;gombjt s ekkor kilps.

call

mozgas

;Az elmozduls vizsglata.

jz

.6_vga5

;Ha van elmozduls, z=O

cm p
je
mov
cm p
je
mov

cx,625
.8_vga5
cx,624
dx,193
9_vga5
dx,l92

;A kpernybl val
;kicsszst is figyelni kell,
;ha nagyobb a maximumnl
;akkor a maximumrtket
;kell visszalltani .

mov
mov
mov
int
call

word ptr [KOORD_X),cx ;Az j egrkoordintkat


word ptr [KOORD_Y),dx ;a memriavltozkba ljuk.
ax,4
33 h
vertbl
;Idzts a vertical bl-hez.

mov
call
jmp

si,offset HELY
kirako
.S_vgaS

;Az eltrolt kpet vissza;rakjuk a helyre

mov
int

ax,J
l Oh

;80*25 szveges kperny

;Ha van, ugrik a vizsgalatra.

Grafika programozsa Assembly nyelven


mov
int
eger

.2_eger:

.3_eger:

;Kilps a DOS-ba

proc
mov
mov
mov

.l_eger:

ax,4c00h
21 h

di,word ptr (CIM)


si,olfset IKON
cx,S

push ex
mov cx,S

;Az ikon 8 kpsor magas

;s 8 pont szles.

mov
cm p
jz

al,[si[
al,O
.3_eger

;Megvizsgljuk, hogy az
;ikon adott panijt ki kell-e
;rakni. Mert ha a pont rtke
;O, akkor azt nem szabad
;kirakni, mert az trln
;az egr krltti kpet.

mov

es:[di),al

;A hasmos pont kiraksa.

inc
inc
loop
pop
add
too p

di
si
.2_eger
ex
di,312
.l_eger

;A kvetkez pont.

;A kvetkez sor.

ret
eger

end p

elrako

proc
mov
mov
mov

si,word ptr (CIM)


di,olfset HELY
cx,S

.l_elrako:

push ex
mov cx,4

.2_elrako:

mov
mov
add
add
loop

ax,es:[si)
[di[,ax
d i,2
si,2
.2_elrako

;Egy 8*8-as ciklus


;segitsgvel a d ltal
;meghatrozott helyrl
;a HEL Y cmre troljuk a
kpet.

;kpernyn lv

149

ffiM PC Gyakorlati Assembly


pop
add
loop

CI

si,Jll
.l_elrako

ret
elrako

end p

kirakoproc

.l_kirako:

mov
mov
push
mov
rep
pop
add
loop

di,word ptr [CIM)


cx,8
CI

cx,4
movsw

;A forrs helyt elre


;belltottuk si-be.
;Igy 8*4 \\Ord-t ds:si-rl
;es:di-re msol.

CI

di,Jll
.l_kirako

ret
kirakoend p

verthi

.l_vb:

.l_vb:

proc
mov
in
test
jz

dx,Jdah
al,dx
al, l OOO b
.l_vb

in
test
joz

al,di
al,lOOOb
.l_vb

ret
vertbl

end p

mozgas

proc
mov
int
cm p

150"

ax,J
;Az egr koordintit
33 h
;sszehasonltja az elz
cx,word ptr [KO ORD_XI ;Jetrolt rtkkel, s ha

Grafika programozsa Assembly nyelven


jnz
emp

l_mozgas:

ret

mozgas

endp

cimki

proe

.l_mozgas
;eltrst tall (az egr
dx,word ptr [KOORD_Y) elmozdult) akkor z=O
;rtkkel tr vissza a hv
;programhoz.

mov bx,word ptr [KOORD_Y) ;A bal fels sarok cmnek


mov ax,320
;kiszmtsa.
mul bx
mov di,ax
mov ax,word ptr [KOORD_X)
shr ax,l
;A eimkiszmtsnl figyelembe
add di,ax
;kell venni, hogy a vizszintes
mov word ptr [CIM),di
;koordinta duplja lett
;letrolva az egr sajtossga
;miatt.
ret
cimki

endp

gombok

proe
mov

si,offset GTABLA

.l__gombok: emp [si),Oft'ffb

;A GTABLA cmke alatt trolt


;terleteke! fogja
;ellenrizni a program,
;melynek a vgt egy OfHfh
;kd jelzi.

jz

.J__gombok

;Ha ezt elrte, nem volt


;a vizsgland helyek
;semelyikn az egr, c= l
;paramterrel tr vissza.

mov
mov
emp
je
em p
je

ax,[si)
bx,l[si)
word ptr [KOORD_X),ax
.l__gombok
word ptr [KOORD_ Y),bx
.2__gombok

;A bal fels koordinta


;vizsglata. Ha az egr
;valamelyik koordintja
;kisebb ezeknl biztos, hogy
;nem esik az adott helyre.

151

ffiM PC Gyakorlati Assembly


mov
mov
cm p
je
cm p
je

u,4[si)
bx,6[si[
u,word ptr [KOORD_X)
.2_gombok
bx,word ptr [KOORD_Y)
.2_gombok

;Ha idig ein a program,


;akkor az egr egy bra
;valamely pontjra mutat.
;Ez esetben visszatrskor
;c jelzbit O nk.

ret

.2_gombok: add
jmp

;A jobb als sarok vizsg;tata. Ha az egr brmely


;koordintja nagyobb
;ezeknl, teht ha a vizsglt
;ponttl akr jobbra akr
;lejjebb van biztos, hogy
;az egr nem egy brra
;mutat.

si,8
.1_gombok

;A kvetkez mez vizsglata .

;Az egr az egyik vizsglt


;mez fltt sincs, vissza;trskor c= l.

.3_gombok: stc
ret

gombok

end p

IKON:

db
db
db
db
db
db
db
db

1,2,3,4,5,6,7,8
2,3,4,5,6,7,8,0
3,4,5,6,7,8,0,0
4,5,6,7,8,9,0,0
5,6,7,8,9,10,11,0
6,7,8,9,10,11,12,13
7,8,0,0,11,12,13,0
8,0,0,0,0,13,0,0

IKON2:

db
db
db
db
db
db
db
db

14,14,14,14,14,14,14,14
14,0,0,0,0,0,0,14
14,0,14,0,0, 14,0,14
14,0,0,14,14,0,0,14
14,0,0,14,14,0,0,14
14,0,14,0,0,14,0,14
14,0,0,0,0,0,0,14
14,14,14,14,14,14,14,14

;A kilps ikonja

HELY

db

64 dup (O)

;Ide trolja le a program


;az egr alatti kpet.

152

;Az egr ikonja.

Grafika programozsa Assembly nyelven


PALETTA: db
db
db

40,10,10,35,15,10,30,20,10,25,25,10,20,30,10,15,35,10
10,40,10,10,35,15,10,30,20,10,25,25,10,20,30,10,15,35
10,10,40,63,63,63

IT ABLA:

dw

60,30,:Z40,50,24,170,600,140,0fft'fh

GTABLA:

dw
dw

60,30,74,37,240,50,254,57,24,170,38,177
600,140,614,147,0fft'fh

KOORD_X:dw
KOORD_Y:dw

156
96

CIM:

HIBATEXT:
vga5

dw

db
en ds
end start

;Az bra X s Y koordintja

"Az egr nem installlhat !",O


;Szegmens vge
;Program vge

A program szoksos mdon egy egrinstallls utn egy


paletta belltssal kezddik, majd az ITABLA tblzatban trolt
koordintkra kirakja a kilpst szimbolizl brkat. Az brk
memriacmnek kiszmtst mr kln rutin vgzi. mivel ha
minden kirakshoz odaraktunk volna egy cmkiszmt rutint, a
program hossza a ktszeresre ntt volna. s van mg egy el
nye a dolognak, mivel gy nyugodtan szmolhatunk 640"200 felbontssal, mert a cmkiszmt rutin ezt fgyelembe vve szmolja a memriacmet. Egybknt az egrkezel eljrsok lettek
volna sokkal bonyolultabbak. Ezutn belltjuk az egr kezd
pozcijt, s a mr ismert mdon, csak egrmaszk nlkl kezeljk az egr mozgst mindaddig, mg nincs lenyomva az egrnek az egyik gombja sem. Amint lenyomtuk valamely gombot,
elindul egy ellenrz rutin, ami az aktulis egrpozcit sszehasonltja a GTABLA cmknl letrolt mezk koordintival.
Amennyiben a mez bal fels sarktl balra illetve feljebb, vagy
a jobb als saroktl jobbra illetve lejjebb van az egr akkor biztos, hogy nem mutat a vizsglt mezre. Ebben az esetben a kvetkez terletet kell vizsglni. Ha nincs tbb mez, akkor egyik
fltt sem volt egernk ezrt folytatdhat a program ott ahol ppen tartott. Ha egy mez fltt volt, akkor kilp a programbl.
Egy kicsit vltoztatva lett a vertical blank rutinon is mivel elfor
dulhat azaz eset is amikor a kperny fels rszn van az egr

153

IBM PC Gyakorlati Assembly


s ppen a visszafuts legvgn kezdjk el kirakni az brt.
Ilyenkor szintn furcsasgok trtnnek. A legbiztonsgosabb a
visszafuts legelejt elcspni. Ezt gy lehet elrni, hogy a vertical blank rutin megvrja mig az elektronsugr rajzolni fog, ezt
vgigvrja s ezutn rgtn kvetkezik a kpkiraks. gy biztos,
hogy a vb. legelejn kezdtk el kirakni az brnkat Figyelni kell
arra is, hogy korltlan mret bra kirakst ezzel a mdszerrel
nem idzthetjk mivel csak egy bizonyos szm mveletet kpes a processzor ezen rvid visszafutsi id alatt elvgezni. Teht nagyobb brk idztett kirakst ms trkkkkel kell megoldani.
Rajzols a kpernyre:
A tovbbiakban ismt egy klasszikus problmval fogunk
foglalkozni mgpedig a vonalrajzolssaL Aki egy kicsit rt a matematikhoz, ismeri az egyenes egyenlett amivel egy vonal
egyes pontjainak koordintjt knnyedn kiszmthatjuk. Addik azonban egy problma, ami megnehezti a feladat ilyen mdon trtn megoldst, ugyanis a szmtgp nem ismeri a trt
szmokat. Sajnos csak egsz szmokkal hajland mveleteket
vgezni. Megtehetjk. hogy runk egy lebegpontos aritmetikt
melynek segtsgvel hasznlhatunk trt szmokat is. Ez is egy
megolds azonban ehhez nem rt, ha egy gyat is magunk mell kszitnk (no nem azrt, mert belefradunk a kd megrsba, ami ugyan nem knny) mivel az eredmnyt kivrni elg sok
idbe telne. Ugyanis gy a program minden egyes pont kiszmtsnl az ltalunk megirt szmol rutint hasznln, ami sokkal
tovbb tart. mint az egsz szmokkal val mvelet. Teht a
megolds egy msik algoritmus. amivel legelszr a ZX
Spectrum ROMjban tallkoztam. Ez nem jelenti azt. hogy ez
egy elavult mdszer hiszen mindmig tbb helyen is lttam alkalmazst. A mvelet lnyege, hogy elszris kivlasztjuk a
kezdpontot Ezutn megnzzk, hogy a vgpont milyen irnyban s milyen tvolsgra van ettl, mindez x s y sszetevkre
lebontva. Alapveten kt vonaltipust klnbztetnk meg s
ezeket mr a program elejn kln kell vlasztani egymstl. A
klnbsg az irnyukbl addik, ugyanis az algoritmus lnyege,
hogy az egyik sszetevt minden lpsben nveli eggyel s kiszmolja az ehhez tartoz msik sszetevt. Ha nem bontannk
154

Grafika programozsa Assembly nyelven


kln a kt tpust, akkor elfordulhatna olyan eset, amikor pldul a 0,0; 10,100 vonalat kne kirajzol ni s mi az x koordintt
nveljk egyesvel, az y-t szmtjuk. Ekkor a vonalbl mindssze 10 pont ltszana. Teht az egyenes kiraksa eltt el kell
dntennk, hogy a x illetve az y sszetevje nagyobb a vonalnak. Ezt egy kivonssal s sszehasonltssal elvgezhetjk. Az
elbb emltett pldnl az x sszetev 1O-O azaz 1O az y pedig
100-0 teht 100, ebbl addan mindig a nagyobbikat vlasztjuk
ki a lpkedsre ugyanis gy biztos, hogy az egyenes minden
pontja a kpernyre kerl. Fontos. mg az is. hogy az egyenes
vgpontja milyen irnyban helyezkedik el a kezdponthoz kpest. mivel, ha annak valamely koordintja kisebb, akkor azt
cskkenteni kell. Ezt a programban gy oldottam meg, hogy
nem kivonok belle, hanem hozzadok -1-et (65535-t) az eredmny ugyanaz mivel a regiszter krbeforduL A vonal pontjait kiszmt mdszer igen egyszer, mindssze annyit kell tenni,
hogy egy regiszterhez minden lpsben hozzadom a kisebbik
koordinta sszetevt, s sszehasonltom a nagyobbikkaL Ha
kisebb, nincs oldalirny lps, ha nagyobb akkor kivonjuk a regiszterbl azt s tesznk egy lpst oldalirnyba is. gy mire a
vonal vgre rnk, amit egy ciklussal lltunk a nagyobbik
mret +1-re, pontosan a kijellt ponthoz rnk.
[Program 26]
Vga6

Segment
assume cs:Vga6,ds:Vga6

; Szegmensdefinci
;Cs, ds hozzrendelse
:a szegmensregiszterekhez.

Start:

mov
mov

ax,Vga6
ds,ax

;Ds belltsa a kd elejre.

mov
mov

ax,OaOOOh
es,ax

;Es belltsa a kpemy


;memria szegmenscmre.

mov
int

ax,llh
l Oh

;320*200/256 felbonts
;belltsa.

call

Line

;A vonalhz rutin futtatsa.

xo r
int

ax,ax
l 6h

:Billentyvrs.

155

IBM PC Gyakorlati Assembly

Line

.l_Line:

.l_Line:

mov
int

ax,J
l Oh

;Vissza a Text kpemyre.

mov
int

ax,4c00h
l lh

;Vissza a DOS-hoz.

mov
mov

bx,word ptr [Xa)


ax,word ptr [Xb)

;A vonal kezdpontjnak s
;vgnek x koordintjt
;berja ax,bx regiszterekbe.

mov

dx,l

;A vzszintes lpskz.

sub

ax,bx

;Kiszrntja a kt pont kztti


;tvolsgo!.

j ne

.I_Line

;Ha ez nem negatv, tugolja


;a kvetkez rszt.

n eg

ax

;A tvolsg valdi rtknek a


;kiszmtsa.

mov

dx,65535

;A vzszintes lpskzt -l-re


;lltja.

mov
mov
mov

word ptr [DELTA_X),ax ;A regisztereket berja a


word ptr (PONT_X),bx ;memriavltozkba.
word ptr (SGN_X),dx

mov
mov
mov
sub
j ne
n eg
mov

bx,word ptr [Y a)
ax,word ptr [Yb)
dx,l
a x, b x
.l_Line
ax
dx,65535

RIOV

word ptr [DELTA_Y),ax


word ptr (PONT_YJ,bx
word ptr [SGN_Y],dx

mov
mov
cm p

156

;A vonalhz rutin kezdete.

Proc

;Ugyanaz, ami a vzszintes


;rtkeknl trtnt.

ax.word ptr JDELTA_Xl ;Eldnti, hogy a vonal milyen


;uny.

Grafika programozsa Assembly nyelven


je

.l_Vizsz

;Ha a vzszintes sszetevje


;a nagyobb. arra az eljrsra
;ugrik.

mov
shr

dx,ax
dx,l

;Egybknt az algoritmus
;nvekmnyt szmll
;regiszterbe behja a vonal
;vzszintes hossznak a felt.

mov
inc

cx,ax
ex

;A ciklusszmllba pedig a
;hossznl eggyel tbbet.

;Fuggoleges

.l_Fuggo:

.2_Fuggo:

push dx

;Szmll elmentse.

call

Pont

;Az aktulis pont kiraksa.

pop
mov
add
add
cm p
je

dx
ax,word ptr (SGN_Y]
;Az algoritmus szerinti
word ptr [PONT_Y],ax ;kvetkez pont koordintainak
dx,word ptr [DELTA_X] ;kiszmtsa.
dx,word ptr [DELTA_Y]
.2_Fuggo

sub
mov
add
loop

dx,word ptr [DELTA_Y]


ax,word ptr (SGN_X]
word ptr (PONT_X],ax
.l_Fuggo

re t
; Vzszintes
.l_Vizsz:

mov
mov
inc
shr

cx,word ptr [DELTA_X] ;Hasonlan mint a fggleges


dx,cx
;eseteben trtnt, itt is
ex
;azok a mveletek hajtdnak
dx,l
;vgre, csak az ellenkez

.2_Vizsz:

push
call
pop
mov
add
add
cm p

dx
;koordintkkal.
Pont
dx
ax,word ptr (SGN_X]
word ptr [PONT_X],ax
dx,word ptr [DELTA_Y]
dx,word ptr [DELTA_X]
.3_Vizsz

je

157

ffiM PC Gyakorlati Assembly

.3_Vizsz:

sub
mov
add
loop

dx,word ptr [DELTA_X)


ax,word ptr [SGN_Y)
word ptr [PONT_Y),ax
.2_Vizsz

re t
Line

En dp

Pont

Proc
mov
mov
mov
mul
add
mov
mov
ret

di,word ptr [PONT_X)


ax,word ptr [PONT_Y)
bll,320
bx
di,ax
al,byte ptr [COLOR)
es:[di),al

:A pont koordintibl ki
:kell szmolni annak eimt
:a kpernyn, amit a szekott
:mdon egy szorzssal s egy
:sszeadssal tesznk.
;Majd a megadott sznnel
;kirakjuk a pontot a megfelel
;helyre.

Pont

End p

PONT_X:
PONT_Y:

dw
dw

?
?

;A ki rakand pont xy
;koordintja.

Xa:
Ya:

dw
dw

50
50

;A vonal kezdpontjnak
;koordintai.

Xb:
Yb:

dw
dw

200
100

;A vonal vgpontjnak
;koordintai.

DELTA_X: d w
DELTA_Y: d w

?
?

;A vonal vzszintes mrete.


;A vonal fggleges mrete.

SGN_X:

dw

;A vzszintes lpskz s
;irnya.

SGN_Y:

dw

;A fggleges lpskz s
;irnya.

COLOR:

db

;A vonal szne.

Vga6

En ds
End Start

158

;A szegmens vge.
;A program vge.

Grafika programozsa Assembly nyelven


A program a szoksos belltsokkal kezddik. Ezutn kvetkezik a vonalrajzol rutin indtsa, majd billentyvrs, paramterek visszalltsa s visszatrs a DOS-hoz. A vonalrajzol
azrt lett eljrsba tve, hogy knnyedn felhasznlhat legyen
ms rutinokban is. Azonban a sajt programban val felhasznls eltt nem rt nmi vltoztats. Clszer kihagyni a pontkirak rutint, s a szmt rutinoknl nem a koordintt hanem a
memriacmet vltoztatni. Tovbb rdemes a lehetsgekhez
kpest minl kevesebb memriavltozt hasznlni s amit csak
lehet regiszterekkel megoldani ugyanis gy nagy mrtkben
gyorsthatjuk a programunk mkdst.
A rutin els lpsben a vonal kezd- s vgpontjnak vzszintes koordinti vonja ki egymsbl. Ezzel megtudva a kt
pont tvolsgt s egymshoz kpesti elhelyezkedst.
Amennyiben a kivons elvgzse sorn carry flag rtke 1 llapotba ll, az azt jelenti, hogy a vgpont x koordintja kisebb
mint a kezdpont teht majdan nem nveini kell rtkt hanem
cskkenteni, ezt gy oldottam meg, hogy a koordinlhoz hozzadok 65535-t, aminek ugyan az a hatsa, mintha kivontam
volna rtkbl egyet. Ezrt a dx regiszter elzleg 1-re lltott
rtkt megvltoztatom a mr emltettre. Ezenkvl el kell vgezni egy kettes komplemens kpzst is mivel a kivons eredmnye nem a kt pont abszolt tvolsga, hanem annak komplemense ezrt azt neglni kell. Ezutn mr a valdi tvolsgot
fogja mutatni a regiszter. Ha elvgeztk a kvnt mveleteket. az
eredmnyket memriavltozkba rjuk majd megismteljk a
lertakat a fggleges koordintkkal is. Ezzel a vonal kirajzolshoz minden szksges elkszt mveletet elvgeztnk. A
tovbbiakban mr csak az a dolgunk, hogy a vonal x illetve y
sszetevjtl fggen eldntsk, hogy melyik rutint indtsuk el.
Az algoritmus els lpse.hogy belltja a szmlljt a nagyobbik xy rtk felre. Ezt azrt teszi mert a rutin mkdsbl
addan ha nullrl indtannk azt. akkor a hzott vonalban a
trspontok nem a megfelel helyen lesznek, pl, ha a 0,0 pontbl a 100,0 pontba hznnk egy vonalat. a trs nem az 50.
pontnl lenne hanem valahol a 99. krnykn, de ha a szmll
kezdrtke nem nulla, hanem az emltett rtk, akkor a prob-

159

IBM PC Gyakorlati Assembly


lma nem jelentkezik. Msodik lpsben meghatrozza a ciklus
hosszt. Ezt gy teszi, hogy veszi a nagyobbik sszetevt, s
megnveli eggyel, amit azrt tesz mert ha a 0,0 pontbl az 1,1
pontba hzunk egy vona lat. akkor a kt pont kztti tvolsg 1,
de neknk kt pontot kell kitenni.
Ezt kveti a pont kiraksa, ami a mr ismert mdon trtnik, ezrt itt kln nem trek r ki.
Ha ez megtrtnt, veszi a hosszirny lpskzt (1; 65535)
amit a hosszirny koordinthoz ad. Ezt minden esetben meg
kell tenni. Majd a szmllhoz hozzadjuk a kisebbik sszetev
rtkt, s sszehasonltjuk a nagyobbik sszetev rtkveL
Ha annl kisebb vagy egyenl, tugorja a kvetkez pr utastst s jabb hosszirny lpst tesz. Amennyiben rtke mr
nagyobb, akkor a szmllbl ki kell vonni a nagyobbik xy rtket, hogy jbl nveini lehessen, majd a oldalirny lpskz
rtkt a oldalirny koordinlhoz adjuk s amg a ciklus el
nem fogy, ismtli ezeket a mveleteket. Aki gy gondolja, papron kiprblhatja az algoritmus mkdst.
A kvetkez hasznos tma, amivel foglalkozni kvnok, az
a kperny egy ablaknak mozgatsa valamely irnyban. Az
ilyen programokat hvjk scroll rutinoknak. Ezek ltalban egy
pixelponttal jobbra, balra, flfel vagy lefel mozgatjk az
ablakon belli kpet. Ennek tbbfle megoldsa ltezik, az
egyik, amikor az ablak szln kicssz adat elvsz s a msik
oldalrl res kppontok jnnek be. vagy a kp "vgtelentve
van" azaz, ami kiment az a msik oldalrl bejn, vagy lehet mg
pldul olyan, amit fknt ltvnyosabb kpernytrlsre
szaktak hasznlni. hogy tbb rszletben mint egy redny
magba fordul a kinnlv kp. Nos ezek mindegyikre lthatunk
majd egy oldal illetve egy fggleges irny megoldst. de
elbb a mkdskrl egy pr sz: tulajdonkppen mindegyik
azon alapszik. hogy a kperny-memria egy rszt mshov
msoljuk t. Hogy hov, az a scroll rutintl fgg. pldul egy
vzszintes serclinl amikor nincs szksgnk a kicsordul
rszre. akkor egyszeren egy kpponttal arrbb msoljuk a kije160

Grafika programozsa Assembly nyelven


llt terletet. Vgyzni kell azonban arra, hogy nem mindegy hogyan msolunk. Clszer a onnan kezdeni, ahol kiesnek a pontok, s els lpsben a legszls helyre msolni az eggyel beljebbit majd a kettvel beljebbit az elz helyre s gy tovbb.
Fellp itt is az a problma, hogy mekkora terletet tudunk egy
kpvlts alatt a kpernyn arrbb mozgatni, ugyanis itt mr nagyon csnyn eljnnek a trsek, ha nem idztjk megfelelen a mozgatst. A fggleges irny rutinoknl azonos a helyzet. Akkor, ha azt szeretnnk, hogy krbe forogjon az bra, akkor kt lehetsgnk van, az egyik, hogy eltroljuk a kies kppontokat valahov a memriba s a mozgats vgn kirakjuk
az els pont helyre, vagy ami egy kicsit lassabb, de nem szKsges hozz httrmemria, az a kppont cserlgets eljrs,
amikor szintn a vgrl indulva megcserljk a kt utols pontot egymssal majd egy ponttal beljebb lpnk mindaddig, mg
el nem rjk a kijellt terlet vgt. gy a cserlgetsek hatsra
az utols pont az els helyre vndorol. A redny vagy ms nven fodros serclioknl az els rutinhoz hasonlan jrunk el,
mindssze annyi klnbsggel, hogy nem az egsz kpet mozgatjuk egyszerre, hanem sok klnll rszre bontva pldul 8
pixelenknt mozgatjuk, gy rjk el azt a hatst mintha egy redny mg csszna a kp.
[Program 27]
Vga 7

Segment
assume cs:Vga7,ds:Vga7

;Szegmensdefinci
;Cs.ds hozzrendelse

Start:

mov
mov

ax,Vga7
ds,ax

;Ds regiszter belltsa a


;program elejre.

mov
int

ax,l3h
l Oh

;320*200/256 zemmd
;bekapcsolsa

mov
mov

ax,OaOOOh
es,ax

;A kperny-memria kezdeimt
;es regiszterbe tlti

xo r

ax,ax

;A szmek kezdrtke.

mov

ex, l 6

;Fggleges

mov

di,92*320+144

;Az bra kezdcme.

sorok szma/2

161

IBM PC Gyakorlati Assembly


.t_Vga7:

.2_ Vga7:

pqsh ex

mov

Cll, l 6

;A vzszintes pontok szma/4

mov
mov
mov
mov

es:[di),ax
es:J20[di),all
es:2[di),all
es:J22[di),all

;A sznel< kiraksa.

inc
inc

al
ah

;Kvetkez

szn

add
loop
add
pop
loop

di,4
.2_Vga7
di,576

;Kvetkez

kppont.

mo
.J_Vga7:

Korbe_Bal

;Egy j sorra qgrik.

ex
.t_Vga7
Cll,l28

pqsh ex
call Korbe_Fel
call Korbe_Bal
Szunet

;A mozgatsok szma.

;A scroll rutin(ok) hvsa

;A sebessg cskkentse.

call
pop

ex

loop

.J_Vga7

;A ciklus ismtlse, mg Cll


;nem nulla.

xo r
int

all,ax
16h

;Billentyvrs.

mov
int

all,l
l Oh

;80*25 karakteres md
;belltsa.

mov
int

all,4c00h
21 h

;Visszatrs az opercis
;rendszerhez.

;A:z eljrs kezdete.

Proc
call

162

;Az egymsba gyazott ciklqs


;miatt el kell menteni Cll
;rtkt.

Vert_Dl

;Idzts

hvsa.

Grafika programozsa Assembly nyelven

.l_KB:

.2_KB:

mov

di,92"320+144

;Az ablak kezdcme.

mov

cx.32

;A sorok szma.

push ex
mov ex,63

;A vzszintes mret-1

mov ax,es:[di)
xe hg al, ah
mov es:[di),ax

;Az adott pozcikban lev


;kppontok felcserlse.

inc
loop

di
.2_KB

;Kvetkez

pop
add
loop

ex
di,257
.l_KB

;A kvetkez sorra lp.

kppont.

ret

;Visszatrs a hv programhoz

Korbe_Bal

End p

;Az eljrs vge.

Korbe_Fel

Proc
call

Vert_BI

mov
mov

di,92"320+144
cx,JI

.I_KF:

push ex
mov cx,32

.2_KF:

mov
mov
mov
mov

ax,es:[di)
!Jx,es:320[di)
es:[di),bx
es:320[di),ax

add
loop

di,2
.2_KF

pop
add
loop

ex
d,256
.l_KF

;Mivel fgglegesen mozgatjuk


;az alakzatot s pros szm
;a szlessge, lehet egyszerre
;egy .wrdt mozgatni.

ret

163

ffiM PC Gyakorlati Assembly


Korbe_Fel

Endp

Mozgat_Bal Proc

.l_MB:

.l_MB:

call

Vert_81

;Idzts.

mov

di,9l*3l0+144

;A:z ablak cme.

mov

n,3l

;A sorok szma

push ex
mov n,63

;A vzszntes kppontok-l

mov
mov

al,es:l(di)
es:(di),al

;A:z adott kppont tmsolsa


;a mellette lev pozciba.

inc
loop

di
.l_MB

;Kvetkez

xo r
mov

al,al
es:(di),al

;A:z utoljra mozgatott pont


;helyere nullat rva trljk azt.

pop
add
loop

ex

;Egy j sor mozgatsa.

kppont.

di,l57
.l_MB

ret

;Vissza a hv programhoz.

Mozgat_Bal Endp

Mozgat_Fel Proc
call

Vert_BI

mov
mov

di,9l*3l0+144
cx,64

.l_MF:

push ex
mov cx,31

.2_MF:

mov
mov

ax,es:3lO(di)
es:(di),ax

add

di,3l0

164

;Hasonlan mint a forgatnl,


;itt is lehet .wrdt mozgatni.

Grafika programozsa Assembly nyelven


loop

.2_MF

xo r
mov

ax,ax
es:[diJ,ax

pop
sub
loop

di,31 *320-2
.l_MF

Cl<

ret
Mozgat_Fel End p
Fodor_Bal

Proc
call

Vert_BI

;Idzts

mov

di,92*320+144

;Az ablak memriacme.

mov cx,32
push Cl<

;A sorok szma.

.l_FB:

mov cx,S
pusb Cll

;A blokkok szma egy sorban.

.2_FB:

mov

cx,7

;Egy blokk szlessge-l

mov
mov
inc
loop
xo r
mov

al,es:l(diJ
es:(di),al
di
.3_FB
al,al
es:(di),al

;Hasonlan mint a mozgatnl.


;a megadott szlessg rszt
;arrbb tolja egy ponttal gy,
;hogy a szln lev pont

inc
pop
loop

di

;Ezt megteszi az egsz soron.

Cl<

.3_FB:

pop
add
loop

;trldik.

.2_FB
Cl<

;Egy j sor mozgatsa.

di,2S6
.l_FB

ret
Fodor_Bal

End p

165

ffiM PC Gyakorlati Assembly


Fodor_Fel

Proc
call
mov
mov

Vert_Dl
di,92*320+144
cx,64

.l~ FF:

push ex
mov cx,4

.l_FF:

push ex
mov ex, 7

.3_FF:

""v
mov
add
loop

ax,es:320[dil
es:(di),ax
di,320
.3_FF

xo r
mov
add
pop
loop

ax,ax
es:(di),ax
di,320
ex
.l_FF

pop
sub
loop

ex
di,32*320-2
.l_FF

;Hasonlan a tbbibez, VIOrds


;kezels.

ret
Fodor_Fel

Endp

Sznet

Proc

.l_Szunet:

push
mov
loop
pop
ret

Szunet

Endp

Vert_Dl

Proc

166

ex
cx,lftlb
.l_Szunet
ex

;Egy lftlb hossz ciklus.


;anlkl, hogy a ex rtke
;megvltozna a rutinbl
;val visszatrskor.

Grafika programozsa Assembly nyelven


mov
.l_VB:

.2_VB:

in
test
jnz
in
test
jz

dx,3dah
al,dx
al,8
.l_VB
al,dx
al,8
.2_VB

;A rutin addig vr. mg egy


;ellrl kezdd visszafutst
;nem rzkel.

re t
Vert_BI

End p

Vga 7

En ds
End Start

;A szegmens vge
;A program vge.

A prograrnek mkdse knnyedn megrthet, ha elemeire bontva vizsgljuk. A program elejn smmi j dolog nincs, belltja a szekott dolgokat. Ezutn csinl egy 16*16-os ciklust, ami
segtsgvel kirakunk egy sznpalettt ami ksbb az brt fogja
helyettesteni. Ha ezzel megvagyunk, jhet a mozgats. Az
egyes rutinok gy lettek megrva, hogy egy hvsra egy pontnyit
mozgatnak, ezrt ha ennl tbbet kvnunk mozgatni, akkor egy
ciklusba kell szervezni azt. Vgyzni kell azonban arra, hogy a
prograrnek hasznljk a ex regisztert, gyhogy a call utasts
eltt el kell menteni a verembe az rtkt A minta alapbelltsa ktfle krbeforgatst vgez, ezltal a szveg- balrafel mozog. De ezt termszetesen meg lehet vltoztatni, hogy a
tbbi rutint is ki tudjuk prblni. Az eljrsok hvsa utni call
sor egy vrakozst iktat be, mgpedig egy 1fffh hossz holtciklus segitsgvel. Az ismttsi ciklus leteltvel egy billenty
vrs s egy kperny visszallts kvetkezik majd visszatrs
az opercis rendszerhez. Nos akkor nzzk az egyes rutinok
mkdst:

Minden forgats eltt egy Vertical Blank idzts lett beiktatva. Ezutn kvetkezik a mozgatand ablak bal fels sarknak meghatrozsa. Ezek az sszes rutinban megtallhatk.
Ahhoz, hogy egy 64*32 kppont mret alakzatot mozgatni
tudjunk, egy fggleges s egy ebbe gyazott vzszintes ciklusra van szksgnk (vagy fordtva, de akkor megvltozik a

167

IBM PC Gyakorlati Assembly


mveletek sorrendje). A vzszintes rtk megadsnl a szlessg mnusz egyet kell megadni (vzszintes scrollnl) mert klnben eggyel tbb pontot mozgatna. Az els rutinnl a mr emltett
cserlget eljrs lett alkalmazva gy, hogy a kperny-mem
ribl kiolvas egy wordt, megcserli a regiszter als-fels
byte-jt majd visszarja. Ezzel kt egyms melletti pontot cserltnk meg. Ahhoz, hogy az egsz bra mozogjon, nveini kell
eggyel a vzszintes koordinta rtkt s vgrehajtani az emltett mveletet egszen a sor vgig majd megismtelni az
sszes sorra, ezrt van szksg a kt egymsba gyazott ciklusra.

Ha a forgats irnya nem vzszintes, hanem fggleges, ak


kor mr nem clravezet a regiszterek cserlgetsa mivel a
visszars helyt is meg tudjuk vltoztatni. Tovbb, hogy egy
kicsivel gyorsabb legyen a rutinunk mkdse, rdemes nem
byte-os adatokkal dolgozni hanem wordsseL
Itt a kt egymsba gyazott ciklusnl a kls a magassg1 s a bels ciklus a szlessg/2 a word miatt. A mozgats gy
trtnik, hogy betlti ax regiszterbe az indexregiszter ltal mutatott rtket s bx-be az alatta lv kt pontot (di+320) majd az
els cmre rja vissza a bx-et s a msodikra az ax-et. Ezzel
megcserldtt a kt kppont. Hasonlan mint az elbb, vgrehatjuk a mveletet az egsz sorra majd egyel lejjebb lpve megismteljk azt mindaddig, mg el nem rjk a ciklus vgt.
Akkor, ha nem akarjuk, hogy az adatok krbeforduljanak,
egy egyszer msolgatst kell vgeznnk. Ezt valstja meg a
Mozgat nev rutin. Termszetesen hasonlkppen kezddik
mint eldei, a klnbsg ott kezddik, hogy a mozgats egy olvassbl s egy j helyre trtn irsbl ll. Majd ha lefutott a
bels ciklus, az ppen aktulis helyrl trli a pontot (ez mindig
az utols pont helye). gy valstja meg, hogy res legyen az a
rsz, ahonnan lecsszik az alakzat. Amire vgyzni kell ilyen rutinoknl az az, hogy pontosan a szltl induljunk s vigyzzunk
arra, hogy ne rjunk az alakzaton kvlre (ne tvesszk el a hatrait). A msik fontos dolog, hogy a msolst mindig gy vgezzk, hogy vlasztunk egy haladsi irnyt ami a mozgats irnyval mindig ellenttes, ezutn vesszk az adott pontot s htra
168

Grafika programozsa Assembly nyelven


fel msoljuk. Ennek lnyege, hogy ha elre fel msolnnk, akkor a kvetkez kppont amit mozgatnunk kne, az az ltalunk
odamsolt pont lenne. gy a legels pont sznvel telernnk az
adott sort. Ugyanez igaz a fggleges irny mozgatsra is. A
klnbsg ott annyi, hogy mint az elbbi fggleges rutinnl, itt
is megengedhetjk a words adatok hasznlatt
A kvetkez scroll rutinok tulajdonkppen nem hoznak
semmi jdonsgot, mindssze ltvnyosak. Ugyanis itt csak arrl van sz, hogy az elbbi mozgat eljrst nem az egsz alakzatra alkalmazzuk, hanem csak egy 8*8-as ngyzetre. gy ez a
kis alakzat fog ugyan gy viselkedni mint az elbb a nagy. Ha
nem csak egy ilyen objektumra hajtjuk vgre a mveletet, hanem az egsz alakzatot felbontjuk kis ngyzetekre s mindegyiken elvgezzk azt, akkor lesz ez az rdekes jelensg.
A rutint egybknt sokkal hatkonyabban lehet hasznlni
bittrkpes (2 szn) zemmdokban mivel ott elegend kiolvasni egy byte-ot, egy shl shr utastssal eltolni majd visszarni. gy
a rutin lefutsa is sokkal gyorsabb lenne.

Az egyes rutinoknl ms s ms bellts lenne szksges, gyhogy clszer egy j eljrs eltt a vrakozsi idt s
az ismtlsek szmt belltani mivel pldul egy Fodor rutin lefutshoz 8 lps szksges mindssze s viszonylag nagyobb
vrakozsi id, hogy ltni is lehessen valamit.
A kvetkez elg gyakran elfordul grafikai feladat a kr
rajzolsa. Itt hasonl nehzsgek lpnek fel, mint az egyenes
hzsnL A feladatot megoldhatnnk a kregyenlettel, vagy
abbl kiindulva, hogy a szinusz s a koszinusz fggvnyek a
krbl lettek alkotva. gy a kr pontjait gy is megkaphatjuk.
hogy egy 0-360-ig tart ciklus (x) segtsgvel a krhz tartoz
pontok egyik koordintja r*sin(x) a msik pedig r*cos(x) lesz.
Az eddig emltett megoldsok htrnya, hogy alapveten nem
rtana hozzjuk egy lebegpontos aritmetika amivel a trt szmokat is tudjuk kezelni, valamint az, hogy egy 10 pont sugar
krt _is 360 pontbl s egy 100 sugar krt is 360 pontbl pt
fel. Igy addhat olyan eset, amikor a kr fala 1-2 pont vastag
illetve olyan is, amikor a pontok kztt rs van. A megolds

169

IBM PC Gyakorlati Assembly


hasonl mint az egyenes rajzol rutinnL Egy olyan algoritmus.
ami nem szmol csak egsz szmokkal valamint mindig a megfelel szm pontot teszi ki a kpernyre. Az itt hasznlt rutin kihasznlja a kr azon tulajdonsgt, hogy knnyedn felbonthat
nyolc egyforma rszre. gy tulajdonkppen elegend csak egy
nyolcad krt rajzolni s a maradkot tkrzssei brzolni. Az
algoritmus mkdse a kvetkezkppen nz ki.
Cx = a kzppont X koordintja
Cy = a kzppont Y koordintja
r = a kr sugara

Dx s Dy
Delta X illetve a Delta Y a kzpponttl val
tvolsg, amit a program szmol ki.
Dx=r
Dy=O
Szmt:

Ha r>Dy2 akkor ugrs a pontkiraksra.

Klnben: Dx=Dx-1
r=2*Dx+1
Pontkirak:

Pont
Pont
Pont
Pont
Pont
Pont
Pont
Pont

Cx+Dx,Cy+Dy
Cx-Dx,Cy+Dy
Cx+Dx,Cy-Dy
Cx-Dx,Cy-Dy
Cx+Dy,Cy+Dx
Cx-Dy,Cy+Dx
Cx+Dy,Cy-Dx
Cx-Dy,Cy-Dx

Dy=Dy+1
Ha Dy<Dx akkor vissza a szmtshoz.
Klnben vge.
Aki jratos a magasabb szint nyelvekben, az knnyedn
megrti az elbb emltetteket Ami taln a leginkbb feltn, az
a nyolc pontkiraks. Ez vgzi a tkrzst. hogy egy teljes krt
170

Grafika programozsa Assembly nyelven


kapjunk. Aki gy gondolja, szintn elemezheti a rutin mkdst
papron. Nos ezek utn a program:
[Program 28)
Vga8

Segment
assume cs:Vga8,ds:Vga8

;Szegmensdefinci
;Cs, ds hozzrendelse
;a szepnensregiszterekhez.

Start:

mov
mov

ax,Vga8
ds,ax

;Ds belltsa a kd elejre.

mov
mov

ax,OaOOOh

es,ax

;Es belltsa a kperny;memria szegmenscimre.

mov
int
mov
xo r

ax,l3h
l Oh
dx,word ptr (SUGAR)
cx,cx

;320*200/256 felbonts
;belllfSa.
;Belltjuk a szksges kezd
;rtkeket (Dx=r. Dy=O).

mov
mov
push
mul
pop

ax,cx
bx,cx
dx
bx
dx

;Eilltjuk a DyDy rtkt

cm p

word ptr ISUGARJ,ax

;s ezt sszehasonltjuk a
;sugar rtkveL

ja

.2_Vga8

;Amennyiben a sugr rtke


;kisebb vagy egyenl az elbbi
;rtkkel. akkor atugorja
:a kvetkez rszt s a
;pontkirakssal folytatja a
;rutin vgrehajtst.

dec
mov
shl
inc
add

dx
bx,dx
b x, l
bx
word ptr [SUGARJ,bx

mov
add
mov

ax,word ptr JKOORD_X) :l. pont kiraksa.


ax,dx
word ptr )PONT_X[,ax

.1_Vga8:

.2_Vga8:

;A Dx=Dx-1 s az r=r+2"Dx+I
vgrehajtsa.

;mveletek

171

IBM PC Gyakorlati Assembly

172

mov
add
mov
call

all,word ptr [KOORD_Y[


ali,Cll
word ptr (PONT_Y],ax
Pont

mov
sub
mov
mov
add
mov
call

all,word ptr [KOORD_X) ;2. pont kiraksa.


all,dX
word ptr [PONT_X[,ax
all,word ptr (KOORD_Y)
ali,CX
word ptr (PONT_Y),ax
Pont

mov
add
mov
mov
sub
mov
call

ali,word ptr [KOORD_X) ;3. pont kiraksa.


Bll,dX
word ptr [PONT_X),ax
Bli,WOrd ptr [KOORD_Y)
ali,Cll
word ptr (PONT_Y),ax
Pont

mov
sub
mov
mov
sub
mov
call

all,word ptr [KOORD_X) ;4. pont kiraksa.


all,dX
word ptr [PONT_X),ax
all,word ptr [KOORD_Y)
Bli,CX
word ptr (PONT_Y),ax
Pont

mov
add
mov
mov
add
mov
call

all,word ptr [KOORD_X) ;5. pont kiraksa.


ali,CX
word ptr [PONT_X),ax
all,word ptr [KOORD_Y)
all,dx
word ptr [PONT_Y),ax
Pont

mov
sub
mov
mov
add
mov
call

all,word ptr [KOORD_X) ;6. pont kiraksa.


8li,CX
word ptr [PONT_X),ax
Bll,word ptr (KOORD_Y)
&ll,dX
word ptr [PONT_Y),ax
Pont

Grafika programozsa Assembly nyelven


mov ax.word ptr [KOORD_X] ;7. pont kiraksa.
add ali,CX
mov word ptr [PONT_X],ax
mov ax,word ptr (KOORD_Y[
sub ax,dx
mov word ptr (PONT_Y],ax
call Pont

.3_Vga8:

Pont

mov
sub
mov
mov
sub
mov
call

ax,word ptr [KOORD_X] ;8. pont kiraksa.


word ptr [PONT_X[,ax
ax,word ptr [KOORD_Y[
ax,dx
word ptr [PONT_Y),ax
Pont

inc
cm p
j ne
jmp

ex
cx,dx
.3_Vga8
.l_Vga8

xo r
int

ax,ax
16h

;Billentyvrs .

mov
int

ax,3
l Oh

;Szveges kperny.

mov
int

ax,4c00h
21 h

:Visszatrs az opercis
:rendszerhez.

a:~,ex

;A Dy=Dy-1 vgrehajtsa.
;Ha Dx<Dy akkor vge.
;Klnben jabb pont.

Proc
push
mov
mov
mov
mul
add
mov
mov

bx ax dx
di,word ptr [PONT_X)
ax,word ptr [PONT_Y[
bx,320
bx
di,ax
al,byte ptr [COLOR]
es:[di],al

pop
ret

dx ax bx

:A pont koordintibl ki
;kell szmolni annak cmt
:a kpernyn. amit a szakott
:mdon egy szorzssal s egy
:sszeadssal tesznk.
;Majd a megadott szinnel
;kirakjuk a pontot a megfelel
:helyre.

173

ffiM PC Gyakorlati Assembly


Pont

Endp

PONT_X: d w
PONT_Y: d w
COLOR:
db
dw
SUGAR:
KOORD_X:dw
KOORD_Y: dw
Vga8

?
?
7
50
160
100

En ds
End Start

;A kirakand pont xy
;koordintja.
;A vonal szne.
;A kor sugara,
;X koordintja.
;Y koordintja.
;A szegmens vge.
;A program vge.

A programban a szksges zemmd, stb. belltsok utn


kvetkezik Ox s Oy kiindul rtknek belltsa. A kvetkez
lps az sszehasonltsi mvelet. Ahhoz, hogy ezt el tudjuk
vgezni, elbb el kell lltani a Oy*Oy rtkt egy regiszterbe
s csak ezutn tudjuk sszehasonltani a sugr rtkvel. A
ngyzetre emelst gy vgezzk el, hogy ax s bx regiszterbe
is a Oy rtkt tesszk, majd sszeszorozzuk ket. Ha az sszehasonlts sorn a sugr kisebb-egyenlnek bizonyult, cskkentjk Ox rtkt majd a sugrhoz adjuk a sugr+2*dx+1 rtket.
Lnyegben ez az egsz eljrs lelke, ugyanis ez hatrozza
meg, hogy mikor kell oldalirny lpst tenni a rajzols sorn. A
pontok kirakst a vonalrajzol rutinnl hasznlt eljrs vgzi.
Hvsa eltt belltjuk a megfelel koordintkat attl fggen,
hogy melyik krcikket rajzoljuk ppen. Ezutn kvetkezik egy
fggleges lps s ha a Oy>Ox akkor megismtli a rutint. Htrnya a programnak, hogy megvltoztatja a sugr kiindul rtkt, de ezen knnyedn lehet segteni egy tmeneti trol beiktatsval. Tovbbi szpsghibja a dolognak, hogy a
320*200-as felbontsnl nem krt "anem ellipszist rajzol, aminek az az oka, hogy ebben a felbontsban torzt a megjelents.
Ezen gy lehet segteni, hogy pldul 640*480-as felbontsan
mkdtetjk a rutint ami mr pontos krt eredmnyez.

17-t

Grafika programozsa Assembly nyelven


Kpformtumok:
A grafikus kpek trolsa a lemezen tbbflekppen
trtnhet. A legegyszerbb, amit a Paint Brush nev windows
alatti rajzol program is tmogat, a bittrkpes trols, ami azt
jelenti, hogy a kp minden pontja egyenknt le van mentve. Ha
fgyelembe vesszk, hogy pldul egy 1024*768/256 szn
grafika ilyen mdon trtn trolshoz 768Kbyte plusz a fejlc
s a sznpaletta hossza szksges, ami mr nem csekly mret.
Ezrt ezt csak egszen apr brk trolsra rdemes
hasznlni vagy egy j nagy winchestert kell bepteni a gpbe
(de ez egy kicsit kltsges). Erre a problmra lettek kitallva a
klnfle tmrtsi eljrsok, minek hatsra a file mrete a
tredkre vltozik. Nos elg sok tmrtsi eljrst kidolgoztak
az vek sorn, az egyik jobb mint a msik. Az egyik legtmrebb
taln a .GIF formtum, de ennek kitmrtse nem a legegyszerbb. Ezrt egy kis kompromisszum rn arra jutottam, hogy
a bizonyra sokak szmra ismers De Luxe Paint rajzolprogram kpformtumt fogom ismertetni. Ennek oka, hogy arnylag
j tmrtsi arnyt lehet vele elrni s a visszafejtse sem okoz
nagy fejtrst.

Az eljrs lnyege, hogy az egyms mellett lv egyforma


byte-okat letmrti oly mdon, hogy trolja, hogy hny darab s
hogy milyen rtk adat volt az adott helyen. Termszetesen
meg kell klnbztetni a tmrtett s a tmrtetlen adatokat
egymstl, amit gy oldottak meg, hogy a mennyisget trol
byte-ot negltk, gy 7. bitje mindig 1 rtk. Ezen mdszerrel
egy csomagban maximum 128 Byte-ot trolhatunk mivel a vezrl byte 0-127-ig tmrtetlen adatokat jelent, ez fltt pedig
tmrtettet A pontos darabszmot gy kapjuk, ha ezt a byte-ot
negljuk (kettes komplemenst vesszk) majd eggyel megnveljk az rtkt
Ha olyan byte-ot tallunk, amelyiknek a 7. bitje O, az aztjelenti, hogy utna az adott byte rtke+1 darab tmrtetlen adatot tallunk. Ezt egyszeren kimsoljuk innen. s a blokk utni
byte-rl ismt eldntjk, hogy tmrtett vagy norml adatok jnnek utna. De hogy egy kicsit egyszerbb legyen megrteni a
mkdst, egy plda:

175

IBM PC Gyakorlati Assembly


A mamriban lv adat: ... 81 23 04 45 F2 A6 75 EA FC
00 02 36 AF 98 E4 FF ...
Ezen adat kitmritse a kvetkezkppen trtnne: Mivel
az els adat 81h aminek a 7. bitje 1, ezrt ezt neglni kell s
utna megnveini eggyel. gy eredmnyknt 80h-t kapunk. Ezutn szksgnk van a kvetkez adatra ami a 23h s a megfelel helyre (ahov ki akarjuk tmrteni a kpet) berunk 80h darab
23h-t. Ezutn vesszk a kvetkez rtket. ami itt a 04h. Ez azt
jelenti, hogy a soron kvetkez 04h+1 azaz 5 darab byte nincs
tmrtve. Teht a 128 darab 35 utn letraijuk egyms utn a
45h. F2h. A6h, 75h, EAh rtkeket. A kvetkez adat az FCh jelentse: neg FCh+1 darabot kell a kvetkez byte-bl rni a memriba, teht 5 darab 0-t kell rni az elz adatok utn.
Ezutn kvetkezik egy 02 ami mutatja, hogy a 36h, AFh, 98h
adatokat kimsolhatjuk innen mivel nem tmrtett adatok. s
vgl az E4 FF jelentse, hogy 29 darab 255-t kell rni az elz
adatok utn.
Ezzel a mdszerrel kpeknl viszonylag j tmrtsi
arnyt lehet elrni. Azonban az eljrs ismerete nem elegend
egy kp kirakshoz. Ugyanis a rajzol program trol mg egy
pr hasznos informcit a file-ban. Kztk a sznpalettt, az
adott rajz mrett .hogy milyen felbontsban kszlt s egyb
ms adatokat.
Az minden adatcsoportot egy cmke jell, ami utn egy
ngy byte-os mret tallhat. Ez hatrozza meg az adott cmke
hosszt. Klnbsg a PC-s adattrolshoz kpest, hogy a hossz
egyes helyirtkei nem fordtott sorrendben helyezkednek el,
hanem gy, ahogyan lerjuk azt. Az egyes cmek jelentst s
tartalmukat a rszletessg ignye nlkl a kvetkez tblzat
tartalmazza:
Cm
00
04
08
176

Hossz
4
4

Tartalom/Jelents
FORM formtum cmke.
A file hossza ezt kveten.
A formtum neve.

Grafika programozsa Assembly nyelven

oc

10

14

16
20
22
24

2
2
2
4

28

2C
30

?
DPPS+4

?
CRNG+4
?

?
4
4

4
4

TINY+4

BODY+4

BMHD bittrkp fejlc cmke.


BMHD blokk hossza.
A kp szlessge.
A kp magassga.
A sznek szma az zemmdban.
A kptorzts arnya.
A ksztsnl hasznlt zemmd X s
Y irny felbontsa.
CMAP cmke, a palettasznek trolsi
helyt jelli.
A CMAP blokk hossza.
R-G-B sznsszetevk.
DPPS cmke. A perspektvi trolja.
DPPS blokk hossza.
CRNG cmke, a DP-nl hasznlt
szntmeneteket trolja itt.
A CRNG blokk hossza.
T/NY cmke, a DP-be trtn kp
betltse eltt kirajzold kicsinytett
kpet trolja itt.
A T/NY blokk hossza.
BODY cmke, a kp kezdett jelli.
A BODY blokk hossza, azaz a kp
tmrtett mrete.

A kitmrts sorn figyelembe kell venni, hogy a szneket


24 bites sznpalettt felttelezve trolja a gp, de mivel az als
kt bitet nem hasznlja, egyszeren arrbb kell tolni az rtket
kt bittel s mris megkapjuk a helyes rtket.
A most kvetkez programban a felsorolt adatok kzl nem
sokat fogunk hasznlni, mivel tudjuk, hogy 320*200/256 zemmdban kszlt kpet szerelnnk kirakni azonos mdban s
mretben, nincs szksgnk az adatok tbbsgre.
[Program 29]
Vga9

Segment
assume cs:Vga9,ds:Vga9

;Szegmensdefinci.
;Cs,ds belltsa.

177

ffiM PC Gyakorlati Assembly


Start:

Tovabb:

mov
mov

ax,Vga9
ds,ax

;Ds regiszter belltsa a


;kd elejre.

mov
mov
int

ax,4a00h
bx,l024
21 h

;A program ltallefoglalt
;memriaterletet 16K
;mretre vltoztatjuk.

mov
mov
int
mov

ax,4800h
;Krnk a DOS-tl egy
bx,4096
;64K mret memrialapot.
2lh
word ptr [MEMOCIM[,ax;Ennek szegmenseimt a
;memriavltozba tesszle

mov
mov
int
mov

ax,3d00h
;A FILENEV alatt trolt nev
dx,offset FILENEV
;file megnyitsa olvassra.
2lh
word ptr [FILESZAM),ax;A visszakapott file azonost
;informcit a memriba
;mentjk.

jnc
jmp

Tovabb
Hiba

pusb
mov
mov
mov
mov
xor
mov
int

ds
;A ds regiszter rtkt
bx,ax
;elmentjk, mivel mi nem
ax,word ptr [MEMOCIM);a ds ltal mutatott
ds,ax
;szegmensre kvnunk betlteni
ax,3f00h
;hanem az ltalunk lefoglaltdx,dx
;ra. A DOS htrnya viszont,
cx,Otmb
;hogy a betltend file
2lh
;helyt a ds:dx regiszterben
;kell megadni a rutinnak.

pop

ds

mov
mov
int

ax,3e00b
;A file lezrsa.
bx,word ptr [FILESZAM)
2lb

mov
int

ax,lJb
l Oh

;3:0*200/256 grafikus zemmd


;belltsa.

mov

(lx,3c8h
cx,2S6
ax,ax

;A sznpaletta kinullzsa

IllO V

xo r

178

;A ds visszalltsa.

Grafika programozsa Assembly nyelven


.t_Torles:

.t_Vga9:

out
dll,al
inc
ds
push n
sor
8li,8I
;~-G-B

out
out
out

dll,al
dll,al
dll,al

nullzsa.

pop
dec
inc
loop

ds
al
.t_Torles

mov
mov
mov
mov
schg

al,byte ptr (CIMKE(


;A BODY cmke megkeresse.
es,word ptr (MEMOCIM(
di,6
Cll,es:(di(
cl,ch

8I

repnz scasb
jnz
Hiba
mov
push
dec
mov
re p z
pop
jaz

si,offset CIMKE
din
di
Cll,4
cm ps b
Cll di
.l_Vga9

mov d,.,es:(di+5(
schg dl,dh

;A tmrtett kp hosszat
;a ds regiszterbe teszi

add

;Az els adatbyte-ra lltja


;a mutatt.

di,7

push ds
mov
mov

;Az adatszegmens elmentse.

ds,word ptr (MEMOCIMJ;Ds-be a tmritett kp


;kezdcime le5z
ali,OaOOOh
;Es-be a videomemra

mov

es,a:x

IDOV

Si,di

;szegmenscimt tlti.
;Si-be a tmrtett kp
tesZI.

;kezdcimt

179

IBM PC Gyakorlati Assembly

.2_ Vga9:

xo r
xo r

di,di
ch,ch

;Regiszterek nullzsa.

and
jz

dx,dx
Szin

;Ha dx=O azaz a kp kiraksa


;a vgre rt, ugrik a sznek
;belltsra.

mov
inc
dec

cl,[si)
si
dx

;Cl regiszterhe teszi a kp


;egy byte-jt, nveli si-t
;s cskkenti a szmllt

test
jz

cl,128
Norma l

;Ha cl 7. bitje O akkor


;tmrtetlen adat kvetkezik.
;Klnben tmrtett.

;Tomoritett
n eg
inc

cl
cl

;Ez esetben neglni kell


;az rtkt s nveini eggyel.

mov

al,[ si)

;Al regiszterhe tlti a


;kirand byte-ot.

inc

si

;A kvetkez byte.

dec
re p
jmp

dx
stos b
2_Vga9

;A szmll cskkentse.
;CI darab al kiraksa a kpre,
;majd vissza.

Norm al:

inc
sub
re p
jmp

cl
dx,cx
movsb
.2_Vga9

;Cl+ I adat tmsolsa ds:si


;eimrl es:di eimre s a
;szmll ennek megfelelen
;trtn cskkentse majd
;vissza.

Szin:

mov

si,30h

mov

cx,256

;A szinek most a JOb cmtl


;kezdden vannak letrolva.
;256*3 byte hosszan.

mov

ai,O

;Az els lltand paletta


;a O. sorszm.

mov
out
inc
push
inc

dx,3c8h
dx,al
al

;A sznpaletta mdostsa
;a memriban trolt adatoknak

.l Szin:
-

180

as
dx

;megfelelen.

Grafika programozsa Assembly nyelven

Hiba:

mov
shr
shr
out

al, l sil
al, l
al, l
dx,al

;A ptros sszetev belltsa.

mov
shr
shr
out

al,lsi+ll
al, l
al, l
dx, al

;A zld sszetev belltsa.

mov
shr
shr
out

al,[si+21
al, l
al, l
dx, al

;A kk sszetev belltsa.

add si,3
pop ax
loop .l_Szin

;A kvetkez szn.

xo r
int

;Billentyvrs.

mov ax,3
int
l Oh

;Karakteres md belltsa.

mov ax,4c00h
int
21 h

;Visszatrs az opercis
;rendszerhez.

CIMKE:
db
FILESZAM:dw
MEMOCIM:dw
FILENEV: db
Vga9

ax,ax
16h

"BODY"
?
?

"demokep.lbm",O

En ds
End Start

;A szegmens vge.
;A program vge.

A program mindjrt egy mr ismertetett rutinnal kezddik,


lefoglal egy 64Kbyte hossz rszt s betlti ide a lemezen tallhat mintakpet. A grafikus zemmd bekapcsolsa utn els
lpsben az sszes palettasznt feketre lltja. Ezt azrt teszi.
mert egy kp kitmritse tbb idt vesz ignybe. mint egy palettallts s ha fekete sznekkel kirakjuk a kpet, akkor abbl
semmi nem fog ltszani, azonban amikor a szneket is belltjuk,
ami mr nagyon rvid id alatt megoldhat, hirtelen megjeleni a
181

ffiM PC Gyakorlati Assembly


kp. Ezzel azt a hatst rhetjk el, mintha ilyen gyorsan lett volna kicsomagolva a kp. Ezutn egy mr szintn ismert eljrssal megkeressk a BODY cmkt, ami a kp elejt jelli. Dx regiszterbe tesszk a cmkt kvet hosszt, amit szmllknt
hasznlva fogjuk tudni, hogy mikor rnk a kp vgre.
A kitmrts kt rszre lett bontva. Az egyik a tmrtett
adatokat teszi a kpernyre, a msik pedig a tmrtetlent Az
eljrsok a mr emltett mdon mkdnek, fgyelve, hogy a dx
regiszter rtkt mindig megfelel mrtkben cskkentsk.
Elrve a kp vgt jhet a sznek belltsa. Itt meglehetnnk, hogy megkeressk a CMAP cmkt, de mivel ismert a kezdcme, ettl eltekintnk s a hosszt sem fogjuk megnzni mivel egy 256 szn kpnl ez mindig 300h teht a jl bevll out
utastsos mdszerrel belltjuk mind a 256 szn RGB rtkt
Ezutn nincs ms dolgunk mint vrni egy billenty lenyomsig
s utna visszalltani az eredeti paramtereket s kilpni a
programbl.
Egy vdelem be lett ptve a rutinba, mivel ha a kp betltse sikertelen lett volna s a program mgis kinullzza a szneket s elkezdi keresni a BODY cmkt, abbl legjobb esetben is
egy fekete kp kerlhet ki eredmnyl, de a rendszer letagysa
sem elkpzelhetetlen. Ezrt a file megnyitsakor fgyeljk a carry flag rtkt s ha ez 1 akkor billentyvrs nlkl kilpnk a
programbl, mivel valamilyen oknl fogva a gp nem tudta megnyitni a demokep.lbm nev file-t.
Ez a rutin csak 256 szn kpek kiraksra alkalmas, mivel
a 16 szn kpek gy troldnak, hogy a O. sor O. plane-je, az O.
sor 1. pane-je, ... , O. sor 3.plane-je, 1.sor O. plane-je, ... ,utols
sor 3. plane-je. Ezrt a kitmrt rutint ennek megfelelen t
kell alaktani.
Amennyiben a DP programbl nem egy teljes kpet mentettnk le, hanem egy brush-t (.BBM) akkor az ugyangy troldik, de a kpmretnl a brush mretei tallhatak. A 16 szn
mdokra emltett dolog itt is igaz.

182

Grafika programozsa Assembly nyelven

AZ SVGA ZEMMDOK TULAJDONSGAI


Az IBM gpeknl ellett fogadva egy szabvnyos kperny
kezels, amihez minden gyrt cgnek tartania kell magt. Ez a
szabvny azonban csak a standard mdokra vonatkozik, azaz a
13h zemmdig. Az ettl fljebb es rsszel szabadon garzdlkodhatnak. gy az SVGA krtyk sokban eltrnek egymstl.
Ezek els s legfontosabb tulajdonsga, hogy nincsenek szabvnyostva, gy ahny grafikus krtya, annyi fle lehetsg s
tulajdonsg. Azrt, hogy mgis lehessen valamit hasznostani
ezen szolgltatsokbol, megprblom az ltalam eddig fellelt ismeretanyagot belevinni ebbe a fejezetbe, ami ugyan nem tl
sok, de remlem mindenki tall benne hasznosat Az ismeretek
hinynak oka, hogy a gyrt cg nem mellkel a krtya mell
egy rszletes lerst, amiben szerepeJnnek az adott eszkz
programozsi lehetsgeL Ez rszben rthet (zletpolitika) de
ezzel megneheztik a programozk feladatt.
Az egyik klnbsg a krtyk kztt az egyes (azonos)
zemmdok szma (amit al-be kell rni a 10h int rutinnl). Ezt
ugyan megadjk a krtyhoz tartoz kis fzetkben, de ha esetleg olyan programot akarunk rni, ami nem csak egy fle krtyatpuson kellene hogy mkdjn, akkor a tbbit is ismerni kell.
Nos a most kvetkez ismertet taln segt egy kicsit ebben.
ACUMOS
zemmd:

Felbonts:

Sznek szma:

59h
58 h
SCh
SD h
SEh
5Fh

800*600
800*600
800*600
1024""768
640*400
640*480

2
16
256
16
256
256

183

IBM PC Gyakorlati Assembly


AHEAD
zemmd:

Felbonts:

Sznek szma:

60 h
61 h
62h
63 h
6 Ah
71 h
74h

640*400
640*480
800 *600
1024*768
800*600
800*600
1024*768

256
256
256
256
16
16
16

zemmd:

Felbonts:

Sznek szma:

54h
61 h
62 h
63 h
64h
65 h

800*600
640*400
640*480
800*600
1024*768
1024*768

16
256
256
256
256
16

zemmd:

Felbonts:

Sznek szma:

?Oh
72 h
78 h
79h
?Bh

800*600
1024*768
640*400
640*480
800*600

16
16
256
256
256

ATI

CHIPS& TECH

EV EREX

!! ax=Ox70h bi=zemmd !!
zemmd:
Felbonts:

184

Sznek szma:

Grafika programozsa Assembly nyelven


752*410
800*600
1280"350
1280*600
640"350
640*400
512*480
1024*768
640*480
800*600
1024*768

16
16
4
4
256
256
256
16
256
256
256

zemmd:

Felbonts:

Sznek szma:

59h
58 h
5Ch
5 Dh
SEhvagySCh
5Fh
6Ah vagy 79h
7Ch
7 Dh
7 Eh
7 Fh

720*512
640"350
640*480
720*512
800*600
1024*768
800*600
512*512
512*512
640*400
1024*768

16
256
256
256
256
16
16
16
256
256
4

zemmd:

Felbonts:

Sznek szma:

58h
59h
5Ah
5Ch
5 Dh
5Eh
5Fh

800*600
800*600
1024*768
800*600
1024*768
640*400
640*480

16
2
2
256
16
256
256

01h
02 h
11h
12h
13h
14h
15h
20h
30h
31 h
32h

GENOAGVGA

NCR

185

ffiM PC Gyakorlati Assembly


OAKTECH
zemmd:

Felbonts:

Sznek szma:

52h
53h
54h
56h
58h
59h

800"600
640*480
800"600
1024"768
1280*1024
1024"768

16
256
256
16
16
256

zemmd:

Felbonts:

Sznek szma:

58h
59h
SCh
50h
SEh
5 Fh

800"600
800"600
800"600
1024"768
640*400
640*480

16
2
256
16
256
256

zemmd:

Felbonts:

Sznek szma:

5Bh
SCh
SOh
SEh
5Fh
60h
61 h
62h
6 Ch
74h
75h
76h
77h

800"600
640*400
640*480
800"600
1024"768
1024"768
768*1024
1024"768
640*480
640*480
640*480
800"600
800"600

16
256
256
256
16
4
16
256
16M
32K
64K
32K
64K

PARADISE

TRICENT 8900CL

186

Grafika programozsa Assembly nyelven


TSENG (Genoa, Orchid, Willow)
zemmd:

Felbonts:

Sznek szma:

29h
20 h
2 Eh
2 Fh
30h
37h

800"600
640"350
640*480
720*512
800"600
1024*768

16
256
256
256
256
16

zemmd:

Felbonts:

Sznek szma:

29h
20 h
2 Eh
2 Fh
30h
37h
38h

800"600
640"350
640*480
640*400
800"600
1024*768
1024*768

16
256
256
256
256
16
256

TSENG4000

VIDE07
!! ax=6F05h bi=zemmd !!
zemmd:

Felbonts:

Sznek szma:

60h
61 h
62h
63h
64h
65h
66h
67h
68h
69h
6Ah

752*410
720*540
800"600
1024*768
1024*768
1024*768
640*400
640*480
720*540
800"600
1024*768

16
16
16
2
4
16
256
256
256
256
256

187

ffiM PC Gyakorlati Assembly


Az itt feltntetett zemmdokat kell al regiszterhe rni az
zemmd vrtsakor. Kivtelt kpez az a kt eset, ahol az kln
jellve is van, itt az ax regiszterbe a megadott rtket, bi-be pedig az zemmdot kell rni.
A kvetkez problma akkor addik, ha olyan zemmdot
hasznlunk, ahol a kp mrete tllpi a 64KByte-os mretet (16
szn mdoknl a 4*64KByte-ot). Ekkor ugyanis lapozni kell.
Azaz a videokrtyn tallhat memribl egy msik szegmenst
lapoz be a gp RAMjba (ltalban OAOOOh-tl kezdden). Nos
itt jelentkezik a dokumentci hinya. Ugyanis azt, hogy az adott
krtyt mely portcmen keresztl s mi mdon lehet lapozni, azt
ltalban elfelejtik kzlni a felhasznlval.
A kvetkez program arra hivatott, hogy egy 256 szmu
SVGA mdban pontokbl kirajzoljon egy vonalat a kperny
valamely rszre. Erre egybknt a ROM BIOS is kpes, gy ez
is bemutatsra kerl. A klnbsg szemmel lthat lesz annak
ellenre, hogy a kzvetlen memriakezel rutint lehetett volna
mg gyorstani azzal, ha megvizsgljuk, hogy kell-e lapozni,
vagy pedig ugyan arra a szegmensre esik a pont, ahov az el
zt tettk. Ami fontos, hogy a programban ki lehet vlasztani pr
gyakori krtyatpus kzl a megfelelt s a gp ettl fggen
lltja be a video zemmdot, s a krtynak megfelel lapoz
eljrst fogja hasznlni.
[Program 30]
Svgal

Segment
;Szegmensdefinci.
assume cs:Svgal,ds:Svgal ;Cs,ds hozzrendelse.

Szeleseg

equ

Start:

mov u,Svgal
mov ds,u

;Ds regiszter belltsa a kd


;elejre.

mov u,OaOOOh
mov es,u

;A videomemria kezdc:mt
;es regiszteibe teszi.

call

188

1024

Trident_lni

;Az zemmd X irny felbon;lsa a cmkiszmtshoz.

;Az zemmd bekapcsolsa

Grafika programozsa Assembly nyelven


.l_Svgal:

Ahead_Ini

mov a,l0l4
push CI

;A vonal hossza.

mov
mov
mul
mov
add
adc:

u,word ptr (Koord_Y]


bs,Szeleseg
b ll
di,u
d,word ptr [Koord_X)
ch,O

;Az Y koordinta rtkt


;megszorozzuk a kperny
;szlessgvel, s az gy
;kapott eredmny kisebbik
;helyirtk rszt di-be
;tesszk, DU\id hozzacljuk
;a vzszintes koordinta
;rtkt. A lapozshoz a
;magasabb helyirtk word
;kerl felhasmlsra mivel
;a szorzskor itt alakul ki,
;hogy hnysmr nagyobb a cm
;a szegmensmretnl.
;A S7mitsnl hozz kell meg
;adl\i az sszeadskor esetleg
;kpzdtt c:arry fiaget mert
;ez is azt jelenti, hogy nem
;frt bele egy \Wrdbe a szm.

c:all

Trident_Lapoz

;A kiS7mitott lap belltsa.

mov
mov

al,byte ptr (Szin)


es:(di),al

;A szmolt helyre a megadott


;sznnel kitesz egy pontot.

pop
inc:
loop

word ptr [Koord_X)


.l_Svgal

;Az X koordinta nvelse


;mig Cll nem nulla.

mr
int

u,u
16h

;Billentyvrs.

mov
int
mov
int

u,3
lOb
u,4c00b
l lb

;A szveges md belltsa.

CI

;Visszatrs az openicicis
;ren~rhez.

Proc
mov
int

u,63h
lOb

ret
Ahead_lni

Eadp

189

IBM PC Gyakorlati Assembly


Oak_IDi

Proc
mov u,S9b
int
ret

Oak_Ini

1011

Eadp

Trideot_Ini Proc

mov u,6lb
int
ret

lOb

Trideot_Ini Eodp

Tseog__Ini

Proc
mov u,38b
int
ret

Tseag__Ini

lOb

Eodp

Abd_Lapoz Proc

mov ab.dl
mov &:1,4
sbl

dl,cl

or
ab.dl
mov ai.Odb
mov tb,3eeb
out
ret

tb,u

Abd_Lapoz Eodp
Oak_Lapoz Proc

mov db,cU
mov e1,4
sbl

190

db.el

Grafika programozsa Assembly nyelven

--- ......
or

IIHIV

dl,dll
ab,dl

...1111

tb,3dell
ds,al

iac
ill

ds
l,ds

out

ds,al

ret

Ollk_L8par& Elldp

--_,

Trid_L8par& Proc

IIHIV

inc
iD
ad

mr
or

...,dl
lb,3c411
I,Oell
U,. l
ds
l,dx
u,OIIOII
b,l

_, ......
ds,al

ret
Trid_L8poz EDdp
TSLLpoz Proc

mov l,dl
mov
mov cl,3

......

sbl

or
or

out

81,cl
.J,40b

......

lb,3cdb
U,.l

ret

T~&....L8poz

EDd p

191

IBM PC Gyakorlati Assembly


.Koord_X:
.Koord_Y:
Szin:

dw
dw
db

O
384
15

Svgal

En ds
End Start

;A szegmens vge.
;A program vge.

[Program 31]
Svgal

Segment
;Szegmensdefinci.
assume cs:Svgal,ds:Svglll ;Cs,ds hOZ2rendelse.

Stan:

mov
mov

u.Svglll
ds,u

;Ds regiszter belltsa a kd


;elejre.

mov
mov

u,OaOOOh
es,ax

;A videomemria kezdcimt
;es regiszterile teszi.

call

Trident_Ini

;Az zemmd bekapcsolsa.

.l_Svgal:

mov cs,10:Z4
push ex

;A vonal hossza.

mov
mov
mov
xo r
mov
int

al,byte ptr (Szin)


cs,word ptr (Koord_X)
ds,Word ptr (Koord_Y)
bh,bh
ah,Och
lOb

;Al regiszterile a pont sznt,


;ex-be az X, dx-be az Y
;koordintt kell helyezni,
;bh tartalmazza a grafikus lap
;szmt (itt csak O lehet) s
;az ah=Och jelenti a rutinnak,
;hogy egy pontot kell kitenni
;a megadott paramterekkel.

pop
inc
loop

ex
word ptr (Koord_X)
.l_Svgal

;Az X koordinta nvelse


;mg ex nem nulla

xor
int

u, u
16h

;Billentyvrs.

mov
int

u,3
lOb

;A szveges md belltsa.

mov as,4c00h
int
l lh

192

;Visszatrs az opercis
;rendszerhez.

Grafika programozsa Assembly nyelven


Ahead_Ini

Proc
mov
int
ret

Ahead_lni

Endp

Oak_Ini

Proc
mov
int
ret

Oak_Ini

u,6lb
!Oh

u,59b
lOh

Endp

Trident_Ini Proc
mov
int
ret

ax,62h
l Oh

Trident_Ini End p
Tseng_Ini

Proc
mov
int
ret

ax,38h
l Oh

Tseng_Ini

End p

Koord_X:
Koord_Y:
Szin:

dw
dw
db

Svgal

En ds
End Start

o
384
15
;A szegmens vge.
;A program vge.

A prograrnek mkdse igen egyszer, az egyetlen olyan


dolog, ami eddig nem nagyon volt hasznlva, az a cm kiszmtsnl alkalmazott megolds, mgpedig az, hogy 16 bites szor-

193

ffiM PC Gyakorlati Assembly


zsnl az eredmnyt dx:ax-ben kapjuk meg s ezzel meg lehet
hatrozni, hogy a pont hnyadik videoszegmensre esik mivel dx
regiszter azt fogja mutatni, hogy az eredmny hnyszor nagyobb
egy szegmensnl. Az adc utastsra azrt van szksg, mert
elfordulhat, hogy a szorzs utn di regiszterben egy 65535-hz
kzeli szm alakul ki, s a vzszintes koordinta hozzadsa sorn krbefordulna a regiszter s gy egy O-hoz kzeli rtket
kapnnk, ami tulajdonkppen j is, de nem azon a szegmensen,
ahol az elbb voltunk, hanem a kvetkezn. Ezrt kell hozzadni a dx regiszterhez a O+carry rtket.
Amikor a pontkirakst a BIOS vgzi el, akkor annyi csupn
a dolgunk, hogy a megfelel regiszterekbe belltsuk a kvnt
paramtereket s elindtsuk a rutint. A gp automatikusan kiszmalja a kppont eimt s a megfelel sznre lltja azt. Az
egyetlen klnbsg a sebessg, az utbbi sokszor lassabb a direkt rutinnl.

194

Grafika programozsa Assembly nyelven


FGGELK
A PSP felptse:
Cm byte:

Tartalom:

0-1

A kt byte tartalma:CD 20, ami egy int 20


utastsnak felel meg. Erre a cmre ugorva a
program befejezheti a futst.

2-3

A memria fels hatr, az els nem hasznlhat


memriacm paragrafusokban kifejezve.

Fenntartott.

5-9

A DOS funkcikkal kapcsolatos tvoli


utasts.

OAh-OB

A program befejezsi offsetcme.

OCh-ODh

A program befejezsi szegmenscme.

OEh-OFh

A Ctrl Break kilps offsetcme.

10h-11h

A Ctrl Break kileps szegmenscme.

12h-13h

hibakezel

rutin offsetcme.

14h-15h

hibakezel

rutin szegmenscme.

16h-2B

A DOS rszre fenntartott terlet.

2Ch-2Dh

A programkrnyezet szegmenscme

2Eh-4Fh

A DOS rszre fenn~artott terlet.

50h-52h

Ez a 3 byte egy int 21 h tvoli hivst tartalmaz.

53h-5Bh

A DOS rszre fenntartott terlet.

call

195

IBM PC Gyakorlati Assembly


5Ch-6Bh

Norml (nem megnyitott) file ler blokk (FCB1)

6Ch-7Fh

Msodik norml nem megnyitott FCB2. Ezt a kt


file ler blokkot a DOS kszti el s az adott
utastsra vonatkoz paramtereket tartalmazza.

80h-FFh

Lemez tviteli terlet (DTA). Itt troldnak azok


a paramterek, amiket az utastst kveten
megadtunk mint paramtert.

A 10h megszakts lehetsgei:


Funkci:

Mkdse:

ah=O

A megjelentsi md belltsa, az zemmd


sorszmt. EGA,VGA (MCGA) krtyk esetn
ha az zemmd 7. bitje 1 rtk, akkor nem trli
a kpernyt, klnben igen.

ah=1

A kurzor tpusnak belltsa. ch regiszter als


4 bitje a kurzor kezd, cl als 4 bitje az utols
sornak szmt hatrozza meg. Csak szveges
kpernyn alkalmazhat.

ah=2

A kurzor pozcijnak belltsa. Dh a sor, dl az


oszlop, bh a lap sorszmt hatrozza meg.

ah=3

A kurzor pozcijnak lekrdezse. A bh regiszterben kell megadni a lap sorszmt, ahol kvncsiak vagyunk a kurzor helyzetre s az elbb
emltett regiszterekben kapjuk meg a szksges
informcikat Grafikus zemmdban a lap sorszma ltalban O.

ah=4

A fnyceruza regisztereinek olvassa. Amikor


ah regiszter rtke 1, akkor a fnyceruzval kijellt karakter sort a dh, oszlopt a dl regiszterben kapjuk meg. Grafikus mdban a ch illetve
EGA krtyknl a ex regiszter tartalmazza a
fnyceruza Y bx pedig az X koordintjt.

196

Grafika programozsa Assembly nyelven


ah=S

Az aktv lap kivlasztsa, a lap sorszmt al


regiszterben kell megadni.

ah=&

Az aktulis lap egy rsznek felfel mozgatsa.


A sorok szmt al regiszterben kell megadni (O
esetn trli a kpet). A mozgatand terlet bal
fels sarkt cl ch, jobb als sarkt pedig dl dh
regiszterek hatrozzk meg.

ah=7

Az aktulis lap egy rsznek lefel mozgatsa.


A megadand paramterek megegyeznek a
felfel mozgatsnl lertakkaL

ah=S

A bh regiszter ltal mutatott lapon a kurzor pozcijban lv karakter ascii kdjnak s sznnek lekrdezse. A kdot ah, a sznt al regiszterekben kapjuk meg.

ah=9

Karakterek rsa a kurzor pozcijtl kezdd


en. A kirand karakter kdjt al, az ismtlsek
szmt ex regiszterben kell megadni. Bh regiszter jelentse 256 szn grafikus mdoknl a httrszn, egybknt a lap sorszma, bl regiszter
karakteres kpernyn a teljes sznt, grafikus mdoknl az eltr sznt hatrozza meg. Ha bl regiszter 7. bitje 1 rtk, akkor az adatot xor mvelettel teszi ki a kpernyre.

ah=OAh

A funkci nagyban megegyezik az elzvel,


annyi klnbsggel, hogy szveges mdban
nincs lehetsg attribtum megadsra, ekkor
az ppen aktulis sznt fogja hasznlni.

ah=OBh

A sznpaletta lltsa. Ha bh regiszter rtke


nulla, akkor 320"200 CGA mdban a httr,
karakteres mdban a keret, 640"200 CGA
mdban az eltr, 640"200 EGA mdban a
httr sznt lehet megadni bl regiszterben. Ha
bh regiszter tartalma 1 akkor a 320"200-as CGA
kpernyhz tartoz kt sznpaletta kzl lehet
vlasztani bl segtsgvel (O vagy 1).

197

ffiM PC Gyakorlati Assembly


ah=OCh

ah=ODh

Pont kiraksa a dx ltal megadott sorban, ex ltal megadott oszlopban al sznnel, bh ltal mutatott lapra. 256 szn grafikus mdban al csak a
sznt hatrozza meg, klnben ha a 7. bitje 1 rtk, akkor az aktulis helyen lv sznnel xor
kapcsolatba hozza az ltalunk megadottat, s az
eredmnyt fogjuk ltni a kpernyn.
Egy pont visszaolvassa. Az eredmnyt az
emltett regiszterekben kapjuk.

elbb

ah=OEh

Karakter kiraksa a kurzor pozcijba annak


mozgatsval. Al regiszterbe kell tenni a kirand karaktert, grafikus mdban bl regiszterbe az
eltr sznt, szveges mdban bh-ba a lap szmt.

ah=OFh

Az aktulis video md lekrdezse. Al regiszterben kapjuk az zemmd sorszmt, ah-ban az


egy sorban lv karakterek szmt, bh regiszterben pedig az aktv lap szmt.

ah=10h

198

EGA, MCGA, VGA krtyk sznpalettinak belltsa a megfelel rtkre.

ai=O

A bl regiszterben megadott szm paletta regiszter belltsa bh-ban megadott sznre.

al=1

A keret sznnek belltsa bh regiszterben


megadott sznre. (kivtel MCGA)

al=2

A paletta regiszterek s a keret lltsa es:dx ltal mutatott adatterlet rtkei alapjn. Az els
16 byte a palettasznt, a 17. byte a keret sznt
hatrozza meg.

al=3

A szn byte 3. bitjnek rtelmezse. Ha bi=O akkor az intenzits, bl=1 eseln pedig villogs vezrlse.

Grafika programozsa Assembly nyelven


al=7

A VGA krtyk paletta regiszterek kiolvassa.


A regiszterek jelentse megegyezik a O. funkdval.

ai=S

A keret sznnek visszaolvassa. A szn rtkt


bh regiszterben kapjuk meg.

ah=9

A VGA krtyk sznpalettinak rtkt s a keret


sznt egy es:dx ltal mutatott 17 byte-os adatterletre msolja. Az egyes byte-ok rtelmezse
megegyezik a 2. funkcinl lertakkal.

al=1 Oh

Az MCGA s VGA krtyk paletta regisztereinek


belltsa. Bx-ben megadott sorszm palettt a
dh ch cl regiszterek ltal meghatrozott RGB
sszetevknek megfelel sznure lltja. Az
egyes komponensek maximlis rtke 256 sznu
mdoknl 63 mivel ilyenkor a gp teljes sznpalettja 18 bites.

al=12h

Az MCGA s a VGA krtyk sznpalettinak belltsa az es:dx ltal mutatott tblzat adatai
alapjn. Cx mutatja a belltand sznregiszterek
szmt. A szneket RGB sorrendben kell trolni
a memriban.

al=13h

A VGA sznkivlaszt regiszter belltsa. Ha bl


rtke O, akkor az zemmd regiszter 7. bitjt a
bh regiszter 7. bitje hatrozza meg. Ha bl=1
akkor a bh-ban megadott adatot a sznkivlaszt
regiszterbe rja.

al=15h

Az MCGA s a VGA krtyk sznregisztereinek


olvassa. A regiszterek mukdre megegyezik a
10h funkcinl emltettekkel.

al=17h

Az MCGA s a VGA krtyk sznregisztereinek


kiolvassa a 12h funkcinl lertakkal megegyemdon.

199

IBM PC Gyakorlati Assembly


al=18h

Az MCGA s a CGA krtyk digitl-analg talaktja maszkregiszternek belltsa bl regiszterben megadott rtkre.

al=19h

A digitl-analg talakt maszkregiszternek


kiolvassa a 18h funkcinak megfelelen.

ai=1Ah

A VGA krtyk sznkivlaszt regiszternek


kiolvassa a bh regiszterbe. 81 regisztert az
zemmd regiszter 7. bitje alapjn lltja be. Ha
bi=O, akkor bh regiszterbe a sznkivlaszt
regiszter 2. 3. bitjt, ha bl=1 akkor a 0-3. bitjt
teszi.

al=1 Bh

Szrke skla ellltsa VGA illetve MCGA


krtyknL Bx regiszterben kell megadni az els
sznkd szmt, ex-ben pedig a sznskla
hosszt.

ah=11 h

200

Az EGA, MCGA, VGA zemmdok karakter


genertornak programozsa az al regiszterben
meghatrozott altunkei szerint. AI=0-4 funkcik
alaphelyzetbe lltjk a megjelentt, de nem tr
lik a kpernyt, al=10h-14h funkcik megegyeznek a 0-4 funkcikkal, de csak a O. lap aktivizlsa utn hasznlhatk. Al=20-24 a grafikus karakterkszletet tlti be a memriba.

ai=O

A felhasznl ltal definilt karakterkszlet


betltse. Es:bp regiszterekbe kell belltani a
karaktertbla kezdcmt, ex-be a karakterek
szmt, dx-be az els karakter kdjt, bl regiszterbe a karaktergenertor sorszmt, ahov betltse a kszletet s bh regiszteme az egy karaktert ler byte-ok szmt.

al=1

A 8*14 pont mret betkszlet betltse a


ROM-bl. 81 regiszterben kell megadni a karakter genertor sorszmt.

Grafika programozsa Assembly nyelven


al=2

A 8*8-as betkszlet betltse, bl regiszter


jelentse megegyezik az elzvel.

al=3

Az aktv karakter genertor kijellse. A bl


regiszterben kell megadni a kszlet sorszmt.

al=4

Csak MCGA s VGA krtyknl a 8*16 pontos


betkszlet betltse.

al=10h-14h ld.: 1-4.


al=20h

8*8 kppont mret grafikus felhasznli kszlet


betltse. A kezdcmet es:bp regiszterekben
kell megadni.

al=21 h

Felhasznli grafikus karakterkszlet betltse


es:bp cmtL Az egy karakterhez tartoz byte-ok
szmt ex regiszterben kell megadni. A
megjelentend
sorok szmt bl rtke
hatrozza meg. Ha bi=O, akkor a megjelentend
sorok szmt dl regiszter tartalmazza, bl=1
eseln 14, bl=2 eseln 25, bl=3 eseln pedig
43 soros megjelents.

al=22h

8*14 pont mret grafikus kszlet betltse a


memriba. 81 s dl szerepe megegyezik az
elzveL

al=23h

8*8 pontos grafikus karakterkszlet betltse a


memriba. 81, dl szerepe azonos az
elzekkeL

al=24h

VGA krtyk 8*16 pontos kszletnek betltse.


81, dl szerepe mint elbb.

al=30h

A karakterkszlet cmnek lekrdezse bh


regiszterben megadott szempont szerint. A
karakterenknti sorok szmt ex a kijelzett sorok
szmt pedig dl regiszterben kapjuk. Az es:bp
rtke bh tartalmtl fggen ll be:
201

ffiM PC Gyakorlati Assembly

ah=12h
bl=1 Oh

bh=O

Es:bp az int 1Fh vektort adja,

bh=1

Es:bp az int 44h vektort adja,

bh= 2

Es:bp a ROM 8*14 pontos karakter


kszletnek cmt adja,

bh=3

Es:bp a 8*8-as kszlet 0-127 ascii


kdokhoz tartoz cmt adja,

bh=4

Es:bp a 8*8-as kszlet msodik


felnek cmt mutatja,

bh=S

Es:bp a ROM 9*14 pontos karakter


kszletnek cmt adja,

bh=&

Es:bp a ROM 8*16 pontos karakter


kszletnek cmt adja,

bh=7

Es:bp a ROM 9*16 pontos karakter


kszletnek cmt adja,

EGA, MCGA, VGA konfigurcis funkcik:


Konfigurcis informcik lekrdezse. Hvs
utn ha bh regiszter rtke nulla, a belltott
zemmd sznes, 1 esetn fekete-fehr. Ch
regiszter mutatja a bemr csatlakozn lv
jelet, cl a krtya kapcsolinak llst. 81
regiszterbl tudhatjuk meg a memria kapacits
mrtkt.
bi=O
bl=1
bl=2
bl=3

bl=20h

202

: 64Kbyte,
: 128 Kbyte,
: 196 Kbyte,
: 256 Kbyte vagy tbb.

A 43 soros EGA, VGA kpernytartalmat


kinyomtatni kpes rutin kivlasztsa.

Grafika programozsa Assembly nyelven


bl=30h

Csak VGA krtyknl a karakteres


rasztersorainak szma:

kperny

ai=O : 200 sor


al=1 : 350 sor
al=2 : 400 sor
bl=31h

bl=32h

bl=33h

bl=34h

bl=36h

VGA krtya esetn a standard paletta rtkek


betltsnek engedlyezse:
ai=O

A betlts engedlyezve,

al=1

A betlts letiltva.

A VGA krtyk perifria-, memria regiszterei


elrsnek engedlyezse, tiltsa:
ai=O

Az elrs megengedett,

al=1

Az elrs tiltott.

Fekete-fehr VGA kimenet


dlyezse:

ellltsnak

ai=O

A konverzi megengedett,

al=1

A konverzi tiltott.

enge-

A kurzor emulci engedlyezse VGA krtyn:


ai=O

Az emulci megengedett,

al=1

Az emulci tiltott.

VGA krtya kimeneteinek vezrlse:


ai=O

A kimenetek engedlyezettek,

al=1

A kimenetek tiltottak.

203

ffiM PC Gyakorlati Assembly


ah=13h

Az es:bp cmen kezdd ex hosszsg szveg


kiratsa a bh regiszter ltal meghatrozott lapra. A szveg koordintjt dx regiszterben kell
megadni, dh-ba a sor-, dl regiszterbe pedig az
oszlop koordintjt. Al regiszter segtsgvel
tbb alfunkci kzl vlaszthatunk:

ai=O

A szveg csak a karakterek kdjait tartalmazza,


az attribtum informcit a bl regiszter hatrozza meg. A kurzort nem mozgatja.

al=1

A szveg csak a karakterek kdjait tartalmazza,


az attribtum informcit a bl regiszter hatrozza meg. A kurzort mozgatja.

al=2

A szveg a karakter s sznkdokat felvltva


tartalmazza, a kurzort nem mozgatja.

al=3

A szveg a karakter s sznkdokat felvltva


tartalmazza, a kurzort mozgatja.

ah=1Ah
ai=O

megjelent

A megjelent adatainak lekrdezse, bl-ben az


aktv, bh regiszterben az inaktv megjelent
kdjt kapjuk.
Kd

Megjelent

O
1
2
3

Nincs beptve
MDA fekete-fehr
CGAsznes
Fenntartva
EGAsznes
EGA fekete-fehr
PGA
VGA analg fekete-fehr
VGA analg sznes
Fenntartva
MCGA digitlis sznes
MCGA analg fekete-fehr

4
5
6
7
8
9
OAh
OBh

204

adatainak lekrdezse.

Grafika programozsa Assembly nyelven


OCh
Offh

MCGA analg sznes


Ismeretlen megjelent tpus.

Megjelent kombincik belltsa. A regiszterek hasznlata megegyezik az elbb hasznltakkal.

al=1

Az MCGA, VGA adottsgainak s llapotnak

ah=1Bh

lekrdezse. A rutin hvsa eltt bh regiszterbe


nullt, es:di regiszterekbe pedig egy 64 byte
mret adattrolsra hasznlhat memriarekesz eimt kell megadni, ahov a gp az adott
megjelentvei kapcsolatos informcikat trolni
fogja. Ennek felptse:
Cm

Hossz

Funkci

A BIOS statikus adattblzatra mutat


cm.

Az aktulis zemmd kdja.

A kijelzett karakteroszlopok szma.

A kperny frisstsre hasznlt memria terlet hossza.

A memria terlet kezdcme.

OBh

16

Az egyes lapokon

lv

kurzorok cmei.

1Bh

A kurzor utols sornak szma.

1Ch

A kurzor

1Dh

Az aktv lap sorszma.

1Eh

kezdsornak

szma.

A krtya perifria cme.

20 h

zemmd regiszter rtke.

21 h

A sznkivlaszt regiszter rtke.

205

ffiM PC Gyakorlati Assembly


A megjelentett karaktersarok szma.

22h
23 h

Egy karakter rasztersorainak szma.

25h

Az aktv megjelent kdja.


Az inaktv

26 h
27h

kdja.

A kijelzett sznek szma.


Az elrhet lapok szma.

29h
2Ah

megjelent

A kijelzett resztersorok szma:

o- 200
1-350
2-400
3-480
4 - fenntartva 5 - 600
6-768

A karaktergenertor sorszma. amit a

2 Bh

sznbyte 3. bitjnek O rtke mellett


hasznl VGA krtyn.

2 Ch

A karaktergenertor sorszma, amit az


elbb emltett bit 1 rtke mellett
hasznl.
llapotkd. Az egyes bitek jelentse:

2 Dh

7-6
5

4
3
2
1
O

2 Eh
206

Fenntartva.
A villogs engedlyezett.
Kurzor emulci engedett.
Az alap palettartkek betltse
engedlyezett.
Fekete-fehr monitor hasznlata.
A szrke rnyalatok ellltsa
engedlyezett.
Minden md bellthat.

Fenntartva.

Grafika programozsa Assembly nyelven


A krtya memriakapacitsa:

31 h

O -64K
2 -196K

Paramter ments lehetsgei:

32h

7-{)
5
4
3
2
1

O
33 h

1- 128K
3 - 256K vagy tbb.

13

Fenntartva.
Kiegszt tblzat hasznlata.
A paletta regiszterek fellrhatk.
A grafikus karakterek fellrhatk.
A norml karakterek fellrhatk.
Dinamikus jellemzk tblzata
aktv.
Kt karakterkszlet hasznlata
VGA krtynl.

Fenntartva

A statikus paramterek tblzata:


Cm

Hossz

Funkci

A O - 13h zemmdok bellthatsga,


az engedlyezst az egyes bitek rtke
hatrozza meg.

Fenntartva.

A bellthat pontsarok szma karakteres mdban:


7-3
2
1
O

Fenntartva.
400 sor.
350 sor.
200 sor.

Az egyszerre megjelenthet karakter

kszletek szma.
9

betlthet

kszletek szma.

207

IBM PC Gyakorlati Assembly


OAh

Egyb BIOS tulajdonsgok:


15
14
13
12
11
10

9
8
7-4
3
2
1

OC h
OEh

Fenntartva.
Mentsi paramterek:
7-6
5
4
3
2
1

o
OFh
ah=1Ch

ai=O

208

A D/A talakt a sznkivlaszt


regiszterrel vezrelhet.
A sznkdok betlthetk.
64 palettaregiszter hasznlhat.
Kurzor emulci hasznlhat.
Paletta alaprtkeinek betltse
hasznlhat.
Karakter kszlet betlthet.
A szrkernyalatok bellthatk.
Minden md hasznlhat.
Fenntartva.
Kombincis lehetsgek.
Villogs l httrintenzts.
Az llapot ments hasznlhat.
Fnyceruza engedlyezett.

Fenntartva.
Kiegszt tblzat hasznlhat.
Paletta regiszterek menthetk.
Grafikus kszlet menthet.
Norml karakterek menthetk.
Dinamikus jellemzk tblzata
menthet.
Tbb karakterkszlet engedett.

Fenntartva.
A VGA krtya llapotnak mentse, visszatltse.
A mentshez szksges memriaterlet mretnek lekrdezse. A ex regiszter bigeivel vlaszthat ki a menteni kvnt tulajdonsgok csoportja
s bx regiszterben kapjuk a szksges memria
terlet mrett 64Byte-os egysgben.

Grafika programozsa Assembly nyelven


Bit

Paramtercsoport

2
1
O

Sznkdok adatai
BIOS adatmez
Hardware paramterek.

al=1

A paramterek mentse az es:bx ltal cmzett


memria terletre. Cx szerepe az lekrdezsnl
lertakkal megegyezik.

al=2

A lementett paramterek visszalltsa az es:bx


ltal mutatott memria terlet adatai alapjn. Cx
szerepe hasonl az elbb emltettekkeL

209

Trgymutat
Trgymutat
A

AAA,74
AAD,75
AAM,75
AAS, 74
Adatbusz, 7
ADC, 76
ADD, 76
ALU, 6
AND, 25; 88; 101
Asciikd,l7
Assembly, 8
B

BCD, 41
Bels regiszter, 114
Bettpus, 135
Binris, 36
BIT, 7; 25; 93; 130
Bitsk, 122
Bittrkp, 136; 174
Brusb, 182
Byte, 7; 16; 20

c
CALL, 32; 87
Carry, 102
CBW,80
CGA, 92
Ciklusok, 9; 32
Cm, 7
Cmbusz, 7
Cmke, 20; 23
CLC,81
CLD, 61; 82
CLl, 82
CMC,82
CMP,80

210

CMPS,80
CMPSB, 57; 81
CMPSW, 57; 81
CPU, 6
<...'WD, 80
D

DAA,75
DAS, 75
DEC, 76
Decimlis, 38
DIV, 40; 77
DMA, 67
DTA,66
Dword, 7; 16; 20
E

EGA, 116
Egrkurzor, 98
Eljrsok, 9
EQU, 69
F

FAR, 23
Felbonts, 92; 116; 140
Felttelek, l O
File, 52
Flag, 12; 24; 70
G

Gpkd, 8
H

Handle, 53
Httr, 121
Hercules, 92
Hexadecimlis, 36
HLT, 90
Holtciklus, 70

Trgymutat
I

110,68
IDIV, 77
Ikon, 92; 98; 143
IMUL, 77
IN, 69; 82
INC, 76
lndexregiszter, 12
INS,83
INSB,83
INSW,83
INT, 17; 87
Int, 70
Intenzits, 93
INT0,87
IRET, 70; 87

LAHF,80
LDS, 79
LEA, 78

JA, 84
JC,85
JG,85
JGE,85
JMP, 23; 84
JNA,84
JNC,84
JNG,85
JNGE,86
JNZ,85
JZ,85
K

Karakterkszlet, 117; 133


Krtya, 92
Kperny-memria, 92; 93;
140
Kpernyvezrl, 114
Kpformtum, 174
Keret, 120
Komplemens, 25
KontroUer, 68
Koordinta. 97

Lebegpontos,

153

LES, 79
WCK,90

LODS,78
LODSB,78
LODSW,78
LOOP,32; 86
LOOPNZ,86
WOPZ,86
M

Megszakts, 67
Memria, 51
Memriavltoz, 20
Men,44
Monitor, 92
MOV, 15;77
MOVS,78
MOVSB,78
MOVSW,78
MUL, 77
N

NEG, 25; 88
NOP,90
NOT, 25; 88

o
Offset, 10; 17
OR, 26; 88; 101
Org, 14
OUT, 69; 83; 92
OUTS,83
OUTSB,83
OUTSW,83
211

Trgymutat
p

Paletta, 93; 117; 120; 140; 176


Paragrafus, ll
Parits, 68
Plane, 117; 121
Pont, 95
POP, 38; 84
POPF,84
Port, 67; 92; 114
PSP, 55; 66
PUSH, 38; 83
PUSHF,83
R

RAM, 6
RCL, 28; 89
RCR, 27; 89
Real-Time, 41
Regiszter, 10
REP, 57; 86
REPNZ,86
REPZ, 86
RET,32; 87
RETF,87
Rezidens, 70
ROL, 27; 89
ROM BIOS,14; 17; 33; 92;
117
ROR, 27; 89

s
SAHF,80
SAL, 29; 89
SAR, 28; 90
SBB, 76
Scan kd, 51
SCAS,81
SCASB, 57; 81
SCASW, 57; 81
ScroU,159
Sequencer, 126
212

SET-RESET,122
SHL, 28; 89
SHR,28;89
Stack, 38
Standard, 183
STC,81
STD,82
STI, 82
STOS, 78
STOSB, 78
STOSW, 78
SUB, 76
SVGA,183
Szegmens, 10; 14; 23; 55
Szegmenscm, 93
Szegmensregiszter, 12
Sznbyte, 17
Sznkioszts, 93
T

TEST, 81
Tmrts, 174

zemmd, 92

v
Vltozk, 9
Verem, 38
Vertical Blank, 114
VGA, 116
Video lap, 117
Videomemria, 117

w
WAIT,90
Word, 7; 16; 20

x
XCHG,79
XLAT,36; 79
XOR,26;88

792,-

I . a elektronikai alkatrszek heszerzsrl van sz, Magyarorszgon mg ma is az


ELEKTROMODUL a legnagyobb szakvllalat.

II

* kszletezs

* bizomnyi beszerzs
* export - import
* nagykeresketJelem

* kiskereskedelmi rusts, bizomnyban is

l
l

* katalgustr
* alkalmazstechnikai tancsads.

De kereskedhz-knt nemcsak alkatrszekkel foglalkozunk!

* alapanyagok
* alkatrszek
* szerelsi anyagok* rszegysgek
*~;,pek
* muszerek
* komplett technolgik

/l

beszerzst vllaljuk

elssorban

az elektronikai ipar terletn, de esetenknt ms gazatok


rszre is.

Raktrbzisunk szoii:ltatsai

* vmudvarknt behozata/i s kiviteli vmkezels


* vmkfsrvnyezs

* brraktrozs.

ELEKTROMODUL Vllalat Elektronikai Kereskedllz


1132 Budapest, Victor Hugo u. 11-15.
Tel.: 270-2899,270-1477 Fax: 129-1650 Tx.: 22-5154
Raktrbzis:
1158 Budapest, Ksmrk u. 92.
Tel.: 251-8700
Fax: 163-3087 Tx: 22-6622

You might also like