You are on page 1of 148

TMOP-4.1.1.

F-14/1/KONV-2015-0009
A GPSZETI S INFORMATIKAI GAZATOK DULIS S
MODULRIS KPZSEINEK KIALAKTSA A PCSI
TUDOMNYEGYETEMEN

Gimesi Lszl

Intel processzorok programozsa


assembly nyelven

Pcs
2015

A tananyag a TMOP-4.1.1.F-14/1/KONV-2015-0009 azonost szm,


A gpszeti s informatikai gazatok dulis s modulris kpzseinek kialaktsa a
Pcsi Tudomnyegyetemen cm projekt keretben valsul meg.

TMOP-4.1.1.F-14/1/KONV-2015-0009
A GPSZETI S INFORMATIKAI GAZATOK DULIS S
MODULRIS KPZSEINEK KIALAKTSA A PCSI
TUDOMNYEGYETEMEN

Intel processzorok programozsa assembly nyelven

Gimesi Lszl
Szakmai lektor: Mark Tams
Nyelvi lektor: Gimesi Lszln

ISBN 978-963-642-831-0

Pcsi Tudomnyegyetem
Termszettudomnyi Kar

Pcs, 2015.
Gimesi Lszl

Tartalomjegyzk
1.

Bevezets

2.

Hardver

3.

4.

5.

6.

7.

2.1.

A rendszerbusz (sn)

2.2.

CPU (Central Processing Unit)

2.3.

Az operatv memria

2.4.

Az input/output egysgek

Binris aritmetika

10
12

3.1.

A szmrendszerek

12

3.2.

Adatbrzols

14

3.3.

Az Intel processzorok szmbrzolsa

17

3.4.

Mveletvgzs

18

Az Intel mikroprocesszorok

27

4.1.

Kezdetek

27

4.2.

Mikroprocesszor

29

4.3.

Az Intel processzorok regiszterkszlete

31

4.4.

A matematikai trsprocesszor

35

Az Intel processzorok utastsrendszere

38

5.1.

Utastsok

38

5.2.

Operandusok s cmzsi mdok

38

5.3.

A verem (stack)

42

5.4.

Memriaszervezs

43

Az assembly programozs

45

6.1.

Szegmentls

45

6.2.

Kezdjnk el programot rni

46

6.3.

Konstansok hasznlata

47

6.4.

Nhny egyszerbb szubrutin

48

6.5.

Az adatszegmens hasznlata

58

6.6.

Lemezmeghajt kezelse

67

6.7.

A karakteres vide-memria kezelse

70

6.8.

Mintapldk az INT 21h interrupthoz

73

Az assembly kapcsolata ms nyelvekkel

78

7.1.

Assembly rutinok Turbo Pascal programokban

78

7.2.

Assembly rutinok C programokban

84

8.

Irodalomjegyzk

94

9.

Mellklet

95

Intel processzorok programozsa assembly nyelven

1. Bevezets
A trolt program elvt Neumann Jnos1 fogalmazta meg, miszerint a programutastsok s az
adatok azonos formban (binrisan), ugyanabban a bels memriban helyezkednek el. gy van
ez a legkorszerbb szmtgpnl is. Ez azt jelenti, hogy a szmtgpen brmilyen programozsi nyelvet is hasznlunk, az eredmny mindig egy binris az operatv memriba tlthet
szmsor (utastssorozat).
Az els szmtgpeket gpi kdban programoztk, az utastsokat binris szmok formjban kellett a memriba tpllni. 1946-ban kezdtk hasznlni a mnemonikus kdokat2, majd a
szimbolikus nyelveket, amelyekkel nagymrtkben megnveltk a programrs hatkonysgt.
Azonban az gy elksztett utastssorokat le kellett fordtani gpi kdra. Az els fordt (assembler) program 1949-ben kszlt el.
A programozs sorn legtbbszr egy folyamatot runk le. Elkpzeljk, hogy egy adott feladatot hogyan oldannk meg (milyen lpsek sorozatval tudnnk lerni), s azt prbljuk a szmtgppel elvgeztetni. Egy programozsi nyelvnek, s az azt lefordt fordtprogramnak az a
feladata, hogy megteremtse a kapcsolatot az emberi gondolatok s a CPU utasts-vgrehajtsa
kztt.
Minl kzelebb ll egy programozsi nyelv az emberi gondolkodshoz, minl egyszerbben
lehet lerni benne a feladatot, annl magasabb sznt nyelvrl (programozsi nyelvrl) beszlhetnk. Ekkor a fordtprogramra hrul a nagyobb feladat, hogy a gpi kdot (futtathat llomnyt)
ellltsa, ez a kd azonban nem lesz optimlis. A mkdskor felesleges utastsokat is knytelen a processzor vgrehajtani, ami megnveli a program erforrsignyt, de manapsg a korszer, nagysebessg processzorok korban a programozk nagy rsze ezzel nem foglalkozik.
Amikor programjaink optimalizlsa, sebessgnek nvelse a clunk, assemblyben (alacsony
szinten) kell a programunkat elkszteni. Ekkor a programozra hrul a nagyobb feladat, hiszen
neki kell sszelltani gy az utastsokat, ahogy a CPU gondolkodik.
Vannak olyan esetek, amikor az assembly rsakor nem az optimalizls a clunk. Ilyen pldul, amikor egy magas sznt nyelv nincs felksztve bizonyos feladatok elvgzsre: klnbz
konverzik, erforrsok s portok kezelse stb.
Ahhoz, hogy az assembly-t hatkonyan tudjuk hasznlni, meg kell ismerni a szmtgpek,
mikroprocesszorok felptst, s a binris aritmetikt. E tmkkal foglalkozik a jegyzet els
rsze. Ezt kveti az Intel mikroprocesszorok mkdsnek s programozssnak ismertetse.
A jegyzet egyszer pldk segtsgvel, lpsrl-lpsre ismerteti az utastsokat s a MASM
(Microsoft Macro Assembly) nyelvet, majd foglalkozik azzal is, hogy milyen mdon lehet meghvni egy assembly rutint magas sznt programozsi nyelvbl.
A Fggelkben tbbek kztt sszefoglalsra kerl az Intel processzorok alaputastskszlete s a fontosabb megszaktsok (interrupt-ok) kezelse.

Neumann Jnos (John von Neumann) 1903. december 28-n szletett Budapesten. 1925-ben a Zrich-i Egyetemen vegyszmrnki diplomt szerzett, majd 1926-ban, Budapesten, matematikbl doktorlt. 1930-ban meghvtk a Princeton Egyetemre,
ahol nem sokkal ksbb professzorr neveztk ki. F kutatsi terlete a matematikai logika, a jtkelmlet s a halmazelmlet
volt, de foglalkozott fizikai problmk megoldsval is. A II. vilghbort kveten tbb szmtgpes jts fzdik a nevhez.
2
A programozsban hasznlt, a beszlt nyelvhez hasonl, abban knnyen megjegyezhet kifejezsekket mnemoniknak nevezzk.

Gimesi Lszl 2015.

2. Hardver
A szmtgp fejldse sorn kezdetben minden egyes szmtgp ms s ms architektrval rendelkezett. Ez azt jelentette, hogy ahny tpus szmtgpet terveztek s ptettek, mindegyik a tbbitl eltr felpts volt, a rszegysgeket ms s ms elvek alapjn kapcsoltk
ssze. A legtbb szmtgp-struktra zskutcnak bizonyult, de volt nhny kzlk, amely
meghatrozta a tovbbi fejldst.
Neumann szmra az ENIAC-kal szerzett tapasztalatok alapjn nyilvnvalv vlt, hogy a
szmtgp programozsa kapcsolk s vezetkek segtsgvel nagyon krlmnyes s idignyes feladat. Ez a felismers vezetett az els programtrols szmtgp megalkotshoz, ahol a
memriban az adatokkal egytt az utastsokat is troltk.
Neumann azt is szrevette, hogy az ENIAC-ban hasznlt decimlis aritmetika (minden szmjegy brzolshoz 10 darab elektroncsvet hasznltak) helyettesthet binris aritmetikval.3
Azokat a szmtgpeket, amelyeket a fenti alapgondolatok alapjn ptettek, ma Neumannelv szmtgpeknek nevezzk. Ez az elv mg ma is alapja szinte valamennyi digitlis szmtgpnek. A Neumann-elv gpnek t elemi rsze volt: a memria, az aritmetikai-logikai, a vezrl, a bemeneti s a kimeneti egysg. Ezek memriakzpont szmtgpek voltak.
Az 1960-as vek elejn a DEC (Digital Equipment Corporation) bemutatta a PDP-8-at. E
szmtgpben alkalmaztk elszr a BUS (BUSZ) rendszert, amely megteremtette a szmtgpek bvtsnek lehetsgt. Teht a felhasznl ksbb is az ignyeinek megfelelen fejleszthette szmtgpt, pldul nagyobb memrival vagy j perifriaillesztkkel.
A BUSZ nem ms, mint prhuzamos kbelek sszessge, amelyeket a szmtgp rszegysgeinek sszektsre hasznlnak. Ez az architektra olyan jelents jts volt (a memriakzpont IAS gphez kpest), hogy azta is alkalmazzk majdnem minden kisszmtgpben.
rdekessgknt megjegyezzk, hogy mr 1964-ben is ksztettek olyan szmtgpet, a CDC6600-at, ahol tbb processzort is hasznltak. Egyet az sszeadshoz, egy msikat a szorzshoz,
harmadikat az osztshoz, s kln processzor volt az input/output mveletek elvgzshez.
A felsorolt nhny fejleszts volt az, amelyek alapveten meghatroztk a mai szmtgpek
felptst. Ennek megfelelen a szmtgp-architektra egy busz (ms nven sn) rendszerre
pl, amely biztostja a kapcsolatot a rszegysgek kztt. A rendszerbuszhoz kapcsoldik a
kzponti egysg (CPU), a bels (operatv) memria s az input/output egysgek (a perifriaillesztk).

Charles Babbage (1791-1871) az 1830-as vekben megtervezte az Analytical Engine mechanikus berendezst, amely mr
rendelkezett szinte az sszes olyan tulajdonsggal, mint egy modern szmtgp. Sajnos a kor technolgiai szinvonala nem tette lehetv a gp megptst.

Intel processzorok programozsa assembly nyelven

2.1. A rendszerbusz (sn)


Snnek nevezzk az azonos tpus adattvitelre szolgl vonalak (vezetkek) sszessgt. Ennek rtelmben a snrendszer architektrknl nem is egy, hanem hrom buszrl beszlhetnk,
gymint cmbusz (address bus), adatbusz (data bus) s vezrlbusz (control bus). Ezek egyttes
neve a rendszerbusz.
A cmbusz segtsgvel kijellhetjk a szksges input/output eszkzt, vagy a memria trol
rekeszt. Az adatbusz biztostja az adatramlst a rszegysgek kztt, s a vezrlbuszon a
szmtgp temezshez, vezrlshez szksges informcik haladnak.
A buszon tvihet adat nagysga (a busz szlessge) szmtgpfgg. A busz szlessge azt
jelenti, hogy egyszerre (prhuzamosan) hny bitnyi informci haladhat t rajta.
Mivel a buszon egyszerre csak egy adat tartzkodhat, elfordulhat, hogy a rszegysgeknek
vrakozniuk kell arra, hogy a buszt hasznlhassk. Illetve az is elfordulhat, hogy a rszegysg
foglalt s akkor a buszon lv adatnak kell vrakoznia, ami meggtolja ms eszkzk buszhozzfrst. A gyorsts rdekben az egysgek s az adatbusz kz egy tmeneti trolt,
adatpuffert (cache memrit) ptenek.
A szmtgpben hasznlt rszegysgek (processzor, memria, klnbz input/output eszkzk) nem egyforma sebessggel mkdnek, ezrt az jabb szmtgp-konstrukcikban nem egy
snrendszert hasznlnak, hanem tbbet. Pldul egyet a lassbb perifrikhoz, egy gyorsabb snt a
nagysebessg eszkzkhz (pl. winchester), s esetleg egy harmadikat a processzor s a memrik kztt. Ezt a rendszert osztott snrendszernek nevezzk. Ilyenkor a klnbz sebessg
buszokat szintn pufferrel (cache-sel) kell sszekapcsolni.
2.2. CPU (Central Processing Unit)
A kzponti egysg, vagy processzor (CPU) feladata az operatv (rendszer) memriban trolt
programok vgrehajtsa, a szmtgp rszegysgeinek vezrlse.
ltalnossgban a processzor felptsrl elmondhat, hogy hrom f egysgbl ll. Az
aritmetikai s logikai egysg (ALU), a vezrlegysg s a regiszterek. A CPU-n belli rszegysgeket egy gynevezett bels buszrendszer kti ssze.
2.2.1. ALU (Arithmetic and Logic Unit)
Az ALU legfontosabb rsze az sszead. Az sszeads eljeles binris szmokkal, kettes
komplemens kdban trtnik. Ezen kvl kpes az adatok bitenknti lptetsre, s az alapvet
logikai mveletek (NOT, AND, OR, XOR) vgrehajtsra. A mveletekhez hasznlt adatok s
eredmnyek ltalban a regisztertmbben helyezkednek el.
Az aritmetikai s logikai egysg feladata lehet mg a fixpontos szorzs s oszts is. A lebegpontos aritmetikai, s a hossz (tbb regiszteres) egsz szmokkal vgzett mveleteket egy lebegpontos aritmetikai egysg vgzi, ami lehet akr a processzoron kvl is (ez az gynevezett trsprocesszor vagy ko-processzor).

Gimesi Lszl 2015.

2.2.2. A vezrlegysg
A vezrlegysg feladata a processzor mkdsnek temezse s a kls egysgekkel trtn
kommunikci vezrlse. Mkds kzben az operatv memribl az utastsregiszterbe tltdik a programutasts. A vezrlegysg a betlttt utastskdnak megfelelen vezrli a proceszszort.
Ktfle vezrlsi mdot klnbztetnk meg: a huzalozott (hardware) s a mikroprogramozott
(firmware) vezrlst. A huzalozott vezrls utastskszlete kttt, az nem vltoztathat meg. A
mikroprogramozott vezrls azt jelenti, hogy egy processzorutasts tbb mikroutastsbl tevdik ssze, teht az utastskszlet utlag megvltoztathat.
2.2.3. A regisztertmb
A processzornak a mkdshez szksge van gyors, bels memrira, amelyben trolja pldul az utastsokat, vagy a mveletek input s output adatait. E feladatot a regiszterek ltjk el,
amelyek korltozott szmuk s mretk miatt nagymennyisg adat trolsra nem hasznlhatk.
(Erre val az operatv memria.)
A regisztertmb elemeit funkcijuk szerint hrom f csoportba sorolhatjuk:
Az ALU-hoz tartoz regiszterek, amelyek a mveletek operandusait s eredmnyeit, valamint a jelzbiteket troljk. Ezek az akkumultor(ok) (accu) s a jelzbit (flag) regiszterek.
A vezrlegysghez tartoz regiszterek, amelyek a vezrlst, a cmzst s az utastsvgrehajtst tmogatjk. Ezek kz tartozik az utastsregiszter, az utastsszmll, az
indexregiszter s a veremmutat is.
Az ltalnos cl regiszterek, amelyekben trolhatunk adatokat, vezrlkdokat s cmeket is.
A regiszterek szhossza (hny bit hosszsg) ltalban megegyezik a processzor szhosszval. (A legelterjedtebbek a 16, 32 s a 64 bit szhosszsg processzorok.)
A nagyobb szmokkal vgzett mveletekhez, a nagyobb memriacmek elrshez a regiszterek sszekapcsolhatk, gynevezett regiszterprokat hasznlhatunk.
2.2.4. A processzor zemmdjai
A norml mkdsi llapot
A Neumann-elv, trolt program szmtgpek norml llapotn azt rtjk, amikor a processzor egyms utn vgrehajtja az operatv memriban trolt utastsokat. Teht ilyenkor az
utastsciklusok egyms utni vgrehajtsa trtnik.
Az utastsciklus hrom rszbl ll: az utasts betltse az operatv memribl (az utastsmutat regiszterben trolt cmrl), majd az utasts hossznak megfelelen belltja a kvetkez
utasts cmt, s vgl vgrehajtja azt.

Intel processzorok programozsa assembly nyelven

Abban az esetben, ha a programunk befejezdtt, vagy valamilyen oknl fogva felfggesztettk a vgrehajtst, a processzornak le kellene llnia. Azonban ez nem megengedett llapot, hiszen a processzor indt s felgyel minden folyamatot, gy egy ll processzort hiba szltana
meg mondjuk egy perifria. Ezrt amikor a processzornak nincs feladata egy gynevezett
vrakoz ciklusban mkdik. (A modern mikroprocesszorok s mikrokontrollerek esetben ltezik egy SLEEP zemmd is, amikor meghatrozott idre felfggeszthetjk a processzor mkdst. Ilyenkor a hardvernek kell gondoskodnia az jraindtsrl, illetve a mkds folytatsrl.)
A processzorvezrelt kiszolgl llapot: megszakts (interrupt)
A processzor mindaddig norml mkdsi llapotban van, amg valamilyen kls eszkz kiszolglsa nem vlik szksgess. Ekkor az input/output eszkzk kztti kommunikcit mindig a processzor vezrli. Ez trtnhet a processzor kezdemnyezsre (pldul programmal kirunk a terminlra), illetve valamelyik eszkz krsre.
Abban az esetben, ha valamilyen input/output eszkz kr kiszolglst, akkor ezt jelzi a processzornak a vezrlbuszon keresztl (interrupt krs). Ha a processzor fogadni tudja a krst,
felfggeszti az ppen fut program mkdst (megszakts), s tadja a vezrlst az eszkzkiszolgl programnak.
Tbb, egyidej krs esetn hardveresen (vektor-interrupt), vagy programmal (opercis rendszerrel) kell eldnteni a kiszolgls sorrendjt.
A processzortl fggetlen kiszolgl llapot: DMA (Direct Memory Access)
Egy szmtgpes rendszerben ltalban a processzor irnyt minden mveletet. Azonban lehetnek olyan feladatok, amikor a processzor annyira leterhelt, hogy ms egysgeknek kell r vrakozniuk, valamint gyakran elfordul olyan tevkenysg, amit a processzortl fggetlenl is
vgre lehet hajtani.
A fentiekbl kvetkezik, hogy clszer a buszon egy processzortl fggetlen mkdsi mdot
biztostani, ilyen pldul a memria s a httrtr kztti adattvitel. Ezt a mdszert kzvetlen
adattvitelnek, DMA-nak nevezzk. A processzor ilyenkor csak a tranzakci elindtsban s a
befejezs nyugtzsban vesz rszt, egybknt a DMA-vezrl tveszi a rendszerbusz irnytst.
2.2.5. Processzortpusok
CISC (Complex Instruction Set Computer)
A szmtgp-alkalmazsok fejldsvel megntt az igny az egyre tbbet tud, egyre tbb
utastst ismer processzorok irnt s szksg volt a rgi gpekkel val kompatibilits megrzsre is, ezrt egyre bonyolultabb gpi utastsokat vezettek be. Ezen utastsokat vgrehajt processzorokat CISC (sszetett Utastskszlet Szmtgp) processzornak nevezzk.
Az sszetett utastskszlet nagymrtkben megknnyti az assembly programozst, valamint
hatkony tmogatst nyjt a magasszint programnyelvekhez. A nagy utastskszlet (akr 2-300
utastsa is lehet egy processzornak) bonyolultabb s idignyesebb teszi a mikroprogram futst, a nagy mikroprogram pedig nagy bels mikroprogram-memrit ignyel. (A mikroprogram
egy interpreter, amely a gpikd utastsokat futtatja.)
Jelentsebb CISC processzorok az Intel sorozat (286, 386, 486, Pentium), a Digital (DEC)
PDP s VAX processzorai, valamint az IBM nagygpeiben hasznlt processzorok.

Gimesi Lszl 2015.

RISC (Reduced Instruction Set Computer)


Az 1980-as vek elejn az alkalmazott utastsok statisztikai elemzse alapjn megterveztk a RISC (Cskkentett Utastskszlet Szmtgp) CPU-t, amelyben nem hasznltak
interpretert. Ezek a processzorok jelentsen klnbztek az akkoriban kereskedelemben lvktl,
azokkal nem voltak kompatibilisek. Ezeknl viszonylag kisszm (kb.50) vgrehajthat utastst
hasznltak.
A RISC processzor minden egyszer parancsot kzvetlenl vgre tud hajtani, gy nincsenek
mikroutastsok, nincs interpreter, s nincs szksg a mikroprogram-memrira sem. Ebbl kvetkezik, hogy jval egyszerbb s gyorsabb a CPU.
Jelentsebb RISC processzorok a SUN szerverekben s munkallomsokban hasznlt processzorok, a DEC Alpha processzora s a HP munkallomsok processzorai.
Az Intel a 486-os sorozattl kezdve egy olyan processzortpust fejlesztett ki, amely ugyan
CISC processzor, de tartalmaz egy RISC magot. gy a leggyakrabban hasznlt utastsokat
interpreter nlkl hajtja vgre.
Prhuzamos utastsvgrehajts (tlapols)
A CPU sebessgnek nvelst az utastsok prhuzamos vgrehajtsval is megvalsthatjuk.
A prhuzamos mkds megoldhat a CPU-n bell, azaz utastsszinten, s CPU-n kvl, vagyis
tbb processzor sszekapcsolsval.
Az utastsszint prhuzamostsra az ad lehetsget, hogy a processzor egy ciklus alatt tbb
rszfeladatot hajt vgre (az utasts betltse a memribl, az utasts dekdolsa, az operandusok lekrdezse, majd az utasts vgrehajtsa). A hagyomnyos processzorok esetben a kvetkez utastsnak meg kell vrnia azt, hogy az elz befejezdjn. A prhuzamos processzorok
esetben az utasts egy gynevezett adatcsatornba (pipeline) kerl. Ennek mkdse a kvetkez: az els utastst beolvassuk a memribl, majd az a csatorna msodik llomsra, a dekdolshoz kerl. A dekdols alatt a csatornba beolvassuk a kvetkez utastst. Ezt kveten a
csatornban minden adat tovbbhalad, az els utasts az operandus lekrdezshez, a msodik a
dekdolshoz, kzben beolvassuk a harmadik utastst,s gy tovbb. A folyamat hasonl a
futszalagon vgzett szerelshez. Belthat, hogy ennl az egyszerbb ciklusnl is egy idben
ngy utastssal foglalkozik a CPU.
Ilyen elven mkdnek az Intel processzorok a 486-tl kezdve (a Pentiumokban mr nemcsak
egy pipeline-t hasznlnak).
A msik prhuzamos mkdsi lehetsg az, amikor a szmtgpben egyszerre tbb proceszszort hasznlunk. Ilyenkor az opercis rendszernek kell gondoskodnia a processzorok temezsrl. A processzorok adatkapcsolatt ltalban a kzs memria biztostja. Ilyenek az array s a
multiprocesszoros szmtgpek.

Intel processzorok programozsa assembly nyelven

2.3. Az operatv memria


Minden szmtgp a Neumann-elvbl kvetkezik tartalmaz egy bels (operatv vagy
rendszer) memrit az ppen fut programok (utastsok) s az adatok trolsra. A memria
feladata, hogy az informcit binris formban trolja, majd azt a megfelel idben (pl. a processzor krsre) rendelkezsre bocsssa.
A memria az informci trolst egy memriamtrixban oldja meg. Ez nem ms, mint elemi (egy bites) trol-cellk sszessge, ahol a sorok byte hosszsgak. A mtrixos szervezs
megknnyti az adatok helynek gyors s pontos meghatrozst (minden egyes sor cmezhet).
A flvezet memrik eltt a ferrittrak, azeltt pedig a mgnesdobos trak voltak az egyeduralkodk. Ezek gynevezett nem felejt memrik voltak, ugyanis a tpfeszltsg kikapcsolsa (kimaradsa) esetn megriztk az informcit. Ezeket az eszkzket a processzor rsra s
olvassra is tudta hasznlni. Az ilyen tpus memrikat neveztk RAM-nak (Random Access
Memory). Az elnevezs arra utal, hogy a memria cmfggetlen, tetszleges elrs (teht nem
soros4 elrs).
A flvezet memrik megjelensvel tvettk ezt az elnevezst, ami nem volt szerencss,
ugyanis ezeknek az ramkrknek nem ez a f jellemzje. Tovbb, a flvezet memrik kztt
megjelentek olyan tpusok, amelyeket a CPU nem tud rni, csak olvasni. Ezek az gynevezett
ROM-ok (Read Only Memory), amelyek szintn tetszleges (nem soros) elrs memrik.
2.3.1. RAM (Random Access Memory)
Mint mr emltettk, a RAM (tetszleges vagy vletlen elrs memria) elnevezs trtneti
okokbl maradt fenn. Szerencssebb lenne az rhat-olvashat elnevezs hasznlata.
A flvezet RAM-ok csak tpfeszltsg jelenltben rzik meg az informcit, ezrt a program indulsakor azt be kell tlteni egy nem felejt memribl vagy httrtrrl.
A RAM-nak kt csoportjt klnbztetjk meg: a statikus s a dinamikus memrikat.
A statikus RAM-ok (SRAM) cellnknt (bitenknt) egy billen ramkrt (D flip-flop) tartalmaznak. Ezen ramkrk tulajdonsga, hogy az informcit (ami 0 vagy 1) mindaddig troljk, amg azt nem vltoztatjuk meg, vagy nem kapcsoljuk ki a tpfeszltsget.
Egy D flip-flop ramkr hat NAND kapubl alakthat ki, amibl nyilvnval, hogy egy bit
trolshoz jelents mennyisg alkatrszbl ll ramkrre van szksg. Viszont elnye a nagy
sebessge, tipikus elrsi ideje nhny ns (nanoszekundum). Ezrt az SRAM-okat olyan helyen
alkalmazzk, ahol kvetelmny a nagy sebessg, s nem tl fontos a nagy kapacits, pldul a
cache memrikban.
A dinamikus RAM-ok (DRAM) az SRAM-mal ellenttben nem bonyolult felpts billen
ramkrket hasznlnak, hanem kihasznljk azt, hogy egy kondenztor bizonyos ideig megrzi
tltst. gy minden egyes cellban elegend egy kapacitiv flvezet elem s egy erst tranzisztor. A trolk (kondenztorok) feltlttt vagy kisttt llapota jelenti az 1 vagy 0 rtket.
A cellnknti kis alkatrszigny miatt ezzel a technolgival olcs s nagykapacits trolk
pthetk.
A kapacitiv jelleg informcitrols htrnya, hogy az elektromos tlts idvel cskken, illetve megsznik. Ez az id ma mr nhnyszor 10 ms (milliszekundum). Annak rdekben, hogy
4

Kezdetben a memriaramkrk fejlesztsekor csak lptetregiszterekbl, vagy mg korbban (pldul az EDVAC szmtgpben) higanyos mvonalbl ptett soros elrs trolkat (Serial Access Memory, SAM) hasznltak.

Gimesi Lszl 2015.

az informci ne vesszen el, a DRAM lland frisstst ignyel, azaz a cellkat jra fel kell tlteni. Ezen kvl ellenttben az SRAM-mal a DRAM olvasskor elveszti a tartalmt, teht azt
vissza kell rni. A frisstsrl s az adatvisszarsrl a memria ramkrei gondoskodnak, ami
viszont jelentsen lasstja mkdst, hiszen a frissts ideje alatt a DRAM msra nem hasznlhat. A DRAM-ok elrsi ideje tbb 10 ns.
A DRAM-ot a viszonylagos lasssga ellenre a szmtgpek, munkallomsok operatv
memrijaknt szoktk felhasznlni, mivel a DRAM nagy kapacits, olcs memriatpus.
A memria ramkrk mindig lassbbak voltak, mint a CPU-k, gy a processzornak ltalban
vrnia kell, mg a memribl megkap egy adatot. (Minl lassbb a memria, annl tbbet kell
vrnia a processzornak.)
Felmerl a krds, hogy a sebessg nvelse rdekben (drga s kis kapacits) SRAM-okat,
vagy a trolkapacits nvelsre (olcs, de lass) DRAM-okat hasznljunk-e. Ezt a problmt
gy oldhatjuk meg, hogy a kicsi, de gyors memrit kombinljuk a nagykapacits, de lass
memrival. gy egy viszonylag gyors s nagy memrit kapunk.
A fenti eljrst cache-elrsnek hvjk, amely a kvetkezkppen mkdik: amikor a CPUnak szksge van egy adatra, elszr azt a cache-ben (SRAM) nzi meg. Csak akkor fordul a f
memrihoz (DRAM), ha az adat nincs a cache-ben. Az informci ekkor az operatv memribl a cache-be kerl, ahonnan a processzor mr hasznlhatja. Ez gy mg nem gyorstja a memria elrst, de amikor az operatv memria s cache kztt adatot msolunk, akkor nemcsak azt
az egyet rjuk t, amire ppen szksge van a CPU-nak, hanem a kvetkezket is. Mivel az egyms utn vgrehajtand utastsok is s az egyms utn feldolgozand adatok is az esetek dnt rszben sorban, egyms utn helyezkednek el a memriban, a processzor kvetkez adatkrse esetn a szksges informcik nagy valsznsggel mr a cache-ben lesznek.
A cache-memrik lehetnek a CPU-n kvl (Intel 386), s lehetnek bell (Intel 486). A tovbbi gyorstsok rdekben tbbszint cache-t is alkalmazhatnak.
Nem tekintjk kln memria kategrinak, de az eltr felhasznls jellege miatt mgis kln foglalkozunk a CMOS RAM memrival.
A CMOS (Complementary Metal Oxide Semiconductor) egy kis ramfelvtel, kismret
memria, melyben olyan vltoz adatokat trolunk, amelyekre szksg van a szmtgp kikapcsolsa utn is. A memria a kis ramfelvtel kvetkeztben egy kiskapacits akkumultort
vagy elemet hasznl a folyamatos tpellts biztostsra.
A szmtgpekben a CMOS tartalmazza a rendszerdtumot s az idt, valamint a klnbz
eszkzk alapadatait s a szmtgp indtshoz szksges informcikat.
2.3.2. ROM (Read Only Memory)
A RAM-ok hasznlatakor egy alapvet problmval llunk szemben. Amikor bekapcsoljuk a
szmtgpet, az operatv tr res (pontosabban hasznlhatatlan adatokkal van tele). De akkor
hogyan induljon el a szmtgp, hiszen a processzor csak az operatv memriban trolt programok futtatsra kpes? Kt lehetsgnk van: az egyik, hogy valamilyen kls trolrl tltjk
fel a memrit. A msik, hogy az indulshoz olyan memrit hasznlunk, amelyik tpfeszltsg
nlkl is megrzi az informcit.
A mindennapi letben szmtalan olyan alkalmazs van, ahol nem hasznlunk httrtrat. Pldul hztartsi gpekben, jtkokban, klnbz vezrl elektronikkban a programoknak s az
adatok egy rsznek meg kell maradnia a kikapcsols utn is.

Intel processzorok programozsa assembly nyelven

Ezekre a feladatokra fejlesztettk ki a ROM (csak olvashat memria) ramkrket, amelyek


tpfeszltsg nlkl is megrzik az informcit. ltalnossgban megjegyezhetjk, hogy a RAM
s a ROM kztt a CPU szempontjbl csak annyi a klnbsg, hogy a processzor a ROM-ba
nem tud rni.
Az adat a ROM-ba a gyrts sorn kerl, gynevezett maszk-programozsi technikval. A trolt informci utlag nem vltoztathat meg.
Annak rdekben, hogy az eszkzfejlesztknek ne a memriagyrtktl kelljen megrendelni
az egyedi programozott ramkrket, kifejlesztettk a PROM (Programmable ROM), programozhat ROM ramkrket.
A PROM egyszer rhat memria. Az rs egy viszonylag magas feszltsggel trtnik, amivel kigetnek egy-egy mtrixpontot. Ebbl az eljrsbl maradt meg a ksbbiekben a program
begets kifejezs.
A ROM s a PROM memrik semmilyen krlmnyek kztt nem trlhetk, s nem rhatk jra. Ha mgis j programra van szksgnk, az egsz memria-ramkrt (chip-et) ki kell
cserlnnk. (Az eszkzk elssorban a mikroprogramok fejlesztsekor, vagy ha a berendezs
zemideje alatt j programverzik vrhatk, gyakran kell cserlni ezeket az alkatrszeket.) Ezrt
szksg volt olyan ROM tpus memrikra, amelyeket jra fel lehet hasznlni.
Az jraprogramozhat memrik els genercii az EPROM (Erasable PROM), a trlhet
PROM memrik.
Az EPROM-ok trlst ers ultraviola fny segtsgvel vgezhetjk. Ez gy trtnik, hogy a
chip tokozsn tallhat egy kis vegablak, amelyen keresztl megvilgthat az ramkri lapka.
A fny hatsra mindegyik memriacella rtke 1 lesz. A programozs hasonlan a PROM-hoz
kln, erre a clra kifejlesztett elektronikval trtnik.
Lttuk, hogy az EPROM-ok programozsa elg nehzkes: azokat ki kell venni a berendezsbl, egy specilis fnyforrssal meg kell vilgtani, egy beget segtsgvel be kell programozni,
majd vissza kell tenni az eredeti helykre. Erre a folyamatra nincs szksg az EEPROM
(Electrically Erasable PROM), elektromosan trlhet memrik esetben.
Az EEPROM-ok elektromos impulzusokkal, az eredeti helykn programozhatak. A mretk jval kisebb, mint az EPROM-ok, de lassbbak s jval drgbbak azoknl.
Az EEPROM-hoz hasonl a flash memria. Egyre elterjedtebben hasznljk digitlis fnykpezgpekben, kamerkban s szmtgpek adathordozjaknt.
A memriaramkrk pldul a tpfeszltsg-ingadozs hatsra hibkat vthetnek. Nhny memriafajta a hibk elleni vdekezsl hibajelz vagy hibajavt kdot hasznl. Hibajavt kd esetn a memria az alapadat mell az rskor jabb (un. hibafelismer vagy hibajavt) biteket rak. Olvasskor ezek segtsgvel ellenrzi az adatok helyessgt.
2.4. Az input/output egysgek
A szmtgpek felhasznlja az ember, ezrt szksg van olyan berendezsekre, eszkzkre,
amelyek biztostjk az ember s a szmtgp kztti kommunikcit. Ezek az eszkzk a perifrik. Termszetesen tallkozhatunk olyan perifrikkal is, amelyeket csak a szmtgpek
hasznlnak. Ilyenek a httrtrak (winchester, CD-ROM, floppy, stb.), illetve szmtgpek kztti kapcsolatot biztost hlzati illesztk s modemek.
Az input/output eszkzket csoportosthatjuk funkcijuk szerint, gy megklnbztetnk bemeneti (input) s kimeneti (output) perifrikat. Az input perifrik segtsgvel vezreljk a
szmtgpet, utastsokat s adatokat tpllhatunk bele. Az output perifrikkal a szmtgp ad
10

Gimesi Lszl 2015.

t szveges, kpi vagy nyomtatott informcikat az ember szmra. Ezen kvl lehetnek gynevezett input-output eszkzk is, amelyek kpesek adatok fogadsra s kldsre is. Ezek ltalban a httrtrak, de ilyenek pldul a hlzati csatolk s az audio illesztk is.
Nemcsak funkcijuk szerint csoportosthatjuk ezeket az eszkzket. Pldul bels s kls
perifriaknt attl fggen, hogy a szmtgphzba beptve, vagy azon kvl tallhatk, cserlhetek vagy fixen beptettek, hlzati eszkzk vagy csak a munkalloms hasznlhatja azokat
s gy tovbb.
Egy jabb csoportostsi lehetsg az, hogy a rendszerbuszra kapcsold perifria-illeszt
ramkr s a perifria kztti adattvitel milyen tpus, ami pldul lehet soros vagy prhuzamos.
A perifrik rszletesebb ismertetse nem e jegyzet clja.

11

Intel processzorok programozsa assembly nyelven

3. Binris aritmetika
3.1. A szmrendszerek
A mindennapi letben a szmokat a tzes (decimlis) szmrendszerben brzoljuk. Ez a trtnelem sorn alakult ki, taln azrt, mert az ember a tz ujjt is felhasznlta a szmols megknynytsre. Korbban ms szmrendszereket s szmbrzolsokat is hasznltak, pldul: rmai
szmok, babilniai hatvanas szmrendszer. (Innen ered az id-mrtkegysg (ra) felosztsa is.)
A mechanikus gpek is a tzes szmrendszert hasznltk, mivel az adatmegads s az eredmny
kirtkelse gy volt a legegyszerbb. Ezekben a berendezsekben ltalban egy trcsa helyzete
(elfordulsa) jelezte, hogy melyik alaki rtkrl van sz, a trcsk egymshoz viszonytott elhelyezse pedig a helyi rtket jelentette.
Ha az elektronikus berendezsek is tzes szmrendszert hasznlnnak, akkor nagyon bonyolult, tz klnbz llapotot tkrz ramkrt kellene pteni. Ennl sokkal egyszerbbek s gy
megbzhatbbak a kt-llapot elektronikk. (Elg azt vizsglnunk, hogy egy vezetben folyik
ram vagy nem, egy kapcsol be- vagy kikapcsolt llapotban van-e.) Ebbl kvetkezik, hogy
olyan bels kdrendszerre (szmbrzolsra) van szksg, amelyben a hasznlt llapotok (jelek)
szma kett. gy az elektronikus szmtgpek a kettes (binris) szmrendszert hasznljk. Tovbbi elny, hogy a binris adatbrzols segtsgvel egysgesen tudjuk kezelni az aritmetikai
s logikai adatokat, mveleteket. Teht: egy ktllapot elektronikai elem jellheti a binris 1-et
vagy 0-t s a logikai igen vagy nem llapotot.
A msik ok: a binris szmrendszer hasznlatval minden a kettes szmrendszerben vgzett mvelet felrhat elemi logikai mveletek sorozatval. Ennek megfelelen a szmtgp
elektronikja is felpthet nhny elemi logikai ramkr felhasznlsval.
Termszetesen a szmtgp felhasznljt nem rdekli, hogy az adatokat milyen szmrendszerben trolja a gp, a megszokott tzes szmrendszerben szeretn megadni az rtkeket, s az
eredmnyt is gy vrja. Ezrt a bevitelnl s a kimenetnl meg kell oldani a gyors s viszonylag
pontos konverzit. (Hogy mit jelent a viszonylag pontos, arra mg visszatrnk!)
Megjegyezzk, hogy ha a felhasznlt nem is rdekli a szmtgp bels szmbrzolsa, azt
egy programoz mr nem hagyhatja figyelmen kvl.
Minden nem negatv szm felrhat a kvetkez alakban:

a k 10 k + a k 1 10 k 1 + ... + a1 10 + a 0 + a 1 10 1 + ... + a l 10 l

(3-1.)

ahol: k, j = 0, 1, 2, s ak a0 a-l 9-nl nem nagyobb, nem negatv, egsz szm.


Ugyangy egyrtelmen felrhat ez a szm kettes szmrendszerben is:

bm 2 m + bm 1 2 m 1 + ... + b1 2 + b0 + b1 2 1 + ... + b n 2 n

(3-2.)

ahol: m, n = 0, 1, 2, s bm b0 b-n rtke 0 vagy 1.


Mivel a kettes szmrendszerben is olyan a szimblumokat (szmjegyeket) hasznlunk a szmok rsakor, amik a tzes szmrendszerbeli szmokban is elfordulnak, rnzsre nem mindig

12

Gimesi Lszl 2015.

egyrtelm, hogy melyik szmrendszert hasznljuk. A flrertsek elkerlse rdekben a rendszer alapszmt indexben jelezzk. Pldul:
1110 = 10112 vagy 10102 = 1010
A tovbbiakban a kettes szmrendszerbeli (binris) szm egy helyi rtkt bitnek nevezzk.
(Bit: az angol binary digit szavak sszevonsbl szrmazik, de pici, falat jelentse is van.)
Ennek megfelelen a fenti, 3-2. kplettel felrt binris szm brzolsra m+n+1 bit szksges.
A bit az informatikban hasznlatos legkisebb informcihordoz egysg, az informatika
alapegysge, rtke: 0 vagy 1.5
A tzes szmrendszerben ezresvel csoportosthatjuk a szmokat az egyszerbb kezelhetsg rdekben , s ezeknek a nagysgrendeknek kln elnevezst adhatunk. A binris szmoknl is ezt a hagyomnyt kvetik, br itt nem pontosan ezerszeres a vltszm.
Pldul 1 kg (kilogramm) = 103 g (gramm), de 1 kbit (kilobit) = 210 = 1024 bit. Ennek megfelelen felrhat a kvetkez tblzat:
1024 bit = 1 kbit (kilobit)
= 210 bit
1024 kbit = 1 Mbit (megabit) = 220 bit
1024 Mbit = 1 Gbit (gigabit) = 230 bit
1024 Gbit = 1 Tbit (terabit)
= 240 bit
A nyolcbites (nyolcjegy) binris szmot byte-nak (bjt) nevezzk. A bjt a digitlis informcifeldolgozs alapegysge. A memrik s a httrtrak kapacitst is bjtban mrik. Az elzekhez hasonlan itt is hasznlatos a kB (kilobjt), MB (megabjt), stb. elnevezs.
Binris szmrendszerben a szmok sokkal hosszabbak lesznek, mint a tzes szmrendszerben.
Lttuk, hogy 103 210, ami azt jelenti, hogy 10 helyi rtk hosszsg binris szm felel meg 3
helyi rtk decimlis szmnak. Ebbl ltszik, hogy a binris szmok nehezen kezelhetek. Az
ttekints megknnytsre vezettk be a nyolcas (oktlis) s a tizenhatos (hexadecimlis) szmrendszereket. Azrt ppen ezeket, mert a szmrendszerek kztt egyszer az tvlts (8 = 23; 16
= 24).
Az oktlis szmrendszer elnye, hogy csak olyan jellseket (alaki rtkeket) hasznlunk,
amelyek ismertek a tzes szmrendszerben. Tovbb a nyolc kzel ll a tzhez, gy a nyolcas
szmrendszerben trtn brzols nem sokkal hosszabb, mint a tzes szmrendszerbeli.
A kettes s a nyolcas szmrendszerek kztti tvlts egyszeren elvgezhet. A binris szmot jobbrl bithrmasokba (tridokba) csoportostjuk, egy-egy csoport egy oktlis szmjegynek
felel meg. A visszaalakts is egyszer, mivel a nyolcas szmrendszerben megadott szm egy
szmjegye megfelel egy binris tridnak.
Az oktlis szmrendszer htrnya, hogy egy bjt nem egsz szm tridbl ll, ami a programozsnl jelent nmi gondot. Ezt a htrnyt kszbli ki a tizenhatos szmrendszer.
A hexadecimlis szmok s a binris szmok kztt is knny a konverzi, csak itt ngyes
csoportokat kell alkotni. Tovbbi elny, hogy egy bjt rtke felrhat kt hexadecimlis szmjegy segtsgvel (8 biten 28 = 162 klnbz rtk jelenthet meg). Htrnya, hogy a tizenhatos
szmrendszerben 16 klnbz jelre van szksg. Mivel a tzes szmrendszerben tz (0, 1, 2,9)
5

Claude Elwood Shannon (1916 2001) hradstechnikus s matematikus az informcielmlet megalkotja. A legjelentsebb
mve, a Mathematical Theory of Communication, 1948-ban jelent meg, amelyben meghatrozta egy rendszer entrpijt s
bevezette az informci egysgt.

13

Intel processzorok programozsa assembly nyelven

darab jelnk van a szmok brzolsra, gy a tztl a tizentdik elem jellsre j szimblumokat kellett bevezetni:
1010 = A16; 1110 = B16; 1210 = C16; 1310 = D16; 1410 = E16; 1510 = F16;
3.2. Adatbrzols
Adatbrzols szempontjbl ktfle szmot klnbztetnk meg: az egsz tpus (fixpontos)
s a lebegpontos szmokat. Az ezekkel vgzett szmolsokat kt kln aritmetikai egysg vgzi.
Az egsz tpus szmokat tovbb csoportosthatjuk tartalmuk (jelentsk) szerint: jelenthetnek egsz szmot, de lehetnek kdok is (pl. utastskd, karakterkd stb.).
3.2.1. A fixpontos szmbrzols
Legegyszerbb szmbrzolsi md az egsz szmok brzolsa, trolsa. Ilyenkor pldul
egy tetszleges egsz szmot kettes szmrendszerben, a megfelel bit-hosszsgban kell trolni.
Szabvny szerint a szmtgpek ezeket 1, 2, 4 vagy 8 bjt hosszsgban troljk. (Ennek megfelelen pldul 1 bjton (8 bit) 28 = 256 klnbz rtket tudunk brzolni, azaz pl. 0 255 kztti szmok trolsra alkalmas 1 bjt.)
Fixpontos (fixed point) szmbrzolssal lehetsges trtek trolsa is. Ebben az esetben a
rendelkezsre ll adattrol elemet kt rszre: egszre s trtre osztjk. Ennek htrnya, hogy
nem rugalmas. Pldul egy nagyon nagy szm brzolsakor, amikor a trtrsz elhanyagolhat
lenne, akkor is helyet foglalunk szmra. A fixpontos brzols egyik specilis esete a mr
emltett egsz szmok esete, amikor a tizedespontot (kettedes pontot) az utols bit utn rgztjk.
A szmok brzolsnl megklnbztetnk eljeles s eljel nlkli szmokat. Az eljeles
abban tr el az eljel nlklitl, hogy a szm legnagyobb helyi rtk bitjt kinevezik eljelbitnek, amely pozitv szmok esetn 0, negatv szmoknl pedig 1.
A fixpontos szmoknl a programozs sorn tekintettel kell lenni az gynevezett tlcsordulsra. (Trtrsz esetn a lecsordulsra.) Ez azt jelenti, hogy egy mvelet eredmnye lehet egy
olyan hossz szm, amely a rendelkezsre ll helyen mr nem fr el. A fenti plda alapjn 1
bjtban 255-nl nagyobb szmot nem tudunk trolni.
A tlcsordult szmjegyek elvesznek, a maradkkal val szmols hibs eredmnyt adhat.
Ezrt erre a programozs sorn kln figyelmet kell fordtanunk, mivel ilyen esetben ltalban
sem a fordtprogramtl, sem a futtat krnyezettl nem kapunk visszajelzst.
3.2.2. A lebegpontos szmbrzols
A fixpontos brzols htrnyait kszbli ki az gynevezett lebegpontos szmbrzols,
amely bizonyos szempontbl rugalmasabban, de bonyolultabban kezeli a szmokat. A lebegpontos brzols alapja az, hogy a szmok hatvnykitevs alakban is felrhatk:

m pk
ahol:

14

p: a szmrendszer alapszma (esetnkben 2),


m: mantissza,
k: karakterisztika.

Gimesi Lszl 2015.

A hatvnykitevs forma egyrtelmsge rdekben elfogadtak egy kzs elvet: az m mindig


kisebb, mint 1, s a tizedesponttl (esetnkben inkbb kettedespont) jobbra es els szmjegy
nem lehet nulla.
1
m <1
p

(Pldul: tzes szmrendszerben 0,1 m < 1 , kettes szmrendszerben 0,5 m < 1 .)


A fenti feltteleket teljest felrsi mdot normalizlsnak nevezzk, amit termszetesen a
szmtgpek automatikusan elvgeznek. Egy, a gyakorlatban is hasznlhat lebegpontos szm
trolsra minimum 32 bitre (4 bjtra) van szksg.
Ezek utn nzzk meg, hogy egy lebegpontos szm brzolshoz milyen adatokra van szksg:
a mantissza abszolt rtke,
a mantissza eljele,
a karakterisztika abszolt rtke,
a karakterisztika eljele.
A mantissza eljelt (azaz a szm eljelt) ugyangy a legnagyobb helyi rtk biten jelezzk,
mint a fixpontos szmoknl. A kvetkez bitek tartalmazzk az eljeles karakterisztikt, majd a
jobb oldalon helyezkedik el a mantissza.
Mivel a mantissza trolsra korltozott szm bit ll rendelkezsre, nem tudunk tetszleges
pontossg szmot brzolni. A lebegpontos szmok e tulajdonsgt szmbrzolsi pontossgnak hvjuk. Szoks ezt gy is jellemezni, hogy egy adott szm hny jegyre (helyi rtkre) pontos.
A karakterisztikt s annak eljelt egyben, gynevezett eltolsos mdszerrel brzoljk. Pldnak vegynk egy 8 bites (1 byte-os) kitevt. Ekkor a kitev tnyleges rtkt gy kapjuk meg,
hogy az brzolt rtkbl kivonunk 127-et, pldul 1 esetn 128, -1 esetn 126 a kitevben trolt
rtk.
Megjegyezzk, hogy gptpusonknt eltrhet a lebegpontos szmok bitkpe.

3.2.3. Decimlis szmok brzolsa


Ez a szmbrzolsi forma elssorban zleti szmtsoknl (pl. adatbzis-kezelnl) fordul
el. Itt nem az aritmetikai mveleteken van a hangsly, ezek szma kicsi. Sokkal gyakrabban
fordul el a szmok bersa, illetve megjelentse, ami a szmrendszerek kztti konverzik
szmt megnveln. Sok esetben pldul banki mveleteknl nem megengedett a konvertlsbl szrmaz pontatlansg. Ezrt olyan brzolsmdot fejlesztettek ki, amely szksgtelenn
teszi a szmok kettes szmrendszerre val konvertlst. (Termszetesen a trols itt is binrisan
trtnik.)
Ezzel a mdszerrel ellenttben a lebegpontos brzolssal tetszleges pontossg szmot
lehet trolni.
A decimlis szmbrzols formja szmtgptl fgg. Pldul a rgebbi IBM gpeken a
BCD (Binary Coded Decimal) kdolst alkalmaztk. Itt a szmjegyeket s az eljelet fl bjton
(4 biten) brzoltk. A PDP szmtgpeknl a szmjegyeket kzvetlenl az ASCII kdjukkal
troltk. Ebben az esetben egy helyi rtk s az eljel trolsa is egy-egy bjton trtnt.

15

Intel processzorok programozsa assembly nyelven

3.2.4. Logikai rtkek brzolsa


A matematikai logikban logikai kifejezsekkel dolgozunk. Egy logikai kifejezs lehet egyetlen egy llts is, amely kt klnbz rtket vehet fel, attl fggen, hogy az llts igaz (true)
vagy hamis (false).
Mivel egy llts (logikai adat) csak kt rtket vehet fel, a trolsra elegend egyetlen bit is.
A gpkzeli (alap) utastsokban ltalban egy bitet hasznlnak 1: igaz, 0: hamis. A programozsi gyakorlatban azonban ott, ahol a legkisebb adathossz egy bjt, a logikai informci trolsra
is egy bjtot alkalmaznak, gy az igaz = 1 (000000012) illetve a hamis = 0 (000000002). Elfogadott gyakorlat az is, ha a bjt rtke 0, akkor az a hamis lltsnak felel meg, ha nem 0, akkor
igaznak.
3.2.5. Karakterek (szveges adatok) brzolsa
A betket, a szmjegyeket, az rsjeleket s az egyb jeleket, sszefoglal nven karaktereknek hvjuk. Az egy vagy tbb karakterbl ll sorozatot szvegnek nevezzk.
A szmtgpen a szveges llomnyokat kdolt formban troljuk, azaz nem a szveg, illetve a betk kpt, hanem a karakterek numerikus kdjt. Megjelentskor, illetve nyomtatskor a
trolt kdhoz kapcsoljuk hozz azt az informcit, hogy milyen formban (stlusban) jelenjen
meg a karakter. Az egyrtelmsg rdekben a karaktereket s kdjukat klnbz szabvnyostott tblzatok tartalmazzk.
A legelterjedtebb az Amerikai Szabvnygyi Hivatal (ANSI), 1977-ben megalkotott ASCII
kdtblja, amely 128 karaktert (vezrlkarakter, bet, szmjegy, rsjel) tartalmaz. A 128 karakter 7 biten (27) brzolhat, gy a nyolcadik bitet paritsbitknt ellenrzsre lehetett hasznlni.
Ksbb a szmtstechnika nemzetkziv vlsval szksgess vlt az angol karakterkszletben nem tallhat klnbz nemzeti karakterek bevezetse is. Ennek rdekben 28-ra, azaz
256 karakterre bvtettk a kdtblt. (Legelterjedtebb 8 bites szabvny az ISO 8859 (Latin) karakterkszlet.) Mivel az sszes nemzeti rsjel trolsra ez sem volt elg, tbb klnbz, nemzeti kdtblt alaktottak ki (pldul: nyugat-eurpai, kelet-eurpai, cirill, stb.). Termszetesen
ezek a kdtblk az eredeti 7 bites US-ASCII kdokat vltozatlan jelentssel tartalmazzk (ld.
mellklet).
Egyb (kp, hang, vide stb.) adatok brzolsa
Mint minden adatot a szmtgpen, ezeket is digitlis formban troljuk. Azonban a kdolsokra klnbz szabvnyos formkat talltak ki, annak megfelelen, hogy mely tulajdonsgait
tartjuk fontosnak, illetve milyen clra hasznljuk azokat.
Pixelkpek esetn a pixelek tulajdonsgait (pl. sznt), vektorgrafikus brzolsnl a kp ltrehozsnak folyamatt (utastsait) troljuk, akr szveges formban.
Hangok esetben mintavtelezs s kvantls utn szintn digitalizls kvetkezik.
Mind a kp-, mind a hangadatok esetben szoks az adatokon tmrtseket is vgezni, amelyek lehetnek vesztesgesek vagy vesztesgmentesek.
A mai modern grafikus- s hagkrtyk mr sajt processzorral s vezrlszoftverrel rendelkeznek, gy biztostva a gyors, valsidej, hromdimenzis, fotorealisztikus megjelentst.

16

Gimesi Lszl 2015.

3.3. Az Intel processzorok szmbrzolsa


Egsz tpus szmok:
7

15

31

63

0 1 bjt
rvid egsz
0 2 bjt
egsz szm
0 4 bjt
hossz egsz
0 8 bjt
kiterjesztett

Pakolt egsz szmok:


79

0 10 bjt
BCD egsz

Vals tpus (lebegpontos) szmok:


Egyszeres pontossg (Short Real Number):
31 30
23 22
S
Exp

Mantissza

0 4 bjt
rvid vals

Dupla pontossg (Long Real Number):


52 51
63 62
S
Exp

Mantissza

0 8 bjt
hossz vals

Kiterjesztett pontossg (10-Byte Real Number):


79 78
S

64 63
Exp

Mantissza

0 10 bjt
kiterjesztett vals

Az sszes tpus szm eljele a legnagyobb helyi rtk biten tallhat. Ha az eljel bit 0, a
szm pozitv vagy 0; ha 1, akkor a szm negatv.
A vals szmok brzolsa megegyezik a fenti, ltalnos ismertetben lertakkal. E szmokkal
vgzett mveleteket az Intel processzorok a 486-os sorozat ta a CPU-ba beintegrlt lebegpontos aritmetikai egysggel hajtk vgre. A korbbi processzorok esetben vagy matematikai
trsprocesszort (koprocesszort) hasznltak, vagy szoftveresen emulltk a mvelet elvgzst.
A vals szmoknl a kitevk (Exp.) hatrozzk meg, hogy mekkora a szm nagysgrendi tartomnya. A mantissza nagysga (bitszma) a szm pontossgra van hatssal.
A binrisan kdolt (BCD) formban 18 jegy decimlis egsz szmot brzolhatunk. Ennl az
adatbrzolsi formnl egy bjton kt decimlis szmjegy tallhat. Az utols (tizedik) bjt legfels bitje az eljel, a tbbi bitejt nem hasznljuk.

17

Intel processzorok programozsa assembly nyelven

3.4. Mveletvgzs
A szmtgpet nemcsak az adatok trolsra hasznljuk, hanem azokkal klnbz mveleteket szeretnnk elvgezni. Mivel a felhasznl a tzes szmrendszerben gondolkodik, dolgozik,
a szmtgp pedig a mr megtrgyalt okokbl a kettes szmrendszert hasznlja, els lpsknt egy konverzit kell vgrehajtanunk a szmrendszerek kztt. Ezutn vgezhetk el a kettes szmrendszerben - a kvnt matematikai illetve logikai mveletek, majd az eredmnyt jabb,
de ellenttes irny konverzival (tzes szmrendszerben) tovbbtjuk a felhasznlnak.
3.4.1. Logikai mveletek
A 3.2.4. rszben trgyaltuk a logikai rtkek brzolst, most nzzk meg, hogy milyen mveletek vgezhetk velk. A logikai adatokkal, vltozkkal vgrehajtott mveletek eredmnye is
logikai rtk lesz. Lttuk, hogy egy logikai vltoz kt rtket vehet fel (igaz vagy hamis), ennek
megfelelen a mveletek eredmnye is e kt rtk kzl lesz valamelyik.
Gpi kd utastsok esetn a logikai mveleteket bitenknt hajtjuk vgre. (Megjegyezzk,
hogy a magas szint programozsi nyelvek esetben hasznlt logikai mveleteket nem bitenknt
vgezzk el.)
Az albbi pldkban jelljk A s B szimblumokkal azokat a logikai vltozkat, amelyekkel
mveletet szeretnnk megvalstani, s legyen L az eredmny:
Negls (tagads)
A logikai tagads, egyvltozs mvelet.
szimbluma:

Jellse: NEM (NOT),


A

llts

1 Ha A = hamis L = igaz

0 Ha A = igaz L = hamis

A digitlis technikban a jelek elnevezsnl (dokumentcikban, kapcsolsi rajzokban, stb.)


a negls jellsre a fellvonst hasznljk. Pldul:
NOT READY

= READY

Nzznk erre egy pldt 8 biten (1 bjton):


NOT 1 0 1 1 0 1 0 1
01001010

18

Gimesi Lszl 2015.

Logikai sszeads
szimbluma:

Jellse: VAGY (OR),


A

llts

Ha A s B = hamis L = hamis

Ha A = hamis, B = igaz L = igaz

Ha A = igaz, B = hamis L = igaz

Ha A s B = igaz L = igaz

Az 1 bjtos plda:
10111010
OR 1 0 1 1 0 0 0 1
10111011
Logikai szorzs
szimbluma:

Jellse: S (AND),
A

llts

Ha A s B = hamis L = hamis

Ha A = hamis, B = igaz L = hamis

Ha A = igaz, B = hamis L = hamis

Ha A s B = igaz L = igaz

Az 1 bjtos plda:
10111010
AND 1 0 1 1 0 0 0 1
10110000
Ha egy adatnl nmagval S illetve VAGY mvelet vgznk, akkor nem vltozik meg az rtke.
10111010
OR 1 0 1 1 1 0 1 0
10111010
10111010
AND 1 0 1 1 1 0 1 0
10111010
Ezt a tulajdonsgot programrsnl felhasznlhatjuk az adatok tesztelsre.

19

Intel processzorok programozsa assembly nyelven

Kizr VAGY
szimbluma:

Jellse: - (XOR),
A

llts

Ha A s B = hamis L = hamis

Ha A = hamis, B = igaz L = igaz

Ha A = igaz, B = hamis L = igaz

Ha A s B = igaz L = hamis

Az 1 bjtos plda:
10111010
XOR 1 0 1 1 0 0 0 1
00001011
Adatot trlni (nullzni) tudunk, ha nmagval kizr VAGY mvelet vgznk.
10111010
XOR 1 0 1 1 1 0 1 0
00000000
Ezt az elvet fogjuk alkalmazni pldul a regiszterek trlsnl is.
(Tbb kdolsi-dekdolsi eljrst dolgoztak ki az (A X) X = A azonossgot felhasznlva.)
Mivel a processzor minden mveletet logikai mveletek sorozatbl pt fel (logikai ramkrkkel hajt vgre), hatkonyabb programot rhatunk, ha igyeksznk (ahol csak lehet) logikai utastsokkal programozni.
Az elektronikai alkalmazs miatt meg kell emlteni mg kt logikai mveletet:
NAND (a NEM s az S mveletek egyms utni elvgzse): (A B);
NOR (a NEM s a VAGY mveletek egyms utni elvgzse): (A B);
A felsorolt logikai alapmveleteket a szmtgpben gynevezett kapuramkrk vgzik,
gy ltezik AND, NAND, OR, NOR, s NOT (inverter) ramkr.
Igazolhat, hogy brmely logikai mvelet helyettesthet csak NAND vagy csak NOR mveletekkel. Ennek a szmtgpek felptsnl, gyrtsnl van jelentsge, hiszen gyakorlatilag
egyetlen fajta logikai-ramkr segtsgvel kialakthat brmilyen logikai rendszer. Teht csak
egyfajta ramkri elemet kell gyrtani nagy sorozatban, ami a megbzhatsgot nveli s az elllts fajlagos kltsgt cskkenti.

20

Gimesi Lszl 2015.

3.4.2. Aritmetikai mveletek


Az elzekben mr lttuk, hogy a szmtgpek minden mveletet a kettes szmrendszerben
vgeznek el, s az adatokat is ebben a formban troljk. (Ez akkor is gy van, ha a felhasznl
vagy a programoz a knnyebben kezelhet forma miatt az oktlis vagy a hexadecimlis
szmrendszert hasznlja.)
A szmtgpek felptsbl kvetkezik, hogy fix hosszsg (helyi rtk) szmokkal dolgoznak. Ebbl tbb olyan tulajdonsg szrmazik, amelyeket figyelembe kell vennnk a mveletek vgrehajtsakor.
A Logikai mveletek rszben mr utaltunk arra, hogy a szmtgp minden mveletet elemi
szintre bont. Ezek utn nzzk meg, hogy a binris szmrendszerben hogyan vgezhetjk el az
aritmetikai mveleteket.
Az albbi pldkban jelljk A s B szimblumokkal azokat a vltozkat, amelyekkel mveletet szeretnnk vgezni, legyen S az eredmny, s vezessnk be egy C (carry) vltozt az tvitel
vagy maradk jellsre.
sszeads
A binris sszeadst hasonlan vgezzk, mint a decimlis szmoknl: a szmokat sszeadjuk
az adott helyi rtken (A+B=S), s ha van maradk (tvitel) (C), akkor azt hozzadjuk a magasabb helyi rtkek sszeghez.
A

Ha megvizsgljuk az sszeads mveleti tbljt lthatjuk, hogy az eredmny nem ms, mint
az A s B rtkkel elvgzett XOR logikai mvelet, illetve a maradk a kt rtk AND kapcsolata.
Ebbl az kvetkezik, hogy egy sszeadt el tudunk kszteni egy XOR s egy AND kapuramkrbl. Mivel ennl az sszeadsnl mg nem vettk figyelembe azt, hogy esetleg az elz
(kisebb helyirtk) kt bit sszeadsakor maradk is keletkezhetett, ezt az sszead ramkrt
fl-sszeadnak nevezzk.
Azt az ramkrt, amelyik az elz tvitelt is figyelembe veszi az eredmny kiszmtsnl
teljes sszeadnak nevezzk. Elksztshez kt fl-sszead ramkr kell.
A szmtgpek termszetesen nem egybites szmokkal dolgoznak, ezrt az azonos helyi rtken lv biteket egyms utn ssze kell adni, s a keletkezett tvitelt hozzadni a kvetkez
helyi rtkek sszeghez. Ezt elvgezhetjk sorban egyms utn vagy prhuzamosan, de ekkor
annyi teljes sszead ramkrre van szksg, ahny bites az a trol elem, amelyben a szm tallhat.

21

Intel processzorok programozsa assembly nyelven

Pldaknt nzzk meg kt tetszleges, 8 jegy (1 bjt hossz) binris szm sszeadst:
10111010
+10110101
1 01101111
Mivel a pldban csak 8 bit llt rendelkezsre az eredmny trolsra, a legutols (baloldali)
tvitel elveszik (ha van). Ez a tlcsorduls, amivel a 3.2.1. rszben foglalkoztunk, nem szabad
figyelmen kvl hagyni, mert hibs eredmnyt adhat. A szmtgpek ksbbi felhasznls
rdekben ezt a tlcsordult rtket ideiglenesen eltroljk.
A negatv szmok ellltsa
Tzes szmrendszerben egy szm ellentettjt gy kapjuk meg, hogy a szmot megszorozzuk
mnusz eggyel. A szmtgp ezt a mveletet kettes komplemens kpzssel hajtja vgre. Nzzk egy plda segtsgvel 8 bites szm esetben:
Az eredeti szm:
10111010
Negljuk minden egyes bitjt egyes komplemens: 0 1 0 0 0 1 0 1
kettes komplemens: 0 1 0 0 0 1 1 0
Adjunk hozz egyet
Ha sszeadjuk az eredeti szmot s a kettes komplemenst, az eredmny (leszmtva az tvitelt) nulla lesz. Amit a tzes szmrendszerben megszoktunk, hiszen ha egy szmhoz hozzadjuk a
mnusz egyszerest, eredmnyl nullt kapunk
10111010
+01000110
00000000
Kivons
Digitlis technikban lteznek az gynevezett kivon ramkrk, amelyek nagyon hasonltanak az sszeadkhoz, de a szmtgpekben az egyszersts miatt a kivonshoz is az sszead ramkrket hasznljk. Termszetesen ekkor a kivonand kettes komplemenst veszik.
3.4.3. Bitenknti lptets (SHIFT, ROTATE)
Mr tbbszr utaltunk r, hogy minden mveletet visszavezetnek logikai (alap) utastsokra.
Ez a szorzsnl is gy van. Azonban a szorzs trgyalsa eltt meg kell ismerkednnk egy olyan
(nem matematikai) mvelettel, amely a szmtgpek mkdshez nlklzhetetlen. Ezek a
lptets vagy shift, illetve a forgats vagy rotls.
Logikai shift jobbra: minden bit rtkt eggyel jobbra mozgatja. A legnagyobb helyi rtk 0
(nulla) lesz, a legkisebb helyi rtken kilp bit egy erre a clra fentartott egy bites trolba, a
Carry-be kerl.
0

22

D7 D6 D5 D4 D3 D2 D1 D0

Gimesi Lszl 2015.

Aritmetikai shift jobbra: minden bit rtkt eggyel jobbra mozgatja. A legnagyobb helyi rtkre az eljel kerl (vagyis sajt maga, hogy a szm eljele ne vltozzon meg), a legkisebb helyi
rtken kilp bit a Carry-be kerl.
D7 D6 D5 D4 D3 D2 D1 D0

Logikai s aritmetikai shift balra: minden bit rtkt eggyel balra mozgatja. A legkisebb helyi rtkre a 0 (nulla), a legnagyobb helyi rtken kilp bit a Carry-be kerl.
C

D7 D6 D5 D4 D3 D2 D1 D0

Figyeljk meg, hogy (a fixpontos szmoknl) a balra trtn lptets kettvel trtn szorzsnak, a jobbra lptets kettvel trtn osztsnak felel meg.
Rotls jobbra: minden bit rtkt eggyel jobbra mozgatja. A legnagyobb helyi rtkre s a
Carry-be a legkisebb helyi rtken kilp bit kerl.
D7 D6 D5 D4 D3 D2 D1 D0

Rotls jobbra Carry-n keresztl: minden bit rtkt eggyel jobbra mozgatja. A legnagyobb
helyi rtkre a Carry tartalma, a legkisebb helyi rtken kilp bit a Carry-be kerl.

D7 D6 D5 D4 D3 D2 D1 D0

Rotls balra: minden bit rtkt eggyel balra mozgatja. A legkisebb helyi rtkre s a Carrybe a legnagyobb helyi rtken kilp bit kerl.
C

D7 D6 D5 D4 D3 D2 D1 D0

Rotls balra Carry-n keresztl: minden bit rtkt eggyel balra mozgatja. A legkisebb helyi rtkre a Carry tartalma, a legnagyobb helyi rtken kilp bit a Carry-be kerl.

D7 D6 D5 D4 D3 D2 D1 D0

Lptet utastsokat hasznlunk tbb alapfunkci (pl. soros - prhuzamos konverzi) vgrehajtsn kvl a szorzs s oszts mveletnl is.

23

Intel processzorok programozsa assembly nyelven

3.4.4. Szorzs
A bitenknti szorzst hasonlan vgezzk, mint a decimlis szmoknl: A*B=S,
A

Vegyk szre, hogy az eredmny az A s B rtkkel elvgzett AND logikai mvelet.


A legtbb esetben azonban nem egy bites rtket kell sszeszoroznunk, hanem akr tbb byte
hosszsg binris szmot. Ekkor hasznlhatjuk azt a mdszert, hogy a szorzandt sszeadjuk
annyiszor, amennyi a szorz. gy a szorzst visszavezettk sszeadsra, de ez szorz szm szszeadst jelent. Egy hatkonyabb mdszer a helyi rtkenknti sszeads (ahogy a decimlis
szmok esetben vgezzk az rsbeli szorzst), a szorzandt megszorozzuk egyesvel - pldul
balrl jobbra haladva - a szorz egyes helyi rtkein ll szmmal. A rszszorzatokat gy rjuk
le, hogy mindig egy helyi rtkkel jobbra toljuk (shift) azokat, majd az gy kapott rszeredmnyeket sszeadjuk.
Nzzk egy pldt kt egy byte-os szm szorzsra:
1
1

0
0
0

1
1
0
1

1
1
0
0
1

1
1
0
1
0
0

0
0
0
1
1
0
1

1
1
0
1
1
0
0
0
1

0
0
0
0
1
0
1
0
1
1

0
1
0
0
1
0
0
0

0
1
0
1
0
1
0

0
0
0
0
1
0

0
1
0
1
0

0
0
0
0

0
1
1

0
0

A feladat vgrehajtsakor hasznlunk egy egybites szorzst (S), a rszszorzatokat eltoljuk


eggyel jobbra, majd sszeadjuk azokat. Mivel az sszeadsnl mr lttuk, hogy az is visszavezethet alap (logikai) utastsokra, a fenti folyamatbl kvetkezik, hogy a szorzs is lerhat
alaputastsok sorozatval. (A gyakorlatban ez a folyamat valamivel egyszerbb, mivel a nullkkal nem kell sszeadst vgezni, csak az eltolst vgrehajtani.)
Lthatjuk, hogy az eredmny eltrolsra legalbb kt bjt adatterlet szksges (az tvitel biten kvl). Ezt az assembly utastsoknl is figyelembe kell venni. Ennek megfelelen a bjtos
szorzsnl az eredmny ktbjtos regiszterbe kerl, ktbjtos szorzsnl pedig ngybjtos lesz a
szorzat. Az oszts esetben fordtott a helyzet, itt az eredmny fele akkora regiszterbe kerl, mint
az osztand.

24

Gimesi Lszl 2015.

3.4.5. Oszts
Az osztst pldul ahogy az iskolban a bevezetsekor tanultuk elvgezhetjk kivonsok
sorozatval: az osztandbl addig vonjuk ki az osztt, amg a maradk nagyobb, mint az oszt.
Az eredmny a kivonsok darabszma, a maradk az lesz, amibl mr nem tudtuk kivonni az
osztt.
Termszetesen az osztst is elvgezhetjk jval hatkonyabban is, felhasznlva az eddig megismert bitmveleteket.
Az algoritmus mkdst egy mintafeladat segtsgvel mutatjuk be, vgezzk el a 203:11
osztst:
0
1
2
3
4

5
6
7

M (maradk)
0
1
1 1
1 1 0
1 1 0 0
1
1 1
1 1 0
1 1 0 1
1 0
1 0 1

1
1
0
0
1
1
0
1
1
1
0

1
0
0
1
0
0
1
1
0
0
0

A (osztand)
0 0 1 0
0 1 0 1
1 0 1 1
0 1 1 0
1 1 0 0
1 1 0 0
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

1
1
0
0
0
0
0
0
0
0
0

1
0
0
0
0
0
0
0
0
0
0

B (oszt)
0 1 1

0
0
0
0
0
0
0
0
0
0
1

H (hnyados)
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
1 0 0 1
0 0 1 0

1. rjuk fel a 0. sorba az elvgzend mveletet, az osztandt (A), az osztt (B), a hnyadost
(H) s a maradkot (M).
2. Lptessk A-t s M-et balra gy, hogy az A-bl kilp bit az M-be kerljn. Ezzel egytt
lptessk H-t is eggyel balra.
3. A 2. pontban lert lpst addig vgezzk, amg az MB nem lesz. (*-gal jellt sor). Ekkor
mdostsuk az M rtkt M-B-re s a H rtkt H+1-re.
4. Folytassuk a 2. s 3. pontban lertakat annyiszor, amilyen hossz az osztand. Esetnkben
8-szor. (A balra mozgatsok szmt a sorok elejn lthat szm mutatja.)
Az algoritmus alapjn elksztett mintaprogram az 5.4. fejezet vgn megtallhat.

25

Intel processzorok programozsa assembly nyelven

3.4.6. Relcis mveletek


A szmtgp, illetve a programok mkdshez az eddig ismertetett mveleteken kvl
szksgnk lehet arra, hogy kt rtket ssze tudjunk hasonltani, el tudjuk dnteni, hogy melyik
a kisebb, a nagyobb, esetleg egyenlk-e. Ezeket az sszehasonlt mveleteket relciknak nevezzk. Az sszehasonlts eredmnye mindig egy logikai rtk (igaz vagy hamis).
A relcis mveleteket a szmtgp alaputasts szinten ismeri, ami azt jelenti, hogy kt rtket ssze tud hasonltani s az eredmnyt gynevezett jelzbiteken trolja.
Amikor csak egy szmrl akarjuk eldnteni, hogy az negatv, nulla, vagy pozitv-e, a jelzbitek belltsra hasznlhatjuk az e fejezetben ismertetett mdszert: nmagval AND vagy OR
mveletet vgznk.
Termszetesen a relcis mveletek is visszavezethetk alaputastsokra. Nzznk egy pldt.
A feladat kt szm sszehasonltsa:
Vonjuk ki az els szmbl a msodikat!

26

Ha az eredmny = 0

a kt szm egyenl;

Ha az eredmny 0 s az eljel bit = 1

a msodik szm nagyobb;

Ha az eredmny 0 s az eljel bit = 0

az els szm nagyobb.

Gimesi Lszl 2015.

4. Az Intel mikroprocesszorok
4.1. Kezdetek
Nzzk meg, milyen utat jrt be a szmtstechnika, amg eljutott az els mikroprocesszor
megalkotsig.
Charles Babbage (1792-1871) brit matematikus s feltall megalkotta a modern digitlis
szmtgp alapelveit.
Herman Hollerith (1860-1929) nmet szrmazs amerikai statisztikus 1889-ben kapott szabadalmat egy lyukkrtys adatfeldolgozsra alkalmas berendezsre, amellyel az 1890-es amerikai npszmlls adatait dolgoztk fel. Hollerith 1896-ban alaptotta meg a Tabulating Machine
Company nev cget, amelybl aztn 1924-ben megalakult az IBM.
George Boole (1815-1864) s Augustus de Morgan 1847-tl kezdve kidolgozta a formlis
logikt (a Boole-algebrt), ezzel megteremtve a modern szmtgpek mkdshez szksges
egyik fontos matematikai modellt.
Leonardo Torres y Quevedo (1852-1936) 1914-ben bevezette a lebegpontos szmbrzolst a szmtstechnikban. 1910 s 1920 kztt programvezrls mechanikus szmolgpeket
ptett egyedi clokra (pl. kt komplex szm szorzatnak kiszmtsra). Tle szrmaznak a
programozsi nyelvek els kezdemnyei is.
Konrad Zuse (1910-1995) 1932-ben ptette Nmetorszgban az els mechanikus trolt tetszleges adatok, elssorban lebegpontos szmok trolsra. A trol 24 bites adatokat tudott
fogadni. A lebegpontos szmoknl ebbl 16 bit volt a mantissza, 7 bit a karakterisztika s 1 bit
az eljel.
Alan Turing (1912-1954) 1936-ban az On Computable Numbers cm mvben lerta egy
olyan szmtgp matematikai modelljt, amely mint a lehet legegyszerbb univerzlis szmtgp brmilyen vges matematikai s logikai problmt meg tud oldani.
Leslie Comrie (1893-1950) 1937-ben megalaptotta Londonban az els kereskedelmi jelleggel mkd szmtkzpontot. A nagyobb feladatok megoldsra tbb szmtgpet s lyukkrtys Hollerith-gpet kapcsolt ssze.
Howard Aiken vezetsvel fejlesztettk ki az els teljesen automatikusan mkd ltalnos
cl digitlis szmtgpet az Egyeslt llamokban, a Harvard egyetemen. A tervezshez az
IBM 5 milli dollrral jrult hozz s a gp megptst is az IBM vgezte. Ez volt a Mark I.,
vagy ms nven Automatic Sequence Controlled Calculator (ASCC). Ez a gp fixpontos szmokkal dolgozott (10 szmjegy a tizedesvessz eltt, 13 szmjegy pedig utna). Relkbl plt
fel, 3304 db ktlls kapcsolt tartalmazott, sszesen kb. 760 000 alkatrszbl llt s 500 mrfld (800 km) huzalt hasznltak fel hozz. A gp kb. 15 m hossz s 2,4 m magas volt. A memrija a mechanikus szmolgpekhez hasonlan fogaskerekekkel, tzes szmrendszerben trolta
az adatokat, 72 db 23 jegy szmnak volt benne hely. Az adatbevitel lyukkrtykkal trtnt. A
programot lyukszalag tartalmazta, ez vezrelte a gp mkdst. A gpnek egy sszeadshoz
0,33, egy szorzshoz 4, egy osztshoz 11 msodpercre volt szksge s gyakran meghibsodott
(ms forrsok szerint a szorzs ideje 6 s s a gp megbzhatan mkdtt). A munkt 1939-ben
kezdtk s 1944-ben kszltek el. A tengeri tzrsg rszre ksztettek vele lelem-tblzatokat.
Ezt a szmtgpet 1959-ig hasznltk.
A II. vilghbor alatt tudsok s matematikusok egy csoportja, Bletchley Parkban (Londontl
szakra) ltrehozta az els teljesen elektronikus digitlis szmtgpet, a Colossust. A gp 1943
decemberre kszlt el s 1500 elektroncsvet tartalmazott. A Colossus kvarcvezrls volt, 5
27

Intel processzorok programozsa assembly nyelven

kHz-s rajellel dolgozott, msodpercenknt 25.000 karaktert tudott feldolgozni. sszesen tz


darab ilyen gp kszlt. Rejtjelezett nmet rdizenetek megfejtsre hasznlta a Turing ltal
vezetett csoport. Ezzel a gppel sikerlt megfejteni a nmet ENIGMA rejtjelt.
Az els ltalnos cl elektronikus digitlis szmtgp az ENIAC (Electronic Numerical
Integrator And Computer) volt. Az ENIAC-ot a msodik vilghbor alatt kezdte el tervezni katonai clokra - John Presper Mauchly s John William Eckert. A gpet a Pennsylvania
egyetemen ptettk, a munkt 1946-ban fejeztk be. A gp 17 468 elektroncsvet tartalmazott,
tbb szz kW elektromos energit fogyasztott s 450 m2 helyet foglalt el, tmege 30 tonna volt,
az elhelyezshez tbb mint 30 m hossz termet ptettek. Hrom nagysgrenddel gyorsabb volt,
mint a rels szmtgpek: az sszeadst 0,2 ms, a szorzst 3 ms alatt vgezte el. A programja
fixen, drtozva volt, azt csak mintegy ktnapos kzi munkval, villamos csatlakozsok tktsvel lehetett tkdolni. A gp memrija 20 db tzjegy eljeles decimlis szmot tudott trolni. A
szmtsok elvgzshez szksges elkszletek tzszer annyi idt vettek ignybe, mint maga a
szmts. gy szksgess vlt, hogy a program trolsra j elvet dolgozzanak ki.
Az ENIAC utda, az EDVAC (Electronic Discrete Variable Automatic Calculator) ugyancsak
Mauchly s Eckert vezetsvel plt, 1944-tl 1948-ig, vglegesen csak 1951-ben helyeztk
zembe. Itt mr felhasznltk azokat az alapelveket, amelyeket Neumann Jnos (1903-1957)
magyar matematikus fektetett le az ENIAC mkdse sorn szerzett tapasztalatok alapjn. A
szmtgp a programot s az adatokat memriban trolta. Higanyos mvonal segtsgvel oldottk meg az adattrolst, ami jelentsen cskkentette a felhasznlt elektroncsvek szmt.
Neumann, Herman Goldstine-nal egytt ptette meg sajt IAS gpt. rdekessge ennek a
gpnek, hogy nem volt lebegpontos aritmetikja. Neumann gy gondolta, hogy egy matematikus kpes a tizedespont (kettedes-pont) helyt fejben nyomon kvetni.
A tranzisztor 1947-es feltallsval j lendletet kapott a szmtstechnika fejldse. A tranzisztor szmtgpben trtn alkalmazsa az 1950-es vek kzepn-vgn jelent meg. A tranzisztorokkal kisebb, gyorsabb s megbzhatbb ramkrket lehetett kszteni, mint az elektroncsvekkel. Ezek a szmtgpek mr msodpercenknt egymilli mveletet is el tudtak vgezni.
A tranzisztorok sokkal kevesebb energit fogyasztanak s sokkal hosszabb letek, megbzhatsguk pedig mintegy ezerszerese az elektroncsveknek. A mretek cskkense miatt sokkal
olcsbb szmtgpeket lehetett kszteni, amelyek zemeltetse is egyszerbb s olcsbb volt.
Ekkor kezdtk alkalmazni a ferritgyrs memrit is.
Az els integrlt ramkrt (IC-t) 1958-ban ksztette Jack S. Kilby a Texas Instrumentsnl s
Robert Noyce a Fairchild Semiconductornl. A tmegtermels 1962-ben indult meg, az els
integrlt ramkrket tartalmaz szmtgpek pedig 1964-ben kerltek kereskedelmi forgalomba. Az integrlt ramkrk tovbb cskkentettk a szmtgpek rt, mrett s meghibsodsi
gyakorisgt. Ekkor jelent meg a bjt-szervezs s az input-output processzor, valamint jelents
fejlds trtnt a tv-adattvitelben is.

28

Gimesi Lszl 2015.

4.2. Mikroprocesszor
Az els mikroprocesszort6 1971-ben Ted Hoff (Stanford University mrnke) tervezte, s az
Intel ksztette.7 Egy 7 x 7 mm-es szilciumlapka 2300 tranzisztort tartalmazott.
Az LSI (Large-Scale Integration) technolgia tette lehetv, hogy a szmtgpek kzponti
egysge (CPU) egyetlen flvezet lapkra (IC) kerljn.
A mikroprocesszoroknak ksznhet, hogy a szmtgpek a mindennapi let rszv vltak.
Olcssguk, kicsiny mretk hozzjrult a szleskr elterjedskhz.
A jelentsebb Intel processzorok megjelenst s nhny jellemz paramtert az albbi tblzat tartalmazza:
Tpus
4004
8008
8080
8088 (PC)
8086 (XT)
80286 (AT)
386
486
Pentium
Pentium Pro
Pentium II
Celeron
Pentium III
Pentium 4
Xeon
Pentium M
Core 2 Duo
Atom
Core i5
Core i7

Kiads
ve
1971
1972
1974
1978
1978
1982
1985
1989
1993
1995
1997
1998
1999
2000
2001
2003
2006
2008
2010
2012

Szhossz
[bit]
4
8
8
8
16
16
32
32
32
64
64
64
64
64
64
64
64
64
64
64

rajel
[MHz]
0,108
0,8
2
5
5
6
16
25
66
200
233
266
650
1500
1700
1700
2660
1860
3800
2900

Technolgia
[m]
10
10
6
3
3
1,5
1,5
1
0,8
0,35
0,35
0,25
0,25
0,18
0,18
0,09
0,065
0,045
0,032
0,022

Tranzisztor
szma
2,3 x 103
3,5 x 103
4,5 x 103
2,9 x 104
2,9 x 104
1,34 x 105
2,75 x 105
1,2 x 106
3,1 x 106
5,5 x 106
7,5 x 106
7,5 x 106
9,5 x 106
42 x 106
42 x 106
55 x 106
291 x 106
47 x 106
1,16 x 109
1,4 x 109

Forrs: www.intel.eu
A 8080-as processzor tovbbfejlesztsbl kszl a Zilog Z80-as processzor, amely alapja
volt pldul a Spectrum szmtgpeknek.
A 8088-as processzor kerlt az els IBM gyrtmny szemlyi szmtgpbe. Ez a PC kategria mg 8 bites regiszterekkel dolgozott.
Egy rdekes megfigyelst tehetnk, ha sszehasonltjuk az ENIAC kzponti egysgt s az els mikroprocesszort. A felhasznlt aktv elemek (elektroncs, tranzisztor) szma kzel azonos,
az rajel-frekvencijuk is azonos nagysgrend, a mretk viszont alig 30 v alatt tbb tonnrl s tbb tz ngyzetmterrl, nhny milligrammra, illetve 13,5 mm2-re cskkent.
A fejlds temre Gordon Moore (az Intel egyik alaptja) 1965-ben adott prognzist,
amely szerint az egysgnyi terleten elhelyezhet ramkri elemek szma vente megduplzdik.8 Ezt a megllaptst 1975-ben az addigi tapasztalatok alapjn fellvizsglta s kt vre

Mikroprocesszornak nevezzk az egyetlen flvezet elemen kialaktott teljes CPU-t (Central Processing Unit=Kzponti vezrl egysg), amely egyetlen integrlt ramkrs tokban helyezkedik el.
7
Egyes forrsok szerint a Texas megelzte az Intelt, ahol ugyanebben az vben ksztettk el az els mikroprocesszort.
8
Gordon E. Moore, 1965: Cramming More Components onto Integrated Circuits, Electronics, pp. 114117.

29

Intel processzorok programozsa assembly nyelven

mdostotta. Ez vtl kezdve nevezik e tendencit Moore trvnynek (Moores law). E fejldst
szemllteti az albbi grafikon:
Moore trvnye
1,00E+10
Core i7
Core i5
1,00E+09

Tranzisztor szma

Core 2 Duo
1,00E+08

Pentium 4
Pentium II

1,00E+07
Pentium
1,00E+06
386
80286

1,00E+05

Pentium M
Pentium III

Pentium Pro

486

8088
1,00E+04
1,00E+03

8008
4004
1971

8080

1976

1981

1986

1991

1996

2001

2006

2011

Az brt megfigyelve feltnik, hogy a fejlds tendencija lassulst mutat. Ennek kt oka van:
egyik az, hogy a gyrtstechnolgia fejlesztse nem tudott lpst tartani a trvnyben megfogalmazottal. A msik pedig magbl a flvezet technolgibl kvetkezik, ugyanis a miniatrizls sorn kezdik elrni azt a fizikai korltot (minimlis mretet), ahol a tranzisztor mr nem mkdhet.

30

Gimesi Lszl 2015.

4.3. Az Intel processzorok regiszterkszlete


A CPU-nak rsze egy nagysebessg memria, amelyben ideiglenesen troldnak a mveletek
elvgzshez szksges adatok, eredmnyek, valamint cm- s vezrlinformcik.
A regiszterek mretvel (bithosszval) jellemezhetjk a processzort. Ennek megfelelen ltezik 8, 16, 32, stb. bites kzponti egysg. Minl nagyobb egy regiszter mrete, annl gyorsabb a
processzor. Pldaknt adjunk ssze kt egsz (16 bites) szmot. Ha ezt 8 bites processzorral vgezzk, akkor a szmokat kt rszletben tudjuk csak sszeadni. Elszr az als nyolc bitet, majd
a fels nyolcat, hozzadva az elzbl szrmaz tlcsordulst. Amennyiben 16 bites (vagy nagyobb) processzorunk van, ez a mvelet egy utastssal elvgezhet.
A regisztereket funkcijuk szerint csoportosthatjuk. (A felsorolsban hasznlt regiszternevek
az assembly programozsban is hasznlatosak.)
A jegyzetben trgyalt regiszterek jelents rszt a 8088-as processzortl kezdve hasznljk. A
ksbb bevezetett regisztereknl minden esetben megadjuk azt a processzor tpust, ahol azt elszr alkalmaztk. Ltni fogjuk, hogy a regiszterek nem egyenrangak, ms-ms funkcit ltnak
el, gy egymssal nem minden esetben helyettesthetk.
4.3.1. ltalnos regiszterek
Tbb clra hasznlhat regiszterek, de egyes utastsok vgrehajtsnl meghatrozott szerepet tltenek be.
Akkumultorregiszter - Accumulator
15
AX

7
AH

0
AL

A teljes (16 bites) regiszter neve AX. A regiszter als 8 bitjre kln is lehet hivatkozni AL
(Accumulator Low) nven, a fels 8 bitjre pedig AH (Accumulator High) nven. Minden mvelethez hasznlhat, kitntetett szerepe van a szorzs, az oszts s az I/O utastsok vgrehajtsnl. A 32 bites vltozat neve EAX, ahol a regiszter als 16 bitje megfelel az AX regiszternek:
31
15
7
0
EAX
AH
AL

Bzisregiszter - Base
15
BX

7
BH

0
BL

A regiszter als 8 bitje BL (Base Low), a fels 8 bitje BH (Base High). Nhny kivteltl eltekintve minden mvelethez hasznlhat. ltalban az adatszegmensben9 trolt adatok bziscmt tartalmazza, indirekt cmzsnl hasznlhat. (A 32 bites vltozat neve: EBX, felptse hasonl az EAX-hez)

Az adatszegmens lersval az 5.4 fejezet foglalkozik.

31

Intel processzorok programozsa assembly nyelven

Szmllregiszter - Counter
15
CX

7
CH

0
CL

A regiszter als 8 bitje CL (Counter Low), a fels 8 bitje CH (Counter High). Nhny kivteltl eltekintve minden mvelethez hasznlhat. ltalban ciklus, lptet, forgat s sztring utastsok ciklusszmllja. (A 32 bites vltozat neve: ECX, felptse hasonl az EAX-hez)
Adatregiszter - Data
15
DX

7
DH

0
DL

A regiszter als 8 bitje DL (Data Low), a fels 8 bitje DH (Data High). Minden mvelethez
hasznlhat, kitntetett szerepe van a szorzs, az oszts s az I/O utastsok vgrehajtsnl. (A
32 bites vltozat neve: EDX, felptse hasonl az EAX-hez)
4.3.2. Vezrlregiszterek
Forrs cm - Source Index
15

0
A forrsadat indexelt cmzsre.

SI
(A 32 bites vltozat neve: ESI)
Cl cm - Destination Index
15

0
A cladat indexelt cmzsre.

DI

A kt regiszter segtsgvel valsthat meg az indirekt s indexelt cmzs. Kitntetett szerepe


van a sztring mveletek vgrehajtsban. (A 32 bites vltozat neve: EDI)
Stack mutat - Stack Pointer
15

0
A verembe utolsknt bert elem cme.

SP

A veremmutat rtke automatikusan vltozik a stack-mveleteknek megfelelen. Kzvetlen


utastssal is mdosthat, de ez igen nagy gondossgot ignyel. (A 32 bites vltozat neve: ESP)
A verem tetejn trolt adat teljes cme az SS:SP regiszterprban tallhat.
Bzis mutat - Base Pointer
15

0
BP

A verem indexelt cmzshez.

A regiszter hasznlhat a stack-szegmens indirekt s indexelt cmzsre. Egyb mveleteknl


nem javasolt a hasznlata. (A magasszint nyelvek fggvnyhvsakor, a paramtertadsban s
a loklis vltozk hasznlatakor van szerepe.) (A 32 bites vltozat neve: EBP)

32

Gimesi Lszl 2015.

Utastsmutat - Instruction Pointer


15
IP

0
A vgrehajtand utasts cme.

A processzor mkdse sorn az IP a kvetkez utastsra mutat. Az utasts beolvassa


(fetch) utn az IP az utasts hosszval automatikusan nvekszik, ezltal a beolvasott utastst
kvet utastsra mutat. Vezrlstads (ugrs, szubrutinhvs) esetn az IP-be az j cm rdik.
(A 32 bites vltozat neve: EIP)
(Irodalmakban hasznljk mg a PC (Program Counter) elnevezst is, br ez megtveszt,
mert nem az utastsokat szmolja.)
Az utasts teljes memriacmt a CS:IP regiszterpr tartalmazza.
Sttuszregiszter - Flags
31

15
A
V R
C

0
I
N
O D I T S Z
O

A sttuszregiszter bitjei az utols mvelet eredmnynek megfelelen llnak be. Tartalmuk


utastssal mdosthat s lekrdezhet. A feltteles vezrltad utastsok a bitek llstl
fggen mkdnek. (A 386-os processzortl 32 bites!)
A jelzbitek (flags) elnevezsei:
C Carry (tvitelbit)

Pldul bitlptesnl a regiszterbl kikerl bit rtke.

P Parity (paritsbit)

P=1, ha az eredmny als 8 bitjben lv egyesek szma


pros, egybknt P=0.

A Auxiliary Carry

fl tvitel, tvitel a 3. s a 4. bit kztt.


BCD szmokkal vgzett mveleteknl hasznlatos.

Z Zero (zr bit)

Z=1, ha az eredmny nulla, egybknt Z=0.

S Sign (eljel bit)

S=0, ha az eredmny pozitv, egybknt S=1.

T Trap (lptets)

Utastsonknti megszakts engedlyezse nyomkvetshez.

I Interrupt

Hardvermegszakts engedlyezse (I=1) tiltsa (I=0).

D Direction

Ciklus s sztringkezel index - n, ha D=0 s cskken,


ha D=1.

O Overflow

O=1, ha az eredmny nem fr el a clregiszterben.

Kiegszts 80286-tl:
IO I/O Protection
Level

2 bites jelz, a privilegizlsi szint rtke (0-3).


Csak vdett mdban.

N Nested Task

Begyazott taszk jelz. Csak vdett mdban.

Kiegszts 80386-tl:
R Resume
V Virtual 8086

Hibajelz megszakts engedlyezse.


Mode 8086 virtulis zemmd engedlyezse, vdett mdban.

Kiegszts 80486-tl:
AC Aligment Check Illeszked memriahvs engedlyezse.

33

Intel processzorok programozsa assembly nyelven

4.3.3. Szegmensregiszterek (memriakezels)


A szegmensregiszterek troljk a klnbz funkcikhoz hasznlt memriaszegmenscmeket. (A memriacmzshez mindig regiszterprt hasznlunk!)
Kdszegmens Code Segment
15

0
Kdszegmens, az utastsok cmzshez.

CS

Az ppen fut programmodul bziscmt tartalmazza. Minden utastsbetlts (fetch) a kdszegmens-regisztert hasznlja. Tartalma kiolvashat, de tartalma csak vezrlstadssal mdosulhat.
Veremszegmens - Stack Segment
15

0
Stack szegmens, a verem cmzshez.

SS

A stack-knt hasznlt memriaterlet bziscmt tartalmazza. rhat-olvashat, de mdostsa


nagy figyelmet ignyel.
Adatszegmens - Data Segment
15

0
Adatszegmens, az adatterlet cmzshez.

DS

Az adatszegmens bziscmt tartalmazza, rhat-olvashat regiszter. Sztring mveleteknl


alaprtelmezs szerint a forrs-sztring cmt a DS:SI regiszterpr tartalmazza.
Extra szegmens - Extra Segment
15

0
Extra szegmens, msodik adatterlet cmzshez.

ES

Msodlagos adatszegmens bziscmt tartalmazza, rhat-olvashat regiszter. Az ES alkalmazsakor egy prefixumot (mdost eltagot) kell hasznlnunk az utasts eltt. Sztring mveleteknl alaprtelmezs szerint a cl-sztring cmt az ES:SI regiszterpr tartalmazza.
A 386-os processzortl tovbbi szegmensregisztereket vezettek be:
Extra szegmens - Extra Segment
15
FS

Extra szegmens - Extra Segment


15
GS

Extra szegmens, tovbbi adatterlet cmzshez.

Extra szegmens, tovbbi adatterlet cmzshez.

A 386-os processzoroktl lehetsg van a szegmensregiszterek nlkli, gynevezett lineris


cmzsre is.

34

Gimesi Lszl 2015.

4.4. A matematikai trsprocesszor


A numerikus adatfeldolgoz processzort (NDP Numeric Data Processor) a 286-os processzor
mellett hasznltk elszr, trsprocesszorknt (287-es koprocesszor). (A 386-os CPU trsprocesszora a 387-es.) Ezt mg kln tokba ptve lehetett a szmtgpben elhelyezni. A 486-os
processzor az els olyan Intel processzor, amely lebegpontos egysget tartalmaz.
A matematikai trsprocesszor alkalmazsval egy jabb lehetsg nylt a prhuzamos mvelet-vgrehajtsra. Amikor a programban lebegpontos utasts van, akkor a CPU tadja azt az
NDP-nek, majd folytatja a programvgrehajtst. Termszetesen, ha az NDP ltal szolgltatott
eredmnyre szksg van, akkor azt meg kell vrnia.
A matematikai processzor a lebegpontos mveletek vgrehajtshoz ltalban sajt regisztereit hasznlja. E regisztereket eltren a mr bemutatott regiszterektl veremknt cmezzk.
A verem tetejre (aktulis elemre) az llapot regiszter hivatkozik. A regiszterekben 8 darab 10
bjtos lebegpontos szmot tudunk trolni.
Ezen kvl a koprocesszor gynevezett 16 bites kontrolregisztereket is tartalmaz.
4.4.1. A koprocesszor regiszterkszlete
Adatregiszterek:
Mantissza
Eljel Exponens
79 78
64 63
ST(0)

ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Kontrol regiszterek:
15

0
Vezrlregiszter (Control Word)
llapotregiszter (Status Word)
Toldalkregiszter (Tag Word)
Utastsmutat
(Instruction Pointer)
Operandusmutat
(Operand Pointer)

Az utastsmutat-regiszterbe kerl az EIP regiszter tartalma. Operandusmutat tartalmazza a


lebegpontos utasts ltal hasznlt memriban lv operandus eltols (offset) cmt.

35

Intel processzorok programozsa assembly nyelven

Vezrlregiszter:
A vezrl regiszter segtsgvel befolysolhatjuk a koprocesszor mkdst.
X

IC

RC

PC

PM UM OM

ZM DM IM

IM Invalid Operation Mask (rvnytelen mvelet)


DM Denormal Operand Mask (Nem normalizlt operandus)
ZM Zero Divide Mask (Nullval trtn oszts)
OM Owerflow Mask (Tlcsorduls)
UM Underflow Mask (Alulcsorduls)
PB Precision Mask (Pontossg)
PC Precision Control (Pontossg meghatrozsa.) A PC hatrozza meg, hogy az NDP milyen pontossg szmformt hasznljon a mvelethez.
00 egyszeres pontossg (alaprtelmezett)
01 nem hasznlt
10 dupla pontossg
11 kiterjesztett pontossg
RC Rounding Control (Kerekts meghatrozsa) Az RC hatrozza meg, hogy az NDP
hogy illessze az eredmnyt a megadott pontossg eredmnyregiszterbe.
00 legkzelebbi rtkre kerekt (alaprtelmezett)
01 lefel kerekt
10 felfel kerekt
11 0-ra kerekts
IC

36

Infinity Control (Vgtelen rtelmezse) Csak a 287-es processzorban hasznltk.


1 pozitv s negatv vgtelen is ltezik
(A tbbi NDP csak ezt az zemmdot hasznlja.)
0 eljel nlkli (kzs) vgtelenhez tartanak a szmok

Gimesi Lszl 2015.

llapotregiszter:
B

C3

ST

C2

C1

C0

ES

SF

PE

UE

OE

ZE

DE

IE

IE Invalid Operation Exception (megszakts rvnytelen mvelet miatt): egyb hibk jelzse (pl. aritmetikai, hivatkozsi hibk).
DE Denormal Exception (nem normalizlt kivtel10): a mvelet operandusa nem normalizlt.
ZE Zero Devide Exception (nullval val oszts kivtel): nullval oszts jelzse.
OE Owerflow Exception (tlcsorduls kivtel): az eredmny nagyobb abszolt rtk, mint
amit az NDP brzolni tud.
UE Underflow Exception (alulcsorduls kivtel): az eredmny kisebb abszolt rtk, mint
amit az NDP nulltl klnbzen brzolni tud.
PE Precision Exception (pontossg megszakts): Ha az NDP az adott pontossgban nem
tudja brzolni az eredmnyt. Ez a kivtel fordul el akkor is, ha kisebb pontossg
adatra konvertlunk.
SF Stack Fault (veremhiba): verem-tlcsorduls jelzse (287-ben nincs).
ES Error Summary (hibasszegzs): rtke 1, ha brmelyik lebegpontos utasts hibt tallt.
C0 Status, Carry (tlcsorduls jelzbit).
C1 Status, Undefinied (nem definilt jelzbit): a feltteles vezrlstadsnl nem hasznlt.
C2 Status, Parity (parts jelzbit).
C3 Status, Zero (zr jelzbit).
ST Stack pointer (regisztermutat): a legutoljra feltlttt lebegpontos regiszterre mutat.
Ha j szm kerl a verembe, rtke eggyel cskken. Ha kivesznk egy adatot, akkor
eggyel n.
B Busy (foglaltsgbit): rtke 1, ha az NDP foglalt, vagy ha kivtel trtnt.
Toldalkregiszter
A regiszter 8 db ktbites informcit tartalmaz az ST regiszterekrl.
00 a regiszter rvnyes lebegpontos rtket trol
01 a regiszter tartalma 0.0
10 a regiszterben vgtelen, normalizlatlan vagy rvnytelen szm van
11 a regiszter res (nincs hasznlatban)

10

Kivtelek (exception): a CPU bels programjnak (firmware) megszaktst okoz esemnyek.

37

Intel processzorok programozsa assembly nyelven

5. Az Intel processzorok utastsrendszere


Minden szmtgp a Neumann-elvbl kvetkezik tartalmaz egy bels (operatv vagy
rendszer) memrit az ppen fut programok (utastsok) s az adatok trolsra. A memria
feladata, hogy az informcit binris formban trolja, s azt pldul a processzor krsre
rendelkezsre bocsssa.
Az Intel mikroprocesszor memrija bjt szervezs. Ez azt jelenti, hogy a memria bjtonknt cmezhet, vagyis minden egyes bjtnak van egy memria cme. Brmely kt szomszdos
bjt egy 16 bites szt alkot (a sz pros illetve pratlan memriacmen is kezddhet). Az Intel
processzoroknl a nvekv bjtsorrendet (little endian) alkalmazzk, vagyis az alacsonyabb
helyirtk van az alacsonyabb memriacmen.
Mivel a programutastsok is a memriban troldnak, gy ezek tulajdonkppen binris szmok, amelyeket a processzor sorban egyms utn beolvas s vgrehajt.
A gpi kd utastsok ngy rszbl llnak, mretk fgg az utaststl s a cmzsi mdtl.
Az ltalnos utastsszerkezet a kvetkez:
Prefixum

Operci kd

Cmzsi md

Operandus

1. A prefixum mdostja az utasts rtelmezst. (Hasznlata nem ktelez.) Hasznlatval elrhatjuk pldul az ismtlsek szmt, vagy letilthatjuk a megszaktskrst.
2. Az operci kd adja meg, hogy a processzornak milyen mveletet kell vgrehajtani.
Minden utastsban szerepelnie kell!
3. A cmzsi md az operandusok a ksbbiekben rszletesen trgyalt rtelmezst
adja meg. (Csak operandust tartalmaz utastsokban tallhat.)
4. Az operandus lehet konstans, cm vagy cmzshez hasznlt rtk. Hossza vltoz, de
el is maradhat.
5.1. Utastsok
Az assembly utastsok pontosan megfelelnek egy gpi kd utastsnak, azaz a fordt program (assembler) minden utastst egy gpi kdra fordt le.
A jegyzetben az Intel processzorok alap utastskszletvel foglalkozunk. (Nem trnk ki a
lebegpontos utastsokra.) Az utastsok rszletes lerst Az Intel processzorok utastsai
mellkletben trgyaljuk.
5.2. Operandusok s cmzsi mdok
Az Intel processzorok gynevezett egycmes processzorok, ami azt jelenti, hogy egy utastssal csak egy memriahelyet tudunk megcmezni. Azaz ha az utasts kt operandus (pldul:
MOV), akkor csak az egyik lehet memriacm, a msiknak regiszternek kell lennie.
Nhny, elssorban a MOV utasts segtsgvel ismerkedjnk meg a klnbz operandusokkal s cmzsi mdokkal. (Szintaktikja: MOV cl, forrs - A forrs tartalmt a cl operandusba msolja, a cl eredeti rtke elvsz, a forrs tartalma megmarad.)
Vannak olyan utastsok, amelyeknek nincs operandusuk, vagy maga az utasts egyrtelmen
(implicit) meghatrozza azokat:

38

RET

;Visszatrs szubrutinbl. nincs operandus

CBW

;AL-ben lv rtket AX-be konvertlja (implicit)

Gimesi Lszl 2015.

5.2.1. Regiszteroperandus
Az utasts paramterei regiszterek, amelyekben troljuk a mvelet elvgzshez szksges
adatokat. (Az operandusokat a regiszter nevvel adjuk meg.) 8, 16 vagy 32 bites regiszterekkel
vgezhet mvelet, ennek megfelelen vltozik az utasts hossza.
MOV AH, AL

;AL tartalmt AH-ba msolja (8 bites adatmozgats)

MOV AX, BX

;BX tartalmt AX-be msolja (16 bites adatmozgats)

MOV EAX, EBX

;EAX tartalmt EBX-be msolja (32 bites adatmozgats)

(Az utastsok egy rsznl csak meghatrozott regiszterek hasznlhatk.)


5.2.2. Kzvetlen (immediate) operandus
Ilyenkor az operandust az utasts kdja tartalmazza.
MOV AX, 2

; AX-be kettt teszi

Ez az utasts gpi kdra lefordtva B80200h, hrom egyms utni bjtot foglal el a memriban. A B8h (a szm utni h jelzi, hogy az hexadecimlis) az utastskd, ez van a legkisebb
cm bjton. Ezt kzvetlenl a ktbjtnyi adat (02h s 00h) kveti. Azrt 0200h s nem 0002h,
mert az Intel processzorok az als bjtot (02h-t) troljk elbb a memriban (little endian).
5.2.3. Direkt memriacmzs
Ebben az esetben az operandus egy elre (a DATA szegmensben) deklarlt adat. Ennek a
memriacme szerepel az utastsban.
.DATA
Adat DB 10h, 11h, 12h, 13h

;DB jelentse: az adategysgnk bjtos

.CODE
.
.
MOV AX, Adat

;AX-be tlti az Adat cmen lv rtket (10h)

MOV AX, [Adat]

;Ua. mint az elz

MOV AX, Adat[2] ;AX-be tlti az Adat+2 cmen lv rtket (12h)


MOV AX, Adat+2

;Ua. mint az elz

Az utasts gpi kdra lefordtva A10002. Az A1h az utastskd, amelyet kzvetlenl a ktbjtos adatcm kvet. (Felttelezve, hogy az adat cme 0200h.) Lthat, hogy az elz
(immediate operandus) pldtl csak az opercis kdban klnbzik.
Az adat szegmenscmnek (alaprtelmezsben) a DS-ben kell lennie, ezrt ezt hasznlat eltt
be kell lltani:
;A DS esetben csak regiszteroperandus cmzsi mdot vlaszthatunk, gy a belltst
kt lpsben kell elvgezni
MOV AX, DGROUP

;Adatszegmens cme AX-be. A DGROUP a program


;betltsekor kap rtket az opercis rendszertl.

MOV DS, AX

;Adatszegmens cme a DS-be.


39

Intel processzorok programozsa assembly nyelven

5.2.4. Indirekt memriacmzs


Itt az operandussal megadott helyen nem az adatot, hanem annak cmt talljuk.
5.2.4.1. Regiszter indirekt cmzs
MOV AX, [BX]

;AX-be tlti a BX ltal megcmzett memria tartalmt.

Az alaprtelmezett adatszegmens cme DS. Ms szegmensre trtn hivatkozs:


MOV AX, ES:[BX] ;AX-be tlti az ES:BX ltal megcmzett memria tartalmt.
Ilyen esetben csak szegmensregiszter hasznlhat prefixumknt.
5.2.4.2. Indexelt (bzis-relatv) cmzs
.DATA
Adat DB 10h, 11h, 12h, 13h
.CODE
.
.
MOV AX, Adat[BX] ;AX-be tlti az Adat+BX cmen lv adatot
Ez a cmzsi md hasonlt egy tmb elemre trtn hivatkozshoz.
5.2.4.3. Bzis plusz index cmzs
MOV AX, [BX][DI] ; AX-be tlti a BX+DI cmen lv adatot
5.2.4.4. Bzis plusz relatv cmzs
MOV AX, Adat[BX][DI]

; AX-be tlti az Adat+BX+DI cmen lv adatot

Pldul tbbdimenzis tmbk kezelsre hasznlhat. Figyelem: ktdimenzis tmb hasznlata esetn a tmb elemeinek egyms utni elrsekor az egyik regisztert nem egyesvel (az adat
hosszval) kell vltoztatni, hanem figyelembe kell venni a tmb (pl. sor) mrett!
5.2.5. A stack (verem) cmzse
A stack cmzsre a bzisregiszteres cmzsi md hasznlhat. A szegmenscmet az SS regiszter, a bziscmet pedig a BP regiszter tartalmazza. (E regisztereket br megengedett nem
clszer msra hasznlni.)
A stack-et ideiglenes adattrolsra s szubrutin hvskor paramter tadsra hasznlhatjuk. Itt
troldik automatikusan szubrutin hvs esetn a visszatrsi cm is.11 Ezrt is fontos, hogy a
stack hasznlatakor krltekinten jrjunk el.
Plda: Tegyk fel, hogy kt egyszavas paramtert adunk t egy szubrutinnak a vermen keresztl. Mivel a szubrutin hvsakor a visszatrsi cm (kzeli hvs esetn 2, tvoli hvs esetn 4

11

Hasznlatval rszletesen Az assembly kapcsolata ms nyelvekkel fejezetben foglalkozunk.

40

Gimesi Lszl 2015.

bjt) is a verem tetejre kerl, ezt is figyelembe kell venni. (Most ttelezzk fel, hogy kzeli hvs trtnt.) Az tadott paramterek elrse a hvott szubrutinban:
PUSH BP
;BP eredeti tartalmnak mentse
MOV BP, SP

;A stack tetejnek cme BP-be

MOV AX, [BP+4] ;Az els paramter betltse AX-be


MOV BX, [BP+6] ;A msodik paramter betltse BX-be
POP BP

;BP eredeti rtknek visszalltsa

Lthat, hogy cmzsre a BP regisztert hasznltuk, s hasznlat utn az eredeti rtket visszalltottuk.
5.2.6. A programterlet cmzse
Pldkban a JMP cm felttel nlkli vezrltad utastst fogjuk hasznlni. Mkdse: a
program a cm ltal megadott helyen folytatdik. (A CS:IP utastsregiszterbe rdik a cm)
5.2.6.1. IP-relatv cmzs
JMP SHORT cm

;Kzeli (rvid) ugrs a cmre

A SHORT eltag hasznlata a programoz szndkt fejezi ki a kzeli (127 bjton belli)
vezrlstadsra. Amennyiben az ugrs 127 bjtnl nagyobb, a fordt hibazenetet kld.
A feltteles vezrltad utastsok (JZ, JNZ, JGE, stb.) mindig IP-relatv cmzssel mkdnek.
5.2.6.2. Direkt cmzs
JMP cm

;Direkt ugrs a szegmensen belli cmre

A fordt program mindig IP-relatv hvst alkalmaz a direkt hvs helyett, ha a cm tvolsga
127 bjton bell van.
JMP FAR PTR cm ;Direkt ugrs a tvoli cmre (4 bjtos)
5.2.6.3. Indirekt cmzs
JMP BX

;Ugrs a BX ltal cmzett utastsra

JMP [BX]

;Ugrs a DS:BX ltal megadott


;memriaszval cmzett utastsra

JMP DWORD PTR [BX][SI]


;Ugrs a BX+SI cmen lv 4 bjttal megcmzett
; (tvoli) utastsra

41

Intel processzorok programozsa assembly nyelven

5.3. A verem (stack)


A verem egy olyan az opercis rendszer ltal kijellt memriaterlet, ahova kzvetlen
utastsokkal tudunk adatot elmenteni, s onnan letlteni.
A stack terletn trolhatjuk tmenetileg adatainkat, itt troldik szubrutin hvsakor a
visszatrsi cm, vagy magas sznt nyelvek esetben az eljrsok s fggvnyek paramterei
s loklis vltozi is. Az opercis rendszer is hasznlja ezt a terletet, pldul megszaktsokkor
ide menti a futtatshoz szksges regiszterek tartalmt.
A stack egy last in first out (utolsknt be, elsknt ki) szervezs memria. Azaz, amit
utoljra beletettnk, azt vehetjk ki elsknt. Amikor betesznk egy adatot a verembe, a veremmutat12 rtke kettvel13 cskken, ha kiemelnk egyet, akkor kettvel n. gy mindig a pointer
ltal mutatott cmre runk (last in), s onnan is olvasunk (first out).
Ez a fajta memriaszervezs teszi lehetv a szubrutinok hvst tetszleges mlysgben s a
rekurzit is.
A CALL szubrutin hvs elmenti a stack tetejre a kvetkez (CALL utni) utasts cmt. Ezt
a cmet tlti be az IP-be (utastspointerbe) a RET utasts.
A kvetkez fejezetben ltni fogjuk, a programunk a memriba az alacsonyabb memriacmtl kezdden tltdik be. A stack kezdete viszont a rendelkezsre ll memria vgn helyezkedik el, teht a legmagasabb memriacmen.
A processzor regiszterkszletnek ismertetsnl lttuk, hogy a verem tetejn trolt (aktulis)
adat teljes cme az SS:SP regiszterprban tallhat.
Assembly nyelven a PUSH forrs utastst hasznljuk adattrolsra, s a POP cl utastst az
adatok visszatltsre a verembl.
A PUSH utasts az SP (veremmutat) rtkt kettvel cskkenti, majd az operandusban (forrsban) trolt ktbjtos adatot elhelyezi a verem tetejn.
A POP utasts kiveszi a verem tetejn lv (ktbjtos adatot), amit a cl-lal megadott cmre
tlt. Ezutn az SP rtkt kettvel nveli.

12
13

Veremmutat egy regiszter (vltoz), amely a verem tetejre, a verembe - utoljra betett adat memriacmre mutat.
Az Intel processzorok esetben, a verembe mindig szavas (16 bites) szmokat tudunk eltrolni. Mivel ez 2 bjtnyi adatot jelent,
gy a veremmutat rtke kettvel vltozik.

42

Gimesi Lszl 2015.

5.4. Memriaszervezs
A szmtgpekben a CPU s az operatv memria kln helyezkedik el. Kzttk a kapcsolatot a BUS biztostja (memriainterfsz). A cmbuszon n szm cmvonal tallhat, gy sszesen 2n memriaelem cmezhet meg. A memria linerisan viselkedik, azaz folyamatos elrst
biztost a 0 kezdcmtl 2n-1 cmig. Egy lineris memria esetn a felhasznli program elmletileg a teljes memrit elri, annak brmelyik cmre adatot rhat, s azt kiolvashatja.
A korai Intel processzorok memriakezelse eltr ettl a memriamodelltl. Ezek a proceszszorok a szegmentlt memriacmzst hasznljk. A 386-os processzortl kezdve alkalmasak a
szegmensnlkli cmzsre is. Ebben az estben felvetdik az opercis rendszer kompatibilitsnak krdse is.
A korbbi mikroprocesszorokban a memria cmzsre szolgl regiszterek 16 bit hosszak
voltak, amelyekkel maximlisan 64 kbjt memria cmzsre volt lehetsg. Ezrt a cmzshez
egy jabb, gynevezett szegmensregisztert is felhasznltak, gy a cm kt rszbl, egy szegmens- s egy bziscmbl ll. A szegmensen bell a cmzs lineris. Egy szegmens mrete 64
kbjt. A programoz egy szegmensen bell elrhet brmilyen adatot.
A program betltsekor dl el, hogy a program s az adatok tnylegesen hov kerlnek a memriba. Ezeket a cmeket ksbb ltni fogjuk programmal le is krdezhetjk.
A COM llomny felptse
COM llomnyokat a felhasznl csak ritkn kszt. ltalban a memriarezidens programok
ilyenek. Ezeket a memria jobb kihasznlsa s a sebessg nvelse rdekben csaknem
minden esetben assemblyben rjk. E programokkal a jegyzetnkben nem foglalkozunk, csak az
sszehasonlts rdekben mutatjuk be.
Memriaelrendezs:
CS, DS, ES, SS PSP14 256 bjt
IP=100h
Program
Adat
Verem
SP
Lthat, hogy a PSP, az utastsok, az adatok s a verem szmra sszesen egy szegmensnyi
hely ll rendelkezsre. Ebbl kvetkezik, hogy a CS, DS, ES, SS regiszterek rtkei megegyeznek.
Mivel a PSP 256 (100h) bjtnyi helyet elfoglal, ezrt a programunk a 100h cmen fog kezddni.

14

PSP: (Program Segment Prefix) az opercis rendszer szmra tartalmaz informcikat. Ez a terlet ms clra nem hasznlhat.

43

Intel processzorok programozsa assembly nyelven

Amikor az opercis rendszer betlti a COM llomnyt a memriba, a kvetkez lpseket


vgzi el:
Ltrehozza a 256 bjtos elttet (PSP). Ide kerl tbbek kztt a programot indt
parancssor is.
Bemsolja az egsz fjlt a httrrl a memriba, a PSP utn.
Belltja a DS, ES, SS szegmensregisztereket a PSP elejre.
Belltja az SP regisztert a szegmens vgre.
Belltja a CS regisztert a PSP elejre s az IP regisztert a 100h cmre.
Az EXE llomny felptse
A fentiekbl lthat, hogy a httrtron trolt COM llomnyt gy is fel lehet fogni, mint a
memriba betlttt fjl (folyamat) tkrkpe, ezrt ezeket a programokat (bizonyos eseteket
kivve) egyetlen szegmensbe kell megrni.
Az EXE llomnyok ezzel szemben sokkal rugalmasabbak, tbb szegmenst hasznlhatnak,
ezltal nagyobb programok rhatk benne.
Memriaelrendezs:
DS, ES
CS

SS

PSP 256 bjt


Program
Adatszegmens
Veremszegmens

Lthat, hogy ebben az esetben a program, az adat s a stack kln szegmensen helyezkedik
el.
Amikor az opercis rendszer betlti az EXE llomnyt a memriba, a kvetkez lpseket
vgzi el:
Ltrehozza a 256 bjtos elttet (PSP). Hasonlan a COM llomnyhoz.
A fejlc kivtelvel betlti a PSP utni memriba a programot.
A fejlc alapjn megkeresi a programban az sszes olyan hivatkozst, amelyet t
kell helyezni.
Belltja a DS, ES szegmensregisztereket a PSP elejre. (Amennyiben a programban
hasznlunk adatszegmenst, akkor ezeket programban kell belltanunk, hogy az adatszegmensre mutassanak.)
Belltja az SS-t s az SP-t a fejlc informcii alapjn.
Belltja a CS regisztert a kdszegmens elejre, az IP regisztert pedig a fejlcben megadott ofszet cmre.

44

6. Az assembly programozs
Az Assembly program rsa hasonlan trtnik a magas szint nyelvekhez. Elszr szksges egy szvegszerkeszt, amellyel elkszthetjk a forrsnyelv (szveges) vltozatot, majd
ebbl a megfelel fordt- s LINK (TASK) program segtsgvel a mr nllan is mkd,
futtathat llomnyt.
Az Assembly programok fordtsra tbb fordt (assembler) programot fejlesztettek ki (pl.
MASM, TASM). Mi a Microsoft ltal ksztett Macro Assembler15 (MASM) programmal ismerkednk meg.
A programrst a PWB (Microsoft Programmers WorkBench) keretrendszer segtsgvel vgezzk. E program tartalmaz egy szvegszerkeszt, fordt, linkel s futtat programrszt, valamint a hibakeresst segt nyomkvet (debugger) alkalmazst.
Meg kell jegyeznnk, hogy az assembly programok processzor- s opercisrendszer-fggek,
gy a megrt s lefordtott llomnyunk nem biztos, hogy msik krnyezetben is mkdni fog.
Erre figyeljnk, amikor olyan programot runk, amelyet ms szmtgpeken is szeretnnk hasznlni.
6.1. Szegmentls
Korbban lttuk, hogy a memriakezelsnl a szegmentlt modellt hasznljuk, gy a cm kt
rszbl, egy szegmens- s egy bziscmbl ll. A szegmensen bell a cmzs lineris. Egy szegmens mrete 64 kbjt. A programoz egy szegmensen bell elrhet brmilyen adatot.
A program betltsekor dl el, hogy a program s az adatok tnylegesen hov kerlnek a memriba. Ezeket a cmeket ksbb ltni fogjuk programmal le is krdezhetjk.
A szegmentlst az Assembly programunkban is definilnunk kell.
DOSSEG
.MODEL SMALL
.STACK

;Veremszegmens kijellse

.DATA

;Adatszegmens, csak akkor kell megadni


;ha tartalmaz adatot

.CODE

;Kdszegmens, ezutn rhatjuk a programutastsokat.

.
.
.
END

15

A MASM bizonyos programozst knnyt eljrsokat tartalmaz, amelyeket makrknak neveznk. Makrkat a programoz is
definilhat.

Intel processzorok programozsa assembly nyelven

A DOSSEG direktva jelzi a fordtnak, hogy programszegmenseket egy szigoran meghatrozott rendben akarjuk betlteni, fggetlenl a programban megadott sorrendtl.
A .MODEL direktvt annak megadsra hasznljuk, hogy az eljrshvsok NEAR (kzeli)
vagy FAR (tvoli) jellegek-e. A .MODEL SMALL direktva megadja az assemblernek, hogy
csak egy kdszegmensnk van, s az sszes eljrshvs NEAR. A .MODEL MEDIUM esetn az
eljrshvsok ha nincs kln NEAR-nek definilva FAR mdak.
A .STACK direktvt COM llomnyoknl nem, de EXE llomnyok esetn meg kell adni.
A .DATA direktvra akkor van szksg, ha adatszegmenst akarunk hasznlni. Pldul, ha egy
magas szint nyelvben rt programban nem hasznlunk globlis vltozt, akkor nincs szksg az
adatszegmensre.
A .CODE direktva a kdszegmens kezdett jelzi. (Ezutn rhatjuk a programunkat.)
A fordt programnak az END direktva jelzi a program vgt.
A programrs sorn tetszlegesen hasznlhatunk kis- s nagybetket. (Kztk klnbsg csak
a szvegkonstansokban van.)
Az Assembly programozsban a ; jelzi a magyarz (comment) szveget, ami a sor vgig
(ENTER-ig) tart.
6.2. Kezdjnk el programot rni
A program rsnak csak gy van rtelme, ha annak valamilyen eredmnye van, s azt meg is
tudjuk jelenteni. Amikor tanulunk egy programozsi nyelvet, ltalban az elsk kztt szerepel
az a feladat, hogy rjunk ki valamit a kpernyre. Mivel az Assemblyen nincsenek elre megrt
fggvnyek, eljrsok, a kperny kezelst is neknk kellene megrni. Ez azonban mg egy jl
felkszlt programozt is prbra tenne, hiszen egy komplett monitorkezelt (drivert) kellene
elkszteni.
Segtsget jelent, hogy az opercis rendszer rszt kpezik azok a hardverkezel szoftverek
(driverek), amelyeket mr teleptettnk a szmtgpnkre, gy lehetsgnk van az opercis
rendszer monitorkezel programjnak hasznlatra.
Az opercis rendszer rutinjainak (nemcsak driver) hvsra a szoftvermegszaktsokat
(interruptokat) hasznlhatjuk. (A megszaktsok hasznlatt kln fejezetben trgyaljuk.)
Elsnek rjunk ki egy tetszleges karaktert a kpernyre (hasznljuk a 21h DOS megszaktst):
.MODEL SMALL
.STACK
.CODE

END

46

MOV DL, "A"

;A kirand karakter kdja DL-be

MOV AH, 2

;AH-ba a kpernyre rs funkcikdja

INT 21h

;Kirs

MOV AH, 4Ch

;AH-ba a visszatrs funkcikdja

INT 21h

;Visszatrs az opercis rendszerbe

Gimesi Lszl 2015.

Minden programunkat az opercis rendszerbe val visszatrst biztost utastsokkal kell


befejezni!
MOV AH, 4Ch
INT 21h
Az assembler (fordt) nem tesz klnbsget a kis s nagybet kztt. Teht a programunkat
rhatjuk kis s nagy betk hasznlatval, de vegyesen is hasznlhatjuk azokat. A jobb ttekinthetsg rdekben az utastsokat, a regiszterneveket s a makrkat nagybetvel, a vltozkat s
cmeket, pedig kisbetvel rjuk.
Bvtsk a programunkat: krjnk be a billentyzetrl egy karaktert, majd rjuk ki a kpernyre azt.
.MODEL SMALL
.STACK
.CODE
MOV AH, 1

;AH-ba a beolvass funkcikd

INT 21h

;Egy karakter beolvassa, a karakter ASCII kdja AL-be kerl

MOV DL, AL

;A kirand karakter kdja DL-be

MOV AH, 2

; AH-ba a kpernyre rs funkcikdja

INT 21h

; Karakter kirsa

MOV AH, 4Ch

;Kilps a programbl

INT 21h
END
6.3. Konstansok hasznlata
A fenti programjainkban ktfle szm konstanst hasznltunk:
MOV AH, 1 s a MOV AH, 4Ch.
Az els esetben decimlisan, a msodikban hexadecimlisan adtuk meg az rtkeket.
A szmrendszer alapszmt (radix) mindig a szm utn rt betvel jelezzk:
Y vagy B binris szm,
O vagy Q oktlis szm,
T vagy D decimlis szm,
H hexadecimlis szm.
(A betvel kezdd hexadecimlis szmoknl a fordtprogram nem tudja megklnbztetni
azokat a nevektl, ezrt ilyenkor a szm el egy vezet nullt runk. Pldul: 0FFh.)
A fordtprogram alaprtelmezett szmrendszere a 10-es, gy a decimlis szmok esetben elhagyhatjuk a betjelet. Az alaprtelmezett szmrendszert a .RADIX n (n: a szmrendszer alapja,
2 s 16 kztti rtk) direktvval llthatjuk be.
Ha pldul, a .RADIX 16 direktvt kiadjuk, akkor a tizenhatos szmrendszer lesz az alaprtelmezett, gy a hexadecimlis szmok esetn a h jellst elhagyhatjuk.

47

Intel processzorok programozsa assembly nyelven

Amennyiben a szmrendszert 10-nl nagyobbra lltjuk, a decimlis s a binris szmoknl


nem hasznlhatjuk a D illetve B betjelet.
A karakter-konstansok megadsnl hasznlhatjuk a karakter kdjt, de a szimblumt is.
MOV AL, 65
MOV AL, A
MOV AL, A
Mindhrom esetben az AL regiszterbe a 65 kerl (az A ASCII kdja 65).
6.4. Nhny egyszerbb szubrutin
Annak rdekben, hogy a gyakran hasznlt eljrsokat ne kelljen jra lerni, tegyk azokat
alprogramba (szubrutinba). Ksztsnk egy karakter beolvas s egy karakter kir szubrutint,
majd ezeket egy fprogram segtsgvel hvjuk meg. Az alprogramok kztti adattadsra hasznljuk a DL regisztert.
Eljrsok elvlasztsra hasznlnunk kell a PROC s ENDP direktvkat, amelyek kz rjuk
a szubrutin utastsait. Alprogramok hasznlatakor a fprogramot is el kell neveznnk, s a kt
direktva kz kell tennnk! Az alprogramokat tetszleges sorrendben rhatjuk.
.MODEL SMALL
.STACK
.CODE
main proc
CALL read_char
CALL write_char
MOV AH,4Ch
INT 21h
main endp
read_char proc
PUSH AX
MOV AH, 1
INT 21h
MOV DL, AL
POP AX
RET
read_char endp
write_char proc
PUSH AX
MOV AH, 2
INT 21h
POP AX
RET

;Fprogram
;Karakter beolvassa
;Karakter kirsa
;Kilps

;Karakter beolvassa. A beolvasott karakter DL-be kerl


;AX mentse a verembe
;AH-ba a beolvass funkcikd
;Egy karakter beolvassa, a kd AL-be kerl
;DL-be a karakter kdja
;AX visszalltsa
;Visszatrs a hv rutinba
;A DL-ben lv karakter kirsa a kpernyre
;AX mentse a verembe
; AH-ba a kpernyre rs funkcikdja
; Karakter kirsa
;AX visszalltsa
;Visszatrs a hv rutinba

write_char endp
END main

48

;END + a fprogram neve

Gimesi Lszl 2015.

Az eljrsokat mindig nv + proc-cal kezdjk s nv + endp-vel fejezzk be. Amikor


tbb eljrs van a programunkban, meg kell adnunk a betltnek (loader-nek), hogy melyik a
fprogram. Ezt az END direktva utn rt (pldnkban main) nvvel tehetjk meg.
(A kvetkezkben a mr ismertetett szubrutinokat jra nem rjuk le, csak hivatkozunk rjuk.)
Egsztsk ki programunkat egy soremelssel:
.MODEL SMALL
.STACK
.CODE
main proc
CALL read_char

;Fprogram
;Karakter beolvassa

CALL cr_lf

;Soremels

CALL write_char

;Karakter kirsa

MOV AH,4Ch

;Kilps

INT 21H
main endp
CR EQU 13
LF EQU 10
cr_lf proc
PUSH DX

;CR-be a kurzor a sor elejre kd


;LF-be a kurzor j sorba kd
;DX mentse a verembe

MOV DL, CR
CALL write_char

;kurzor a sor elejre

MOV DL, LF
CALL write_char

;Kurzor egy sorral lejjebb

POP DX

;DX visszalltsa

RET

;Visszatrs a hv rutinba

cr_lf endp
END main
Itt egy jabb direktvval, az EQU-val ismerkedtnk meg. Segtsgvel a szmokat nevekkel
(konstansokkal) helyettesthetjk. Helyette hasznlhatjuk az = jelet is. (A CR EQU 13 megfelel
a CR = 13 kifejezsnek.) A szubrutinban hasznlt MOV DL, CR egyenrtk a MOV DL, 13 utastssal.
A konstansok fordtsi idben kerlnek behelyettestsre, ellenttben a magas szint nyelvekben hasznlt vltozkkal, amelyek futsi idben kapnak rtket.
Most bvtsk szubrutinkszletnket egy binris, egy decimlis s egy hexadecimlis konvertl s kir elemmel.

49

Intel processzorok programozsa assembly nyelven

Feladat: krjnk be egy karaktert a billentyzetrl, majd rjuk ki a karakter kdjt binrisan,
decimlisan s hexadecimlisan.
.MODEL SMALL
.STACK
.CODE
main proc
CALL read_char

;Fprogram
;Karakter beolvassa

XOR DH, DH

;DH trlse

CALL cr_lf

;Soremels

CALL write_binary

;Karakterkd konvertlsa binris szmm s kirsa a


kpernyre

CALL cr_lf

;Soremels

CALL write_decimal

; Karakterkd konvertlsa decimlis szmm s kirsa


a kpernyre

CALL cr_lf

;Soremels

CALL write_hexa

;Konvertls hexadecimlis szmm s kirsa a kpernyre

MOV AH,4Ch

;Kilps

INT 21h
main endp
END main
A DH regiszter trlsvel egsztettk ki fprogramunkat. Korbban mr lttuk, hogy a szmtgp minden mveletet logikai mveletekk alakt t. Ezrt ahol csak lehet mi is inkbb logikai utastsokat hasznljunk, amelyeket nemcsak gyorsabban hajt vgre a processzor, de kisebb
az utasts helyfoglalsa is. A trlst elvgezhettk volna a MOV DH, 0 utastssal is, ez azonban
hrom bjtot foglal el, mg az XOR DH, DH csak kettt.
A binris kirskor a regiszter bitjeit kell kirni, sorban egyms utn, balrl jobbra. Ehhez kihasznlhatjuk a bitforgat (rotl) utastsok azon tulajdonsgt, hogy a regiszterbl kilp bit a
CF-be (carry-bit) kerl. Teht a regiszter tartalmt nyolcszor egyms utn rotljuk balra, s a CF
tartalmnak megfelelen 1-et vagy 0-t runk ki. Azaz, ha a CF-ben 0 van, akkor a "0" (ASCII
48) karaktert, 1 esetn a 1 (ASCII 49) karaktert kell megjelenteni.
Hasznljuk az ADC DL, "0" utastst, amely sszeadja a DL tartalmt, 48-at (a "0" kdjt) s
a CF bitet, az eredmny a DL-be kerl. Ha eredetileg DL = 0, akkor az sszeads utn 48 lesz az
rtke, ha CF = 0, s 49 lesz, ha CF = 1.

50

Gimesi Lszl 2015.

A ciklus megrshoz hasznljuk a LOOP cm szmllciklust. A processzor a LOOP hatsra, az irnyjelz bit (DF) rtknek megfelelen cskkenti vagy nveli a CX regiszter tartalmt.
Amennyiben a CX rtke nem nulla, a program a cm-en folytatdik, ellenkez esetben a kvetkez utastson.
write_binary proc
;kirand adat a DL-ben
PUSH BX

;BX mentse a verembe

PUSH CX

;CX mentse a verembe

PUSH DX

;DX mentse a verembe

MOV BL, DL

;DL msolsa BL-be

MOV CX, 8
binary_digit:
XOR DL, DL

;Ciklusvltoz (CX) belltsa


;DL trlse

RCL BL, 1

;Rotls balra eggyel, kilp bit a CF-be

ADC DL, "0"

;DL = DL + 48 + CF

CALL write_char

;Binris digit kirsa

LOOP binary_digit

;Vissza a ciklus elejre

POP DX

;DX visszalltsa

POP CX

;CX visszalltsa

POP BX

;BX visszalltsa

RET

;Visszatrs a hv rutinba

write_binary endp
Figyeljk meg, hogy a szubrutinokban elmentjk azon regiszterek tartalmt, amelyeket a rutinban hasznlunk. Ez azrt clszer, mert gy megrizzk az eredeti tartalmat, s a hvskor nem
kell arra figyelnnk, hogy a regiszter esetleg megvltozik.
Mivel a STACK-re mentnk, a visszatltst fordtott sorrendben kell elvgezni. (Amit utoljra
elmentettnk, azt vehetjk ki elszr.)
A decimlis konvertl elksztse eltt rjuk meg a hexadecimlis talaktt, mert annak egy
rszt hasznlni fogjuk a decimlis konvertlskor.
Egy hexadecimlis helyi rtk (digit) ngybites binris szmnak felel meg, teht egy bjt kt
hexadecimlis digittel rhat le. Els lpsknt vlasszuk kett a DL tartalmt: als illetve fels
ngy bitre, majd az gy kapott rtkekkel kln-kln vgezzk el a konvertlst. Ehhez egy j
(write_hexa_digit) alprogramot ksztnk.
Elszr a fels ngy bitre van szksgnk (eltolva az als ngy bit helyre), amit gy kapunk
meg, hogy a DL tartalmt ngy bittel jobbra mozgatjuk (oszts 16-tal). Az SHR DL, CL utastssal a DL tartalmt CL (4) szer jobbra shift-eljk, gy a fels ngy bit alulra csszik, helykbe
pedig nulla kerl.

51

Intel processzorok programozsa assembly nyelven

A msodik digit konvertlsnl a szm mr j helyen (als ngy biten) van, csak a fels bitek
tartalmt kell kitrlni. Ezt vgezhetjk el az AND DL, 0Fh utastssal (maszkols).
write_hexa proc

;A DL-ben lv kt hexa szmjegy kirsa

PUSH CX

;CX mentse a verembe

PUSH DX

;DX mentse a verembe

MOV DH, DL

;DL mentse

MOV CL, 4

;Shift-els szma CX-be

SHR DL, CL

;DL shift-else 4 hellyel jobbra

CALL write_hexa_digit ;Hexadecimlis digit kirsa


MOV DL, DH

;Az eredeti rtk visszatltse DL-be

AND DL, 0Fh

;A fels ngy bit trlse

CALL write_hexa_digit ;Hexadecimlis digit kirsa


POP DX

;DX visszalltsa

POP CX

;CX visszalltsa

RET

;Visszatrs a hv rutinba

write_hexa endp
A hexadecimlis digit konvertlsnl meg kell vizsglnunk, hogy a szm 10 alatti-e, azaz decimlis szmjeggyel le tudjuk-e rni. Ekkor ahogy a binris talaktnl mr lttuk a "0" kdjhoz hozzadjuk a binris rtket. Amennyiben a szm nagyobb vagy egyenl, mint tz, akkor
ehhez mg hozz kell adni az "A" s a "0" kdja kztti klnbsget s le kell vonni 10-et.
write_hexa_digit proc
PUSH DX

;DX mentse a verembe

CMP DL, 10

;DL sszehasonltsa 10-zel

JB non_hexa_letter

;Ugrs, ha kisebb 10-nl

ADD DL, "A"-"0"-10


non_hexa_letter:
ADD DL, "0"

;A F bett kell kirni


;Az ASCII kd megadsa

CALL write_char

;A karakter kirsa

POP DX

;DX visszalltsa

RET
write_hexa_digit endp

;Visszatrs a hv rutinba

A decimlis konverzit gy vgezzk, mint ahogy a szmrendszerek kztti vltst. A szmot


elosztjuk tzzel (a szmrendszer alapszmval), majd az eredmnnyel addig vgezzk az osztst,
amg az eredmny nulla nem lesz. A maradkokat troljuk, amelyek megadjk az j (tzes) szmrendszerbeli szmjegyeket (a legkisebb helyirtktl kezdve).
Az eljrsban a verembe gyjtjk a maradkokat, majd egy ciklus segtsgvel visszaolvassuk
(fordtott sorrenben kell kirni ket, mint ahogy keletkeznek), illetve kirjuk azokat a mr megrt

52

Gimesi Lszl 2015.

write_hexa_digit szubrutinnal. Az osztsok szmllshoz a CX regisztert hasznljuk, gy a viszszaolvassnl nem kell kln trdnnk a ciklusvltoz kezdrtkvel.
write_decimal proc
PUSH AX

;AX mentse a verembe

PUSH CX

;CX mentse a verembe

PUSH DX

;DX mentse a verembe

PUSH SI

;SI mentse a verembe

XOR DH, DH

;DH trlse

MOV AX, DX

;AX-be a szm

MOV SI, 10

;SI-ba az oszt

XOR CX, CX
decimal_non_zero:
XOR DX, DX

;CX-be kerl az osztsok szma


;DX trlse

DIV SI

;DX:AX 32 bites szm osztsa SI-vel, az eredmny AXbe, a maradk DX-be kerl

PUSH DX

;DX mentse a verembe

INC CX

;Szmll nvelse

OR AX, AX

;Sttuszbitek belltsa AX-nek megfelelen

JNE decimal_non_zero ;Vissza, ha az eredmny mg nem nulla


decimal_loop:
POP DX

;Az elmentett maradk visszahvsa

CALL write_hexa_digit ;Egy decimlis digit kirsa


LOOP decimal_loop
POP SI

;SI visszalltsa

POP DX

;DX visszalltsa

POP CX

;CX visszalltsa

POP AX

;AX visszalltsa

RET
write_decimal endp

;Visszatrs a hv rutinba

Bvtsk a szubrutin gyjtemnynket klnbz szmrendszerekben trtn adatbers


lehetsgvel. rjuk meg a fenti kir rutinok beolvas prjait: a decimlis, a hexadecimlis s a
binris beolvasst.
A rutinokban nem vgznk ellenrzst, teht nem vizsgljuk, hogy adatmegadskor csak szm
karaktert adunk-e meg, vagy a hexadecimlis szmoknl csak a megfelel bett hasznljuk-e. A
konverzit 1 bjtra vgezzk, teht az adatmegads sorn erre is tekintettel kell lennnk!
A beolvas rutinok mkdsnek alapelve a kvetkez: a billentyzetrl karaktereket olvasunk be sorban, egyms utn. Elszr a magasabb, majd az egyre alacsonyabb helyi rtkeket,
az ENTER-ig.

53

Intel processzorok programozsa assembly nyelven

A szmkarakter talaktsnl kihasznlhatjuk, hogy az ASCII kdtblban a szmok kdjai


egyms utn kvetkeznek. A 0 kdja 48, az 1 kdja 49 . a 9 kdja 57. Ha a kdokbl
kivonunk 48-at (0 kdjt), akkor a szimblumnak megfelel numerikus rtket kapjuk: 0 0 = 0; 1 - 0 = 1 . 9- 0 = 9. Ezutn a szmokat helyi rtkknek megfelelen kell
eltrolni. Vesszk a legmagasabb helyen lv szmjegyet, amit eggyel magasabb helyi rtkre
tolunk (megszorozzuk a szmrendszer alapszmval), majd hozzadjuk a kvetkez rtket. Ezt
addig folytatjuk, amg van alacsonyabb helyi rtk szmjegy.
Nzzk ezt egy plda segtsgvel: legyenek a bert karakterek 2, 1, 3.
Szorozzuk meg a legmagasabb helyi rtk szmjegyet (2) tzzel, majd adjuk hozz a kvetkez rtket.
2 * 10 + 1 = 21
Az gy kapott rtket (ha van mg j szm) jra megszorozzuk tzzel, majd hozzadjuk a kvetkez rtket.
21 * 10 + 3 = 213
Ezutn mr knnyen megrhatjuk rutinjainkat.
read_decimal proc
PUSH AX

;AX mentse a verembe

PUSH BX

;BX mentse a verembe

MOV BL, 10

;BX-be a szmrendszer alapszma, ezzel szorzunk

XOR AX, AX

;AX trlse

read_decimal_new:
CALL read_char

;Egy karakter beolvassa

CMP DL, CR

;ENTER ellenrzse

JE read_decimal_end

;Vge, ha ENTER volt az utols karakter

SUB DL, "0"

;Karakterkd minusz 0 kdja

MUL BL

;AX szorzsa 10-zel

ADD AL, DL

;A kvetkez helyi rtk hozzadsa

JMP read_decimal_new

;A kvetkez karakter beolvassa

read_decimal_end:
MOV DL, AL

;DL-be a bert szm

POP BX

;AB visszalltsa

POP AX

;AX visszalltsa

RET

;Visszatrs a hv rutinba

read_decimal endp
Ennek alapjn elkszthetjk a hexadecimlis beolvas rutinunkat.

54

Gimesi Lszl 2015.

Itt az alapszm (szorz) 16 (10h) lesz. A konvertlsnl figyelembe kell venni, hogy a betkarakterek ASCII kdja nem kzvetlenl a szmok utn kvetkezik, ezrt kln kell vlasztanunk
a szmjegy s a bet karaktereket. Szmjegy esetn a szubrutin ugyangy mkdik, mint a decimlis beolvassnl. Bet karakternl a kdbl a 0 kdjn kvl mg 7-et le kell vonni. (7 a
klnbsg a 9 s az A kdja kztt.)
read_hexa proc
PUSH AX

;AX mentse a verembe

PUSH BX

;BX mentse a verembe

MOV BL, 10h

;BX-be a szmrendszer alapszma, ezzel szorzunk

XOR AX, AX

;AX trlse

read_hexa_new:
CALL read_char

;Egy karakter beolvassa

CMP DL, CR

;ENTER ellenrzse

JE read_hexa_end

;Vge, ha ENTER volt az utols karakter

CALL upcase

;Kisbet talaktsa naggy

SUB DL, "0"

;Karakterkd minusz 0 kdja

CMP DL, 9

;Szmjegy karakter?

JBE read_hexa_decimal ;Ugrs, ha decimlis szmjegy


SUB DL,7
read_hexa_decimal:
MUL BL

;Bet esetn mg 7-et levonunk


;AX szorzsa az alappal

ADD AL, DL

;A kvetkez helyi rtk hozzadsa

JMP read_hexa_new

;A kvetkez karakter beolvassa

read_hexa_end:
MOV DL, AL

;DL-be a bert szm

POP BX

;BX visszalltsa

POP AX

;AX visszalltsa

RET

;Visszatrs a hv rutinba

read_hexa endp
A hexadecimlis adatok megadsnl azt akarjuk, hogy ne kelljen megklnbztetni a kis- s
nagybetket, azaz az rtkeket adhassuk meg mindkt formban. Ennek rdekben ksztnk egy
kisbet - nagybet konvertl eljrst.

55

Intel processzorok programozsa assembly nyelven

Elszr vizsgljuk meg, hogy a karakter kisbet-e. Ha nem, akkor nem csinlunk vele semmit,
ha igen, akkor a kdjbl kivonjuk a kisbetk s a nagybetk kdjai kztti klnbsget (a A).
upcase proc

;DL-ben lv kisbet talaktsa nagybetv

CMP DL, "a"

;A karakterkd s a kdjnak sszehasonltsa

JB upcase_end

;A kd kisebb, mint a, nem kisbet

CMP DL, "z"

;A karakterkd s z kdjnak sszehasonltsa

JA upcase_end

;A kd nagyobb, mint z, nem kisbet

SUB DL, "a"-"A"

;DL-bl a kdok klnbsgt

upcase_end:
RET
upcase endp

;Visszatrs a hv rutinba

Figyeljk meg, hogy a rutinok nevei utalnak annak funkcijra (beszdes nevek). Ez a mdszer megknnyti a programlistk olvasst, rtelmezst.
Az alprogramokban hasznl cmkk (ugrsi helyek) nevei nemcsak a mkdsre, de az azt tartalmaz szubrutin nevre is utalnak. Ezzel a mdszerrel elkerlhetjk, hogy llandan arra kelljen figyelnnk, hogy van-e mr olyan cmke, amit ltre akarunk hozni. Kt azonos nev cmke
nem lehet egy programban bell!
Ksztsk el a binris beolvast is.
Mr korbban lttuk, hogy a binris szmok kettvel (alapszmmal) val szorzsa gy is elvgezhet, hogy eggyel balra lptetnk (shiftelnk).
read_binary proc
PUSH AX
XOR AX, AX
read_binary_new:
CALL read_char

;AX trlse
;Egy karakter beolvassa

CMP DL, CR

;ENTER ellenrzse

JE read_binary_end

;Vge, ha ENTER volt az utols karakter

SUB DL, "0"

;Karakterkd minusz 0 kdja

SAL AL, 1

;Szorzs 2-vel, shift eggyel balra

ADD AL, DL

;A kvetkez helyi rtk hozzadsa

JMP read_binary_new
read_binary_end:
MOV DL, AL
POP AX
RET
read_binary endp

56

;AX mentse a verembe

;A kvetkez karakter beolvassa


;DL-be a bert szm
;AX visszalltsa
;Visszatrs a hv rutinba

Gimesi Lszl 2015.

Ksztsk el a 3.4.5. fejezetben ismertetett oszts algoritmusa alapjn az oszt programunkat.


Hasznljuk az eddig elksztett szubrutinokat!
Legyen az osztand az AL, az oszt a BL regiszter, a maradkot a DH, mg a hnyadost a DL
regiszterben troljuk.
.MODEL SMALL
.STACK
.CODE
main proc
CALL read_decimal

;Fprogram
;Osztand beolvassa

MOV AL, DL
CALL cr_lf
CALL read_decimal

;Oszt beolvassa

MOV BL, DL
CALL cr_lf
XOR DX, DX
MOV CX, 8
Cycle:
SHL AL,1

;DH (maradk), DL (hnyados) trlse


;Ciklusszm
;Osztand eggyel balra, CR-be a kilp bit

RCL DH,1

;Maradk eggyel balra, belp a CR tartalma

SHL DL,1

;Hnyados eggyel balra

CMP DH, BL
JB Next

;A maradk kiseb,mint az oszt

SUB DH, BL

;Az oszt kivonsa a maradkbl

INC DL

;Hnyados nvelse

Next:
LOOP Cycle
Stop:
CALL write_decimal

;Hnyados (DL) kirsa

CALL cr_lf

;Soremels

MOV DL, DH
CALL write_decimal

;Maradk (CL) kirsa

MOV AH,4Ch

;Kilps

INT 21h
main endp
END main

57

Intel processzorok programozsa assembly nyelven

6.5. Az adatszegmens hasznlata


Tegynk egy karaktert az adatszegmensbe, majd rjuk ki azt a kpernyre:
.MODEL SMALL
.STACK
.DATA
adat DB 65
.CODE
main proc
MOV AX, DGROUP

;Egy bjt (A kdjnak) elhelyezse az adatszegmensbe

;Adatszegmens helynek lekrdezse

MOV DS, AX

;DS belltsa, hogy az adatszegmensre mutasson

MOV DL, adat

;Az adat betltse DL-be

CALL write_char

;Karakter kirsa

MOV AH,4Ch

;Visszatrs az opercis rendszerbe

INT 21h
main endp
Az adatszegmensben elhelyezett adatunkat a cme alapjn tudjuk megkeresni, illetve azonostani. Esetnkben e cm neve adat. (Mivel ez az els definilt adat, gy a cm rtke 0.)
A DB az adattpust definil direktva, amit ksbb rszletesen trgyalunk.
A program rsakor elre nem tudjuk megmondani, hogy a memriban betltskor hov
kerl az adatszegmens. Ez fgg attl, hogy milyen programok futnak mr a szmtgpen, illetve
hol van szabad hely a memriban. Mivel az adatszegmens helye csak a betltskor vlik vglegess, szksgnk van egy DGROUP mutatra, ahov az opercis rendszer berja az adatszegmens cmt. Ezt az adatszegmens hasznlatakor mindig be kell tlteni a DS regiszterbe.
Mivel a memribl kzvetlenl nem tlthetnk be adatot a DS-be, gy ezt kt lpsben kell
megtennnk: elszr AX-be tesszk a DGROUP-un lv rtkt, majd ezt rjuk a DS-be.
Egy msik megolds:
.MODEL SMALL
.STACK
.DATA
adat DB "A"
.CODE
main proc
MOV AX, DGROUP

;Adatszegmens helynek lekrdezse

MOV DS, AX

;DS belltsa, hogy az adatszegmensre mutasson

LEA BX, adat

;Az adat offset cmnek betltse BX-be

MOV DL, [BX]

;DL-be tlti a BX-el cmzett memria tartalmt

CALL write_char

;Karakter kirsa

MOV AH,4Ch

;Visszatrs az opercis rendszerbe

INT 21h
main endp

58

;Egy bjt (A kdjnak) elhelyezse az adatszegmensre

Gimesi Lszl 2015.

Itt a BX regiszteren keresztl cmeztk meg az adatot (indirekt cmzs). Ezt a megoldst akkor clszer alkalmazni, amikor egy vltoz nvhez nemcsak egy rtk kapcsoldik, pldul
tmbk vagy sztringek hasznlatakor. Nzznk erre is egy pldt.
A kvetkez feladatban rjunk ki a kpernyre egy tetszleges szveget.
Brmilyen programozsi nyelven is dolgozunk, amikor sztringet (szvegsort) hasznlunk, meg
kell adnunk a szveg kezdett s vgt. A szveg kezdete minden esetben egy memriacm, esetnkben ez az adat nev mutat. A szveg vgt a programozsi nyelvek eltren kezelhetik,
az Assembly-ben mi dnthetjk el, hogy a sztringeket hogyan zrjuk le. Azonban szoks a C
nyelvhez hasonlan a szveget egy binris nullval befejezni. Ezt figyelembe vve rjuk meg
programunkat.
.MODEL SMALL
.STACK
.DATA
adat DB "Ez egy tetszleges szveg,",10,13,"ami tbb soros is lehet.",10,13,0
.CODE
main proc
MOV AX, DGROUP

;Adatszegmens belltsa

MOV DS, AX
LEA BX, adat

;Az ADAT cme BX-be

MOV DL, [BX]

;DL-be egy karakter betltse

OR DL, DL

;Sttuszbitek belltsa DL-nek megfelelen

JZ stop

;Kilps a ciklusbl, ha DL=0

CALL WRITE_CHAR

;Egy karakter kirsa

INC BX

;BX nvelse, BX a kvetkez karakterre mutat

JMP new

;Vissza a ciklus elejre

MOV AH,4Ch

;Kilps

new:

stop:
INT 21h
main endp
Az adat vltoznv utn szerepl DB direktva azt jelzi, hogy adatunk bjtos.

59

Intel processzorok programozsa assembly nyelven

Az adattpus megadshoz a kvetkez direktvk hasznlhatk:


BYTE, DB
SBYTE
WORD, DW

eljel nlkli bjt


eljeles bjt
eljel nlkli szavas (2 bjtos)
SWORD
eljeles szavas
DWORD, DD
eljel nlkli duplaszavas
SDWORD
eljeles duplaszavas
FWORD, DF 6 csak 386-os processzortl
bjtos
QWORD, DQ
8 bjtos
TBYTE, DT
10 bjtos

0 255
-128 127
0 65535 (64k)
-32768 (32k) 32767 (32k)
0 4G
-2G 2G

koprocesszor utasts

Lthat, hogy az adatmegadsnl nincs szksg az adat hossznak definilsra. Amennyiben


karaktersorozatot adunk meg, azt megtehetjk idzjelek kztt egyszerre, vagy karakterenknt,
vesszvel elvlasztva. Amikor numerikus rtkekkel tltjk fel az adatterletet, azokat vesszvel
vlasztjuk el egymstl. A programunkban a szveget folyamatosan, a soremelseket s a
zrkdot numerikusan adtuk meg.
A kvetkez pldnkban tbbflekppen megadott szveget rjunk ki.
Sztring kirsra rjunk szubrutint, amely bemen paramtere a BX regiszter, azaz a BX-ben
adjuk t a kirand karaktersorozat kezdcmt.
.MODEL SMALL
.STACK
.DATA
adat_1 DB
adat_2 DB
adat_3 DB
.CODE

"Ez az els sor",10,13,0


"E","z"," ","a"," ","m","","s","o","d","i","k",10,13,0
69,122,32,97,32,104,97,114,109,97,100,105,107,10,13,0

main proc
MOV AX, DGROUP

;Adatszegmens belltsa

MOV DS, AX
LEA BX, adat_1

;Az adat_1 cme BX-be

CALL write_string

;Kirs

LEA BX, adat_2

;Az adat_2 cme BX-be

CALL write_string

;Kirs

LEA BX, adat_3

;Az adat_3 cme BX-be

CALL write_string

;Kirs

MOV AH,4Ch

;Kilps

INT 21h
main endp

60

Gimesi Lszl 2015.

write_string proc
PUSH DX

;BX-ben cmzett karaktersorozat kirsa 0 kdig.


;DX mentse a verembe

PUSH BX
write_string_new:
MOV DL, [BX]

;BX mentse a verembe


;DL-be egy karakter betltse

OR DL, DL

;DL vizsglata

JZ write_string_end

;0 esetn kilps

CALL write_char

;Karakter kirsa

INC BX

;BX a kvetkez karakterre mutat

JMP write_string_new ;A kvetkez karakter betltse


write_string_end:
POP BX
;BX visszalltsa
POP DX
RET
write_string endp

;DX visszalltsa
;Visszatrs

A kvetkez pldnkban az adatszegmens megadsakor tbb jdonsgot is megfigyelhetnk.


Az n DUP (val) opertor segtsgvel n darab val rtket helyeznk el az adatszegmensre.
A .DATA utni ? azt jelenti, hogy olyan vltozkat akarunk definilni, amelyeknek nincs kezdeti rtke. Ezrt nem is kell, hogy a programllomnyban (pl. az EXE fjlban) helyet foglaljon.
Az adatterletre csak a program betltse utn van szksgnk. Ha a .DATA? utn valamilyen
konkrt rtket (pl. adat DB A) definilunk, akkor az assembler az sszes vltoznak helyet
foglal az EXE llomnyban. Ezrt a kezdeti rtkkel rendelkez vltozkat a .DATA, a tbbit
pedig a .DATA? rszben kell definilni DUP (?) segtsgvel.
rjunk egy karaktersorozat-beolvas alprogramot. A beolvasott sztring visszarsra hasznljuk a mr elksztett szubrutint. A trolhely kezdcmnek megadsra itt is a BX regisztert
hasznljuk.

61

Intel processzorok programozsa assembly nyelven

.MODEL SMALL
.STACK
.DATA?
adat DB 100 DUP (?)
.CODE
main proc
MOV AX, DGROUP

;Adatszegmens belltsa

MOV DS, AX
LEA BX, adat

;Az adatterlet cme BX-be

CALL read_string

;Karaktersorozat beolvassa

CALL cr_lf

;Soremels

CALL write_string

;Karaktersorozat visszarsa

MOV AH,4Ch

;Kilps

INT 21h
main endp
read_string proc
PUSH DX
PUSH BX
read_string_new:
CALL read_char

;DX mentse a verembe


;BX mentse a verembe

;Egy karakter beolvassa

CMP DL, CR

;ENTER ellenrzse

JE read_string_end

;Vge, ha ENTER volt az utols karakter

MOV [BX], DL

;Ments az adatszegmensre

INC BX

;Kvetkez adatcm

JMP read_string_new

;Kvetkez karakter beolvassa

read_string_end:
XOR DL, DL
MOV [BX], DL

;Sztring lezrsa 0-val

POP BX
POP DX
RET

;BX visszalltsa
;DX visszalltsa
;Visszatrs

read_string endp

62

Gimesi Lszl 2015.

TYPEDEF direktva
E direktva segtsgvel definilhatunk pointervltozt.
typename TYPEDEF distance PTR qualifiedtype
typename:
tpusnv,
distance:
FAR vagy NEAR, de el is maradhat.
qualifiedtype: adattpus (BYTE, WORD, stb.)
Ezutn lehet a .DATA rszben a pointer deklarlst elvgezni.
buf DB 100 DUP (?)
adat typename buf
PTR direktva
Eddigi feladatainkban csak egynem (bjtos) adatokkal foglalkoztunk. Amikor kt adattal vgeztnk valamilyen mveletet, akkor a kt adat tpusnak (hossznak) meg kellett egyeznie. Pldul:
MOV [BX], DL vagy CMP [BX], 0
A MOV esetben a DL regiszter bjtos, gy a fordt program tudja, hogy ez bjt hosszsg
adat mozgatst jelenti. Amikor regiszter is szerepel az utastsban, az assembler - a regiszter
nevbl - tudja, hogy milyen tpus adattal kell a mveletet elvgezni.
A msodik utastsbl viszont nem derl ki, hogy szavakat vagy bjtokat akarunk sszehasonltani. rjuk le ezt az utastst mskpp:
CMP BYTE PTR [BX], 0
gy megmondjuk az assemblernek, hogy a BX egy bjt hosszsg adatra mutat, teht kt bjtot akarunk sszehasonltani.
Nzznk egy msik esetet, amikor adatszegmensbl tltnk be karaktereket:
LEA BX, Adat
MOV DL, [BX]
BX-be kerlt az adatok kezd cme, majd a BX inkrementlsval tltjk be sorban, egyms
utn a karaktereket. Ezt megtehetjk mskppen is:
XOR BX, BX
MOV DL, adat[BX]
Itt a BX nem az adat cmt tartalmazza, hanem a kezdponthoz (adat) kpest elfoglalt helyt
(ofszetjt). BX inkrementlsval rhetjk el a kvetkez karaktereket ebben az esetben is.
Ha kt karaktert szeretnnk egy memriaszba rni, akkor a
MOV DX, adat[BX]
nem megengedett utasts, mivel az adat egy bjtos cmke, a DX pedig egy szavas regiszter.
Ebben az esetben ha az adat-ot valban sz cmknt akarjuk hasznlni a direktvt alkalmazva, ezt megadhatjuk a fordtprogramnak.
MOV DX, WORD PTR Adat[BX]
63

Intel processzorok programozsa assembly nyelven

A bemutatott direktvk felhasznlsval rjuk meg az elz alprogramunkat a processzor


sztringkezel utastsainak segtsgvel.
.MODEL SMALL
FPBYTE TYPEDEF FAR PTR BYTE
.STACK
.DATA?
buf DB 100 DUP (?)
adat FPBYTE buf
.CODE
main proc
MOV AX, DGROUP

;Adatszegmens belltsa

MOV DS, AX
LES DI, adat

;A sztring-pointer betltse a ES:DI-be

CALL read_string

;Karaktersorozat beolvassa

CALL cr_lf

;Soremels

LDS SI, adat

;A sztring-pointer betltse a DS:SI-be

CALL write_string

;Karaktersorozat visszarsa

MOV AH,4Ch

;Kilps

INT 21h
main endp
write_string proc
PUSH AX
PUSH DX
CLD
write_string_new:
LODSB
OR AL, AL

;AX mentse
;DX mentse
;Irnyjelz belltsa
;DS:SI tartalma AL-be, SI-t eggyel megnveli
;Sztring vgnek ellenrzse

JZ write_string_end
MOV DL, AL

;DL-be a kirand karakter

CALL write_char

;Karakter kirsa

JMP write_string_new
write_string_end:
POP DX
POP AX
RET
write_string endp

64

;j karakter
;DX visszalltsa
;AX visszalltsa

Gimesi Lszl 2015.

read_string proc
PUSH DX
PUSH AX
CLD
read_string_new:
CALL read_char

;DX mentse a verembe


;BX mentse a verembe
;Irnyjelz belltsa
;Egy karakter beolvassa

CMP DL, CR

;ENTER ellenrzse

JE read_string_end

;Vge, ha ENTER volt az utols karakter

MOV AL, DL

;AL-be a karakter

STOSB

;AL tartalma ES:DI cmre, DI-t eggyel megnveli

JMP read_string_new
read_string_end:
XOR AL,AL

;Kvetkez karakter beolvassa

STOSB

; Sztring lezrsa 0-val

POP AX

;BX visszalltsa

POP DX

;DX visszalltsa

RET
read_string endp

;Visszatrs

A LES s LDS utastsok mutatt tltenek be a regiszterbe, ezrt hasznlatuk eltt definilni
kellett azt a mutatt, amely az adatterletre mutat. A mutat megadsnl jabb direktvkkal
tallkozunk.
A sztringek beolvasst s kirst elvgezhetjk az INT 21h megszakts segtsgvel is.
Az interrupt-ok hasznlatakor a kvetkezkre kell figyelni:
Az rs s olvass adatterletnek cmt a DS:DX regiszter-prba kell megadni.
Kirskor a zrkarakter a $.
Beolvass esetn az adatterlet els bjtja a puffer hosszt kell, hogy tartalmazza (az
ENTER-rel egytt). A msodikba pedig a tnylegesen beolvasott karakterek szma kerl.
Beolvasskor, ha a megadott puffer mretnl tbb karaktert akarunk megadni, azt nem engedi s spolssal figyelmeztet. Elnye ennek az eljrsnak, hogy hasznlhat a karaktertrls
(Backspace). A pufferbe csak az ENTER letse utn kerl a karaktersor. Teht a beolvasshoz
szksges adatterlet mrete a kt els (hossz) bjtbl, a beolvasand karakterek szmbl s az
ENTER-bl tevdik ssze.
Az egyszersg kedvrt most nem kln szubrutinokba tesszk az eljrsokat.
Mivel a kirshoz $-al kell lezrni a sztringet hogy ezzel ne kelljen foglalkozni a puffert
elre feltltjk ezzel a karakterrel.

65

Intel processzorok programozsa assembly nyelven

.MODEL SMALL
.STACK
.DATA
Attr DB 10,0

;Hossz adatok: puffer mret, karakterszm

Adat DB 11 DUP ('$')


.CODE

;Adatterlet, feltltve $ karakterrel

main proc
MOV AX, DGROUP

;Adatszegmens belltsa

MOV DS, AX
LEA DX, Attr

;Input puffer, az els kt bjt a hosszakhoz

MOV AH, 0Ah

;Funkcikd

INT 21h

;Sztring beolvassa

CALL CR_LF

;Soremels

LEA DX, Adat

;Output puffer

MOV AH, 9h

;Funkcikd

INT 21h

;Sztring kirs

MOV AH,4Ch

;Visszatrs az opercis rendszerbe

INT 21h
main endp
A programunkban 10 karakter mret puffert foglaltunk le, de ebbe csak 9 karaktert tudunk
berni, mivel az ENTER (Dh) karakternek is kell egy hely.
Vegyk szre, hogy az assemblyben megadott adatnevek csak az adatterlet kezdett jelentik.
Nyugodtan hivatkozhatunk egyik cmrl egy msik alatt definilt rtkre. Ez abbl addik, hogy
a memriban sorban, egyms utn hzagmentesen troldnak az adatokat, s azokra brmelyik
bziscmhez kpest hivatkozhatunk.
OFFSET opertor
Egy adat cmt megadhatjuk az OFFSET opertor segtsgvel is. rjuk t az elz programot
gy, hogy a LEA DX, Adat helyett a MOV DX, OFFSET Adat utastst hasznljuk. Mindkt esetben a DX regiszterbe az Adat cme tltdik be.

66

Gimesi Lszl 2015.

6.6. Lemezmeghajt kezelse


Egyszer program segtsgvel mutatjuk be egy lemezmeghajt olvasst. A programban nem
vgznk hibafigyelst, pldul nem vizsgljuk, hogy van-e lemez a meghajtban.
A programban az INT 25h megszaktst hasznljuk, amely segtsgvel egy blokkot (szektort)
olvasunk be a lemezrl. A beolvass nem karakterenknt trtnik, mint pldul a billentyzetrl,
hanem blokkosan. Ilyenkor csak a forrs s cl cmet, valamint a msoland bjtok szmt kell
megadnunk.
A floppy lemezen egy blokk mrete 512 bjt, gy az adatok trolsra 512 bjtnyi helyet foglalunk le az adatszegmensben. (A korszer httrtrak mr nagyobb szektormrettel rendelkeznek.
Ha nem floppyt akarunk olvasni, gyeljnk arra, hogy a trterlet megfelelen nagy legyen.
Programunk segtsgvel a beolvasott adatokat ktflekppen rjuk ki: hexadecimlis s karakteres formban is. Egy 80 karakter/soros kpernyn egy sorban 16 bjtnyi adat fr el. gy egy
blokk kirshoz 32 sorra lesz szksg. (Ha 25 soros monitorunk van, akkor clszer a megjelentst kt fl blokkra osztani.)
A kpernyelrendezs az albbi brn lthat:

67

Intel processzorok programozsa assembly nyelven

A programban felhasznljuk a mr megrt szubrutinokat.


.MODEL SMALL
Space EQU " "
.STACK
.DATA?

;Szkz karakter

block DB 512 DUP (?) ;1 blokknyi terlet kijellse


.CODE
main proc
MOV AX, Dgroup
;DS belltsa
MOV DS, AX
LEA BX, block

;DS:BX memriacmre tlti a blokkot

MOV AL, 0

;Lemezmeghajt szma (A:0, B:1, C:2, stb.)

MOV CX, 1

;Egyszerre beolvasott blokkok szma

MOV DX, 0

;Lemezolvass kezdblokkja

INT 25h

;Olvass

POPF

;A veremben trolt jelzbitek trlse

XOR DX, DX

;Kirand adatok kezdcme DS:DX

CALL write_block

;Egy blokk kirsa

MOV AH,4Ch

;Kilps a programbl

INT 21h
main endp
write_block proc

;Egy blokk kirsa a kpernyre

PUSH CX

;CX mentse

PUSH DX

;DX mentse

MOV CX, 32
write_block_new:
CALL out_line

;Kirand sorok szma CX-be


;Egy sor kirsa

CALL cr_lf

;Soremels

ADD DX, 16

;Kvetkez sor adatainak kezdcme;

LOOP write_block_new ;j sor


POP DX

;DX visszalltsa

POP CX

;CX visszalltsa

RET
write_block endp

68

Gimesi Lszl 2015.

out_line proc
PUSH BX

;BX mentse

PUSH CX

;CX mentse

PUSH DX

;DX mentse

MOV BX,DX

;Sor adatainak kezdcme BX-be

PUSH BX

;Ments a karakteres kirshoz

MOV CX, 16
hexa_out:
MOV DL, Block[BX]

;Egy sorban 16 hexadecimlis karakter


;Egy bjt betltse

CALL write_hexa

;Kirs hexadecimlis formban

MOV DL,Space

;Szkz kirsa a hexa kdok kztt

CALL write_char
INC BX

;Kvetkez adatbjt cme

LOOP hexa_out

;Kvetkez bjt

MOV DL, Space

;Szkz kirsa a ktfle md kztt

CALL write_char
MOV CX, 16
POP BX
ascii_out:
MOV DL, Block[BX]

;Egy sorban 16 karakter


;Adatok kezdcmnek belltsa
;Egy bjt betltse

CMP DL, Space

;Vezrlkarakterek kiszrse

JA visible

;Ugrs, ha lthat karakter

MOV DL, Space


visible:
CALL write_char

;Nem lthat karakterek cserje szkzre


;Karakter kirsa

INC BX

;Kvetkez adatbjt cme

LOOP ascii_out

;Kvetkez bjt

POP DX

;DX visszalltsa

POP CX

;CX visszalltsa

POP BX

;BX visszalltsa

RET
out_line endp

;Vissza a hv programba

69

Intel processzorok programozsa assembly nyelven

6.7. A karakteres vide-memria kezelse


A kpernyn megjelen kp nem ms, mint a kperny-memria lekpezse. Ha a kperny
memriba berunk egy karaktert, akkor az azonnal (a frisstsi frekvencinak megfelel sebessggel) megjelenik a monitoron is.
A vide-memria szegmenscme 0B800h, ami megfelel a kperny els karakterpozcijnak
(bal fels sarok) memriacmnek. Minden karakterpozcit egy 16 bites szval jellemezhetnk.
Az als bjt tartalmazza a karakterkdot, a fels a megjelent attribtumot.
15
Memriaelem

7
attribtum

7
Attribtum

6
vill.

0
karakterkd
3

httrszn

0
karakterszn

Az attribtum bitjei:
0. a karakter kk sznsszetevje,
1. a karakter zld sznsszetevje,
2. a karakter piros sznsszetevje,
3. a karakterszn intenzitsa (vilgossgbit),
4. a httr kk sznsszetevje,
5. a httr zld sznsszetevje,
6. a httr piros sznsszetevje,
7. a karakter villogtatsa.
Az attribtum rtknek kiszmtsa:
attribtum = 128 * villogs + 16 * httrszn + karakterszn
(Ha a memria rsra az AX regisztert hasznljuk, akkor AL-be rjuk a karakterkdot s AHba az attribtumot.)
Sznkdok:
0
1
2
3
4
5
6
7

fekete
kk
zld
cin
piros
ibolya (lila)
barna
szrke

8
9
10
11
12
13
14
15

sttszrke
vilgoskk
vilgoszld
vilgoscin
vilgospiros
vilgoslila
srga
fehr

rjunk programot, amely a kperny kzepre kir egy piros * karaktert, szrke httrrel.
A kperny-memriban a kperny egy karakter pozcijnak ofszetcmt a kvetkezkppen szmtjuk ki:
2*((sorszm-1)*sorhossz + karakterpozci-1)
Kettvel azrt kell megszorozni a kpletet, mert egy karakter 2 bjtot foglal el.
gy egy 80 karakter/sor s 50 soros kperny kzepnek ofszetcme: 3918, a 25 soros pedig
1838.

70

Gimesi Lszl 2015.

.MODEL SMALL
.STACK
.CODE
main proc
MOV AX, 0B800h

;Kperny-memria szegmenscme ES-be

MOV ES, AX
;lltsuk be a kpernyt 80x25-s felbontsra.
MOV AH, 0h
;Kpernyzemmd
MOV AL, 3h

;80x25-s felbonts, sznes zemmd

INT 10H
MOV DI, 1838

;Kperny kzepnek ofszetcme

MOV AL, "*"

;Kirand karakter

MOV AH, 128+16*7+4 ;Sznkd: szrke httr, piros karakter, villog


MOV ES:[DI], AX

;Karakter bersa a kperny-memriba

MOV AH, 4Ch

;Kilps

INT 21h
main endp
END main
Ne feledkezznk meg arrl, hogy a kperny kezd karaktere a bal fels sarokban van. Ha ezt
koordinta-rendszerben kpzeljk el, akkor X jobbra, Y pedig lefel nvekszik.
X

Az els karakter pozcija (1,1), ofszetcme a memriban viszont 0, gy ezt is figyelembe


kell vennnk. Teht a karakter cmzse (a kpernyn) 1-el, mg a memria cmzse 0-val kezddik.

71

Intel processzorok programozsa assembly nyelven

Bvtsk a programunkat gy, hogy tetszleges kpernycmen jelenthessk meg a kvnt karaktert. A koordintkat, a karakter kdjt s az attribtumot adatszegmensben adjuk meg.
.MODEL SMALL
.STACK
.DATA
x DB 10
;X koordinta, oszlopszm
y DB 10

;Y koordinta, sorszm

kar DB "A"

;Kirand karakter

att DB 4
.CODE
main proc
MOV AX, dgroup

;Kirs attribtuma

;Adatszegmens belltsa

MOV DS, AX
MOV AX, 0B800h

;Kperny-memria szegmenscme ES-be

MOV ES, AX
XOR AX, AX

;AX trlse

MOV BL, 160

;Szorz betltse BL-be

MOV AL, y

;Y koordinta betltse AL-be

DEC AL

;AL-1, az 1. karakter a memria 0. cmn van

MUL BL

;AL szorzsa 160-nal

MOV DI, AX

;DI-be a sorszmbl szmtott memriahely

XOR AX, AX

;AX trlse

MOV AL, x

;X koordinta betltse AL-be

DEC AL

;AL-1, az 1. karakter a memria 0. cmn van

SHL AL, 1

;AL szorzsa 2-vel (1-el balra shift)

ADD DI, AX

;DI-hez hozzadjuk az oszlopszmbl


;szmtott memriahelyet

MOV AL, kar

;AL-be a karakterkd

MOV AH, att

;AH-ba a karakter attribtuma

MOV ES:[DI], AX

;Betlts a kperny-memria kiszmtott cmre

MOV AH, 4Ch

;Program befejezse

INT 21h
main endp
END main
Az eddigi mintafeladatok alapjn rjunk programot, amely billentyzetrl kri be a koordintkat, a karaktert s a sznkdokat. Hasznljuk a decimlis beolvas eljrsunkat is.

72

Gimesi Lszl 2015.

6.8. Mintapldk az INT 21h interrupthoz


Az albbiakban nhny mintaprogramot mutatunk be (a teljessg ignye nlkl) az INT 21h
interrupt hasznlatra.
A szveges zenetek kirsra az egyszersg kedvrt az INT 21h megszaktst hasznljuk (ld. 6.5. fejezet).
A rendszerdtum lekrdezse:
.MODEL SMALL
.STACK
.CODE
main proc
MOV AH, 2Ah
INT 21h
CALL cr_lf
CALL write_decimal

;A nap kirsa

CALL cr_lf
MOV DL,DH
CALL write_decimal

;A hnap kirsa

CALL cr_lf
MOV DL, CH
CALL write_binary

;Az v fels bjtjnak kirsa

CALL cr_lf
MOV DL, CL
CALL write_binary

;Az v als bjtjnak kirsa

CALL cr_lf
MOV DL, AL
CALL write_decimal

;A ht napja sorszmnak kirsa

CALL cr_lf
MOV AH,4Ch

;Kilps

INT 21h
main endp
end main
Mivel az vszm a DX regiszterbe (2 bjt) kerl, a write_decimal szubrutinnal csak egybjtos
rtket tudunk kiratni, ezrt az vszm bjtjait kln-kln binrisan ratjuk ki.

73

Intel processzorok programozsa assembly nyelven

A rendszerid lekrdezse:
.MODEL SMALL
.STACK
.CODE
main proc
MOV AH, 2Ch
INT 21h
CALL cr_lf
CALL write_decimal

;A szzadmsodperc kirsa

CALL cr_lf
MOV DL,DH
CALL write_decimal

;A msodperc kirsa

CALL cr_lf
MOV DL, CL
CALL write_decimal

;A perc kirsa

CALL cr_lf
MOV DL, CH
CALL write_decimal

;Az ra kirsa

CALL cr_lf
MOV AH,4Ch

;Kilps

INT 21h
main endp
end main
Knyvtr (mappa) ltrehozsa:
.MODEL SMALL
.STACK
.CODE
.DATA
Library
Success
Error
.CODE
main proc
MOV AX,DGROUP

DB 'teszt',0
DB 'Sikeres megnyits$'
DB 'Sikertelen megnyits$'

;Adatszegmens belltsa

MOV DS,AX
LEA DX, Library

;Knyvtr nevnek kezdcme

MOV AH,39h

;A knyvtr ltrehozsa

INT 21h

74

Gimesi Lszl 2015.

JNC exist

;Sikeres megnyits

LEA DX, Error

;"Sikertelen megnyits" szveg kezdcme

JMP stop
exist:
LEA DX, Success

;"Sikeres megnyits" szveg kezdcme

stop:
MOV AH,9

;Szvegkirs

INT 21h
MOV AH,4Ch

;Kilps

INT 21h
main endp
end main
Knyvtr (mappa) trlse:
.MODEL SMALL
.STACK
.CODE
.DATA
Library
Success
Error
.CODE
main proc
MOV AX,DGROUP

DB 'teszt',0
DB 'Sikeres trls$'
DB 'Sikertelen trls$'

;Adatszegmens belltsa

MOV DS,AX
LEA DX, Library

;Knyvtr nevnek kezdcme

MOV AH,3Ah

;A knyvtr trlse

INT 21h
JNC exist

;Sikeres trls

LEA DX, Error

;"Sikertelen trls" szveg kezdcme

JMP stop
exist:
LEA DX, Success

;"Sikeres trls" szveg kezdcme

MOV AH,9

;Szvegkirs

stop:
INT 21h
MOV AH,4Ch

;Kilps

INT 21h
main endp
end main
75

Intel processzorok programozsa assembly nyelven

Fjl trlse:
.MODEL SMALL
.STACK
.DATA
File_name

DB teszt.txt,0

Success

DB Sikeres trls$

Nofile

DB A fjl nem ltezik$

Error
.CODE
main proc
MOV AX,DGROUP

DB Trlsi hiba$

;Adatszegmens belltsa

MOV DS,AX
LEA DX, File_name

;Fjl nevnek kezdcme

MOV CX,3Fh

;Keress minden attribtumra

MOV AH,4Eh

;A fjl els elfordulsnak keresse

INT 21h
JNC file_exist

;A fjl ltezik

LEA DX, Nofile

;"A fjl nem ltezik" szveg kezdcme

JMP stop
file_exist:
LEA DX, File_name
MOV AH,41h

;Fjl nevnek kezdcme


;Fjl trls

INT 21h
JNC deleting

;Sikeres trls

LEA DX, Error

;"Trlsi hiba" szveg kezdcme

JMP stop
deleting:
LEA DX, Success
stop:
MOV AH,9

;"Sikeres trls" szveg kezdcme


;Szvegkirs

INT 21h
MOV AH,4Ch
INT 21h
main endp
end main

76

;Kilps

Gimesi Lszl 2015.

Olvass fjlbl:
.MODEL SMALL
.STACK
.DATA
File
DB 'Text.txt',0
Error
DB 'Fjl nyitsi hiba$'
Read_error DB 'Olvassi hiba$'
Data
DB 1024 DUP ($)
;Adatterlet
.CODE
main proc
MOV AX, Dgroup
;DS belltsa
MOV DS, AX
LEA DX, File

;Fjl nevnek kezdcme

XOR AL, AL

;Fjl megnyitsa olvassra

MOV AH, 3Dh

;Fjl megnyitsa

INT 21h
JNC Opened

;Sikeres fjlnyits, AX=Handle

LEA DX, Error

;"Fjlnyitsi hiba" szveg kezdcme

JMP Stop
Opened:
LEA DX, Data

;Adatterlet kezdcme

MOV CX, 1024

;Beolvasott bjtok szma (puffer mrete)

MOV BX, AX

;Handle BX-be

MOV AH, 3Fh

;Olvass a fjlbl

INT 21h
JNC Success

;Sikeres olvass

LEA DX, Read_error

;"Olvassi hiba" szveg kezdcme

JMP Stop
Success:
MOV AH, 3Eh

;Fjl lezrs

INT 21h
LEA DX, Data

;Adatterlet kezdcme a kirshoz

MOV AH,9

;Szvegkirs

Stop:
INT 21h
MOV AH,4Ch

;Kilps

INT 21h
main endp
end main
77

Intel processzorok programozsa assembly nyelven

7. Az assembly kapcsolata ms nyelvekkel


Ebben a fejezetben rt mintapldkat akkor is rdemes ttanulmnyozni, ha az adott programozsi nyelvet nem hasznljuk, ugyanis j eljrsokkal fogunk megismerkedni.
7.1. Assembly rutinok Turbo Pascal programokban
Az assembly utastsok hasznlatt - Pascal nyelven - nhny mintaprogram segtsgvel mutatjuk be.
Az assembly programmodulok futtatsakor nem szksges trolnunk (verembe menteni) az
AX, BX, CX, s DX regisztereket. Azonban az SI, DI, BP, SP, CS, DS, s SS regisztereket el
kell menteni, ha hasznljuk azokat.
7.1.1. Alapmveletek
rjunk rutinokat a ngy alapmvelet elvgzsre.
Program Feladat1
{Bjt tpus adatok sszeadsa, eredmny bjtos}
Function Osszeg (A, B: Byte): Byte ; Assembler;
ASM
MOV AL, A

{Az els paramter AL-be}

ADD AL, B

{A msodik paramter sszeadsa AL-lel}

END;

{A fggvny rtke AL-ben van}

{Bjt tpus adatok kivonsa, eredmny is bjtos}


Function Kulonbseg (A, B: Byte): Byte ; Assembler;
ASM
MOV AL, A

{Az els paramter AL-be}

SUB AL, B

{A msodik paramter kivonsa AL-bl}

END;

{A fggvny rtke AL-ben van}

{Word tpus adatok szorzsa, eredmny LongInt}


Function WordSzorzas (A, B: Word): LongInt ; Assembler;
ASM

END;

78

MOV AX, A

{Az els paramter AX-be}

MUL B

{AX szorzsa B-vel, eredmny DX:AX-ben}


{A fggvny rtke DX:AX-ben van}

Gimesi Lszl 2015.

{Eljeles szorzs}
Function IntSzorzas (A, B: ShortInt): Integer ; Assembler;
ASM
MOV AL, A

{Az els paramter AL-be}

IMUL B

{Szorzsa B-vel}

END;

{A fggvny rtke AX-ben van}

{Fprogram}
Begin
Writeln(sszeg: 25 + 40 = , Osszeg(25, 40));
Writeln(Klnbsg: 123 34 = , Kulonbseg(123, 34));
Writeln(Szorzs: 2345 * 1234 = , WordSzorzas(2345, 1234));
Writeln(Eljeles szorzs: -12 * 25 = , IntSzorzas(-12, 25));
End.
A fggvnyek visszatrsi rtke:

Byte, Shortint (1 bjtos) a fggvny tpusa, akkor az AL regiszterbe kell tlteni a viszszatrsi rtket.

Word, Integer (2 bjtos) a fggvny tpusa, akkor az AX regiszterbe kell tlteni a viszszatrsi rtket.

Longint, Pointer (4 bjtos) a fggvny tpusa, akkor a DX:AX regiszterprba kell tlteni a visszatrsi rtket.

Real (6 bjtos) a fggvny tpusa, akkor az DX:BX:AX regiszterekbe kell tlteni a


visszatrsi rtket. (Figyelembe kell venni a vals szmok brzolsnak szablyt.)

String tpus fggvny esetn a visszatrsi rtket a @Result vltoz ltal meghatrozott memriaterletre kell pakolni. Pascal-ban a sztring kezelse eltr az Assemblytl. Ezrt a sztring sszelltsnl figyelembe kell venni azt, hogy az els byte tartalmazza a sztring hosszt.

Azoknl a tpusoknl (Single, Double, Extended) ahol a koprocesszort is hasznljuk, a


visszatrsi rtket a matematikai processzor ST(0) regisztern keresztl adjuk vissza.

79

Intel processzorok programozsa assembly nyelven

7.1.2. Input Output mveletek


rjunk programokat billentyzetrl trtn olvass s a kpernyre rs szemlltetsre.
Program Feladat2 {Standard input output kezelse}
Var
Kar: Char;
{Egy karakter kirsa monitorra}
Procedure Kiir(C: Char); Assembler;
ASM
MOV DL, C

{DL-be a karakter kdja}

MOV AH, 2

{AH-ba a kpernyre rs funkcikdja}

INT 21h

{Karakter kirsa}

END;
{Egy karakter beolvassa a billentyrl}
Function Beolvas: Char; Assembler;
ASM
MOV AH,1

{AH-ba a beolvass kdja}

INT 21h

{Karakter beolvassa, a karakter kd AL-ben}

END;
Begin
Kar:=Beolvas;
Writeln;
Kiir(Kar);
End.
Tltsnk fel egy tmbt karakterekkel: a-tl z-ig, majd rassuk ki. A kirs vgre tegynk egy
soremelst.
Program Feladat3 {Tmb feltltse s kirsa}
Const
MAX = 26;
CR_LF: Array[1..3] of Char = #$0D#$0A$; {0Dh, 0Ah, s a $ karakterek}
Type
TombType = Array[1.. MAX]of Char;
Var
Tomb: TombType;
{Tmb feltltse kisbetkkel}

80

Gimesi Lszl 2015.

Procedure Feltolt(Var T: Tombtype); Assembler;


ASM
PUSH DI

{DI mentse}

LES DI, T

{A tmb ofszet cmnek belltsa}

MOV AL, a

{Els karakter}

MOV CX, MAX

{Ciklusvltoz belltsa}

CLD

{Irnyjelz bit trlse, ES:DI automatikusan n a


sztringmvelet utn}
{Ha nincs elre deklarlva a cm @-al kell kezdeni}
{AL tartalmt az ES:DI cmre teszi, majd DI-t eggyel
megnveli.}

@Uj_karakter:
STOSB
INC AL

{AL-be a kvetkez karakter.}

LOOP @Uj_karakter {Kvetkez karakter}


POP DI

{DI visszalltsa}

END;
{Soremels kirsa}
Procedure Soremeles; Assembler;
ASM
LEA DX, CR_LF {CR_LF ofszet cmnek betltse DX-ben
MOV AH, 9

{Sztring kirsa a $ karakterig}

INT 21h

{DS:DX kezdcm sztring kirsa}

END;
{Vrakozs egy karakter letsre}
Procedure Wait; Asembler;
ASM
MOV AH, 1

(Vrakozs egy karakter letsre}

INT 21h

{DS:DX kezdcm sztring kirsa}

END;
Begin
Feltolt(Tomb);
For I:=1 to MAX do
Kiir(Tomb[I]);

{A Kiir eljrs az elz pldban szerepel!}

Soremeles;
Wait;
End.

81

Intel processzorok programozsa assembly nyelven

rjunk programot, amellyel egy sztringet feltltnk a billentyzetrl, majd kirjuk a kpernyre.
Program Feladat4 {Sztring kirsa}
Var
ST: string;
{Sztring kirs a kpernyre}
Procedure StringWrite(Var S: String); Assembler;
ASM
PUSH SI

{SI mentse}

LDS SI, S

{A sztring-pointer betltse a DS:SI-be}

CLD

{Irnyjelz belltsa}

LODSB

{DS:SI ltal megcmzett bjt betltse AL-be. Ez a


sztring hossza}

XOR CX, CX

{CX trlse}

MOV CL, AL
@Uj_karakter:
LODSB

{Szting hossza CL-be (szmll belltsa)}


{AL-be DS:SI tartalma, SI-t eggyel megnveli.}

MOV DL, AL

{DL-be a kirand karakter}

MOV AH, 2

{Kirs funkci}

INT 21h

{Karakter kirsa}

LOOP @Uj_karakter {Kvetkez karakter}


POP SI

{SI visszalltsa}

END;
Procedure StringRead(Var S: String); Assembler; {Sztring beolvass}
Const
CR=#13;
ASM

82

PUSH DI

{DI mentse

LES DI, S

{A sztring-pointer betltse a ES:DI-be}

CLD

{Irnyjelz belltsa}

XOR CX, CX

{CX trlse}

PUSH DI

{Sztring hossznak cmt elmentjk}

INC DI

{Az els hely kihagysa, ide a hossz kerl}

Gimesi Lszl 2015.

@Uj_karakter:
MOV AH, 1

{Karakter beolvass funkci}

INT 21h

{Karakter beolvassa AL-be}

CMP AL, CR

{ENTER ellenrzse}

JE @Vege

{Vge, ha ENTER volt az utols karakter}

STOSB

{AL tartalmt ES:DI cmre}

INC CL

{Karakterszmlls}

JMP @Uj_karakter

{Kvetkez karakter}

@Vege:
MOV AL, CL

{AL-be a sztring hossza}

POP DI

{Sztring kezdetnek visszalltsa}

STOSB

{A hossz kirsa ES:DI cmre}

POP DI

{DI visszalltsa}

END;
Begin
Readln(ST);

{Sztring feltltse Readln eljrssal}

Writeln;

{Soremels}

StringWrite(ST);

{Sztring kirsa sajt eljrssal}

ST:=;

{Sztring trlse}

StringRead(ST);

{Sztring feltltse sajt eljrssal}

Writeln;

{Soremels}

Writeln(ST);

{Sztring kirsa Writeln eljrssal}

Readln;

{Vr egy ENTER-re}

End.
A fprogramban elklntettk a beolvas s kir rutinok hvst, s kln-kln leteszteltk
azokat a Pascal sajt eljrsaival.
A beolvas rutinnl gyeljnk a sztring hossznak helyes belltsra, ugyanis a Pascal a
hosszbl dnti el, hogy hny karakter kell kirnia. gy ha pldul nulla kerl a hossz-bjtba, akkor
a Writeln nem r ki semmit, annak ellenre, hogy a sztring betltst helyesen vgeztk el.

83

Intel processzorok programozsa assembly nyelven

7.2. Assembly rutinok C programokban


C nyelvbl hvhat assembly eljrsok hvsnak ktfle mdjt mutatjuk be. Az els esetben
hasonlan a Pascalhoz a programba beptett, a C fordt (compiler) ltal lefordtott modulokat vizsgljuk meg, majd a 7.2.2 fejezetben, assemblyben rt, assemblerrel fordtott programok
alkalmazshoz ksztnk mintafeladatokat.
A mintaprogramban egrkezel rutinok mkdst mutatjuk be.
Az egr vezrlst a 33h szoftveres megszaktson keresztl vgezhetjk el. Itt nincs lehetsgnk az sszes egrfunkci bemutatsra, errl a mellklet Megszaktsok fejezetben bvebb
informcit szerezhetnk.
7.2.1. C programba rt assembly utastsok
A programunkban bemutatunk nhny grafikus egrkurzor definilst is.
/* Egrkezel alaprutinok */
typedef struct _PTRSHAPE
{
unsigned xHot, yHot;
unsigned afsPtr[32];
} PTRSHAPE;

/* Egrkurzor struktra */
/* Egrkurzor bzispontja */
/* Egrkurzor kpe */

/* Egrkurzor lthatsga 1: lthat, 2: nem lthat*/


typedef enum _PTRVIS { SHOW = 1, HIDE = 2 } PTRVIS;
/* Public egrfunkcik */
int MouseInit( void );
int GetMouseEvent( void );

/* Egrkurzor struktra */
/* Egrkurzor struktra */

/* Ablak definilsa. Ezen bell mozoghat a kurzor.*/


void SetMouseWin( short xmin, short ymin, short xmax, short ymax void SetMousePos(
short x, short y );
/* Egrkurzor pozicionlsa */
void SetMouseVis( PTRVIS pv );
/* Kurzor ki-be kapcsolsa */
void SetMouseShape( PTRSHAPE _far *ps );
/* Kurzor bellts */
struct MOUINFO
{
short Mousex, Mousey;
unsigned MouseBtn;
} static mi = { 0, 0, 0 };

84

/* Egr adatstruktra*/
/* Egr pozici*/
/* Egr gomb*/

Gimesi Lszl 2015.

/* Nhny egrkurzor definils */


/* Nyl alak kurzor */
PTRSHAPE s_arrow = {0,0,
0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,
0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,
0XC000,0XF000,0X7C00,0X7F00,0X3FC0,0X3FF0,0X1FFC,0X1FFF,
0X0F00,0X0F00,0X0700,0X0700,0X0300,0X0300,0X0100,0X0100};
/* Kr alak kurzor */
PTRSHAPE s_circle = {8,8,
0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,
0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,
0X0000,0X0000,0X0000,0X0000,0X0180,0X07E0,0X07E0,0X0FF0,
0X0FF0,0X07E0,0X07E0,0X0180,0X0000,0X0000,0X0000,0X0000};
/* X alak kurzor */
PTRSHAPE s_x = {8,8,
0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,
0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,0XFFFF,
0X0000,0X2004,0X700E,0X381C,0X1C38,0X0E70,0X07E0,0X03C0,
0X03C0,0X07E0,0X0E70,0X1C38,0X381C,0X700E,0X2004,0X0000};
/* MouseInit - Egr inicializlsa.
* Visszatrsi rtk 0 ha az egeret nem sikerlt inicializlni */
int MouseInit()
{
register flag, btn;
_asm
{
xor ax, ax
;Egrfunkci 0
int 33h
;Reset mouse
mov flag, ax
;Funkcikd mentse
mov btn, bx
;Egrgomb mentse
}
if( !flag ) return 0;
_asm
{
mov ax, 1
;Egrkurzor lthat
int 33h
mov ax, 3
;Egrkurzor-pozci lekrdezse
int 33h
mov mi.Mousex, cx ;Oszlop koordinta
mov mi.Mousey, dx ;Sor koordinta
mov mi.MouseBtn, bx
;Egrgomb
}
return btn; /* Visszatrs az egrgomb kdjval */
}

85

Intel processzorok programozsa assembly nyelven

/* GetMouseEvent Egr sttusz lekrdezse


* Visszatrs: 1 ha van vltozs, s 0 ha nincs */
int GetMouseEvent( void )
{
int rtn;
_asm
{
mov ax, 3
;Egr koordinta s gomb lekrdezse
int 33h
xor ax, ax
;Ha nincs vltozs
cmp bx, mi.MouseBtn
;Msik gomb, mint a legutols?
je noevent
cmp cx, mi.Mousex ;Vltozott az oszlop koordinta?
jne event
cmp dx, mi.Mousey ;Vltozott a sor koordinta?
je noevent
event:
mov ax, 1
;Ha brmi is vltozott
mov mi.Mousex, cx ;j oszlopkoordinta
mov mi.Mousey, dx ;j sorkoordinta
mov mi.MouseBtn, bx
;j egrgomb
noevent:
mov rtn, ax
}
return rtn;

;Visszatrsi rtk

}
/* SetMouseWin Egr mozgsi terletnek belltsa */
void SetMouseWin(short xmin, short ymin, short xmax, short ymax)
{
_asm
{
mov cx, xmin
;Bal als sarok X koordintja
mov dx, xmax
;Jobb fels sarok X koordintja
mov ax, 7
;Vzszintes mozgsintervallum belltsa
int 33h
mov cx, ymin
mov dx, ymax
mov ax, 8
int 33h
}
}

86

;Bal als sarok Y koordintja


;Jobb fels sarok koordintja
;Fggleges mozgsintervallum belltsa

Gimesi Lszl 2015.

/* SetMouseVis Lthatsg belltsa.


/* Paramterek: lthat ( SHOW) vagy nem lthat (HIDE) */
void SetMouseVis( PTRVIS pv )
/*pv=1: lthat, pv=2: nem lthat*/
{
_asm
{
mov ax, pv
;Lthatsg belltsa
int 33h
}
}
/* SetMousePos Egrkurzor pozcijnak belltsa */
void SetMousePos( short x, short y )
{
_asm
{
mov ax, 4
;Egrpozci bellts funkci
mov cx, x
;Oszlop koordinta
mov dx, y
;Sor koordinta
int 33h
}
}
/* SetMouseShape Egrkurzor kpnek belltsa */
void SetMouseShape( PTRSHAPE _far *ps )
{
_asm
{
les di, ps
;bra lers memriacme ES:DI-be
mov bx, es:[di].xHot ;X bzispont
mov cx, es:[di].yHot ;Y bzispont
mov dx, di
add dx, 4
;Kezdet + 4-en kezddik a kp
mov ax, 9
;Grafikus kurzor belltsa
int 33h
}
}

87

Intel processzorok programozsa assembly nyelven

7.2.2. Assembly rutinok C-hez


A kvetkez mintaprogramok segtsgvel megmutatjuk, hogyan lehet olyan assembly eljrsokat rni, amelyeket hvhatunk C nyelv programokbl.
Ahhoz, hogy megadjuk a MASM fordtnak, hogy C-bl hvhat eljrst runk, a .MODEL direktvt ki kell egsztennk egy C betvel:
.MODEL SMALL, C
Ezen kvl hasznlnunk kell a PUBLIC direktvt is, amely megmondja az assemblernek,
hogy az utna megnevezett eljrst hozzfrhetv (nyilvnoss) kell tenni ms llomnyokban
(pldul C-ben) lv programok szmra.
A PUBLIC direktva hatsra az assembler olyan egyb informcikat generl a LINK (szerkeszt) szmra, amelyek lehetv teszik ms programokbl trtn hozzfrst.
A bemutatst egyszer programmal kezdjk: trljk le a kpernyt.
A kperny trlshez hasznljuk a INT 10h megszakts sorgrgets felfel funkcijt.
.MODEL SMALL, C
.CODE
PUBLIC clear_screen
clear_screen PROC
XOR AL, AL

;Ablak trlse

XOR CX, CX

;Bal fels sarok (CL = 0, CH = 0)

MOV DH, 49

;50 soros kperny als sora (25 sorosnl ide 24 kell)

MOV DL, 79

;Jobb oldali oszlop sorszma

MOV BH, 7

;Trlt helyek attribtuma: fekete httr szrke karakter

MOV AH, 6

;Sorgrgets felfel (Scroll-up) funkci

INT 10h

;Kperny trlse

RET
clear_screen ENDP
Lthat, hogy a C nyelv programhoz rt assembly programmodulok esetben nem szksges
elmentennk az AX, BX, CX, s DX regiszterek tartalmt.
Az SI, DI, BP, SP, CS, DS, s SS regiszterek eredeti tartalmt viszont el kell menteni s viszsza kell lltani, ha hasznljuk azokat!

88

Gimesi Lszl 2015.

Paramtertads
Az eddigi pldaprogramjainkban a paramterek (adatok) tadsra a regisztereket hasznltuk.
A C programok azonban a vermet (stack-et) hasznljk a paramterek tadsra.
Azzal, hogy megadjuk az assemblernek, hogy C-hez runk alprogramot, nhny beptett automatizmus egyszersti a program rst. Erre lthatunk pldt a kvetkez mintaprogramban,
ahol ismertetjk a forrsnyelv listt, s az assembler ltal kiegsztett llomnyt is.
rjunk ki egy karaktersort a kpernyre. Hasznljuk a mr megrt kpernytrlt is.
(Figyeljnk arra, hogy a C nyelvben klnbsg van a kis- s nagybetk kztt.)
A C programunk:
Main()
{
celar_screen();
/*Kperny trlse*/
write_string(Ez egy szveg);
}
Az ltalunk megrt forrsnyelv llomny:
PUBLIC write_string
write_string PROC USES SI, string: PTR BYTE
PUSHF
CLD
MOV SI, string

;Sttuszregiszter trolsa
;Irnyjelz belltsa (nni fog)
;Cm betltse az SI-be

new_char:

LODSB
OR AL,AL
JZ end_string
MOV AH, 2
INT 21h
JMP new_char
end_string:
POPF

;DS:SI cmrl egy karakter betltse AL-be


;Sztring vgnek ellenrzse
;Ugrs, ha AL=0
;Kpernyre rs funkci
;Egy karakter kirsa a kpernyre

;Jelzbitek visszalltsa

RET
write_string ENDP
A programban kt j direktvt is hasznltunk.
Az els a USES SI, megmondja a fordtnak, hogy az SI regisztert fogjuk hasznlni, teht el
kell menteni a verembe, majd vissza kell tlteni azt.
A msodik direktvval egy string nev mutatt definilunk, amely a sztring els karakterre
mutat, s bjt tpus:
string: PTR BYTE,

89

Intel processzorok programozsa assembly nyelven

rjuk meg a fenti direktvk nlkl a programot:


PUBLIC write_string
write_string PROC
PUSH BP

;BP mentse

MOV BP, SP

;BP belltsa a paramterekre

PUSH SI

;SI mentse

PUSHF

;Sttuszregiszter trolsa

CLD

;Irnyjelz belltsa (nni fog)

MOV SI, [BP+4]

;Cm betltse az SI-be

new_char:
LODSB

;DS:SI cmrl egy karakter betltse AL-be

OR AL,AL

;Sztring vgnek ellenrzse

JZ end_string

;Ugrs, ha AL=0

MOV AH, 2

;Kpernyre rs funkci

INT 21h

;Egy karakter kirsa a kpernyre

JMP new_char
end_string:
POPF

;j karakter beolvassa
;Jelzbitek visszalltsa

POP SI

;SI visszalltsa

POP BP

;BP visszalltsa

RET 2
write_string ENDP
A BP regiszter egy klnleges cl regiszter, mivel az alaprtelmezsben az SS regiszterrel
egytt hasznljuk. Teht a stack terlett cmezhetjk vele.
A stack aktulis cmt a MOV BP, SP utastssal tltttk a BP-be. A sztring cmnek betltsnl (MOV SI, [BP+4]) 4-et hozz kell adnunk. Ez azrt szksges, mert a fggvny paramterei 4 bjttal feljebb helyezkednek el, mint az a cm, ami a veremmutat elmentsekor volt.
A paramtertads jobb megrtshez nzznk egy egyszer pldt:
Legyen a C programunk:
Main()
{
int param_1, param_2, param_3;
/* Meghvjuk a subroutine fggvnyt 3 paramterrel*/
subroutine (param_1, param_2, param_3);
}

90

Gimesi Lszl 2015.

A subroutine fggvny hvsakor a kvetkez trtnik:


A jobb szls paramtertl kezdve betlti a paramtereket a verembe. (Legutoljra az
els paramtert menti.)
Menti a visszatrsi cmet a verembe.
tadja a vezrlst a fggvnynek.
Vizsgljuk meg a verem kpt:
Cm
Verem tartalma
[BP+8]
[BP+6]
[BP+4]

3. paramter
2. paramter
1. paramter
Visszatrsi cm

BP

BP mentse
SI mentse

IP mentse. Szubrutin hvsakor ez a verem teteje.


PUSH BP, BP mentse, MOV BP, SP az aktulis cm BP-ben
PUSH SI, SI mentse.

Figyeljk meg, hogy a verem az alacsonyabb memriacm fel (brn lefel) nvekszik.
Amennyiben a BP mentse utn azonnal betltjk a veremmutatt (SP) BP-be, utna mr szabadon menthetnk brmennyi adatot a stackre, az mr nem befolysolja a BP-ben elmentett cm
s a paramter tvolsgt. Azaz az els paramter mindig azonos ofszetre lesz BP-ben trolt cmtl, MODEL SMALL esetben 4. Tvoli (FAR) hvs esetn, mivel a CS (kdszegmens) is bekerl a stack-be, az ofszet 6 lesz.
A paramterek ltal elfoglalt stack nagysga fgg a paramter tpustl, amit a szubrutinban is
figyelembe kell vennnk. Vagyis a paramterek cme (az els kivtelvel) fgg attl, hogy milyen tpusak (hny bjtosak).
Mivel a MASM generlja a paramtertadshoz szksges sszes utastst, a fent emltett
direktvk hasznlatakor nem kell trdnnk azzal, hogy az utastsokat megfelel sorrendben
rjuk, s azzal sem, hogy a paramterek melyik veremcmen tallhatk.
rdekessgknt megjegyezzk, hogy a paramterek fordtott sorrendbe trtn trolsa lehetv teszi, hogy kevesebb paramtert hasznljunk a fggvnyben, mint amennyivel azt meghvtuk. (Az utols paramtereket hagyhatjuk el.)
Nzznk ktparamteres adattadsra pldaprogramot. rjunk egy kperny-kurzort mozgat
rutint. Hivatkozzunk a mr elksztett fggvnyekre.
A C fprogram:
Main()
{
int x, y;
x = 40;
y = 25;
clear_screen();
goto_xy(x, y);
write_string(Ez egy szveg);

/*Kurzor pozci */
/*Kperny kzepe 80x50-es felbontsnl*/
/*Kperny trlse*/
/*Kurzor pozicionls*/
/*Szveg kirsa*/

91

Intel processzorok programozsa assembly nyelven

Az assembly szubrutin:
PUBLIC goto_xy
goto_xy PROC x: WORD, y: WORD
MOV DH, BYTE PTR (y)

;Kurzor oszlop koordintja

MOV DL, BYTE PTR (x)

;Kurzor sor koordintja

MOV BH, 0

;Kperny oldalszmnak belltsa

MOV AH, 2

;Kurzorpozci funkci

INT 10h

;Kurzorpozci belltsa

RET
goto_xy ENDP
Figyeljk meg, hogy a paramterek sorrendje megegyezik a hvsi sorrenddel. Teht elszr
az x-et, majd az y-t deklarltuk.
Programunkban egy jabb klnlegessggel tallkozunk: BYTE PTR (y).
Hvskor az x s y vltozkat egszknt, paramter tvtelkor pedig word-knt deklarltuk,
ami kt - kt bjtot jelent. A kurzor cmzshez pedig kt egy bjtos adatra van szksg. gy a
fordtskor
MOV DH, WORD PTR [PB+4]
utastst kapnnk. Ez azonban az assemblyben nem megengedett. Nem mozgathatunk kzvetlenl kt bjtos (szavas) adatot egy bjtos helyre. Hasznlnunk kell a BYTE PTR direktvt. Ebben
az esetben az utasts:
MOV DH, BYTE PTE WORD PTR [PB+4] lenne.
Ezt viszont az assembler nem tudja kezelni. Ezt a problmt gy tudjuk kikszblni, hogy
zrjeleznk. Teht:
MOV DH, BYTE PTE (WORD PTR [PB+4])
Ez pedig, visszarva az eredeti programlistnkba, megfelel:
MOV DH, BYTE PTE (y) utastsnak.

92

Gimesi Lszl 2015.

Fggvnyrtk visszaadsa
C-ben a fggvny rtk visszaadsra a kvetkez regisztereket hasznljuk:
AL bjt hosszsg adatnl,
AX sz esetn,
DX:AX duplaszavas adatnl.
Szemlltetsl rjunk egy rutint, amely segtsgvel bekrnk egy karaktert a billentyzetrl.
A C fprogram:
Main()
{
clear_screen();
goto_xy(40, 25);
write_string(Ez egy szveg);
while (read_key() != );

/*Kperny trlse*/
/*Kurzor a kperny kzepre*/
/*Szveg kirsa*/
/*Karakterek olvassa szkzig*/

}
Az assembly szubrutin:
PUBLIC read_key
read_key PROC
XOR AH, AH

;Beolvass funkci

INT 16h

;Karakter kd AL-be, scan kd AH-ba

OR AL, AL

;Kiterjesztett kd, ha AL=0

JZ ext_kod

;Ugrs, ha kiterjesztett kd

XOR AH, AH

;AH =0, ha ASCII kdot adunk vissza

RET
ext_kod:
MOV AL,AH
MOV AH, 1

;Kiterjesztett (scan) kd AL-be


; AH =1, ha kiterjesztett kdot adunk vissza

RET
read_key ENDP

93

Intel processzorok programozsa assembly nyelven

8. Irodalomjegyzk
Goldstine, Herman H.: A szmtgp Pascaltl Neumannig, Mszaki knyvkiad, 2003.
Kovcs Magda: 32 bites mikroprocesszorok 80386/80486; LSI oktatkzpont.
Marschik Ivn: Mikrogprendszerek tervezse, SZMALK, 1984.
Microsoft: MASM Programmers Guide; Microsoft Corporation.
Peth dm: IBMPC/XT felhasznlknak s programozknak 1 3 ktet; SZMALK, 1990.
Peter Norton John Socha: Az IBM PC assembly nyelv programozsa; Novotrade, 1991.
Pirk Jzsef: Turbo Pascal 5.5; LSI kiad, 1990.
Texas: Bevezets a mikroprocesszor technikba, Mszaki kiad, 1982.
Texas: TTL receptek, Mszaki kiad, 1976.

94

Gimesi Lszl 2015.

9. Mellklet
10.

Intel processzorok utastskszlete

96

11.

Lebegpontos utastskszlet

123

12.

Megszaktsok

134

12.1.

INT 10h funkci: kperny driver hvsa

134

12.2.

INT 16h funkci: klaviatra driver hvsa

136

12.3.

INT 21h funkci: DOS funkcik hvsa

137

12.4.

INT 25h funkci: lemezszektor olvassa

141

12.5.

INT 26h funkci: lemezszektor rsa

141

12.6.

INT 33h funkci: egr driver hvsa

142

13.

A 7 bites ASCII kdtbla

145

13.1.

Alapkdok

145

13.2.

Billentykdok

146

95

Intel processzorok programozsa assembly nyelven

10. Az Intel processzorok utastskszlete


AAA - ASCII Adjust for Addition (ASCII szmok sszeadsa)
AAA
Kt ASCII szm sszeadsa utn hasznlhat utasts. Hatsra az AH s AL regiszterbe
kt pakolatlan BCD (Binary Coded Decimal) szmjegy jn ltre.
Mdostott flagek: AF, CF (OF, PF, SF, ZF bizonytalan)
Pldul: Adjuk ssze a 6 s a 9 ASCII szmjegyeket AL = 36h + 39h = 6Fh (ez nem
egyenl a szmjegyek sszegvel). Az AAA utasts hatsra a 6Fh bl az AH = 01h, az AL =
05h lesz, azaz AX = 15h (BCD szmpr).
AAD - ASCII Adjust for Division (BCD szmok elksztse osztshoz)
AAD
Az AH s AL-ben lv BCD szm talaktsa binris (hexadecimlis) szmm.
Mdostott flagek: SF ZF PF (AF,CF,OF bizonytalan)
AAM - ASCII Adjust for Multiplication (BCD szmm alakts)
AAM
A szorzs eredmnyeknt kapott rtket alaktja t pakolatlan BCD szmm.
Mdostott flagek: PF, SF, ZF (AF, CF, OF bizonytalan)
AAS - ASCII Adjust for Subtraction
AAS
Kt ASCII szm kivonsa utn hasznlhat utasts. Hatsra az AH s AL regiszterben kt
pakolatlan BCD (Binary Coded Decimal) szmjegy jn ltre.
Mdostott flagek: AF, CF (OF, PF, SF, ZF bizonytalan)
Mkdse hasonl az AAA utastsval.
ADC - Add With Carry (sszeads)
ADC cl, forrs
A forrrs operandust s a CF-et hozzadja a cl operandushoz. Az eredmny a cl helyre
kerl.
Mdostott flagek: AF, CF, OF, SF, PF, ZF
ADD - Arithmetic Addition (sszeads)
ADD cl, forrs
A forrs operandust hozzadja a cl operandushoz. Az eredmny a cl helyre kerl.
Mdostott flagek: AF, CF, OF, PF, SF, ZF
A mvelet 8, 16, 32 bites szmokkal, tetszleges cmzsi mdban elvgezhet.

96

Gimesi Lszl 2015.

AND - Logical And (bitenknti S)


AND cl, forrs
A forrs S cl logikai mvelet vgrehajtsa. Az eredmny a cl helyre kerl.
Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)
ARPL - Adjusted Requested Privilege Level of Selector (szelektor RPL belltsa)
ARPL cl, forrs
Vezrlstads letiltsa, ha a cl alacsonyabb prioritsi szinten van, mint a forrs.
Ha a cl RPL (als kt bit) rtke kisebb, mint a forrs RPL rtke, akkor cl=cl+1 s
ZF=1, egybknt cl vltozatlan s ZF=0. (286-tl hasznlhat vdett (protected) md
utasts.)
Mdostott flagek: ZF
BOUND - Array Index Bound Check (tmbindex ellenrzs)
BOUND cl, forrs
Az 5-s megszakts hvsa, ha a cl operandus rtke kisebb a forrs ltal meghatrozott
memriacmen trolt rtknl, s nagyobb a kvetkez memriacmen lvnl. Azaz, ha a
cl rtke nem egy megadott intervallumon bell van. (80188-tl hasznlhat utasts 16
illetve 32 bites operandusokkal.)
Mdostott flagek: BSF - Bit Scan Forward (bitkeress elre)
BSF cl, forrs
A forrs-ban megkeresi (jobbrl) az els 1-be lltott bitet, az indext a cl-ba rja s
ZF=0. Ha a forrs nem tartalmaz 1-et, a cl bizonytalan s ZF=1 lesz. (386-os
processzortl hasznlhat.)
Mdostott flagek: ZF
BSR - Bit Scan Reverse (bitkeress vissza)
BSR cl, forrs
A forrs-ban megkeresi (balrl) az els 1-be lltott bitet, az indext a cl-ba rja s ZF=0.
Ha a forrs nem tartalmaz 1-et, a cl bizonytalan s ZF=1 lesz. (386-os processzortl
hasznlhat.)
Mdostott flagek: ZF
BSWAP - Byte Swap (bjt csere)
BSWAP regiszter
A regiszter [0 7] s [24 31] valamint a [8 15] s [16 23] bitjeinek cserje.
Pldul konvertls 32 s 16 bites trolsi md kztt. (486-os processzortl hasznlhat
32 bites regiszterekre.)
Mdostott flagek: -

97

Intel processzorok programozsa assembly nyelven

BT - Bit Test (bit teszt)


BT cl, forrs
A cl adat forrs-adik bitjnek trolsa a CF-be. (Csak a 386-os processzortl
hasznlhat.)
Mdostott flagek: CF
BTC - Bit Test with Compliment (bit teszt)
BTC cl, forrs
A cl adat forrs-adik bitjnek trolsa a CF-be, s az eredeti bit neglsa. (Csak a 386-os
processzortl hasznlhat.)
Mdostott flagek: CF
BTR - Bit Test with Reset (bit teszt)
BTR cl, forrs
A cl adat forrs-adik bitjnek trolsa a CF-be, s az eredeti bit trlse. (Csak a 386-os
processzortl hasznlhat.)
Mdostott flagek: CF
BTS - Bit Test and Set (bit teszt)
BTS cl, forrs
A cl adat forrs-adik bitjnek trolsa a CF-be, s ez eredeti bit belltsa 1-re. (Csak a
386-os processzortl hasznlhat.)
Mdostott flagek: CF
CALL - Procedure Call (szubrutinhvs)
CALL cm
A program mkdse a cm cmknl folytatdik. A CS:IP (utastspointer) rtkt a
stack-re menti, majd a CS:IP-be a cm cme kerl.
(Kzeli hvs esetn csak az IP-t mdostja.)
Mdostott flagek: CBW - Convert Byte to Word (konvertls bjtbl szba)
CBW
Az AL-ben lv rtket AX-be konvertlja gy, hogy a 8. biten lv eljelet tmsolja a
16. bitre.
Mdostott flagek: -

98

Gimesi Lszl 2015.

CDQ - Convert Double to Quad (konvertls duplaszbl ngybjtosba)


CDQ
EAX tartalmnak konvertlsa EDX:EAX-be. Csak 386-os processzortl.
Mdostott flagek: CLC - Clear Carry (CF trlse)
CLC
Trli a CF jelzbitet.
Mdostott flagek: CF
CLD - Clear Direction Flag (DF trlse)
CLD
Trli a DF (direction) jelzbitet. A sztringkezel utastsok esetn az SI illetve DI
indexregiszterek nvekedni fognak.
Mdostott flagek: DF
CLI - Clear Interrupt Flag (interrupt letilts)
CLI
Trli az IF interrupt jelzbitet. Letiltja a hardver megszaktskrsek fogadst.
Mdostott flagek: IF
CLTS - Clear Task Switched Flag (taskvlts-bit trlse)
CLTS
Trli a taszkvlts-bitet a gp llapot regiszterben. (286- as processzortl, privilegizlt
mdban hasznlhat)
Mdostott flagek: CMC - Complement Carry Flag (CF komplementlsa)
CMC
Komplementlja (ellenkezjre vltoztatja) a CF-et.
Mdostott flagek: CF
CMP Compare (sszehasonlts)
CMP cl, forrs
A cl s forrs sszehasonltsa. A mvelet sorn gy lltja be a flag regisztert, mintha cl
forrs kivonst vgzett volna.
Mdostott flagek: AF, CF, OF, PF, SF, ZF

99

Intel processzorok programozsa assembly nyelven

CMPS - Compare String (Byte, Word or Doubleword) (kt sztring sszehasonltsa)


CMPS cl, forrs
A cl cmen s a forrs cmen kezdd sztringek sszehasonltsa.
CMPSB
CMPSW
CMPSD (386-tl)
A DS:SI s az ES:DI regiszterprokkal megadott kezdcm sztringek sszehasonltsa.
Az SI s a DI, az irnyflag (Direction Flag) llstl fggen cskken vagy n, CMPS (az
operandus tpustl fggen) automatikusan, CMPB (bjt) eggyel, CMPW (word) kettvel
s CMPD (double) nggyel. A REP utastssal egytt hasznlhat.
Mdostott flagek: AF, CF, OF, PF, SF, ZF
CMPXCHG - Compare and Exchange (sszehasonlts s csere)
CMPXCHG cl, forrs
A cl-t sszehasonltja az akkumultorral (AL, AX, EAX). Ha egyenl, a forrs rtke a
cl-ba kerl, egybknt a cl az akkumultorba rdik. (Csak 486-os processzortl)
Mdostott flagek: AF, CF, OF, PF, SF, ZF
CWD - Convert Word to Doubleword (konvertls szbl duplaszba)
CWD
AX tartalmnak DX:AX-be konvertlsa. Az eljel a CX legnagyobb helyi rtk bitje
lesz.
Mdostott flagek: CWDE - Convert Word to Extended Doubleword (konvertls szbl duplaszba)
CWDE
AX tartalmnak EAX-be konvertlsa. Csak 386-os processzortl.
Mdostott flagek: DAA - Decmal Adjust for Addition (BCD szmok sszeadsa)
DAA
Kt BCD szm sszeadsa utn az eredmnyt BCD alakra konvertlja.
Mdostott flagek: AF, CF, PF, SF, ZF (OF bizonytalan)
Plda: Adjuk ssze a 25h s a 69h BCD szmokat, az eredmny 8Eh lesz. Alkalmazva a DAA
utastst kapjuk a helyes 94h eredmnyt.
DAS - Decimal Adjust for Subtraction (BCD szmok kivonsa)
DAS
Kt BCD szm kivonsa utn az eredmnyt BCD alakra konvertlja.
Mdostott flagek: AF, CF, PF, SF, ZF (OF bizonytalan)
Mkdse hasonl a DAA utastssal.

100

Gimesi Lszl 2015.

DEC Decrement (cskkents 1-el)


DEC cl
A cl operandus rtkbl 1-et levon.
Mdostott flagek: AF OF PF SF ZF
DIV Divide (eljel nlkli oszts)
DIV forrs
16bit esetn: AX osztsa a forrs-sal, az eredmny AL-be, a maradk AH-ba kerl.
32bit esetn: DX:AX osztsa a forrs-sal, az eredmny AX-be, a maradk DX-be kerl.
64bit esetn: EDX:EAX osztsa a forrs-sal, az eredmny EAX-be, a maradk EDX-be
kerl.
Mdostott flagek: (AF,CF,OF,PF,SF,ZF bizonytalan)
ENTER - Make Stack Frame (veremkeret elksztse)
ENTER memria szint
A magasszint nyelvek ltal hasznlt veremkeret elksztse. A memria adja meg, hogy
mennyi dinamikus hely kell a hvott rutinnak, a szint a rutinok egymsba gyazsi szintjt
adja. (80188-os processzortl.)
Mdostott flagek: ESC Escape (trsprocesszor vezrlse)
ESC kd, forrs
A kd opercis kdot s a forrs memriacmet kirja a busz adat s cmvonalra.
Tbbprocesszoros rendszereknl a msik processzor vezrlsre szolgl. Ekkor a kd a
processzornak szl utasts, a forrs pedig az operandus cme.
Mdostott flagek: HLT - Halt CPU (CPU lelltsa)
HLT
A processzor HALT (lelltott) llapotba kerl. Folytats csak hardver interrupt-al (ha az
engedlyezett) vagy jraindtssal (a RESET vonal 1-be lltsval) lehetsges. Hardver
interrupt esetn folytats az aktulis CS:IP cmtl.
Mdostott flagek: IDIV - Signed Integer Division (eljeles oszts)
IDIV for
Hasonl a DIV utastshoz. A mveletet eljelhelyesen hajtja vgre.
Mdostott flagek: (AF, CF, OF, PF, SF, ZF bizonytalan)

101

Intel processzorok programozsa assembly nyelven

IMUL - Signed Multiply (eljeles szorzs)


IMUL forrs
8 bit esetn: AL tartalmt megszorozza a forrs-sal, az eredmny AX-be kerl.
16 bit esetn: AX tartalmt megszorozza a forrs-sal, az eredmny DX:AX-be kerl.
32 bit esetn: EAX tartalmt megszorozza a forrs-sal, az eredmny EDX:EAX-be kerl.
IMUL regiszter, konstans (286-tl)
A regiszter-t megszorozza a konstans-sal, az eredmny a regiszter-be kerl. (16 vagy 32
bites szorzs.)
IMUL regiszter, forrs, konstans (286-tl)
A konstans-t megszorozza a forrs-sal (regiszter vagy memriacm), az eredmny a
regiszter-be (16 bites!) kerl.
IMUL regiszter, forrs (386-tl)
A regiszter-t megszorozza a forrs-sal (regiszter vagy memriacm), az eredmny a
regiszter-be kerl. (16 vagy 32 bites szorzs.)
Mdostott flagek: CF, OF (AF, PF, SF, ZF bizonytalan)
Plda:

imul

dx,514

; DX szorzsa 514-el, eredmny DX-be

imul

ax, [bx], 12 ; BX cmen lv rtk szorzsa 12-vel, eredmny AX-be

imul

dx, ax

; DX s AX szorzsa, eredmny DX-be

imul

ax, [bx]

; BX cmen lv rtk szorzsa AX-el, eredmny AX-ben

IN - Input Byte or Word From Port (portrl adat beolvass)


IN cl, port
A cl (AL, AX vagy EAX) feltltse a port (8 bit) ltal cmzett I/O portrl.
A port helyett a DX regiszterben is megadhat a szma, ekkor 16 bites lehet az rtke.
Megjegyzs: IBM PC-n 10 bites (0-1023) lehet a portszm.
Mdostott flagek: INC Increment (nvels 1-el)
INC cl
A cl operandus rtkhez 1-et hozzad.
Mdostott flagek: AF, OF, PF, SF, ZF

102

Gimesi Lszl 2015.

INS - Input String from Port (sztring beolvass)


INS cl, port
Az ES:DI (ES:EDI) kezdcm memria feltltse a port-rl. (80188-tl)
INSB
INSW
INSD (386-tl)
Az ES:DI (ES:EDI) kezdcm memria feltltse a port-rl.
A DI, az irnyflag (Direction Flag) llstl fggen cskken vagy n, INS (az operandus
tpustl fggen) automatikusan, INSB (bjt) eggyel, INSW (word) kettvel s INSD
(double) nggyel.
A port helyett itt is hasznlhat a DX regiszter (16 bit).
Mdostott flagek: INT Interrupt (megszakts)
INT konstans
A konstans sorszm szoftverinterrupt indtsa. Hatsra a stack-re irdik a CS s az IP
majd a CS:IP-be kerl az interrupt-vektor tblbl a konstans-nak megfelel interrupt
szoftver cme.
Mdostott flagek: TF, IF
INTO - Interrupt on Overflow (megszakts)
INTO
OF = 1 esetn indtja az INT 4 (0000:0010 cm) interrupt-ot.
Mdostott flagek: IF, TF
INVD - Invalidate Cache (bels cache trlse)
INVD
Trli a CPU bels cache-t. Egy specilis buszciklus segtsgvel a kls cache is
trlhet. (Csak 486-os processzortl.)
Mdostott flagek: INVLPG - Invalidate Translation Look-Aside Buffer Entry (TLB belps rvnytelentse)
INVLPG
Trli a TLB (Translation Look-Aside Buffer) belpst. (Pldul a virtulis memria
lapozsnl hasznlhat.) (Csak 486-os processzortl.)
Mdostott flagek: -

103

Intel processzorok programozsa assembly nyelven

IRET/IRETD - Interrupt Return (visszatrs megszaktsbl)


IRET
IRETD (386-tl)
Visszatrs interrupt rutinbl. A stack-re elmentett visszatrsi cmet betlti a CS:IP
regiszterprba.
Mdostott flagek: AF, CF, DF, IF, PF, SF, TF, ZF
JA/JNBE - Jump Above / Jump Not Below or Equal (ugrs, ha nagyobb)
JA cm
JNBE cm
Ugrs a cm-re, ha CF = 0 s ZF = 0. Eljel nlkli nagyobb illetve nem kisebb-egyenl.
Mdostott flagek: JAE/JNB/JNC - Jump Above or Equal / Jump on Not Below / Jump Not Carry (ugrs, ha
nem kisebb)
JAE cm
JNB cm
JNC cm
Ugrs a cm-re, ha CF = 0. Eljel nlkli nagyobb-egyenl illetve nem kisebb.
Mdostott flagek: JB/JNAE/JC - Jump Below / Jump Not Above or Equal / Jump on Carry (ugrs, ha kisebb)
JB cm
JNAE cm
JC cm
Ugrs a cm-re, ha CF = 1. Eljel nlkli kisebb illetve nem nagyobb-egyenl.
Mdostott flagek: JBE/JNA - Jump Below or Equal / Jump Not Above (ugrs, ha nem nagyobb)
JBE cm
JNA cm
Ugrs a cm-re, ha CF = 1 vagy ZF = 1. Eljel nlkli kisebb-egyenl illetve nem nagyobb.
Mdostott flagek: -

104

Gimesi Lszl 2015.

JCXZ/JECXZ - Jump if Register (E)CX is Zero (ugrs, ha CX nulla)


JCXZ cm
JECXZ cm (386-tl)
Ugrs a cm-re, ha CX = 0 illetve ECX = 0. Eljel nlkli sszehasonlts.
Mdostott flagek: JE/JZ - Jump Equal / Jump Zero (ugrs, ha egyenl)
JE cm
JZ cm
Ugrs a cm-re, ha ZF = 1. Eljel nlkli egyenl.
Mdostott flagek: JG/JNLE - Jump Greater / Jump Not Less or Equal (ugrs, ha nagyobb)
JG cm
JNLE cm
Ugrs a cm-re, ha ZF = 0 s SF = OF. Eljeles nagyobb illetve nem kisebb-egyenl.
Mdostott flagek: JGE/JNL - Jump Greater or Equal / Jump Not Less (ugrs, ha nem kisebb)
JGE cm
JNL cm
Ugrs a cm-re, ha SF = OF. Eljeles nagyobb-egyenl illetve nem kisebb.
Mdostott flagek: JL/JNGE - Jump Less / Jump Not Greater or Equal (ugrs, ha kisebb)
JL cm
JNGE cm
Ugrs a cm-re, ha SF OF. Eljeles kisebb illetve nem nagyobb-egyenl.
Mdostott flagek: JLE/JNG - Jump Less or Equal / Jump Not Greater (ugrs, ha nem nagyobb)
JLE cm
JNG cm
Ugrs a cm-re, ha ZF = 1 or SF OF. Eljeles kisebb-egyenl illetve nem nagyobb.
Mdostott flagek: -

105

Intel processzorok programozsa assembly nyelven

JMP - Unconditional Jump (felttel nlkli vezrlstads)


JMP cm
Vezrlstads a cm cmre. A CS:IP utastsregiszterbe berja a cm-et.
Kzeli hvs esetn csak az IP vltozik.
Mdostott flagek: JNE/JNZ - Jump Not Equal / Jump Not Zero (ugrs, ha nem egyenl)
JNE cm
JNZ cm
Ugrs a cm-re, ha ZF = 0. Eljel nlkli nem egyenl.
Mdostott flagek: JNO - Jump Not Overflow (ugrs, ha nincs tlcsorduls)
JNO cm
Ugrs a cm-re, ha OF = 0. Eljeles sszehasonlts.
Mdostott flagek: JNS - Jump Not Signed (ugrs, ha nincs eljel)
JNS cm
Ugrs a cm-re, ha SF = 0. Eljeles sszehasonlts.
Mdostott flagek: JNP/JPO - Jump Not Parity / Jump Parity Odd (ugrs, ha a parits pratlan)
JNP cm
JPO cm
Ugrs a cm-re, ha PF = 0.
Mdostott flagek: JO - Jump on Overflow (ugrs tlcsorduls esetn)
JO cm
Ugrs a cm-re, ha OF = 1.
Mdostott flagek: JP/JPE - Jump on Parity / Jump on Parity Even (ugrs, pros parits esetn)
JP cm
JPE cm
Ugrs a cm-re, ha PF = 1.
Mdostott flagek: -

106

Gimesi Lszl 2015.

JS - Jump Signed (ugrs, ha az eredmny negatv)


JS cm
Ugrs a cm-re, ha SF = 1. Eljeles sszehasonlts.
Mdostott flagek: LAHF - Load Register AH From Flags (flag regiszter msolsa AH-ba)
LAHF
A flag regiszter als 8 bitjt AH-ba msolja.
Mdostott flagek: LAR - Load Access Rights (hozzfrsi jog betltse)
LAR cl, forrs
A forrs ltal lert szelektor tartalmt a cl fels bjtjba rja, az als bjtba nulla kerl. ZF
rtke 1, ha a betlts sikeres. (286-os processzortl, vdett mdban)
Mdostott flagek: ZF
LDS - Load Pointer Using DS (mutat betltse)
LDS cl, forrs
A forrs (32 bites) pointer betltse a DS:cl regiszterprba. A forrs els s msodik
bjtja a cl regiszterbe, a harmadik s negyedik bjtja a DS-be kerl. Tvoli (far) pointerek
meghatrozsnl hasznlhat. Segtsgvel cmezhetnk msik szegmensen lv
memrit.
Mdostott flagek: LEA - Load Effective Address (szegmensen belli memriacm betltse)
LEA cl, forrs
A forrs offset cmnek betltse a cl operandusba.
Mdostott flagek: (Hatsa megegyezik a MOV cl, OFFSET forrs utastssal.)
LEAVE - Restore Stack for Procedure Exit (kilps az aktulis veremkeretbl)
LEAVE
Loklis vltozk felszabadtsa (ENTER utasts fordtottja). Visszalltja az eredeti
(ENTER eltti) SP s BP regiszterek tartalmt. gy a kvetkez RET utastssal
visszatrhetnk a hv eljrshoz.
Mdostott flagek: -

107

Intel processzorok programozsa assembly nyelven

LES - Load Pointer Using ES (mutat betltse)


LES cl, forrs
A forrs (32 bites) pointer betltse az ES:cl regiszterprba. A forrs els s msodik
bjtja a cl regiszterbe, a harmadik s negyedik bjtja az ES-be kerl. Tvoli (far)
pointerek meghatrozsnl hasznlhat. Segtsgvel cmezhetnk msik szegmensen
lv memrit.
Mdostott flagek: LFS - Load Pointer Using FS (mutat betltse)
LFS cl, forrs
A forrs (32 bites) pointer betltse az ES:cl regiszterprba. A forrs els s msodik
bjtja a cl regiszterbe, a harmadik s negyedik bjtja az FS-be kerl. Tvoli (far) pointerek
meghatrozsnl hasznlhat. Segtsgvel cmezhetnk msik szegmensen lv
memrit. (386-os processzortl.)
Mdostott flagek: LGDT - Load Global Descriptor Table (adatbetlts a GDT tblba)
LGDT forrs
A forrs cmen lv adat betltse a GDT-be (Global Descriptor Table). (286-os
processzortl, csak vdett mdban.)
Mdostott flagek: LIDT - Load Interrupt Descriptor Table (adatbetlts az IDT tblba)
LIDT forrs
A forrs cmen lv adat betltse az IDT-be (Interrupt Descriptor Table). (286-os
processzortl, csak vdett mdban.)
Mdostott flagek: LGS - Load Pointer Using GS (mutat betltse)
LGS cl, forrs
A forrs (32 bites) pointer betltse az ES:cl regiszterprba. A forrs els s msodik
bjtja a cl regiszterbe, a harmadik s negyedik bjtja az GS-be kerl. Tvoli (far)
pointerek meghatrozsnl hasznlhat. Segtsgvel cmezhetnk msik szegmensen
lv memrit. (386-os processzortl.)
Mdostott flagek: -

108

Gimesi Lszl 2015.

LLDT - Load Local Descriptor Table (adatbetlts az LDTR tblba)


LLDT forrs
A forrs betltse az LDTR-be (Local Descriptor Table Register). (286-os processzortl,
csak vdett mdban.)
Mdostott flagek: LMSW - Load Machine Status Word (adatbetlts az MSW-be)
LMSW forrs
A forrs betltse az MSW-be (Machine Status Word). (286-os processzortl, csak vdett
mdban.)
Mdostott flagek: LOCK - Lock Bus (CPU buszainak lezrsa)
LOCK
Utasts eltt (prefix) kell megadni. Hasznlatakor az utasts vgrehajtsnak idejre
lezrja a CPU buszait, hogy a vgrehajts sorn (pldul tbb processzor esetn) a
processzor ne fogadhasson jabb utastst.
Mdostott flagek: LODS - Load String (Byte, Word or Double)
LODSB
LODSW
LODSD (386-tl)
A DS:SI regiszterprokkal megadott kezdcm sztring msolsa AL, AX vagy EAX
regiszterbe.
Az SI az irnyflag (Direction Flag) llstl fggen cskken vagy n, LODS (az operandus
tpustl fggen) automatikusan, LODSB (bjt) eggyel, LODSW (word) kettvel s
LODSD (double) nggyel. A LOOP utastssal egytt hasznlhat.
Mdostott flagek: LOOP - Decrement CX and Loop if CX Not Zero (ciklus)
LOOP cm
A LOOP utasts s a cm kztti utastsokat a CX-ben trolt szmszor hajtja vgre. A
LOOP a CX rtkt eggyel cskkenti s a cm-et az IP-be rja, ezt a CX=0 rtkig folytatja.
A LOOP s a feltteles vezrlstadsnl csak 8 bites relatv cmzs lehetsges. Azaz -128
vagy 127 bjtnl nem lehet hosszabb az ugrs.
Mdostott flagek: -

109

Intel processzorok programozsa assembly nyelven

LOOPE/LOOPZ - Loop While Equal / Loop While Zero (ciklus)


LOOPE cm
LOOPZ cm
A ciklus addig tartat, amg CX vagy a ZF nem nulla.
Mkdse hasonl a LOOP-hoz.
Mdostott flagek: LOOPNZ/LOOPNE - Loop While Not Zero / Loop While Not Equal
LOOPNZ cm
LOOPNE cm
A ciklus addig tartat, amg CX nem nulla s a ZF nulla.
Mkdse hasonl a LOOP-hoz.
Mdostott flagek: LSL - Load Segment Limit (szegmens-hatrrtk betltse)
LSL cl, forrs
A szegmens-hatrrtk (forrs) betltse a cl regiszterbe. Sikeres betlts esetn ZF
egybe ll, egybknt nulla. (286-os processzortl, vdett mdban.)
Mdostott flagek: ZF
LSS - Load Pointer Using SS (mutat betltse)
LSS cl, forrs
A forrs (32 bites) pointer betltse az ES:cl regiszterprba. A forrs els s msodik
bjtja a cl regiszterbe, a harmadik s negyedik bjtja az SS-be kerl. Tvoli (far) pointerek
meghatrozsnl hasznlhat. Segtsgvel cmezhetnk msik szegmensen lv
memrit. (386-os processzortl.)
Mdostott flagek: LTR - Load Task Register (taszkregiszter betltse)
LTR forrs
A forrs betltse a taszk regiszterbe.
Mdostott flagek: MOV - Move Byte or Word (bjt vagy sz mozgatsa)
MOV cl, forrs
A forrs tartalmt a cl operandusba rja. (A cl eredeti rtke elvsz.)
Mdostott flagek: -

110

Gimesi Lszl 2015.

MOVS - Move String (sztring mozgats)


MOVS cl, forrs
A forrs cmen kezdd sztring msolsa, a cl cmre.
MOVSB
MOVSW
MOVSD (386-tl)
A DS:SI regiszterprokkal megadott kezdcm sztring msolsa az ES:DI cmre.
Az SI s a DI, az irnyflag (Direction Flag) llstl fggen cskken vagy n, MOVS (az
operandus tpustl fggen) automatikusan, MOVSB (bjt) eggyel, MOVSW (word) kettvel s MOVSD (double) nggyel. A REP utastssal egytt hasznlhat.
Mdostott flagek: MOVSX - Move with Sign Extend (eljeles adatmozgats)
MOVSX cl, forrs
A forrs operandus rtknek msolsa a cl regiszterbe eljelhelyesen. (Pldul 8 bites
forrs s 16 bites cl esetn eljelhelyes lesz az tvitel.) (Csak 386-os processzortl.)
Mdostott flagek: MOVZX - Move with Zero Extend (adatmozgats)
MOVZX cl, forrs
A forrs operandus rtknek eljel nlkli msolsa a cl regiszterbe. Klnbz
hosszsg operandusok (rvidebb cl) esetn a plusz biteket nullval tlti fel. (Csak 386os processzortl.)
Mdostott flagek: MUL - Unsigned Multiply (eljel nlkli szorzs)
MUL forrs
8 bit esetn: AL tartalmt megszorozza a forrs-sal, az eredmny AX-be kerl.
16 bit esetn: AX tartalmt megszorozza a forrs-sal, az eredmny DX:AX-be kerl.
32 bit esetn: EAX tartalmt megszorozza a forrs-sal, az eredmny EDX:EAX-be kerl.
Mdostott flagek: CF, OF (AF, PF, SF, ZF bizonytalan)
NEG - Two's Complement Negation (negls)
NEG cl
A cl rtkt neglja, a kettes komplemenst kpzi.
Mdostott flagek: AF, CF, OF, PF, SF, ZF

111

Intel processzorok programozsa assembly nyelven

NOP - No Operation (nincs mvelet)


NOP
res utasts.
Mdostott flagek: NOT - One's Compliment Negation (logikai NEM)
NOT cl
A cl tartalmt bitenknt neglja (egyes komplemens).
Mdostott flagek: OR - Inclusive Logical OR (bitenknti VAGY)
OR cl, forrs
A forrs OR cl logikai mvelet vgrehajtsa. Az eredmny a cl helyre kerl.
Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)
OUT - Output Data to Port
OUT port, forrs
A forrs (AL, AX vagy EAX) tartalmnak kirsa a port (8 bit) ltal cmzett I/O portra.
A port helyett a DX regiszterben is megadhat a szma, ekkor 16 bites lehet az rtke.
Megjegyzs: IBM PC-n 10 bites (0-1023) lehet a portszm.
Mdostott flagek: OUTS - Output String to Port (sztring kirsa)
OUTS port, forrs
Az ES:DI (ES:EDI) cmen kezdd sztring kirsa a port-ra. (80188-tl)
OUTSB
OUTSW
OUTSD (386-tl)
Az ES:DI (ES:EDI) cmen kezdd sztring kirsa a port-ra.
A DI, az irnyflag (Direction Flag) llstl fggen cskken vagy n, OUTS (az operandus
tpustl fggen) automatikusan, OUTSB (bjt) eggyel, OUTSW (word) kettvel s
OUTSD (double) nggyel.
A port helyett itt is hasznlhat a DX regiszter (16 bit).
Mdostott flagek: -

112

Gimesi Lszl 2015.

POP - Pop Word off Stack (adat visszatlts stack-bl)


POP cl
A stack tetejn (SS:SP) lv adat bersa a cl operandusba. Az SP regiszter rtkt 2-vel
(16 bites szhossz) vagy 4-el (32 bites szhossz) nveli.
Mdostott flagek: POPA/POPAD - Pop All Registers onto Stack (adat visszatlts stack-bl)
POPA (80188-tl)
POPAD (386-tl)
A stack tetejn lv 8 adat bersa az (E)DI, (E)SI, (E)BP, (E)SP, (E)BX, (E)DX, (E)CX,
(E)AX regiszterekbe. (A megadott sorrendben!) Az SP rtkt aktualizlja.
Mdostott flagek: POPF/POPFD - Pop Flags off Stack (flag regiszter feltltse a stack-bl)
POPF
A stack tetejn (SS:SP) lv adat bersa a flag regiszterbe. Az SP regiszter rtkt 2-vel
(16 bites szhossz) vagy 4-el (32 bites szhossz) nveli.
Mdostott flagek: sszes flag
386-os (32 bites) processzortl hasznlhat a POPFD utasts.
PUSH - Push Word onto Stack (adat mentse a stack-be)
PUSH forrs
PUSH immed (80188-tl)
A forrs (1 sz hossz) trolsa a stack-ben. Az SP regiszter rtkt 2-vel (16 bites
szhossz) vagy 4-el (32 bites szhossz) cskkenti.
Mdostott flagek: A stack memria cmt az SS:SP regiszterpr tartalmazza.
PUSHA/PUSHAD - Push All Registers onto Stack (adat mentse a stack-be)
PUSHA (80188-tl)
PUSHAD (386-tl)
Az (E)AX, (E)CX, (E)DX, (E)BX, (E)SP, (E)BP, (E)SI, (E)DI regiszterek tartalmnak
msolsa a stack-re. (A megadott sorrendben!) Az SP rtkt aktualizlja.
Mdostott flagek: PUSHF/PUSHFD - Push Flags onto Stack (flag regiszter mentse a stack-be)
PUSHF
A flag regiszter (1 sz hossz) trolsa a stack-ben. Az SP regiszter rtkt 2-vel (16 bites
szhossz) vagy 4-el (32 bites szhossz) cskkenti.
Mdostott flagek: 386-os (32 bites) processzortl hasznlhat a PUSHFD utasts.
113

Intel processzorok programozsa assembly nyelven

RCL - Rotate Through Carry Left (rotls balra carry-n keresztl)


RCL cl, szm
A cl bitenknti rotlsa balra, a CF-en keresztl, szm-szor. A baloldalon kikerl bit a
CF-be irdik, a CF rgi rtke a legkisebb helyi rtkre kerl.
Mdostott flagek: CF, OF
RCR - Rotate Through Carry Right (rotls jobbra carry-n keresztl)
RCR cl, szm
A cl bitenknti rotlsa jobbra, a CF-en keresztl, szm-szor. A jobboldalon kikerl bit a
CF-be rdik, a CF rgi rtke a legmagasabb helyi rtkre kerl.
Mdostott flagek: CF, OF
REP - Repeat String Operation (sztringkezel utastsok ismtlse)
REP utasts
Az utasts tbbszri vgrehajtsa, amg a CX nem nulla. Az ismtlsek szmt CX-be
kell tlteni. A REP utasts a CX rtkt mveletenknt eggyel cskkenti. (Prefix
utasts)
Mdostott flagek: REPE/REPZ - Repeat Equal / Repeat Zero (sztringkezel utastsok ismtlse)
REPE utasts
REPZ utasts
Az utasts tbbszri vgrehajtsa, amg a CX vagy a ZF nem nulla (addig, amg a
karakterek megegyeznek). Az ismtlsek szmt CX-be kell tlteni. Az utasts a CX
rtkt mveletenknt eggyel cskkenti. (Prefix utasts)
Mdostott flagek: REPNE/REPNZ - Repeat Not Equal / Repeat Not Zero (sztringkezel utastsok ismtlse)
REPNE utasts
REPNZ utasts
Az utasts tbbszri vgrehajtsa, amg a CX nem nulla s a ZF nulla (addig, amg a
karakterek klnbzek). Az ismtlsek szmt CX-be kell tlteni. Az utasts a CX
rtkt mveletenknt eggyel cskkenti. (Prefix utasts)
Mdostott flagek: -

114

Gimesi Lszl 2015.

RET/RETF - Return From Procedure (visszatrs szubrutinbl)


RET konstans
RETF konstans
RETN konstans
A stack tetejn lv rtket betlti a CS:IP regiszterprba, gy a kvetkez utastst az j
CS:IP cmrl veszi. Amennyiben a konstans-t (bjtos rtk) megadjuk, akkor a visszatrsi
cm belltsa utn az SP-t konstans szm bjtal megnveli (adattads stack-en
keresztl).
RETF (far) tvoli, RETN (near) kzeli hvskor hasznlhat. Kzeli hvskor csak az IP
vltozik.
Mdostott flagek: ROL - Rotate Left (rotls balra)
ROL cl, szm
A cl bitenknti rotlsa balra, szm-szor. A baloldalon kikerl bit a legkisebb helyi
rtkre s a CF-be rdik.
Mdostott flagek: CF, OF
ROR - Rotate Right (rotls jobbra)
ROR cl, szm
A cl bitenknti rotlsa jobbra, szm-szor. A jobboldalon kikerl bit a legmagasabb helyi
rtkre s a CF-be rdik.
Mdostott flagek: CF, OF
SAHF - Store AH Register into FLAGS (AH-t a flag regiszterbe msol)
SAHF
Az AH regiszter tartalmt a flag regiszter als 8 bitjre msolja.
Mdostott flagek: AF, CF, PF, SF, ZF
SAL - Shift Arithmetic Left (aritmetikai shift balra)
SAL cl, szm
A cl bitenknti shiftelse balra szm-szor. A baloldalon kikerl bit a CF-be rdik, a
legkisebb helyi rtkre 0 kerl.
Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)
SAR - Shift Arithmetic Right (aritmetikai shift jobbra)
SAR cl, szm
A cl bitenknti shiftelse jobbra szm-szor. A jobboldalon kikerl bit a CF-be rdik, a
legmagasabb helyi rtkre az utols bit rtke (az eljel) kerl.

115

Intel processzorok programozsa assembly nyelven

Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)


SBB - Subtract with Borrow (kivons)
SBB cl, forrs
A cl-bl kivonja a forrs s a CF rtkt az eredmny a cl-ba kerl.
Mdostott flagek: AF, CF, OF, PF, SF, ZF
SCAS - Scan String (Byte, Word or Doubleword) (sztring karakterenkti vizsglata)
SCAS cl
Az AL, AX, vagy EAX regiszter tartalmt sszehasonltja a cl cm tartalmval.
SCASB
SCASW
SCASD (386-tl)
Az AL, AX vagy EAX regiszter tartalmt sszehasonltja ES:DI regiszterprokkal
megcmzett rtkkel.
A DI, az irnyflag (Direction Flag) llstl fggen cskken vagy n, SCAS (az operandus
tpustl fggen) automatikusan, SCASB (bjt) eggyel, SCASW (word) kettvel s
SCASD (double) nggyel. A LOOP vagy REP utastssal egytt hasznlhat.
Mdostott flagek: AF, CF, OF, PF, SF, ZF
SETAE/SETNB - Set if Above or Equal / Set if Not Below (bjt bellts, ha nem kisebb)
SETAE cl
SETNB cl
A cl = 1, ha CF = 0 (nem kisebb), egybknt: cl = 0. (Eljel nlkli utasts 386-os
processzortl.)
Mdostott flagek: SETB/SETNAE - Set if Below / Set if Not Above or Equal (bjt bellts, ha kisebb)
SETB cl
SETNAE cl
A cl = 1, ha CF = 1 (kisebb), egybknt: cl = 0. (Eljel nlkli utasts 386-os
processzortl.)
Mdostott flagek: -

116

Gimesi Lszl 2015.

SETBE/SETNA - Set if Below or Equal / Set if Not Above (bjt bellts, nem nagyobb)
SETBE cl
SETNA cl
A cl = 1, ha CF = 1 vagy ZF = 1 (nem nagyobb), egybknt: cl = 0. (Eljel nlkli
utasts 386-os processzortl.)
Mdostott flagek: SETNBE/SETA - Set if Below or Equal / Set if Not Above (bjt bellts, nagyobb)
SETNBE cl
SETA cl
A cl = 1, ha CF = 0 s ZF = 0 (nagyobb), egybknt: cl = 0. (Eljel nlkli utasts 386os processzortl.)
Mdostott flagek: SETE/SETZ - Set if Equal / Set if Zero (bjt bellts, ha egyenl)
SETE cl
SETZ cl
A cl = 1, ha ZF = 1 (egyenl), egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETNE/SETNZ - Set if Not Equal / Set if Not Zero (bjt bellts, ha nem egyenl)
SETNE cl
SETNZ cl
A cl = 1, ha ZF = 0 (nem egyenl), egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETL/SETNGE - Set if Less / Set if Not Greater or Equal (bjt bellts, ha kisebb)
SETL cl
SETNGE cl
A cl = 1, ha SF ? OF (kisebb), egybknt: cl = 0. (Eljeles utasts 386-os
processzortl.)
Mdostott flagek: -

117

Intel processzorok programozsa assembly nyelven

SETGE/SETNL - Set if Greater or Equal / Set if Not Less (bjt bellts, kisebb)
SETGE cl
SETNL cl
A cl = 1, ha CS = OF (kisebb), egybknt: cl = 0. (Eljeles utasts 386-os
processzortl.)
Mdostott flagek: SETLE/SETNG - Set if Less or Equal / Set if Not greater or Equal (bjt bellts, ha nem nagyobb)
SETLE cl
SETNG cl
A cl = 1, ha ZF = 1 vagy SF ? OF (nem nagyobb), egybknt: cl = 0. (Eljeles utasts
386-os processzortl.)
Mdostott flagek: SETG/SETNLE - Set if Greater / Set if Not Less or Equal (bjt bellts, nagyobb)
SETG cl
SETNLE cl
A cl = 1, ha ZF = 0 vagy SF = OF (nagyobb), egybknt: cl = 0. (Eljeles utasts 386-os
processzortl.)
Mdostott flagek: SETS - Set if Signed (bjt bellts, ha van eljel)
SETS cl
A cl = 1, ha SF = 1, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETNS - Set if Not Signed (bjt bellts, ha nincs eljel)
SETNS cl
A cl = 1, ha SF = 0 (nem kisebb), egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETC - Set if Carry (bjt bellts, ha van tvitel)
SETC cl
A cl = 1, ha CF = 1, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: -

118

Gimesi Lszl 2015.

SETNC - Set if Not Carry (bjt bellts, ha nincs tvitel)


SETNC cl
A cl = 1, ha CF = 0, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETO - Set if Overflow (386-tl) (bjt bellts, ha van tlcsorduls)
SETO cl
A cl = 1, ha OF = 1, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETNO - Set if Not Overflow (bjt bellts, ha nincs tlcsorduls)
SETNO cl
A cl = 1, ha OF = 0, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETP/SETPE - Set if Parity / Set if Parity Even (bjt bellts, pros parits esetn)
SETP cl
SETPE cl
A cl = 1, ha PF = 1, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SETNP/SETPO - Set if No Parity / Set if Parity Odd (bjt bellts, pratlan parits esetn)
SETNP cl
SETPO cl
A cl = 1, ha PF = 0, egybknt: cl = 0. (386-os processzortl.)
Mdostott flagek: SGDT - Store Global Descriptor Table (GDT regiszter trolsa)
SGDT cl
A GDR (Global Descriptor Table) regiszternek trolsa a cl-ban megadott memriba.
(286-os processzortl, vdett mdban.)
Mdostott flagek: SHL - Shift Logical Left (logikai shift balra)
SHL cl, szm
A cl bitenknti shiftelse balra, szm-szor. A baloldalon kikerl bit a CF-be rdik, a
legkisebb helyi rtkre 0 kerl.
Mdostott flagek: CF, OF, PF, SF, ZF

119

Intel processzorok programozsa assembly nyelven

SHR - Shift Logical Right (logikai shift jobbra)


SHR cl, szm
A cl bitenknti shiftelse jobbra, szm-szor. A jobboldalon kikerl bit a CF-be rdik, a
legmagasabb helyi rtkre 0 kerl.
Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)
SHLD/SHRD - Double Precision Shift (duplapontos lptets)
SHLD cl, forrs, szm
SHRD cl, forrs, szm
A cl bitenknti shiftelse balra (SHLD) vagy jobbra (SHRD), szm-szor (a forrs
regiszterrel egytt). A belp bitek megegyeznek a forrs-bl kilpvel. (386-os
processzortl.)
Mdostott flagek: CF, PF, SF, ZF, (OF, AF bizonytalan)
SIDT - Store Interrupt Descriptor Table (IDT regiszter trolsa)
SIDT cl
Az IDT (Interrupt Descriptor Table) regiszternek betltse a cl ltal megadott
memriba. (286-os processzortl, vdett zemmdban.)
Mdostott flagek: SLDT - Store Local Descriptor Table (LDT regiszter trolsa)
SLDT cl
Az LDT (Local Descriptor Table) regiszternek betltse a cl ltal megadott memriba.
(286-os processzortl, vdett zemmdban.)
Mdostott flagek: SMSW - Store Machine Status Word (MSW trolsa)
SMSW cl
Az MSW (Machine Status Word) betltse a cl-ba. (286-os processzortl, vdett
zemmdban.)
Mdostott flagek: STC - Set Carry (CF egyre lltsa)
STC
A CF (carry) bitet egyre lltja.
Mdostott flagek: CF
STD - Set Direction Flag (DF egyre lltsa)
STD
A DF (direction) jelzbitet egyre lltja. A sztringkezel utastsok esetn az SI illetve DI
indexregiszterek cskkeni fognak.
Mdostott flagek:DF

120

Gimesi Lszl 2015.

STI - Set Interrupt Flag (interrupt engedlyezse)


STI
Az IF interrupt jelzbitet egybe lltja. Engedlyezi a hardver megszaktsok fogadst.
Mdostott flagek:IF
STOS - Store String (Byte, Word or Doubleword) (sztring trolsa)
STOSB
STOSW
STOSD
Az AL, AX vagy EAX regiszter tartalmt ES:DI regiszterprokkal megadott kezdcm
sztringbe msolja.
A DI, az irnyflag (Direction Flag) llstl fggen cskken vagy n, STOS (az operandus
tpustl fggen) automatikusan, STOSB (bjt) eggyel, STOSW (word) kettvel s
STOSD (double) nggyel. A LOOP vagy REP utastssal egytt hasznlhat.
Mdostott flagek: STR - Store Task Register (taszk-regiszter trolsa)
STR cl
A taszk-regisztert a cl-ban trolja. (286-os processzortl, vdett zemmdban.)
Mdostott flagek: SUB Subtract (kivons)
SUB cl, forrs
A cl-bl kivonja a forrs rtkt az eredmny a cl-ba kerl.
Mdostott flagek: AF, CF, OF, PF, SF, ZF
TEST - Test For Bit Pattern (S teszt)
TEST cl, forrs
Megegyezik a logikai AND mvelettel (AND cl, forrs), csak a jelzbiteket lltja, a cl
rtke nem vltozik.
Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)
VERR/VERW - Verify Read/Write (szegmens ellenrzse)
VERR forrs
Ha a forrs-ban megadott szegmens olvashat/rhat, akkor ZF = 1, egybknt ZF = 0.
(286-os processzortl, vdett zemmdban.)
Mdostott flagek: ZF

121

Intel processzorok programozsa assembly nyelven

WAIT/FWAIT - Event Wait (esemnyre vrs)


WAIT
FWAIT
A processzor vrakoz llapotba kerl mindaddig, amg a TEST kivezetsen 0 (low)
szintet nem kap. A wait llapot biztostja a lassbb egysgekkel (DMA, memria,
coprocesszor) trtn szinkronizlst.
Mdostott flagek: WBINVD - Write-Back and Invalidate Cache (cache visszars)
WBINVD
A CPU bels cache-t kirja a memriba, majd trli azt. (Csak 486-os processzortl.)
Mdostott flagek: XCHG Exchange (csere)
XCHG cl, forrs
A cl s a forrs rtkeinek felcserlse.
Mdostott flagek: XLAT Translate (ttlts)
XLAT
Az AL regiszterbe tlti a BX:AL (segment:offset) memriacm tartalmt. Segtsgvel egy
maximum 256 bjt hosszsg adattbla AL-edik elemt olvashatjuk ki. A tbla
kezdcme BX-ben van.
Mdostott flagek: A MASM 5.x-tl hasznlhat helyette az XLATB utasts.
XOR - Exclusive OR (bitenknti KIZR VAGY)
XOR cl, forrs
A forrs XOR cl logikai mvelet vgrehajtsa. Az eredmny a cl helyre kerl.
Mdostott flagek: CF, OF, PF, SF, ZF (AF bizonytalan)

122

Gimesi Lszl 2015.

11. Lebegpontos utastskszlet


Az utastsok ismertetse utn felsoroljuk azokat a matematikai processzor tpusokat, amelyek
hasznljk az adott utastst. (A 486-os processzortl mr mindegyik lebegpontos utasts hasznlhat, gy ezek nem szerepelnek a felsorolsban.)
Az ST(0) lebegpontos regisztert szoks ST-knt is nevezni.
F2XM1 2x-1 (Y = 2x 1 kiszmtsa)
F2XM1
Paramter nlkli utasts. X-et az ST(0)-rl veszi s Y rtkt ST(0)-ra teszi.
FABS ABSolute value (Vals szmok abszolt rtke)
FABS
ST(0) ban lv rtk abszolt rtke.
FADD/FADDP/FIADD Add (Vals szmok sszeadsa)
FADD
Paramter nlkli utasts. ST(1)-be msolja ST(1) s ST(0) sszegt.
ST(1) lesz a stack teteje (ST).
FADDP reg, ST

(pl. FADDP ST(6), ST)

ST(0) s egy tetszleges lebegpontos regiszter sszeadsa, eredmny a regiszterbe.


Egy elemet leemel a verembl.
FADD ST, reg
ST(0) s egy tetszleges lebegpontos regiszter sszeadsa, eredmny ST(0)-ba.
FADD reg, ST
ST(0) s egy tetszleges lebegpontos regiszter sszeadsa, eredmny a regiszterbe.
Egy elemet leemel a verembl.
FADD forrs

(pl. FADD QWORD PTR [BX])

ST(0)-ba msolja ST(0) s a forrs sszegt. (A forrs 32 s 64 bites lehet.)


FIADD forrs

(pl. FADD data[DI])

ST(0)-ba msolja ST(0) s a forrs sszegt. (A forrs egsz tpus.)


FADD ST(n)
ST(0)-ba msolja ST(0) s ST(n) sszegt.
FCHS Change Sign (Eljelvlts)
FCHS
ST(0) eljelt megvltoztatja.

123

Intel processzorok programozsa assembly nyelven

FCLEX/FNCLEX Clear Exception (Kivtelek trlse)


FCLEX
Trli az llapotszban a kivtel, az IR s a B jelzbiteket.
FNCLEX
Trli az llapotszban a kivtel, az IR s a B jelzbiteket. Nem vgez ellenrzst.
FCOM/FCOMP/FCOMPP/FICOM/FICOMP Compare (sszehasonlts)
FCOM
ST(0) s ST(1) sszehasonltsa.
FCOM reg

(pl. FCOM ST(3))

ST(0) s ST(n) sszehasonltsa.


FCOM forrs

(pl. FCOM data[DI])

ST(0) s a forrs sszehasonltsa. (A forrs 32 s 64 bites adat lehet)


FCOMP reg
ST(0) s ST(n) sszehasonltsa. Veremrl leemeli az ST(0)-t.
FCOMP forrs
ST(0) s a forrs sszehasonltsa. (A forrs 32 s 64 bites adat lehet)
Veremrl leemeli az ST(0)-t.
FCOMPP
ST(0) s ST(1) sszehasonltsa. Veremrl leemeli az ST(0)-t s ST(1)-et.
FICOM forrs

(pl. FICOM WORD PTR [BP+6])

ST(0) s a forrs sszehasonltsa. (A forrs egsz tpus)


FICOMP forrs

(pl. FICOM WORD PTR [BP+6])

ST(0) s a forrs sszehasonltsa. Veremrl leemeli az ST(0)-t. (A forrs egsz tpus)


Sttuszbitek llsa:
C3
C2

C1

C0

Relci

ST > forrs

ST < forrs

ST = forrs

ST nem sszehasonlthat

FCOS Cosine (Koszinusz szmtsa)


FCOS
ST(0)-be ST(0) koszinusza
FDECSTP Decrement Stack Pointer (Veremmutat cskkentse)
FDECSTP
A koprocesszor veremmutatjt eggyel cskkenti. Ha az 0, akkor 7-re lltja.

124

Gimesi Lszl 2015.

FDISI/FNDISI Disable Interrupts (Megszaktsok letiltsa)


FDISI, FNDISI
Megakadlyozza a koprocesszor megszaktst
FDIV/FDIVP/FIDV Divide (Vals oszts)
FDIV
ST(1)-be ST(1) s ST(0) hnyadosa. Veremrl leemeli az ST(0)-t.
FDIV ST, reg

(pl. FDIV ST, ST(n))

ST(0)-ba ST(0) s ST(n) hnyadosa.


FDIV reg, ST

(pl. FDIV ST(n), ST)

ST(n)-ba ST(n) s ST(0) hnyadosa.


FDIV forrs

(pl. FDIV DWORD PTR [BX])

ST(0) osztsa a forrs-al, az eredmny ST(0)-ba (A forrs 32 s 64 bites adat lehet)


FDIVP ST, reg

(pl. FDIVP ST, ST(n))

ST(0)-ba ST(0) s ST(n) hnyadosa. Veremrl leemeli az ST(0)-t.


FDIVP reg, ST

(pl. FDIVP ST(n), ST)

ST(n)-ba ST(n) s ST(0) hnyadosa. Veremrl leemeli az ST(0)-t.


FIDIV forrs

(pl. FDIV Data[DI])

ST(0) osztsa a forrs-al, eredmny ST(0)-ba (A forrs egsz tpus)


FDIVR/FDIVRP/FIDIVR Divide Reserved (Vals oszts)
FDIVR
ST(1)-be ST(0) s ST(1) hnyadosa. Veremrl leemeli az ST(0)-t.
FDIVR ST, reg

(pl. FDIVR ST, ST(n))

ST(0)-ba ST(n) s ST(0) hnyadosa.


FDIVR reg, ST

(pl. FDIVR ST(n), ST)

ST(n)-ba ST(0) s ST(n) hnyadosa.


FDIVR forrs

(pl. FDIVR DWORD PTR [BX])

A forrs osztsa ST(0)-val, az eredmny ST(0)-ba (A forrs 32 s 64 bites adat lehet)


FDIVRP ST, reg

(pl. FDIVRP ST, ST(n))

ST(0)-ba ST(n) s ST(0) hnyadosa. Veremrl leemeli az ST(0)-t.


FDIVRP reg, ST

(pl. FDIVRP ST(n), ST)

ST(n)-ba ST(0) s ST(n) hnyadosa. Veremrl leemeli az ST(0)-t.


FIDIVR forrs

(pl. FDIVR Data[DI])

A forrs osztsa ST(0)-val, az eredmny ST(0)-ba (A forrs egsz tpus)

125

Intel processzorok programozsa assembly nyelven

FENI/FNENI - Enable Interrupts (Megszaktsok engedlyezse)


FENI, FNENI
Az utasts lehetv teszi a megszaktsok fogadst.
FFREE Free Register (Regiszter felszabadtsa)
FFREE reg

(pl. FFREE ST(n))

Trli az ST(n) regiszterhez tartoz toldalkbiteket. A regiszter tartalma nem vltozik.


FINCSTP Increment Stack Pointer (Veremmutat nvelse)
FINCSTP
A koprocesszor veremmutatjt eggyel nveli. Ha az 7, akkor 0-ra lltja.
FINIT/FNINIT Initialize Coprocessor (Koprocesszor inicializlsa)
FINIT, FNINIT
A processzor alaphelyzetbe lltsa. A kontrolregisztert 3FFh-ra lltja, trli a
kivteljelzket s felszabadtja a lebegpontos stack-et.
FLD/FILD/FBLD Load (Betlts a stack tetejre)
FLD reg

(pl. FLD ST(n))

ST(n) regiszter tartalmnak msolsa a verem tetejre.


FLD forrs
A forrs msolsa a verem tetejre. (A forrs vals)
A betlts eltt konverzit vgez.
FILD forrs
A forrs msolsa a verem tetejre. (A forrs egsz)
A betlts eltt konverzit vgez.
FBLD forrs
A forrs msolsa a verem tetejre. (A forrs BCD)
A betlts eltt konverzit vgez.
FLD1/FLDZ/FLDPI/FLDL2E/FLDL2T/FLDLG2/FLDLN2 Laod Constant (Konstans betltse)
A verem tetejre betlti a kvetkez konstansokat:
Utasts
FLD1
FLDZ
FLDPI
FLDL2E
FLDL2T
FLDLG2
FLDLN2

126

Konstans
+ 1.0
+ 0.0

log2(e)
log2(10)
log10(2)
loge(10)

Gimesi Lszl 2015.

FLDCW Load Control Word (Vezrlsz betltse)


FLDCW forrs
A 16 bites forrs betltse a koprocesszor vezrlszavba.
FLDENV/FLDENVW/FLDENVD Load Environment State (Krnyezeti llapot betltse)
FLDENV forrs, FLDENVW forrs, FLDENVD forrs
A krnyezeti vltoz tartalmazza a kontrolszt, a sttuszszt, a toldalkregisztert, az utasts- s az operandusmutatt.
387-es processzortl 28 bjtos, eltte 14 bjtos volt a krnyezeti vltoz.
FMUL/FMULP/FIMUL Multiply (Szorzs)
FMUL
ST(1)-be ST(0) s ST(1) szorzata. Veremrl leemeli az ST(0)-t.
FMUL ST, reg

(pl. FMUL ST, ST(n))

ST(0)-ba ST(n) s ST(0) szorzata.


FMUL reg, ST

(pl FMUL ST(n), ST)

ST(n)-ba ST(0) s ST(n) szorzata.


FMUL forrs

(pl FMUL DWORD PTR [BX])

A forrs szorzsa ST(0)-val, az eredmny ST(0)-ba. (A forrs 32 s 64 bites adat lehet)


FMULP ST, reg

(pl. FMULP ST, ST(n))

ST(0)-ba ST(n) s ST(0) szorzata. Veremrl leemeli az ST(0)-t.


FMULP reg, ST

(pl. FMULP ST(n), ST)

ST(n)-ba ST(0) s ST(n) szorzata. Veremrl leemeli az ST(0)-t.


FIMUL forrs

(pl. FIMUL Data[DI])

A forrs szorzsa ST(0)-val, az eredmny ST(0)-ba (A forrs egsz tpus)


FNOP No Operation (res utasts)
FNOP
Az utasts vrakozsra hasznlhat.
FPATAN Partial Arctangent (Arcus-tanges szmtsa)
FPATAN
Z = arctan(Y/X) rtknek kiszmtsa. X rtke ST(0)-ban, Y rtke ST(1)-ben van.
Az eredmny ST(1)-be kerl, majd a veremrl leemeli az ST(0)-t.
FPREM Partial Remainder (Maradkos oszts)
FPREM
ST(0) osztsa ST(1)-el. A maradk ST(0)-ra kerl.

127

Intel processzorok programozsa assembly nyelven

FPREM1 IEEE Partial Remainder (Parcilis maradkos oszts)


FPREM1
ST(0) osztsa ST(1)-el. A maradk ST(0)-ra kerl.
FPTAN Partial Tangent (Parcilis tangens szmtsa)
FPTAN
Y/X = tan(Z) rtknek kiszmtsa. Z rtke ST(0)-ban, Y ST(0)-ba (Z helyre),
majd X a stack tetejre ST(0)-ra kerl.
FRNDINT - Round to Integer (Kerekts egszre)
FRNDINT
ST(0) rtkt egszre kerekti. A kontrolsz RC rtktl fggen ngyfle
kerektsi md lehetsges.
FRSTOR/FRSTORW/FRSTORD Restore Saved State (llapot adatok visszalltsa)
FRSTOR forrs, FRSTORW forrs, FRSTORD forrs
A forrs-sal megadott 94 bjtos (387-tl 108 bjtos) memriaterletrl visszalltja a
koprocesszor llapott.
FSAVE/FSAVEW/FSAVED/FNSAVE/FNSAVEW/FNSAVED Save Status (A
kooprocesszor llapotnak mentse)
FSAVE cl, FSAVEW cl, FSAVED cl
FNSAVE cl, FNSAVEW cl, FNSAVED cl
A cl-lal megadott 94 bjtos (387-tl 108 bjtos) memriaterletre elmenti a
koprocesszor llapott. Ezutn inicializlja a koprocesszort.
FSCALE Scale (Karakterisztika mdostsa)
FSCALE
Y = Y * 2X rtknek kiszmtsa. X rtke ST(1)-en, Y ST(0)-on tallhat.
FSETPM Set Protected Mode (Vdett md belltsa)
FSETPM
A koprocesszort vdett mdba helyezi.
FSIN Sine (Szinusz szmts)
FSIN
ST(0) rtknek szinusza, eredmny ST(0)-ba.
FSINCOS Sine and Cosine (Szinusz s koszinusz szmtsa)
FSINCOS
ST(0) rtknek szinuszt s koszinuszt kiszmtja, az ST(0)-ra elszr a szinusz,
majd a koszinusz rtkt teszi.

128

Gimesi Lszl 2015.

FSQRT Square Root (Ngyzetgykvons)


FSQRT
ST(0) rtknek ngyzetgykt veszi, az eredmnyt ST(0)-ra teszi.
FST/FSTP/FIST/FISTP/FBSTP Store (Adat trols)
FST reg
ST(0) trolsa a megadott reg-ben (ST(n)).
FSTP reg
ST(0) trolsa a megadott reg-ben (ST(n)). A veremrl leemeli az ST(0)-t.
FST cl

(pl. FST longs[BX])

ST(0) trolsa a megadott memriahelyre. (A cl 32 vagy 64 bites hely lehet.)


FSTP cl

(pl. FST tempgreal[BX])

ST(0) trolsa a megadott memriahelyre. A veremrl leemeli az ST(0)-t.


(A cl 32 s 64 bites hely lehet.)
FIST cl

(pl. FIST doubles[BX])

ST(0) trolsa a megadott memriahelyre. (A cl egsz tpus.)


FISTP cl

(pl. FISTP doubles[BX])

ST(0) trolsa a megadott memriahelyre. A veremrl leemeli az ST(0)-t.


(A cl egsz tpus.)
FBSTP cl

(pl. FBST bcds[BX])

ST(0) trolsa a megadott memriahelyre. A veremrl leemeli az ST(0)-t.


(A cl 80 bites (BCD) hely lehet.)
FSTCW/FNSTCW - Store Control Word (Vezrlsz trolsa)
FSTCW cl, FNSTCW cl
A koprocesszor vezrlszavnak aktulis rtkt trolja a 16 bites cl helyen.
FSTENV/FSTENVW/FSTENVD/FNSTENV/FNSTENVW/FNSTENVD Store Enviroment
State (A krnyezet trolsa)
FSTENV cl, FSTENVW cl, FSTENVD cl
FNSTENV cl, FNSTENVW cl, FNSTENVD cl
A krnyezeti vltoz, az llapot- a vezrl-, s a toldalkregiszter, valamint a
kivtelmutat mentse a megadott cl memriahelyre.
(387-es processzortl 28 bjt, eltte 14 bjt.)

129

Intel processzorok programozsa assembly nyelven

FSTSW/FNSTSW Store Status Word (llapotregiszter mentse)


FSTSW cl, FNSTSW cl
Az llapotsz aktulis rtkt elmenti a cl helyre.
Processzor: 87, 287, 387
FSTSW AX, FNSTSW AX
Az llapotsz aktulis rtkt elmenti az AX regiszterbe.
FSUB/FSUBP/FISUB Subtract (Kivons)
FSUB
ST(1)-be tlti ST(0) s ST(1) klnbsgt, majd a veremrl leemeli az ST(0)-t.
FSUB ST, reg

(lp. FSUB ST, ST(n))

ST(0)-ba tlti ST(0) s ST(n) klnbsgt.


FSUBP ST, reg

(lp. FSUBP ST, ST(n))

ST(0)-ba tlti ST(0) s ST(n) klnbsgt, majd a veremrl leemeli az ST(0)-t.


FSUB reg, ST

(lp. FSUB ST(n), ST)

ST(n)-ba tlti ST(n) s ST(0) klnbsgt.


FSUBP reg, ST

(lp. FSUBP ST(n), ST)

ST(n)-ba tlti ST(n) s ST(0) klnbsgt, majd a veremrl leemeli az ST(0)-t.


FSUB forrs

(lp. FSUB shortreals[DI])

ST(0)-ba tlti ST(0) s a forrs klnbsgt. (A forrs 32 vagy 64 bites vals lehet.)
FISUB forrs

(lp. FSUB warray[DI])

ST(0)-ba tlti ST(0) s a forrs klnbsgt. (A forrs 16 vagy 32 bites egsz lehet.)

130

Gimesi Lszl 2015.

FSUBR/FSUBRP/FISUBR Subtract (Kivons)


FSUBR
ST(1)-be tlti ST(1) s ST(0) klnbsgt, majd a veremrl leemeli az ST(0)-t.
FSUBR ST, reg

(lp. FSUBR ST, ST(n))

ST(0)-ba tlti ST(n) s ST(0) klnbsgt.


FSUBRP ST, reg

(lp. FSUBRP ST, ST(n))

ST(0)-ba tlti ST(n) s ST(0) klnbsgt, majd a veremrl leemeli az ST(0)-t.


FSUBR reg, ST

(lp. FSUBR ST(n), ST)

ST(n)-ba tlti ST(0) s ST(n) klnbsgt.


FSUBRP reg, ST

(lp. FSUBRP ST(n), ST)

ST(n)-ba tlti ST(0) s ST(n) klnbsgt, majd a veremrl leemeli az ST(0)-t.


FSUBR forrs

(lp. FSUBR shortreals[DI])

ST(0)-ba tlti a forrs s ST(0) klnbsgt. (A forrs 32 vagy 64 bites vals lehet.)
FISUBR forrs

(lp. FISUBR warray[DI])

ST(0)-ba tlti a forrs s ST(0) klnbsgt. (A forrs 16 vagy 32 bites egsz lehet.)
FTEST - Test for Zero (Nulla teszt)
FTEST
A TS(0) tartalmt sszehasonltja +0.0-val.)
Sttuszbitek llsa:
C3

C2

C1

C0

Relci

ST > 0.0

ST < 0.0

ST = 0.0

ST nem sszehasonlthat

131

Intel processzorok programozsa assembly nyelven

FUCOM/FUCOMP/FUCOMPP Unordered Compare (Rendezetlen sszehasonlts)


FUCOM
ST(0) s ST(1) sszehasonltsa.
FUCOM reg
ST(0) s ST(n) sszehasonltsa.
FUCOM forrs
ST(0) s forrs sszehasonltsa. (A forrs 32 vagy 64 bites vals lehet.)
FUCOMP
ST(0) s ST(1) sszehasonltsa, majd a veremrl leemeli az ST(0)-t.
FUCOMP reg
ST(0) s ST(n) sszehasonltsa, majd a veremrl leemeli az ST(0)-t.
FUCOMP forrs
ST(0) s forrs sszehasonltsa, majd a veremrl leemeli az ST(0)-t.
(A forrs 32 vagy 64 bites vals lehet.)
FUCOMPP
ST(0) s ST(1) sszehasonltsa, majd a veremrl leemeli az ST(0)-t s ST(1)-et.
Sttuszbitek llsa:
C3

C2

C1

C0

Relci

ST > forrs

ST < forrs

ST = forrs

ST nem sszehasonlthat

FWAIT Wait (CPU vrakozs)


FWAIT
A parancs felfggeszti a CPU mkdst mindaddig, amg a koprocesszor befejezi
az utasts vgrehajtst.

132

Gimesi Lszl 2015.

FXAM Examine (Verem tetejnek vizsglata)


ST(0) llapotnak vizsglata.
Sttuszbitek llsa:
C3
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

C2
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1

C1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1

C0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1

Eredmny
+Nem szablyos
+NAN
-Nem szablyos
-NAN
+Normalizlt
+
-Normalizlt
-
+0
res
-0
res
+Nem normalizlt
res
-Nem normalizlt
res

FXCH Exchange Registers (Verem elemeinek felcserlse)


FXCH
ST(0) s ST(1) tartalmnak kicserlse.
FXCH reg
ST(0) s reg (ST(n)) tartalmnak kicserlse.
FXTRACT Extract Exponent and Significand (Kitev s mantissza kiemelse)
FXTRACT
ST(0)-ban trolt adat kitevjt ST(0)-ba teszi, majd a verem tetejre tlti a mantisszt
FYL2X- Ylog2(X) (Ylog2(X) rtknek kiszmtsa)
FYL2X
Z = Ylog2(X) rtknek kiszmtsa. X rtke ST(0)-on, Y rtke ST(1)-en tallhat.
Leemeli a verem tetejn lv rtket, majd az ST(0)-ra helyezi Z-t.
FYL2X- Ylog2(X+1) (Ylog2(X+1) rtknek kiszmtsa)
FYL2X
Z = Ylog2(X+1) rtknek kiszmtsa. X rtke ST(0)-on, Y rtke ST(1)-en tallhat.
Leemeli a verem tetejn lv rtket, majd az ST(0)-ra helyezi Z-t.

133

Intel processzorok programozsa assembly nyelven

12. Megszaktsok
12.1. INT 10h funkci: kperny driver hvsa
AH = 00h

Kpernyzemmd belltsa.

Szveg zemmdban:
AL=0
40 x 25, mono
AL=1
40 x 25, sznes
AL=2
80 x 25, mono
AL=3
80 x 25, sznes
AL=7
80 x 25, monokrm kperny adapter
Grafikus zzemmd
AL=4
320-szor 200, sznes
AL=5
320-szor 200, mono
AL=6
640-szer 200, mono
AH = 01h

Kurzormret belltsa.

A kurzort sznes adapter esetn 8 (mono adapternl 14) pontsorbl ll tglalap definilja. rtke 0-7 illetve 0-13 kztti lehet.
CH
a kurzor kezd sora
CL
a kurzor utols sora
Ha a kezdsor szma kisebb, mint az utols, a kurzor lyukas lesz. Ha a kezdsor
szma nagyobb a maximumnl, akkor a kurzor nem ltszik.
AH = 02h
DH
DL
BH

Kurzorpozci belltsa.
kurzorpozci sor koordintja (0-24)
kurzorpozci oszlop koordintja (0-79)
oldalszm

AH = 03h
BH

Kurzorpozci olvassa.
oldalszm

Vlasz:
DH
DL
CH, CL
AH = 04h
Vlasz:
AH

DH, DL
CH, BX
AH = 05h
AL

134

kurzor sorszma
kurzor oszlopszma
kurzor mrete. (ld. Kurzormret-belltsnl)
Fnyceruzapozci olvassa.
bekapcsols jelzse
Ha AH = 1, a fnyceruza be van kapcsolva, s az albbi regiszterek
korrekt adatokat tartalmaznak.
a mutatott sor s oszlop szma (karakteres zemmdban)
a mutatott sor s oszlop szma (grafikus zemmdban)
Aktv kpernyoldal kivlasztsa.
oldalszm (0 7, alfanumerikus zemmdban.)

Gimesi Lszl 2015.

AH = 06h
Sorgrgets felfel ablakban.
AL
lptetsek szma (0 esetn trli az ablakot.)
CH, CL ablak bal fels sarknak sor, oszlop koordinti
DH, DL ablak jobb als sarknak koordinti
BH
trlt sorok attribtuma
(Az attribtum hasznlatt s tpusait a programozs fejezetben
rszletesen ismertettk.)
AH = 07h

Sorgrgets lefel ablakban.

Hasonlan mkdik, mint a felfel grgets.


AH = 08h
BH
Vlasz:
AL
AH

Kurzor alatti karakter s attribtumnak olvassa.


kpernyoldal (szveges zemmdban)

AH = 09h
AL
BL
BH
CX

Karakter kirsa az aktulis kurzorpozciba.


karakter kd
karakter attribtum
kpernyoldal (szveges zemmdban)
ismtlsek szma

AH = 0Ah
AL
BH
CX

Karakter kirsa az aktulis kurzorpozciba (attributum nlkl).


karakter kd
kpernyoldal (szveges zemmdban)
ismtlsek szma

AH = 0Bh
BH

Sznpaletta vagy httrszn belltsa


0 - httrszn megads
1 palettaszn megads
sznkd

BL

olvasott karakter
karakter attribtuma (szveges zemmdban)

AH = 0Ch
AL
DL
CX

Raszterpont megjelentse.
sznkd
raszter sorszm (y koordinta)
raszter oszlopszm (x koordinta)

AH = 0Dh
DL
CX
Vlasz:
AL

Raszterpont lekrdezs.
raszter sorszm (y koordinta)
raszter oszlopszm (x koordinta)

AH = 0Eh
AL
BL
BH

Karakter kirs, majd a kurzor lptetse.


karakterkd
karakter szne (grafikus zemmdban)
oldalszm (szveges zemmdban)

AH = 0Fh
Vlasz:
AL
AH
BH

Aktulis zemmd lekrdezse.

sznkd

aktulis kperny zemmd


karakterek szma egy sorban
aktv kpernyoldalak szma
135

Intel processzorok programozsa assembly nyelven

12.2. INT 16h funkci: klaviatra driver hvsa


AH = 00h
Vlasz:
AL
AH
AH = 01h
Vlasz:
ZF
AL
AH
AH = 02h
Vlasz:
AL

136

Billentyzet olvassa.
billenty ASCII kdja (funkci billentyknl 0)
funkci billenty letapogat kdja (scan-kd)
Billentyzet puffernek lekrdezse.
1 a puffer res
0 a pufferben van karakter
ASCII kd
letapogat kd
Billentyzet sttusznak lekrdezse.
sttusz billentyk llapota (a megfelel helyi rtk bit rtke 1, ha az
adott billenty aktv)
0 jobb Shift lenyomva
1 bal Shift lenyomva
2 Control lenyomva
3 Alt lenyomva
4 Scroll Lock be
5 Num Lock be
6 Caps Lock be
7 Insert be

Gimesi Lszl 2015.

12.3. INT 21h funkci: DOS funkcik hvsa


AH = 01h
Vlasz:
AL

Olvass a standard inputrl (billentybeolvass s echo).


a lenyomott billenty ASCII kdja

Funkcibillenty esetn, els olvassra AL-ben 0 rtket kapunk, majd a msodik olvasskor
kapjuk meg scan-kdot.
AH = 02h
DL

Kirs a standard outputra (karakterkirs a kpernyre).


ASCII kd (nemcsak megjelenthet karakterek)

A kvetkez hat funkcihvs paramterei megegyeznek az elz kettvel.


AH = 03h

Olvass a standard kiegszt inputrl.

AH = 04h

Kirs a standard kiegszt outputra.

AH = 05h

Kirs a standard nyomtatra.

AH = 06h

Olvass vagy kirs a standard inputrl vagy outputra.

AH = 07h

Olvass a standard inputrl, nincs CTRL-BREAK ellenrzs.

AH = 08h

Olvass a standard inputrl (azonos a 01h funkcival, echo nlkl).

AH = 09h

Karakterlnc kirsa a standard outputra.

DS:DX
karakterlnc kezdetnek memria cme (mutat)
A sztring a $ karakterig tart.
AH = 0Ah
Vlasz:
DS:DX

AH = 0Bh
AL
AH = 0Ch

Karakterlnc olvassa a standard inputrl.


puffer kezdetnek memria cme (mutat)
A puffer 1. bjtja a puffer hosszt (az ENTER-rel egytt), a 2. pedig a
tnylegesen beolvasott karakterek szmt tartalmazza. A sztring tnyleges beolvassa az ENTER (0Dh) karakter letse utn trtnik meg.
Standard input (billenty) llapotnak lekrdezse.
llapotkd (FF-et tartalmaz, van karakter az eszkz pufferben, 0-t, ha
nincs, vagy fjlvg.)
Klaviatra puffernek trlse s funkcihvs.

Trli a billentyzet puffert, majd meghvja az AL-ben megadott (01h, 06h, 07h,
08h, 0Ah) funkcikd interruptot.

137

Intel processzorok programozsa assembly nyelven

AH = 20h

Kilps a DOS-ba.

Visszatrs az opercis rendszerhez csak COM fjloknl.


Vlasz:
AL
AH = 25h
AL
DS:DX
AH = 35h
AL
Vlasz:
ES:BX
AH = 2Ah
Vlasz:
CX
DH
DL
AL
AH = 2Bh
CX
DH
DL

visszatrsi kd
Megszaktsvektor belltsa.
megszakts szma
az j megszaktskezel cme.
Megszaktsvektor olvassa.
megszakts szma
a megszaktskezel cme
Rendszerdtum lekrdezse
v (1980-2099)
hnap
nap
a ht napja (sorszm)
Rendszerdtum belltsa
v (1980-2099)
hnap
nap

Vlasz:
AL=0
sikeres bellts
AL=0FFh hibs dtum, a rendszerdtum nem vltozott
AH = 2Ch
Vlasz:
CH
CL
DH
DL
AH = 2Dh
CH
CL
DH
DL

Rendszerid lekrdezse
ra
perc
msodperc
szzadmsodperc
Rendszerid belltsa
ra
perc
msodperc
szzadmsodperc

Vlasz:
AL=0
sikeres bellts
AL=0FFh hibs id, a rendszerid nem vltozott

138

Gimesi Lszl 2015.

AH = 39h
DS:DX
Vlasz:
CF=0
CF=1

Knyvtr ltrehozsa (MKDIR)


a knyvtr (mappa) neve karakterlnc kezdetnek memria cme (teljes
elrsi t). A karakterlnc vgt 00h jelzi!
sikeres ltrehozs
sikertelen ltrehozs, AX-ben a hibakd

Megjegyzs:
- Az elrsi tvonalnak (az utols knyvtr kivtelvel) lteznie kell.
- Sikertelen a megnyits, ha mr ltezik a megadott mappa, ha megtelt a szl
knyvtr, vagy az tvonal nv hosszabb az adott opercis rendszerben megengedettnl.
AH = 3Ah
DS:DX
Vlasz:
CF=0
CF=1

Knyvtr trlse (RMDIR)


a knyvtr (mappa) neve karakterlnc kezdetnek memria cme (teljes
elrsi t). A karakterlnc vgt 0 jelzi!
sikeres trls
sikertelen trls, AX-ben a hibakd

Megjegyzs:
- A knyvtrnak resnek kell lennie.
AH = 3Bh
DS:DX
Vlasz:
CF=0
CF=1
AH = 3Dh
DS:DX
AL

Vlasz:
CF=0
CF=1
AH = 3Eh
BX
Vlasz:
CF=0
CF=1

Az aktulis knyvtr belltsa (CHDIR)


a knyvtr (mappa) neve karakterlnc kezdetnek memria cme (teljes
elrsi t). A karakterlnc vgt 0 jelzi!
sikeres tllts
sikertelen tllts, AX-ben a hibakd
Fjl megnyits
a fjl neve karakterlnc kezdetnek memria cme (teljes elrsi t). A
karakterlnc vgt 0 jelzi!
md, a bitek jelentse:
0-2 Access md
000: csak olvass (Read-only)
001: csak rs (Write-only)
010: rs-olvass (Read-Write)
3
foglalt
4-6 Sharing md
7
rklsjelz
sikeres tllts, AX-ben a fjlkezel kd
sikertelen tllts, AX-ben a hibakd
Fjl lezrs
a fjlkezel kdja
sikeres tllts
sikertelen tllts, AX-ben a hibakd
139

Intel processzorok programozsa assembly nyelven

AH = 3Fh
BX
CX
DS:DX
Vlasz:
CF=0
CF=1
AH = 40h
BX
CX
DS:DX
Vlasz:
CF=0
CF=1
AH = 41h
DS:DX
Vlasz:
CF=0
CF=1
AH = 4Ch
AL
AH = 4Eh
DS:DX
CX

Vlasz:
CF=0
CF=1

140

Olvass fjlbl
a fjlkezel kdja
a beolvasott bjtok szma
a cl adatterlet kezdcme
sikeres tllts, AX-ben a tnylegesen beolvasott bjtok szma
sikertelen tllts, AX-ben a hibakd
rs fjlba
a fjlkezel kdja
a beolvasott bjtok szma
a forrs adatterlet kezdcme
sikeres tllts, AX-ben a tnylegesen beolvasott bjtok szma
sikertelen tllts, AX-ben a hibakd
Fjl trls
a fjl neve karakterlnc kezdetnek memria cme (teljes elrsi t). A
karakterlnc vgt 0 jelzi!
sikeres trls
sikertelen trls, AX-ben a hibakd
Kilps (Visszatrs az opercis rendszerbe COM s EXE fjloknl.)
visszatrsi kd
Fjl els elfordulsnak keresse
a fjl neve karakterlnc kezdetnek memria cme (teljes elrsi t). A
karakterlnc vgt 0 jelzi!
keressi attribtum, a bitek jelentse:
0
Read-Only,
1
Hidden,
2
System,
3
Volume Label,
4
Directory,
5
Archive,
6-15 foglalt.
tallat
nincs tallat, AX-ben a hibakd

Gimesi Lszl 2015.

12.4. INT 25h funkci: lemezszektor olvassa


AL

meghajt szma (0=A, 1=B, 2=C, stb.)

CX

olvasand szektorok szma

DX

kezd szektor szma (az els szektor 0)

DS:BX

cl (memria) kezdcme.

Vlasz:
AX
hibakd
12.5. INT 26h funkci: lemezszektor rsa
AL

meghajt szma

CX

rand szektorok szma

DX

kezd szektor szma

DS:BX

forrs (memria) kezd cme

Vlasz:
AX
hibakd

141

Intel processzorok programozsa assembly nyelven

12.6. INT 33h funkci: egr driver hvsa


AX = 00h
Vlasz:
AX
AX = 01h

Inicializls
0 esetn nem inicializlhat, egybknt megtrtnt.
Egrkurzor lthatv ttele

Ha a kurzor nem lthat, lthatv teszi, egybknt hatstalan.


AX = 02h

Egrkurzor lthatatlann ttele

Ha a kurzor lthat, lthatatlann teszi, egybknt hatstalan.


AX = 03h
Vlasz:
BX

CX
DX
AX = 04h
CX
DX
AX = 05h
BX
Vlasz:
AX
BX
CX
DX
AX = 06h

142

Egrkurzor koordintinak lekrdezse


A hvs pillanatban lenyomott egrgomb kdja
0 bal gomb
1 jobb gomb
2 kzps gomb
Oszlop koordinta
Sor koordinta
Egrkurzor mozgatsa adott pontba
Oszlop koordinta
Sor koordinta
Gombok lenyomsnak szma
Melyik gombrl krnk informcit
A tnylegesen lenyomott gomb
A gomb lenyomsnak szma (ld. 03h funkcit)
Oszlop koordinta
Sor koordinta
Gombok felengedseinek szma

BX

Melyik gombrl krnk informcit

Vlasz:
AX
BX
CX
DX

A lenyomott gomb (ld. 03h funkcit)


A gomb felengedseinek szma
Oszlop koordinta
Sor koordinta

Gimesi Lszl 2015.

A kvetkez kt funkcival egy tglalap alak terletet jellhetnk ki, amelyiken bell mozoghat az egrkurzor.
AX = 07h
CX
DX
AX = 08h
CX
DX
AX = 09h
BX
CX
DX
AX = 0Ah
BX
CX, DX
CX, DX
AX = 0Bh
Vlasz:
CX
DX

Egr vzszintes mozgsterletnek megadsa


A terlet els oszlopnak sorszma
A terlet utols oszlopnak sorszma
Egr fggleges mozgsterletnek megadsa
A terlet fels sornak sorszma
A terlet als sornak sorszma
Grafikus egrkurzor definilsa
A kurzor X irny bzispontja
A kurzor Y irny bzispontja
A kurzor bitkpnek memriahelye
Szveges egrkurzor definilsa
0: szoftveres, 1: hardveres definci
A kurzor els s utols sora hardveres defincinl
A kurzor bitkpnek cme, szoftveres defincinl
Informci az egr mozgsrl
Vzszintes elmozduls (balra: negatv, jobbra pozitv)
Fggleges elmozduls (felfel: negatv, lefel: pozitv)

AX = 0Dh

Fnyceruza emulci bekapcsolsa

AX = 0Eh

Fnyceruza emulci kikapcsolsa

AX = 0Fh

Lpskz lltsa

A mozgs finomsgt szablyozhatjuk.


CX
Vzszintes lpskz
DX
Fggleges lpskz
AX = 10h

Letiltott tartomny megadsa.

Az egr szmra tiltott tglalap alak terlet megadsa.


CX, DX Bal fels sarok
SI, DI
Jobb als sarok
AX = 13h
DX

Maximlis sebessg belltsa


Lpskz/msodperc

143

Intel processzorok programozsa assembly nyelven

AX = 1Ah
BX
CX
DX
AX = 1Bh

rzkenysg belltsa.
Vzszintes Mickey-szm16
Fggleges Mickey-szm
Sebessg Mickey/msodperc
rzkenysg lekrdezse

Vlasz:
BX
CX
DX

Vzszintes Mickey-szm
Fggleges Mickey-szm
Sebessg Mickey/msodperc

AX = 1Ch

Megszaktsi arny magadsa

Az megszaktsok szmnak megadsa, az egrpozci lekrdezsnek gyakorisga


BX
Megszaktsok szma:
0 nincs megszakts
1 30 megszakts/msodperc
2 50 megszakts/msodperc
3 100 megszakts/msodperc
4 200 megszakts/msodperc
AX = 1Dh
BX
AX = 1Eh
Vlasz:
BX
AX = 24h
Vlasz:
BX
CH

CL

16

Kperny kivlasztsa
Kperny lapszma, ezen jelenik meg a kurzor
Kperny lekrdezse
Kperny lapszma
Egr-driver lekrdezse
Driver verziszma (BH.BL)
Egr tpusa
1 busz egr
2 soros egr
3 InPort egr
4 PS-2 egr
5 HP egr
IRQ szm

Egy Mickey az egr egysgnyi elmozdulsa (az e legkisebb elmozduls, amit az egr rzkel).

144

Gimesi Lszl 2015.

13. A 7 bites ASCII kdtbla

13.1. Alapkdok
dec. hexa
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
a
11
b
12
c
13
d
14
e
15
f
16
10
17
11
18
12
19
13
20
14
21
15
22
16
23
17
24
18
25
19
26
1a
27
1b
28
1c
29
1d
30
1e
31
1f

kar.

bel
BS
HT
LF
VT
FF
CR

ESC

dec. hexa
32
20
33
21
34
22
35
23
36
24
37
25
38
26
39
27
40
28
41
29
42
2a
43
2b
44
2c
45
2d
46
2e
47
2f
48
30
49
31
50
32
51
33
52
34
53
35
54
36
55
37
56
38
57
39
58
3a
59
3b
60
3c
61
3d
62
3e
63
3f

kar. dec. hexa kar. dec. hexa kar.


60
space 64 40
@ 96
`
65 41
97
61
!
A
a
66 42
98
62
"
B
b
67 43
99
63
#
C
c
68
44
100
64
$
D
d
69 45
%
E 101 65
e
70 46
&
F 102 66
f
71 47
'
G 103 67
g
72 48
(
H 104 68
h
73 49
)
I 105 69
i
74 4A
*
J 106 6a
j
75 4B
+
K 107 6b
k
76 4C
,
L 108 6c
l
77 4D M 109 6d
m
78 4E
.
N 110 6e
n
79 4F
6f
/
O 111
o
80 50
0
P 112 70
p
81 51
1
Q 113 71
q
82 52
2
R 114 72
r
83 53
3
S 115 73
s
84 54
4
T 116 74
t
85 55
5
U 117 75
u
86 56
6
V 118 76
v
87 57
7
W 119 77
w
88 58
8
X 120 78
x
89 59
9
Y 121 79
y
90 5A
:
Z 122 7a
z
91 5B
123 7b
;
[
{
92 5C
124 7c
<
\
|
93
5D
125
7d
=
]
}
94 5E
>
^ 126 7e
~
95 5F
7f
?
_ 127
DEL

145

Intel processzorok programozsa assembly nyelven

kd

shift

ctrl

alt

cr
esc
sp
'
,
.
/
0
1
2
3
4
5
6
7
8
9
;
=
@
[
\
]
`

0d
1b
20
27
2c
2d
2e
2f
30
31
32
33
34
35
36
37
38
39
3b
3d
40
5b
5c
5d
60

0d
1b
20
22
3c
5f
3e
3f
29
21
40
23
24
25
5e
26
2a
28
3a
2b

0a
20

ff
ff
0
ff
ff
ff
1e
ff
ff
ff

0;29
0;78
0;79
0;7a
0;7b
0;7c
0;7d
0;7e
0;7f
0;80

7b 18 0;17
7c 19 0;2b
7d 20 0;18
7e - 0;29

alt gr

kar.

0;68
0;69
0;6a
0;6b
0;6c
0;6d
0;6e
0;6f
0;70
0;71
0;8b
0;8c
0;98
0;a0
0;9d
0;9b
0;a2
0;a3
0;97
0;9f
0;99
0;a1
0;0e
0;a5

alt

alt gr

0;68
0;69
0;6a
0;6b
0;6c
0;6d
0;6e
0;6f
0;70
0;71
0;8b
0;8c
0;98
0;a0
0;9d
0;9b
0;a2
0;a3
0;97
0;9f
0;99
0;a1
0;0e
0;a5

ctrl

alt

0;5e
0;5f
0;60
0;61
0;62
0;63
0;64
0;65
0;66
0;67
0;89
0;8a
0;8d
0;91
0;74
0;73
0;92
0;93
0;77
0;75
0;84
0;76
7f
0;94

shift

ctrl

0;54
0;55
0;56
0;57
0;58
0;59
0;5a
0;5b
0;5c
0;5d
0;87
0;88
0;48
0;50
0;4d
0;4b
0;52
0;53
0;47
0;4f
0;49
0;51
8
0;0f

0;1c a 61 41
b 62 42
20 c 63 43
d 64 44
e 65 45
f 66 46
g 67 47
h 68 48
0;29 i 69 49
0;7e j 6a 4a
k 6b 4b
l 6c 4c
- m 6d 4d
n 6e 4e
o 6f 4f
0;60 p 70 50
q 71 51
r 72 52
s 73 53
t 74 54
u 75 55
v 76 56
w 77 57
x 78 58
y 79 59
z 7a 5a

1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
10
11
12
13
14
15
16
17
18
19
1a

0;1e
0;30
0;2e
0;20
0;12
0;21
0;22
0;23
0;17
0;24
0;25
0;26
0;32
0;31
0;18
0;19
0;10
0;13
0;1f
0;14
0;16
0;2f
0;11
0;2d
0;3e
0;e1

0;3b
0;7b
0;26
0;d1
0;f6
0;5b
0;7d
0;26
0;d6
0;a1
0;88
0;9d
0;3c
0;7d
0;3e
0;2a
0;56
0;9e
0;d0
0;24
0;cf
0;40
0;7c
0;23
0;3e
0;e1

kd

shift

0;3b
0;3c
0;3d
0;3e
0;3f
0;40
0;41
0;42
0;43
0;44
0;85
0;86
0;48
0;50
0;4d
0;4b
0;52
0;53
0;47
0;4f
0;49
0;51
8
9

kar.

kd

f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12

ins
del
home
end
p up
P dn
bs
ht

alt gr

kar.

13.2. Billentykdok

Figyeljk meg, hogy betk esetben a mdost billentyk hasznlatval egy bitet trlnk a
karakter kdjbl. A shift billenty az 5-s, a ctrl billenty pedig a 6-os szm bitet trli.
A tblzatbl is lthat, hogy tbb mint 256 (1 bjton brzolhat) billentykombinci ltezik, ezrt gynevezett ketts billentykdokat hasznlunk (elssorban a funkcibillentyknl).
Ilyenkor a karakterkd mindig 0, a msodik rtk a billenty letapogat (scan) kdja.

146

You might also like