Professional Documents
Culture Documents
F-14/1/KONV-2015-0009
A GPSZETI S INFORMATIKAI GAZATOK DULIS S
MODULRIS KPZSEINEK KIALAKTSA A PCSI
TUDOMNYEGYETEMEN
Gimesi Lszl
Pcs
2015
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
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.
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.
17
3.4.
Mveletvgzs
18
Az Intel mikroprocesszorok
27
4.1.
Kezdetek
27
4.2.
Mikroprocesszor
29
4.3.
31
4.4.
A matematikai trsprocesszor
35
38
5.1.
Utastsok
38
5.2.
38
5.3.
A verem (stack)
42
5.4.
Memriaszervezs
43
Az assembly programozs
45
6.1.
Szegmentls
45
6.2.
46
6.3.
Konstansok hasznlata
47
6.4.
48
6.5.
Az adatszegmens hasznlata
58
6.6.
Lemezmeghajt kezelse
67
6.7.
70
6.8.
73
78
7.1.
78
7.2.
84
8.
Irodalomjegyzk
94
9.
Mellklet
95
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.
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.
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.
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.
Kezdetben a memriaramkrk fejlesztsekor csak lptetregiszterekbl, vagy mg korbban (pldul az EDVAC szmtgpben) higanyos mvonalbl ptett soros elrs trolkat (Serial Access Memory, SAM) hasznltak.
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.
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
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.)
bm 2 m + bm 1 2 m 1 + ... + b1 2 + b0 + b1 2 1 + ... + b n 2 n
(3-2.)
12
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
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
15
16
15
31
63
0 1 bjt
rvid egsz
0 2 bjt
egsz szm
0 4 bjt
hossz egsz
0 8 bjt
kiterjesztett
0 10 bjt
BCD egsz
Mantissza
0 4 bjt
rvid vals
Mantissza
0 8 bjt
hossz vals
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
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:
llts
1 Ha A = hamis L = igaz
0 Ha A = igaz L = hamis
= READY
18
Logikai sszeads
szimbluma:
llts
Ha A s B = hamis L = hamis
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 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
Kizr VAGY
szimbluma:
Jellse: - (XOR),
A
llts
Ha A s B = hamis L = hamis
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
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
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
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
3.4.4. Szorzs
A bitenknti szorzst hasonlan vgezzk, mint a decimlis szmoknl: A*B=S,
A
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
24
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
26
Ha az eredmny = 0
a kt szm egyenl;
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
28
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
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
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)
31
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
0
A verembe utolsknt bert elem cme.
SP
0
BP
32
0
A vgrehajtand utasts cme.
15
A
V R
C
0
I
N
O D I T S Z
O
P Parity (paritsbit)
A Auxiliary Carry
T Trap (lptets)
I Interrupt
D Direction
O Overflow
Kiegszts 80286-tl:
IO I/O Protection
Level
N Nested Task
Kiegszts 80386-tl:
R Resume
V Virtual 8086
Kiegszts 80486-tl:
AC Aligment Check Illeszked memriahvs engedlyezse.
33
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
0
Adatszegmens, az adatterlet cmzshez.
DS
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
34
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)
35
Vezrlregiszter:
A vezrl regiszter segtsgvel befolysolhatjuk a koprocesszor mkdst.
X
IC
RC
PC
PM UM OM
ZM DM IM
36
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
37
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
CBW
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
MOV AX, BX
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
.CODE
.
.
MOV AX, Adat
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
MOV DS, AX
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
40
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
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
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
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
JMP [BX]
41
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
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
SS
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
.CODE
.
.
.
END
15
A MASM bizonyos programozst knnyt eljrsokat tartalmaz, amelyeket makrknak neveznk. Makrkat a programoz is
definilhat.
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 AH, 2
INT 21h
;Kirs
INT 21h
INT 21h
MOV DL, AL
MOV AH, 2
INT 21h
; Karakter kirsa
;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
;Fprogram
;Karakter beolvassa
;Karakter kirsa
;Kilps
write_char endp
END main
48
;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
MOV DL, CR
CALL write_char
MOV DL, LF
CALL write_char
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
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
CALL cr_lf
;Soremels
CALL write_decimal
CALL cr_lf
;Soremels
CALL write_hexa
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
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
PUSH CX
PUSH DX
MOV BL, DL
MOV CX, 8
binary_digit:
XOR DL, DL
RCL BL, 1
;DL = DL + 48 + CF
CALL write_char
LOOP binary_digit
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
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
PUSH CX
PUSH DX
MOV DH, DL
;DL mentse
MOV CL, 4
SHR DL, CL
;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
CMP DL, 10
JB non_hexa_letter
CALL write_char
;A karakter kirsa
POP DX
;DX visszalltsa
RET
write_hexa_digit endp
;Visszatrs a hv rutinba
52
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
PUSH CX
PUSH DX
PUSH SI
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
DIV SI
;DX:AX 32 bites szm osztsa SI-vel, az eredmny AXbe, a maradk DX-be kerl
PUSH DX
INC CX
;Szmll nvelse
OR AX, AX
;SI visszalltsa
POP DX
;DX visszalltsa
POP CX
;CX visszalltsa
POP AX
;AX visszalltsa
RET
write_decimal endp
;Visszatrs a hv rutinba
53
PUSH BX
MOV BL, 10
XOR AX, AX
;AX trlse
read_decimal_new:
CALL read_char
CMP DL, CR
;ENTER ellenrzse
JE read_decimal_end
MUL BL
ADD AL, DL
JMP read_decimal_new
read_decimal_end:
MOV DL, AL
POP BX
;AB visszalltsa
POP AX
;AX visszalltsa
RET
;Visszatrs a hv rutinba
read_decimal endp
Ennek alapjn elkszthetjk a hexadecimlis beolvas rutinunkat.
54
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
PUSH BX
XOR AX, AX
;AX trlse
read_hexa_new:
CALL read_char
CMP DL, CR
;ENTER ellenrzse
JE read_hexa_end
CALL upcase
CMP DL, 9
;Szmjegy karakter?
ADD AL, DL
JMP read_hexa_new
read_hexa_end:
MOV DL, AL
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
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
JB upcase_end
JA upcase_end
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
SAL AL, 1
ADD AL, DL
JMP read_binary_new
read_binary_end:
MOV DL, AL
POP AX
RET
read_binary endp
56
;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
RCL DH,1
SHL DL,1
CMP DH, BL
JB Next
SUB DH, BL
INC DL
;Hnyados nvelse
Next:
LOOP Cycle
Stop:
CALL write_decimal
CALL cr_lf
;Soremels
MOV DL, DH
CALL write_decimal
MOV AH,4Ch
;Kilps
INT 21h
main endp
END main
57
MOV DS, AX
CALL write_char
;Karakter kirsa
MOV AH,4Ch
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
MOV DS, AX
CALL write_char
;Karakter kirsa
MOV AH,4Ch
INT 21h
main endp
58
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
OR DL, DL
JZ stop
CALL WRITE_CHAR
INC BX
JMP new
MOV AH,4Ch
;Kilps
new:
stop:
INT 21h
main endp
Az adat vltoznv utn szerepl DB direktva azt jelzi, hogy adatunk bjtos.
59
0 255
-128 127
0 65535 (64k)
-32768 (32k) 32767 (32k)
0 4G
-2G 2G
koprocesszor utasts
main proc
MOV AX, DGROUP
;Adatszegmens belltsa
MOV DS, AX
LEA BX, adat_1
CALL write_string
;Kirs
CALL write_string
;Kirs
CALL write_string
;Kirs
MOV AH,4Ch
;Kilps
INT 21h
main endp
60
write_string proc
PUSH DX
PUSH BX
write_string_new:
MOV DL, [BX]
OR DL, DL
;DL vizsglata
JZ write_string_end
;0 esetn kilps
CALL write_char
;Karakter kirsa
INC BX
;DX visszalltsa
;Visszatrs
61
.MODEL SMALL
.STACK
.DATA?
adat DB 100 DUP (?)
.CODE
main proc
MOV AX, DGROUP
;Adatszegmens belltsa
MOV DS, AX
LEA BX, adat
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
CMP DL, CR
;ENTER ellenrzse
JE read_string_end
MOV [BX], DL
;Ments az adatszegmensre
INC BX
;Kvetkez adatcm
JMP read_string_new
read_string_end:
XOR DL, DL
MOV [BX], DL
POP BX
POP DX
RET
;BX visszalltsa
;DX visszalltsa
;Visszatrs
read_string endp
62
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
;Adatszegmens belltsa
MOV DS, AX
LES DI, adat
CALL read_string
;Karaktersorozat beolvassa
CALL cr_lf
;Soremels
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
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
read_string proc
PUSH DX
PUSH AX
CLD
read_string_new:
CALL read_char
CMP DL, CR
;ENTER ellenrzse
JE read_string_end
MOV AL, DL
;AL-be a karakter
STOSB
JMP read_string_new
read_string_end:
XOR AL,AL
STOSB
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
.MODEL SMALL
.STACK
.DATA
Attr DB 10,0
main proc
MOV AX, DGROUP
;Adatszegmens belltsa
MOV DS, AX
LEA DX, Attr
;Funkcikd
INT 21h
;Sztring beolvassa
CALL CR_LF
;Soremels
;Output puffer
MOV AH, 9h
;Funkcikd
INT 21h
;Sztring kirs
MOV AH,4Ch
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
67
;Szkz karakter
MOV AL, 0
MOV CX, 1
MOV DX, 0
;Lemezolvass kezdblokkja
INT 25h
;Olvass
POPF
XOR DX, DX
CALL write_block
MOV AH,4Ch
;Kilps a programbl
INT 21h
main endp
write_block proc
PUSH CX
;CX mentse
PUSH DX
;DX mentse
MOV CX, 32
write_block_new:
CALL out_line
CALL cr_lf
;Soremels
ADD DX, 16
;DX visszalltsa
POP CX
;CX visszalltsa
RET
write_block endp
68
out_line proc
PUSH BX
;BX mentse
PUSH CX
;CX mentse
PUSH DX
;DX mentse
MOV BX,DX
PUSH BX
MOV CX, 16
hexa_out:
MOV DL, Block[BX]
CALL write_hexa
MOV DL,Space
CALL write_char
INC BX
LOOP hexa_out
;Kvetkez bjt
CALL write_char
MOV CX, 16
POP BX
ascii_out:
MOV DL, Block[BX]
;Vezrlkarakterek kiszrse
JA visible
INC BX
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
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
.MODEL SMALL
.STACK
.CODE
main proc
MOV AX, 0B800h
MOV ES, AX
;lltsuk be a kpernyt 80x25-s felbontsra.
MOV AH, 0h
;Kpernyzemmd
MOV AL, 3h
INT 10H
MOV DI, 1838
;Kirand karakter
;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
71
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
MOV ES, AX
XOR AX, AX
;AX trlse
MOV AL, y
DEC AL
MUL BL
MOV DI, AX
XOR AX, AX
;AX trlse
MOV AL, x
DEC AL
SHL AL, 1
ADD DI, AX
;AL-be a karakterkd
MOV ES:[DI], AX
;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
;A nap kirsa
CALL cr_lf
MOV DL,DH
CALL write_decimal
;A hnap kirsa
CALL cr_lf
MOV DL, CH
CALL write_binary
CALL cr_lf
MOV DL, CL
CALL write_binary
CALL cr_lf
MOV DL, AL
CALL write_decimal
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
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
MOV AH,39h
;A knyvtr ltrehozsa
INT 21h
74
JNC exist
;Sikeres megnyits
JMP stop
exist:
LEA DX, Success
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
MOV AH,3Ah
;A knyvtr trlse
INT 21h
JNC exist
;Sikeres trls
JMP stop
exist:
LEA DX, Success
MOV AH,9
;Szvegkirs
stop:
INT 21h
MOV AH,4Ch
;Kilps
INT 21h
main endp
end main
75
Fjl trlse:
.MODEL SMALL
.STACK
.DATA
File_name
DB teszt.txt,0
Success
DB Sikeres trls$
Nofile
Error
.CODE
main proc
MOV AX,DGROUP
DB Trlsi hiba$
;Adatszegmens belltsa
MOV DS,AX
LEA DX, File_name
MOV CX,3Fh
MOV AH,4Eh
INT 21h
JNC file_exist
;A fjl ltezik
JMP stop
file_exist:
LEA DX, File_name
MOV AH,41h
INT 21h
JNC deleting
;Sikeres trls
JMP stop
deleting:
LEA DX, Success
stop:
MOV AH,9
INT 21h
MOV AH,4Ch
INT 21h
main endp
end main
76
;Kilps
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
XOR AL, AL
;Fjl megnyitsa
INT 21h
JNC Opened
JMP Stop
Opened:
LEA DX, Data
;Adatterlet kezdcme
MOV BX, AX
;Handle BX-be
;Olvass a fjlbl
INT 21h
JNC Success
;Sikeres olvass
JMP Stop
Success:
MOV AH, 3Eh
;Fjl lezrs
INT 21h
LEA DX, Data
MOV AH,9
;Szvegkirs
Stop:
INT 21h
MOV AH,4Ch
;Kilps
INT 21h
main endp
end main
77
ADD AL, B
END;
SUB AL, B
END;
END;
78
MOV AX, A
MUL B
{Eljeles szorzs}
Function IntSzorzas (A, B: ShortInt): Integer ; Assembler;
ASM
MOV AL, A
IMUL B
{Szorzsa B-vel}
END;
{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.
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.
79
MOV AH, 2
INT 21h
{Karakter kirsa}
END;
{Egy karakter beolvassa a billentyrl}
Function Beolvas: Char; Assembler;
ASM
MOV AH,1
INT 21h
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
{DI mentse}
LES DI, T
MOV AL, a
{Els karakter}
{Ciklusvltoz belltsa}
CLD
@Uj_karakter:
STOSB
INC AL
{DI visszalltsa}
END;
{Soremels kirsa}
Procedure Soremeles; Assembler;
ASM
LEA DX, CR_LF {CR_LF ofszet cmnek betltse DX-ben
MOV AH, 9
INT 21h
END;
{Vrakozs egy karakter letsre}
Procedure Wait; Asembler;
ASM
MOV AH, 1
INT 21h
END;
Begin
Feltolt(Tomb);
For I:=1 to MAX do
Kiir(Tomb[I]);
Soremeles;
Wait;
End.
81
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
CLD
{Irnyjelz belltsa}
LODSB
XOR CX, CX
{CX trlse}
MOV CL, AL
@Uj_karakter:
LODSB
MOV DL, AL
MOV AH, 2
{Kirs funkci}
INT 21h
{Karakter kirsa}
{SI visszalltsa}
END;
Procedure StringRead(Var S: String); Assembler; {Sztring beolvass}
Const
CR=#13;
ASM
82
PUSH DI
{DI mentse
LES DI, S
CLD
{Irnyjelz belltsa}
XOR CX, CX
{CX trlse}
PUSH DI
INC DI
@Uj_karakter:
MOV AH, 1
INT 21h
CMP AL, CR
{ENTER ellenrzse}
JE @Vege
STOSB
INC CL
{Karakterszmlls}
JMP @Uj_karakter
{Kvetkez karakter}
@Vege:
MOV AL, CL
POP DI
STOSB
POP DI
{DI visszalltsa}
END;
Begin
Readln(ST);
Writeln;
{Soremels}
StringWrite(ST);
ST:=;
{Sztring trlse}
StringRead(ST);
Writeln;
{Soremels}
Writeln(ST);
Readln;
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
/* Egrkurzor struktra */
/* Egrkurzor bzispontja */
/* Egrkurzor kpe */
/* Egrkurzor struktra */
/* Egrkurzor struktra */
84
/* Egr adatstruktra*/
/* Egr pozici*/
/* Egr gomb*/
85
;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
87
;Ablak trlse
XOR CX, CX
MOV DH, 49
MOV DL, 79
MOV BH, 7
MOV AH, 6
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
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
;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
;BP mentse
MOV BP, SP
PUSH SI
;SI mentse
PUSHF
;Sttuszregiszter trolsa
CLD
new_char:
LODSB
OR AL,AL
JZ end_string
;Ugrs, ha AL=0
MOV AH, 2
;Kpernyre rs funkci
INT 21h
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
3. paramter
2. paramter
1. paramter
Visszatrsi cm
BP
BP mentse
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
Az assembly szubrutin:
PUBLIC goto_xy
goto_xy PROC x: WORD, y: WORD
MOV DH, BYTE PTR (y)
MOV BH, 0
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
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
OR AL, AL
JZ ext_kod
;Ugrs, ha kiterjesztett kd
XOR AH, AH
RET
ext_kod:
MOV AL,AH
MOV AH, 1
RET
read_key ENDP
93
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
9. Mellklet
10.
96
11.
Lebegpontos utastskszlet
123
12.
Megszaktsok
134
12.1.
134
12.2.
136
12.3.
137
12.4.
141
12.5.
141
12.6.
142
13.
145
13.1.
Alapkdok
145
13.2.
Billentykdok
146
95
96
97
98
99
100
101
imul
dx,514
imul
imul
dx, ax
imul
ax, [bx]
102
103
104
105
106
107
108
109
110
111
112
114
115
116
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
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
119
120
121
122
123
C1
C0
Relci
ST > forrs
ST < forrs
ST = forrs
ST nem sszehasonlthat
124
125
126
Konstans
+ 1.0
+ 0.0
log2(e)
log2(10)
log10(2)
loge(10)
127
128
129
ST(0)-ba tlti ST(0) s a forrs klnbsgt. (A forrs 32 vagy 64 bites vals lehet.)
FISUB forrs
ST(0)-ba tlti ST(0) s a forrs klnbsgt. (A forrs 16 vagy 32 bites egsz lehet.)
130
ST(0)-ba tlti a forrs s ST(0) klnbsgt. (A forrs 32 vagy 64 bites vals lehet.)
FISUBR forrs
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
C2
C1
C0
Relci
ST > forrs
ST < forrs
ST = forrs
ST nem sszehasonlthat
132
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
133
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.)
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
AH = 09h
AL
BL
BH
CX
AH = 0Ah
AL
BH
CX
AH = 0Bh
BH
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
AH = 0Fh
Vlasz:
AL
AH
BH
sznkd
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
Funkcibillenty esetn, els olvassra AL-ben 0 rtket kapunk, majd a msodik olvasskor
kapjuk meg scan-kdot.
AH = 02h
DL
AH = 04h
AH = 05h
AH = 06h
AH = 07h
AH = 08h
AH = 09h
DS:DX
karakterlnc kezdetnek memria cme (mutat)
A sztring a $ karakterig tart.
AH = 0Ah
Vlasz:
DS:DX
AH = 0Bh
AL
AH = 0Ch
Trli a billentyzet puffert, majd meghvja az AL-ben megadott (01h, 06h, 07h,
08h, 0Ah) funkcikd interruptot.
137
AH = 20h
Kilps a DOS-ba.
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
AH = 39h
DS:DX
Vlasz:
CF=0
CF=1
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
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
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
CX
DX
DS:BX
cl (memria) kezdcme.
Vlasz:
AX
hibakd
12.5. INT 26h funkci: lemezszektor rsa
AL
meghajt szma
CX
DX
DS:BX
Vlasz:
AX
hibakd
141
Inicializls
0 esetn nem inicializlhat, egybknt megtrtnt.
Egrkurzor lthatv ttele
CX
DX
AX = 04h
CX
DX
AX = 05h
BX
Vlasz:
AX
BX
CX
DX
AX = 06h
142
BX
Vlasz:
AX
BX
CX
DX
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
AX = 0Dh
AX = 0Eh
AX = 0Fh
Lpskz lltsa
143
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
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
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
145
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