Vous êtes sur la page 1sur 106

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Matijevics Istvn

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


Tanknyv

SZABADKAI MSZAKI FISKOLA

SZABADKA, 2001

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

TARTALOMJEGYZK
0. ..... ........ 1. ..... ........ 1.1 ........ 1.2 ........ ........... ........... ........... ........... TARTALOMJEGYZK ........................................... A PROGRAMOZS KEZDETEI............................ BEVEZETS.............................................................. MONOLITIKUS PROGRAMOK MONOLITIKUS PROGRAMOZS........................ A SZOFTVERTERMKEKKEL SZEMBEN TMASZTOTT IGNYEK...................................... SZOFTVERKRZIS.................................................. A SZOFTVERKRZIS HIBAJELENSGEINEK OKAI........................................................................... A szoftver cljnak felismerse................................. A program bonyolultsga.......................................... A programspecifikci nehzsgei............................ A programozi krnyezet elhanyagolsa.................. A trsadalmi krnyezet megvltozsnak hatsa a programozsra.............................................................. A SZOFTVERKRZIS ENYHTSE........................ SZOFTVER ENGINEERING.................................... A szoftverminsg jellemzi........................................ MODULRIS PROGRAMOZS.............................. Bevezets....................................................................... A modulris programozs elnyei.............................. A modul tpusai............................................................ Modulris programtervezs....................................... Modulris programok tesztelse, karbantartsa...... SZOFTVERFEJLESZTS S FZISAI.................. KVETELMNY ANALZIS................................... SPECIFIKCI.......................................................... TERVEZS.................................................................. IMPLEMENTCI.................................................... TELEPTS S TESZTELS................................... KARBANTARTS...................................................... A SZOFTVERTERMKEK KOMPONENSEI....... Adatfolyam diagram.................................................... Blokk diagram.............................................................. A SZOFTVER TERVEZSI FZISAI..................... A felhasznli fellet tervezse................................... A PROGRAMOZS MDSZERTANA................... ASSEMBLY PROGRAMOZS................................ BEVEZETS............................................................... ASSEMBLY PROGRAMOZSHOZ SZKSGES HARDVER ISMERETEK................. IBM PC S KOMPATIBILIS SZEMLYI SZMTGPEK....................................................... Bevezets....................................................................... A 8086, 8088 mikroprocesszor bels felptse ........ Az Intel 8086 processzor felptse............................... 1. 5. 5. 6. 7. 8. 9. 9. 10. 10. 10. 10. 11. 12. 12. 13. 13. 14. 14. 15. 17. 19. 19. 19. 20. 21. 21. 21. 22. 22. 22. 23. 24. 25. 29. 29. 29. 30. 30. 31. 31.

1.3 ........ ........... 1.4 ........ ........... 1.5 ........ ........... 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 ........... ........... ........... ........... ...........

1.6 ........ ........... 1.7 ........ ........... 1.7.1 ........... 1.8 ........ ........... 1.8.1 ........... 1.8.2 ........... 1.8.3 ........... 1.8.4 ........... 1.8.5 ........... 2. ..... ........ ........... 2.1 ........ ........... 2.2 ........ ........... 2.3 ........ ........... 2.4 ........ ........... 2.5 ........ ........... 2.6 ........ ........... 2.7 ........ ........... 2.7.1 ........... 2.7.2 ........... 2.8 ........ ........... 2.8.1 ........... 3. ..... ........ ........... 4. ..... ........ ........... 4.1 ........ ........... 4.2 ........ ........... 4.3 ........ ........... 4.3.1 ........... 4.3.2 ........... 4.3.2.1

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.3.2.2 4.3.2.3 4.3.2.4 4.3.2.5 4.3.3 ........... 4.3.4 ........... 4.3.4.1 4.3.4.2 4.3.5 ........... 4.4 ........ ........... 4.4.1 ........... 4.4.2 ........... 4.4.3 ........... 4.4.3.1 4.4.3.2 4.4.3.3 4.4.3.4 4.4.3.5 4.4.3.6 4.4.3.7 4.4.3.8 4.4.4 ........... 4.4.4.1 4.4.4.2 4.4.4.3 ........... ........... ........... ........... 5.2.1.1 5.2.1.2 ........... 5.2.2.1 ........... 5.2.3.1 5.2.3.2 ........... 5.2.4.1 ........... ........... ........... A 8086 mikroprocesszor mkdse............................... A 8086 cmzsi technikja............................................. A programozsi cmzsi mdok..................................... Adatmemria cmzsi mdok........................................ 80286, 80386, 80486, Pentium, Pentium II s Pentium III processzorok............................................ Az IBM PC sinrendszere............................................. Bevezets....................................................................... IBM PC bels sinrendszer (busz)............................... A szmtgp felptse a programozs szempontjbl.............................................................. EGYSZER ASSEMBLY PROGRAMOK.............. A DEBUG program..................................................... Assembly programok rsa, fordtsa, szerkesztse s futtatsa................................................................... A *.exe s *.com program felptse.......................... 1. feladat......................................................................... 2. feladat......................................................................... 3. feladat......................................................................... 4. feladat......................................................................... 5. feladat......................................................................... 6. feladat......................................................................... 7. feladat......................................................................... 8. feladat......................................................................... Az IBM PC grafikus krtyjnak vezrlse assembly-bl................................................................. Klnfle grafikus zemmdok programozsa........ Az IBM PC szmtgp CGA grafikus zemmdja.. Az IBM PC szmtgp VGA grafikus zemmdja.. PROLOG...................................................................... BEVEZETS................................................................ A PROLOG NYELVTANI SZABLYAI................. Lekrdezs tnyek alapjn.......................................... 1. plda........................................................................... 2. plda........................................................................... Rekurzi........................................................................ 3. plda........................................................................... Tagads......................................................................... 4. plda........................................................................... 5. plda........................................................................... Az eredmnyek kijelzse............................................. 6. plda........................................................................... Levgs s kudarc........................................................ Levgs......................................................................... A TURBO-PROLOG BETLTSE, INDTSA S MENRENDSZERE............................................. A LOGIKAI NYELVEKRE VONATKOZ NHNY FONTOSABB DEFINCI...................... A PROLOG PROGRAM TULAJDONSGA.......... A TURB-PROLOG PROGRAM SZERKEZETE 33. 34. 34. 35. 35. 35. 35. 36. 36. 38. 38. 41. 43. 44. 45. 46. 47. 48. 49. 51. 55. 57. 57. 57. 59. 63. 63. 64. 66. 67. 68. 68. 69. 70. 71. 71. 72. 72. 73. 73. 75. 75. 76. 77.

5. ..... ........ 5.1 ........ 5.2 ........ 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.3 ........

5.4 ........ ........... 5.5 ........ ........... 5.6 ........ ...........

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 80. 5.7 ........ ........... A LEGGYAKRABBAN HASZNLT PROLOG ALGORITMUSOK...................................................... 82. 5.7.1 ........... Szlsrtk-kivlaszts (legkisebb, legnagyobb elem keresse)............................................................... 5.7.2 ........... sszegzs....................................................................... 83. 84. 5.7.3 ........... Elem trlse listbl..................................................... 5.7.4 ........... sszefuttats................................................................. 87. 87. 5.7.5 ........... nikpzs, metszetkpzs.......................................... 5.7.6 ........... Rendezs permutlssal............................................... 89. 5.7.7 ........... Rendezs minimumkivlasztssal............................... 91. 91. 5.7.8 ........... Rendezs beszrssal................................................... 92. 5.7.9 ........... Gyorsrendezs (Quicksort)......................................... 95. 6. ..... ........ ........... MELLKLETEK........................................................ 95. 6.1 ........ ........... ASCII KDTBLZAT 96. 6.2 ........ ........... I8086 SSZEFOGLAL 107. 7. ..... ........ ........... IRODALOM

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

1. A PROGRAMOZS KEZDETEI
1.1 BEVEZETS
Az 1950-es vekben indult programozsra jellemz volt, hogy a programozk klnsen nagy hangslyt fektettek arra: hogy a programok futsi ideje a lehet legrvidebb legyen s a programok a lehet legkisebb trterletet (memrit) foglaljanak el. A fenti kt kvetelmny a kor szerny mszaki felttelei miatt jelentkezett, a szmtstechnika (h)skorban igen kis mveletvgrehajtsi sebessg (nagy ciklusid) gpek lltak a rendelkezsre szerny trkapacitsokkal. Igen gyakran elfordult, hogy a programoz csak akkor tudta a programot betlteni, ha nhny utastst gyes trkkkkel lefaragott. Ebben az idben a j programoz rvid, elegns s sokszor bonyolult programokat rt. Az ily mdon ltrehozott programokra jellemz volt az, hogy hibsa, vagy sokszor sehogy sem tudtk kielgteni a velk szemben tmasztott ignyeket. Ennek a helyzetnek a szemlltetsere szolgl az 1.1 bra. Program: utastsok sorozata, melyet a szmtgp azrt hajt vgre, hogy megoldjon egy feladatot. A szmtgp csak az operatv memrijban lev gpi kd programot hajtja vgre. A program lehet rendszerprogram s felhasznli program. Programozs: a program ltrehozsa. Szkebb rtelemben a program lefutssnak rszletes lersa, a program kdolsa, tesztelse s a programdokumentci ltrehozsa. Tgabb rtelemben az elzeket mg megelzi a feladat elemzse s az egsz programcsomag megtervezse nagy vonalakban. Operatv memria: munkamemria, egy kzvetlen elrs memria, amelyben a program s adatok helyezkednek el.

1.1 bra: a programozs els veiben megrt programok hatkonysga

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

1.2 MONOLITIKUS PROGRAMOK MONOLITIKUS PROGRAMOZS


A mszaki felttelek, vagyis a hardver s a szoftver fejlettsge a szmtstechnika Hardver: a szmtgp sszes kialakulsakor csak gynevezett monolitikus mechanikus s elektronikus rsze. prgramozst tett lehetv. Ezekre a programokra jellemz, hogy elejtl kezdve Szoftver: a hardvert irnyt sszes utastsonknt kdoltk a programlpseket, program. valamint az is jellegzetessgk, hogy csak ezutn kerlhetett sor a tesztelsre. Az ismtld rszeket annyiszor kellett megrni, ahnyszor a programban elfordultak. Ez a korszak egszen a 60-as vek elejig tartott. Ez a programozsi technika ugyan elavult, de kisebb mai rendszereknl, pldul egyszer mikrovezrlknl elfordulhat alkalmazsa, hiszen ezeknl a berendezseknl nhny tz bjt RAM memria, nhny szintes veremtr., stb. jelenti a hardverkapacitst. A mdszer nagy htrnya az, hogy a tesztels idtartama brmilyen hossz lehet, Tesztels: olyan eljrs, melynek egy-kt nap ugyangy mint 1 hnap, vagy clja a programhibk feldertse. hosszabb id is. Sohasem lehet meghatrozni Programiba az eredmnyek minden az elre megadott azt, hogy a tesztels milyen fzisban van. A eltrse nagy szm programban lev logikai g teszi rtkektl. teljesen lehetetlenn a tesztelst. Ha ilyenkor a tesztelst idhiny miatt csak a fgakra korltozzuk, megeshet, hogy gy a mellkgakban meglev hibk futtatskor okoznak problmt. Ilyenkor a javts, programfoltozgats csak tovbb rontja a helyzetet, ugyanis mg ttekinthetetlenebb vlik a rendszer. Ha mgis sikerl belni a programot, a program tovbbfejlesztse lesz Programoz: az a szemly aki problmatikus, az ttekinthetsg hinya kialaktja, megrja s teszteli a miatt. Amennyiben mgis szksges a programot. Van rendszerprogramoprogram tovbbfejlesztse, akkor lehet hogy z s felhasznli programokat r jobb megolds a feladat jrafogalmazsa s programoz. j program rsa. Ez klnsen akkor igaz, ha ms munkjt szeretnnk tovbbfejleszteni. Minden programoz szereti a problmkat a sajt elgondolsa, tapasztalata alapjn megoldani, ami trkks, csavaros megoldsokat eredmnyez, gy msok szmra rthetetlen megoldsok keletkeznek. Monolitikus programok rsnl lehet a hatkonysgot nvelni s a kltsgeket cskkenteni, ha a bonyolultabb, nagyobb szaktudst ignyl rszeket tapasztalt programozkra, mg az egyszerbb rszeket kezdkre, kevesebb tapasztalattal rendelkez szoftverfejlesztkre bzzuk. A monolitikus programok ltrehozsnak nagy htrnya az, hogy nehezen, esetleg
10

Erforrs: az sszes hardver elem s az sszes szoftver elem (program).

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK sehogyan sem becslhetjk meg elre a ltrehozshoz szksges munkaidt s erforrsokat.

1.3 A SZOFTVERTERMKEKKEL SZEMBEN TMASZTOTT IGNYEK


A szmtstechnika indulsakor a szoftverrel szemben tmasztott kvetelmnyek a kvetkezk voltak: a feladat pontos vgrehajtsa, a lehet legrvidebb futsi id s a lehet legkisebb helyfoglals (memria-kapacits). A mai modern szoftvertermkekkel szemben a kvetkez elsdlegesen fontos kvetelmnyrendszert llthatjuk fel: a program felttlen megbzhatsga, a gyors s olcs kivitelezs, a hatridk pontos betartsa, a hibtlan programozs minimlis bejratsi idt adjon, a knny karbantarthatsg (maintability), egyszer tovbbfejleszthetsg (extensibility) s a programnak a programoz szemlyisgtl val fggetlensge (egoless programming). Megbzhatsg: egy funkcionlis egysggel szemben tmasztott kvetelmny, hogy a feladatt adott idtartam alatt vgrehajtsa. Hardver megbzhatsg az egsz gpre, a szoftvermegbzhatsg az adott programra vonatkozik. Karbantarts: minden tevkenysg, amely biztostja a gp mkdst. Hardver karbantarts a hardver elemek hibtlan mkdst szolglja, mg a szoftver karbantarts a szoftverhibk megszntetse mellett az j opercis rendszerekhez val illesztst is jelenti.

Az imnt felsorolt minsgi kvetelmnyek mell mennyisgi kvetelmnyek is prosulnak. A szmtstechnika fejldse igen erteljes volt, kezdetben csak kevs programot rtak, ma mr gyakorlatilag letnk minden terlett uraljk azok a berendezsek, melyek programok segtsgvel mkdnek, hiszen gyakorlatilag minden berendezs egy kisebb, vagy nagyobb teljestmny szmtgp, vagy mikrovezrl. Megvltoztak a programfejlesztsi, programrsi technolgik, a kezdeti monolitikus programrstl a modulris s struktrlis programfejlesztsen keresztl az objektumorientlt rendszerekig jutott el a szmtstechnika. Ha sszehasonltjuk a programfejlesztst az ipari nagy szorozatban gyrtott berendezsekkel, akkor meg kell llaptani, hogy itt mg mindig egyedi programfejlesztsekrl van csak sz. gy igen sok hibaforrs marad a szoftver fejlesztsekben, ahol szoftverkrzisrl beszlhetnk. Mivel mg ma is elfordul monolitikus programozs (az egyszer mikrovezrlknl), rdemes elemezni a szoftverkrzis krdseit.

11

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

1.4 SZOFTVERKRZIS
A fent trgyalt monolitikus programozsnl megllapthat ltalnossgban, hogy ltezik: megbzhatatlansg, az alkalmazkodkpessg hinya, nehzkessg s az udvariatlansg. Amikor megbzhatatlansgrl beszlnk, akkor klnsen arrl tesznk emltst, hogy a programmal szemben fellltott specifikciknak nem tesz eleget a megrt program, egyszval nem hajtja vgre az elrt feladatokat. Ilyenkor a program: a megengedett input adathalmaz nem minden elemre rtelmezett, esetleg nem minden elemre fejezdik be, vagy hibs eredmnyeket szolgltat. Szintn megbzhatatlansgi problma az is, ha a program: nem vdekezik az input szintakSzintaktikus hiba: elrs. tikus hibi ellen, vagy a program adatait s adatbzisait illeglis hozzfrsek ellen nem vdi, vagy a program nincs felksztve a rendszerkatasztrfk elhrtsra. A program alkalmazkodkpessgnek hinya a ksz program azon tulajdonsga, hogy: 'rzkeny' az opercis rendszer Opercis rendszer: programok mdostsaival, vagy cserjvel sszessge, mely lehetv teszi a szemben (mshogy mkdik felhasznl szmra a szmtgp DOS s mshogy WINDOWS, sszes erforrsnak (hardver s illetve UNIX opercis rendszer szoftver) egyszer hasznlatt. alatt), vagy a program nem hasznlja ki az opercis rendszer s a hardver nyjtotta lehetsgeket, vagy j gpkonfigurci esetn nem kpes az j lehetsgeket hasznlni, vagy ms gpre val tvitelkor nagy mdostsokat kell ltrehozni (portbilits hinya), vagy nvekv terhelskor a teljestkpessge rohamosan cskken. A program nehzkessge a program elksztsre s tovbbfejlesztsre vonatkozik, ami lehet: sszelltsi, rszekbl trtn sszeszerkesztsi problma, ami tlthatatlan programszerkezetet okoz, vagy tesztelsi nehzsg, tesztsszellts, eredmnykirtkels, ami nagy fradsgba kerl, vagy sok gpidt foglal le, vagy, nehz programhiba-hely, programhiba-ok felderts, vagy brmilyen mdosts vgrehajtsa arnytalanul nagy munkabefektets.

12

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A program udvariatlansgrl akkor beszlnk, ha kezelsekor, futsakor (teht a kszlk hasznlatakor) vagy az eredmnyek kirtkelsekor nehzsgekbe tkzik a felhasznl. Udvariatlan a program, ha: helytelen kezelskor nem ad lehetsget a hiba kijavtsra, vagyis lebnul, vagy csak egyflekppen dolgozik, pldul nem lehet rvidtseket hasznlni, vagy a hibajelzsek ktrtelmek, nem elg vilgosak, vagy az input adatok bevitelekor sszertlenl kell sok felesleges adatot bevinni, vagy a kimen adatok, eredmnyek nem szelektlhatk, nem emelhetk ki kzlk a szmunkra fontosak. A szofverkrzis megjelense idben a 60-as vek vgre, a 70-es vek elejre tehet. Ennek egyik oka a hardverrak erteljes cskkense (megvsrolhat a hardver, mindenki szmtgppel oldja meg problmit), a msik ok pedig a hardverteljestmny ltvnyos megnvekedse (jobban ki lehet hasznlni a rendszert, sszetettebbek a megoldsok).

1.5 A SZOFTVERKRZIS HIBAJELENSGEINEK OKAI


A szoftverkrzis mlyebb okainak nhny pontjt a kvetkezkben trjuk fel. 1.5.1 A szoftver cljnak felismerse Mint mr sz volt rla, a szoftverfejleszts kezdeteinl komoly korltoz tnyez volt a korltozott trkapacits s a lass futsi id, amely tnyezk a mai mikrogpeknl mr nem jelentkeznek, illetve csak korltozottabb mrtkben. Mgis, elfordul, hogy programozk ma is ebbe a hibba esnek, nem hasznljk ki a ma nyjtotta mszaki lehetsgeket. Az 1.2 brn az vek folyamn vltoz hardver-szoftver szzalkos kltsgmegoszlst lthatjuk.

1.2 bra: a hardver-szoftver szzalkos kltsgmegoszlsa az vek folyamn

13

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 1.5.2 A program bonyolultsga A program bonyolultsga, vagy komplexitsa azt fejezi ki, hogy a programnak sok egymssal tbbszrsen sszefgg program- s adatllapot egymsutnjt kell megszerveznie. A bonyolultsg forrsai kztt szerepet jtszik: a kivitelez rendezetlensge, a kivitelezs szervezetlensge, a szoftver-kszts tudomnyos megalapozottsgnak elgtelensge s a programozk tapasztalatlansga. 1.5.3 A programspecifikci nehzsgei Nagyon sokszor a feladat megrendelje nem tudja teljesen megfogalmazni ignyeit. Az is elfordul, hogy ugyan pontosan s helyesen megfogalmazott ignnyel lp fel a megrendel, de az adott szakterletet a programoz nem ismeri megfelel mlysgben. Ilyenkor hibs, ellentmond s hinyos specifikcik keletkeznek. A programoz ezek utn hiba kszt el a specifikcinak tkletesen megfelel, hibtlan programot, az nem a vals feladatot hajtja vgre. 1.5.4 A programozi krnyezet elhanyagolsa A programoz, mint egyn tudomnyos-technikai mdszerekkel oldja meg feladatt, de mindig egy (vagy tbb) csoport tagjaknt. Mikor a csoport tagjaknt dolgozik, akkor az emberi krnyezet fel fordul. Ha elhanyagoljk ezt az emberi krnyezetet, akkor ez sokszor felelss tehet a szoftver-gyrts sikertelensgrt. 1.5.5 A trsadalmi krnyezet megvltozsnak hatsa a programozsra A szoftver-krzis valamikor a hatvanas vekben jelentkezett elszr. A nagyon drga felszerels, nagy kltsgekkel kikpzett szemlyzet a kezdetekkor csak azt tette lehetv, hogy nagy cgek az egyetemek kivl szakembereivel egyttmkdve ksztsenek programokat. Mind a cgeknl, mind az egyetemeken kivl szakgrda vett rszt a szoftver-gyrtsban. A nagyobb teljestmny programok megrsa, tesztelse, hasznlata s karbantartsa mindig egy-egy kivl szakemberhez fzdtt. Ez biztostk volt a kivl programok, munkk megszletsre. A hatvanas vek elejn bekvetkez szmtstechnikai robbans, amikor a szmtstechnika kikerl a termelsbe, kzgazdasgba, rhajzsba, egyszval a mindennapi letbe, azt eredmnyezi, hogy igny keletkezik a szoftver nagyipari gyrtsra. Ez a szoftverkszts szemlyes jellegt, az egyni, manufakturlis gyrtst megsznteti, talaktja a nagyipari gyrts mintjra.

14

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Csakhogy a szoftver-gyrts nem mkdhet teljesen a nagyipari gyrts mintjra a kvetkez eltrsek miatt: a szoftver egyedi termk, teht egy termk nem gyrthat sorozatban, a szoftvertermknl nincs egy adatban, redundancia, vagyis mr egy Redundancia: rossz utasts katasztrflis hibt utastsban vagy programban egy informci tbbszri elfordulsa. okozhat, a szoftverelemek tudomnyos vizsglata mg nem rte el azt a szintet, mint a gpipari gyrtsnl az egyes termkeket jellemz elemeknek az ismerete s a nagyipari gyrtsnl rendkvl fejlett szervezettsg s igen szigor szabvnyosts van, ami nem jellemz az egyedi szofvertermk ellltsra.

1.6 A SZOFTVERKRZIS ENYHTSE


A szofverkrzis kikszblsre olyan programfejlesztsi mdszerek alakultak, amelyek a kvetkez csoportokba sorolhatk: modulris programozs, Mestersges intelligencia: tudo strukturlt programozs, mny, mely olyan feladatokat old a mestersges intelligencia meg, amiket az ember intelligencija szablayit alkalmoz technikk s segtsgvel tud megoldani. objektum orientlt programozs.

1.7 SZOFTVER ENGINEERING


A szoftverkrzis s annak kvetkezmnyei vezettek 1968-ban a szoftver engineering fogalmnak megszletshez. A szoftver engineering egy j szemllet, egy mdszertant biztost a programok, programfejlesztsi eszkzk termkszer gyrtsra. Eltrbe kerlt a szoftver, mint szellemi produktum termkszer jellege, azaz a minsg, az eladhatsg. A szoftver termkk vlst a kztudatban az neheztette, hogy - "mszaki" termk ltre - olyan tulajdonsgokkal is rendelkezik, amelyek az ember ltal ksztett lvezeti termkeknek (mvszet) is sajtjuk. Ezen tulajdonsgok sszefoglalsa lthat az 1.1 tblzatban. 1.1 tblzat: a mvszet, a szoftver s a mszaki termk sszehasonltsa mvszet
elssorban eszttikai ignyt elgt ki nem az anyagi megjelense a lnyeges nincs kzvetlen kapcsolata a valsggal nem sorozatgyrtssal kszl fejleszts = gyrts msolat eredeti hasznlat miatt nem ignyel karbantartst hasznlata kzben krnyezete nem befolysolja a viselkedst

szoftver

"mszaki" termk
anyagi megjelensben funkcionl

elssorban clszersgi ignyt elgt ki

kzvetlen kapcsolatban van a valsggal sorozatgyrtssal kszl fejleszts + gyrts msolat = eredeti hasznlata kzben karbantartst ignyel viselkedse fgg a kls krnyezettl (pldul helytelen kezels ltal fellp hibk)

15

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A szoftver engineering nhny defincija: eszkzk s mdszerek a szoftver termkszer ellltsra, tudomnyos ismeretek clszer alkalmazsa szmtgpprogramok valamint a fejlesztskhz, mkdskhz, karbantartsukhoz szksges dokumentcik tervezsre s megalkotsra (Boehm 1976), szoftver termkek szisztematikus gyrtsra s karbantartsra s kltsgvetsre vonatkoz technolgiai s menedzsment vezrelv (IEEE 1983). 1.7.1 A szoftver minsg jellemzi A szoftver minsge egzakt mutatkkal nem lerhat. Kls s bels tnyezket kell vizsglunk, hogy kpet alkothassunk a szoftver minsgrl. A kls tnyezk hatrozzk meg, hogy a szoftvernek milyen feltteleknek kell megfelelnie, a bels tnyezk a kdolsi mdszert jellemzik. Tulajdonkppen a vgeredmny szempontjbl csak a kls tnyezk szmtanak, azonban ezeknek j rsze ersen fgg a bels tnyezktl. Kls tnyezk: Helyessg (correctness): a programnak pontosan a specifikcija szerint kell mkdni. Robosztussg (robustness): szlssges (nem specifiklt) felttelek kztti mkdsi md, a szoftver a legvratlanabb esetekben sem okozhat jelents krt., Mdosthatsg (extendibility): a szoftver ms krnyezetben kis kiigaztsokkal is mkdik, jrahasznlhatsg (reuseability): szoftver, vagy egyes rszeinek felhasznlsa ms problmk megoldsra, Kompatibilits (compatibility): ms szoftverekkel val egyttmkds, Knny hasznlhatsg: a szoftver hasznlatnak gyors s knny elsajttsa, emberkzeli s logikus szoftverkezels, Hatkonysg, Hordozhatsg, Tesztelhetsg, Integrits. Bels tnyezk: Olvashatsg: a programnak vilgosan s rtheten kell kdolva lennie, tiszta logikval, Modularits: mennyire van rszekre bontva a program, s az egyes rszek mennyire ltnak el kln feladatokat. Strukturltsg. A kls tnyezk kzl az els kett a szoftver megbzhatsgt (reliability) jelenti. Egy szoftver akkor tekinthet megbzhatnak, ha minden krlmnyek kztt a specifikcijnak megfelelen mkdik. Hibs adatok berkezse vratlan krlmny, ezt a szoftvernek le kell tudnia kezelni. A szoftver biztonsgossgnak nvelse kltsges dolog, viszont egy olyan szoftver ami nincs felkszlve extrm krlmnyekre, sokkal nagyobb hibt kpes okozni (pl. adatveszts).
16

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

1.8 MODULRIS PROGRAMOZS


1.8.1 Bevezets A monolitikus, teht egyben megrt programoknl mr lthat volt, hogy nem lehet kzben tartani a nagyobb terjedelm programok rst, fejlesztst, tesztelst, karbantartst s bvtst. Igen hamar felfigyeltek a programozk arra, hogy azokat a programokat egyszer s knny implementlni s karbantartani, amelyekben egymstl elklntett s jl rthet rszek vannak. Ezeket a rszeket moduloknak nevezzk. A problma megoldsa gyorsabb s knnyebb vlik, ha a feladatot kdols s tesztels szempontjbl kln kezelhet rszekre bontjuk, vagyis nem kell a feladatot minden szempontbl egyidejleg szem eltt tartani. L.L. Constantine defincija szerint a modul formlisan utastsok sorozata, ahol minden modulnak sajt elnevezse, neve van, a programrendszer ms rszeibl hvhat, valamint rendelkezhet helyi, vagy loklis vltozkkal. Ilyen szempontbl modul pl. az assembly program alprogramja (szubrutinja). Assembly: szimbolikus nyelv, melynek utastskszlete a gpi kd utastsokkal egyezik meg. Alprogram: nmagban fggetlen programegysg, de nmagban nem hajthat vgre. Mindig a fprogram, vagy ms alprogram hvja, esetleg lehet nmagt hv (rekurzv). Futsa befejezsekor a hv program kvetkez utastsra lp vissza.

Parnas azt mondja, hogy a feladat rszfeladatokra val bontsnak alapvet kritriuma a informcik elrejtse. Egy program tbb programobjektumra (algoritmusra, adatsruktrra, konfigurcira stb.) vonatkoz ismeretet tartalmaz, amelyre a program tbb pontjn is hivatkozhatunk. gy arra kell trekedni, hogy valamely programobjektumra vonatkoz ismerethalmazt a programnak egy fizikailag a tbbitl jl elvlaszthat rszbe tmrtsk, ezek a rszek a modulok. Akkor tkletesen modularizlt egy program, ha minden modul bizonyos ismeretek kizrolagos birtokban van. A modul: a feladatnak valamilyen logikai egysge, nll nvvel rendelkez, nmagban rthet programegysg s nllan kdolhat, tesztelhet. A modul a krnyezetvel, vagyis a tbbi modullal paramterek, nevek s kzs vltozk segtsgvel tartja fenn a kapcsolatot. A nagy modulokat az elz elvek alapjn tovbb kell bontani egyszerbb modulokra.

17

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 1.8.2 A modulris programozs elnyei A program modulokra bontsa nem mindig egyszer, da a kapott modulok egyetlen logikai funkcit hajtanak vgre, gy a modul igen knnyen rthet, tiszta logikval rendelkezik, vilgos s ttekinthet. Az egyszer modul kis logikai egysg, gy valsznleg kevs utastsbl ll. Ezrt knny a kdolsi szabvnyok betartsa s pontos s teljes dokumentci elksztse. A programozk munkja ezrt knnyebben ellenrizhet. Rvid s alapos modulvizsglat vgezhet el a rvid modulokon, gy minden kdolsi egysg j minsg, jl tesztelhet. A j minsg modulokbl felpl program is j minsg. Modulris programozsnl az egyes modulokat ms s ms programnyelven rhatjuk. Ebbl kvetkezik az, hogy a program megrshoz a programozkat is knnyebb kivlasztani, jobb lesz a munkamegoszts. A bonyolultabb programrszeket a tapasztaltabb programozk, mg az egyszerbbet a kezd programozk is megrhatjk. Ez azt is eredmnyezheti, hogy a kezdket korn be lehet kapcsolni komolyabb feladatokba, ahol a szerzett tapasztalatuk alapjn haladhatnak elre. Tovbbi elnye a modulris programozsnak, hogy az rsi munkafolyamatot lervidti a tbb programoz bekapcsolsa, hiszen prhuzamosan trtnik a modulok rsa s tesztelse. Modulris programozssal elrelthat, betervezhet a mdostsok gyors, hibtlan kivitelezse, ami flexibilis (knnyen vltoztathat) programok ltrehozst biztostja. Ilyenkor csak a megfelel modulokat kell cserlni. A szabvnyos modulokat modulknyvtrakban lehet trolni s ms programok ltrehozsnl bepteni. Modulknyvtr: egy nv al gyjttt modulok, meleyeket akr az opercis rendszer hvhat, de a programoz is beptheti a modulokat a programjba.

Nagyobb programok fejlesztsnek, belvsnek ideje nehezen ,vagy sehogyan nem becslhet meg, mg a rvid modulok fejlesztsnek ideje knnyen becslhet, ezzel egytt a modulokra bontott nagy programok fejlesztsre sznt id is. Megolddik a modulris programozssal az esetleges fejleszts kzbeni programozcsere, hiszen a kis modulokat knnyebben veszik t az j programozk, gy egy program sohasem marad egy kzben. A modulris programozs a karbantartst is megknnyti, hiszen ellenttben a monolitikus programokkal itt knnyeb megtallni azt a pontot, ahol mdostani kell. 1.8.3 A modul tpusai A modul vizsglatnak szempontjai: a modul funkcija szerint,
18

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK mkdsi logikja szerint s kapcsolata ms modulokhoz.

A modul fekete doboz, funkcija (feladata) az input paramterek lekpezse output paramterekk. Nem trdnk azzal, hogyan mkdik. A modul mkdsi logikjnak vizsglatakor az rdekel bennnket, hogy hogyan hajtja vgre funkcijt. Arm szerint a modulok felosztsa funkcijuk szerint: adatmodul (data modul), vezrlmodul (control modul), eljrsmodul (process modul) s input-output modul (I/O modul). Adatmodul Az adatmodul passzv, a program sszes adatmezeje egytt, egy helyen tallhat. Vezrlmodul Minden programban van egy vezrlmodul s ez a modul hvja az eljrsmodulokat, szervezi s irnytja a program logikjt. A vezrlmodul funkcii: eldnteni, hogy melyik eljrsmodul kapja meg a vezrlst, minden eljrsmodulba nem ill tevkenysg vgrehajtsa s a tl egyszer tevkenysgek vgrehajtsa. Eljrsmodul Az eljrsmodul feladata egy logikai funkci vgrehajtsa. Az eljrsmodul hivhat: msik eljrsmodult s I/O modult. A modul vgn visszatrsi utasts van a hv modul kvetkez utastsra. I/O modul Egyetlen perifrihoz kttt mvelet. 1.8.4 Modulris programtervezs A modulris programtervezs a kvetkez lpsekbl ll: a rendszer modulszerkezetnek megtervezse a feladat specifikcija alapjn, az egyes modulok feladatnak rsban val rgztse (modulspecifikci), valamint az egyes modulok kztti kapcsolatok minimalizlsa,

19

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK a modulok ellenrzse a szerint, hogy elg egyszerek-e, a modulok algoritmusainak megtervezse s ha egyes modulok tovbbi elemekre bonthatk, akkor ezekre a modulokra az elz 4 lpst vgrehajtjuk.

Modulris tervezskor n. fellrl lefel Dekompozci: valamilyen (top down) tervezst alaklmazunk, ahol szempont szerinti rszekre bonts. dekompozcit hajtunk vgre. Valamilyen programozsi tevkenysg fellrl lefel trtnik, a logikailag magasabb szint egysgektl kezdve az alacsonyabb szintek fel. A modul hvsnak szablyai a kvetkezk: a modul ha befejezi mkdst a vezrlst visszaadja a hvsi pont utni utastsra, ers ktsnl (hierarchia) a modul csak az egy szinttel alatta lev modult hvhatja, gyenge ktsnl megengedett a tbb szinttel lejjebb lev modulok hvsa is, nem alkalmazhatk rekurzv modulok (csak kivtelesen) s magasabb szinten lev modult nem hvhat meg a modul. Az 1.3 brn egy ers ktst bemutat modulkapcsolat, mg az 1.4 brn egy gyenge kts modulkapcsolat lthat. Az ers ktsnl (1.3 bra) 3 modulszint lthat, itt kizrlag A modul hvhatja B, C vagy D modult, illetve kizrlag D hvhatja meg kzvetlenl E modult. Itt kizrt pldul az, hogy B meghvja C modult, de nem lehetsges az sem, hogy A kzvetlenl meghvja E modult, ez csak D-n keresztl trtnhet meg.

1.3 bra: ers hierarchij programszerkezet Amennyiben szksges az, hogy B kzvetlenl meghvja C modult, akkor a 1.4 bra szerinti gyenge hierarchij programszerkezetet kell alkalmazni.

20

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

1.4 bra: gyenge hierarchij programszerkezet 1.8.5 Modulris programok tesztelse, karbantartsa A modulrisan megrt programok tesztelse kt lpsben trtnik: a modulok tesztelse s a program tesztelse. A modulokat kln-kln lehet csak megrni, gy tesztelsk is csak egymstl fggetlenl lehetsges. Ez veszlyt is rejt magban, hiszen a modulok kztt hvsukkor kapcsolat keletkezik (paramtertads). A modulok nmagukban mg nem futtathat programrszek, tesztelsk bizonyos krnyezet ltrehozst ignyli. Ilyenkor meg kell oldani: a modul hvsnak szimullst, a modulbl hvott modulok szimullst s a tesztelt modul szmra szksges tesztadatok ltrehozst s elrst. Az lenne j, ha: minden modul nmagban, ms moduloktl fggetlenl lenne tesztelhet, lnyegtelen volna hogy a struktra mely szintjn helyezkedik el a modul, illetve hogy a tbbi modul mr ltezik-e, vagy sem. Hasonlan a monolitikus program tesztelshez itt is szksges (lenne) az sszes lehetsges eset figyelembe vtele. A modul tulajdonsgai a tesztels szempontjbl a kvetkezk: a program egyetlen funkcijt valstja meg, ttekinthet s rthet a logikja, rvid, kis szm elgazst tartalmaz (logikai utak) s kis szm adaton hajt vgre mveletet. A sikeres modultesztek utn a modulokat sszefzve kapjuk a programot. A program tesztelsekor a modulok sszekapcsolsnak sorrendjt kell ellenrizni, melyik modul mikor hvhatja az alatta lev szinten elhelyezked modult. Hasonlan a modulok

21

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK tesztelshez, az egsz program tesztelsekor is olyan adatokkal kell dolgozni, melyek az sszes elgazst, gat bejrjk. Sikeres programhasznlat sorn is felmerlhet olyan igny, amely a program mdostst, karbantartst okozhatja. A modulris programtechnika elnye az, hogy ilyenkor nem kell teljesen j programot rni, csak a modulok hvst, hvsi sorrendjt megvltoztatni, vagy bizonyos modulokat kell csak jbl ltrehozni. Termszetesen ilyenkor is szksges a mdostott, vagy j modulok tesztelse ugyangy, mint az egsz, sszeszerkesztett program tesztelse.

22

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

2. SZOFTVERFEJLESZTS S FZISAI
2.1 KVETELMNY ANALZIS
A szoftverfejlesztk a megrendelktl a szksges informcikat meg kell hogy szerezzk. A szksges informciknak valahogyan a birtokba kell jutniuk, aztn pedig rendszerezni kell a rendelkezsre ll informcikat. Ez egy ktoldal megbeszlssorozat a majdani felhasznl s a fejlesztcsapat kztt. A fzis vgn megszletik az gynevezett Projekt terv, amit a 2.1 brn lthatunk.

2.1 bra: a projekt terv kialaktsa A Projekt tervnek egy lehetsges struktrjra lthatunk pldt a 2.1 tblzatban.

2.2 SPECIFIKCI
A fejlesztend programrendszer rszletes lersa szintn a kt fl (megrendel kivitelez) kzs megbeszlse utn alakul ki, ami esetleg mg a szerzds alapjt is kpezheti. Ez a rszletes specifikci gy is felfoghat, mint a kvetelmny analzis folytatsa formlis eszkzkkel. A specifikci meghatrozsnak hrom f tevkenysge a 2.2 tblzatban lthat.

23

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 2.1 tblzat: a Projekt terv kialaktsa


Bevezets a problma lersa a krnyezet lersa az elrend clok megfogalmazsa a megoldsi javaslatok sszefoglalsa Felttelek, korltok, kvetelmnyek a megrendel prioritsa a felhasznl profilja a termk elvrt lettartama teljestmny kvetelmnyek a meglv szoftver-hardver kvetelmnyek tovbbfejlesztsi elkpzelsek betantsi, installcis dokumnetcis kvetelmnyek a megrendel krnyezete (hardver s szoftver lehetsgei) alternatv megoldsok a tervezett s az alternatv megoldsok megvalsthatsga Eljrsok a fejlesztsi stratgia (letciklus modell) mdszerek s jells-rendszerek szabvnyok s minsgbiztosts kltsg-figyels gyrtsirnyts tesztels, teszt adatok elfogads felttele fizetsi felttelek Javaslatok a fejleszts ltalnos stratgija javaslat a megoldsra a felhasznl s a megrendel szerepe a javasolt megoldsban a javasolt megolds ltal biztostott funkcik a javasolt megolds elnyei s htrnyai

Becslsek munkafeloszts temterv munkatrsak (szervezet) kltsgvets kltsganalzis kockzat analzis szksges eszkzk

Hivatkozsok felhasznlt dokumentumok szakkifejezsek jegyzke szerzds (tervezet)

2.2 tblzat: a programrendszer kialaktsnak hrom f tevkenysge


Fogyaszt: Nyelv: Pontossg: Terminolgia: Szemllet: felhasznl termszetes nyelv nem precz az alkalmazs szakkifejezsei nem technolgiai szoftver fejleszt formlis nyelv precz szoftver terminolgia technolgiai

2.3 TERVEZS
A tervezsi fzisban a fellltott kvetelmnyrendszer elemzse s a specifikcik hatrozzk meg a program struktrjt, illetve a program elemeit (2.2 bra).

2.2 bra: programtervezs

24

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Ekkor kell a program mkdshez elengedhetetlen adatszerkezetnek, rutinoknak s azok interfsznek, moduloknak s azok kapcsolatainak, valamint a szksges algoritmusoknak a kidolgozst is elvgezni. A tervezsben a kvetelmny analzis a mit?, a specifikci a milyet?, a tervezs a hogyan? krdsre adja meg a vlaszt. A 2.3 tblzat mutatja hardver, szoftver s fejleszt ltal meghatrozott feltteleket, hatsokat. 2.3 tblzat: a tervezst befolysol tnyezk
hardver szoftver szemlyi

kapacits korltok hlzati viszonyok specilis eszkzk architektra

fejleszti krnyezet adatbziskezel opercis rendszer

kreativits gyakorlat fantzia

2.4 IMPLEMENTCI
Itt trtnik a programok rsa, vagyis a kdols.

2.5 TELEPTS S TESZTELS


A program teleptse mellett lben, tesztadatokkal trtnik meg a program viselkedsnek ellenrzse. Itt derlnek ki a tervezskor nem elrelthat hibk.

2.6 KARBANTARTS
Mg a leggondosabb tervezs, telepts s tesztels mellett is elfordulnak hibk, melyeket gyorsan s kis rfordtssal kell helyrehozni. A specifikciban rgztettekhez kell tartani magt a megrendelnek s kiviteleznek is. A karbantarts (2.3 bra): fejleszt (perfective): 65%, a felhasznl vagy a programoz ltal mg a fejleszts fzisban javasolt mdostsok; alkalmazkod (adaptive): 18%, a szoftver krnyezetben trtnt vltozsokhoz igazts miatti mdostsok; javt (corrective): 17% a mkds kzben felfedezett hibk miatti javtsok.

2.3 bra: A karbantartsi kltsgek megoszlsa

25

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A szoftver kltsgt befolysol tnyezk a kvetkezk: a szoftver tervezs s implementls technikai faktorai: o a modulok egymstl val fggetlensge o a programozsi stlus o a tervezs ellenrzse o a program tesztelse o programozsi nyelv vlaszts o szabvnyok, szabvnyos szoftver eszkzk hasznlata o a dokumentci minsge a szoftver fggsge a kls tnyezktl a mkdtet hardver stabilitsa a szoftver vrhat lettartama a szoftvert tmogat team folytonossga, llandsga, stabilitsa .

2.7 A SZOFTVERTERMKEK KOMPONENSEI


A szoftvertermkek komponensei (2.4 bra): adat, processz s relci.

2.4 bra: a szoftver komponensei

2.7.1 Adatfolyam diagram Az adatfolyam diagram lerja a vizsglt rendszer be- s kimen adatait, a rendszerben trolt adatokat, az egyes adatokon vgzett mveleteket. 2.7.2 Blokk diagram

Blokk diagramot akkor hasznlunk, mikor egy programrendszerben csak az adatok egymstl fggsgt akarjuk szemlltetni, kzmbs a az illet adatok tartalma, formtuma. Pldul a Szabadkai Mszaki Fiskola oktatsi hierarchija lthat a 2.5 brn.
26

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

2.5 bra: a Szabadkai Mszaki Fiskola oktatsi hierarchija

2.8 A SZOFTVER TERVEZSI FZISAI


A klvilggal val kapcsolat szerint hrom szoftvertervezsi fzis klnbztethet meg: kls (interface) fzis, architekturlis fzis s rszletes tervezsi fzis.

A kls tervezsnl klvilgnak a mkdtet hardvert s/vagy rendszer szoftvert, egyb szoftvereket, valamint a felhasznlt tekintjk. Ezek a kls tnyezk a 2.6 bra szerint llnak klcsns kapcsolatban.

2.6 bra: a kls tnyezk s a szoftver Az brn felhasznli interfsznek (MMI man-machine interface) nevezett rsz igen fontos, ugyanis a felhasznl ezt ltja a szoftverbl, ennek a rsznek a
27

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK hinyossgai teszik nehzkess, megbzhatatlann az egyszer szoftverhasznlatot. A ms alkalmazsokkal, illetve szoftverekkel MMI man-machine interface: ez s hardverrel val sszehangols csak kapcsolja ssze a felhasznlt (az mszaki krds, ugyanakkor nem ltvnyos embert) a szmtgppel, klnsen rsze a szoftvermkdsnek. Az itt fellp a be- s kiviteli eszkzkkel. Az hibk is a felhasznli interfszen keresztl interaktv mkdst egyre vlnak lthatv. bonyolultabb s ltvnyosabb eszkzk biztostjk (mikrofon, hangszr, lapolvas stb.).

2.8.1 A felhasznli fellet tervezse A felhasznli fellet tervezsnl fontos: a felhasznlk krnek ismerete, az interfsz a felhasznl gondolkodsmdjhoz s nyelvi terminolgijhoz kell hogy alkalmazkodjon, nem mindegy, hogy az adott rendszert mely munkakrben dolgozk fogjk hasznlni, az adott terlet szakkifejezsei miatt, de fontos a felhasznlk gyakorlatnak figyelembe vtele is (a 2.7 bra plda egy lehetsges felosztsra, csoportostsra), a teljestmnyre vonatkoz kvetelmnyek meghatrozsa, pldul ha a szoftver gyors kell hogy legyen, az interfsz mkdse nam lassthatja azt, a program hasznlata sorn alkalmazott funkcik csoportostsa, a leggyakrabban hasznlt funkcikat funkcira emlkeztet parancsokkal kell elltni, a veszlyes funkcikat kivlt akcikat mindig tbbszri ellenrzssel kell ellti, alaprtelmezett rtkek hasznlata clszer, egyes funkcik sszektse, pldul a programbl val kilps automatikusan trolsi feladatot is hajtson vgre, kezd felhasznlknak ms, gyakorlott felhasznlknak megint ms kezelsi mdszert engedlyezni (pl. Windows-nl, egr s billenty), hiba jelentkezsrl a felhasznl amellett, hogy tudomst kell hogy szerezzen, meg kell engedni, hogy dntsn a kvetkez lpsekrl,

2.7 bra: a szoftverfelhasznlk krnek felosztsa

28

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

3. A PROGRAMOZS MDSZERTANA
Ebben a fejezetben az elz fejezetekben megismert mdszereket, technikkat lehet megtallni sszefoglalva. Az 1960-as vek vgig monolitikus programozs. jellemzi: Egy programoz egy program s a programoknak nincs szerkezete. A j program legfontosabb kritriumai: jl ttekinthet szerkezete, jl dokumentlt s bebizonythat mdon azt csinlja, ami a feladata. A megoldsok: modulris programozs, a megoldand feladat komlexitsnak cskkentse s a gyakorlat alaktotta ki (heurisztikus). Kt fle tervezsi mdszer ltezik: Top-Down dekompenzci, a feladatot rszfeladatokra bontjuk, majd azokat tovbbi rszfeladatokra, mg kezelhet mretu rszproblmkhoz nem jutunk s Button-Up kompozci, a rszfeladatokbl kell sszepteni a programot, nincs mdszer a modulok sszefzsre, illetve annak bebizonytsra, hogy a modulok egytt jl fognak dolgozni. A modulris programozs elnyei: a rszprogramok knnyen ttekinthetk, knnyebben megrhat, knnyebben tesztelhet, tbb modul rhat egy idben (prhuzamos problmamegolds), knnyebben javthat, a modulok szabvnyosthatk, modulknyvtrakban trolhatk s jrafelhasznlhatk. A struktrlt programozs matematikai alapokon nyugszik. Dijkstro kialaktotta a hiearchikus programozs mdszert. Ez a Top-Down dekompozcit egszti ki: az eredeti feladat rszfeladatra bontsval kialakthat egy absztrakt program, finomtssal cskken az absztrakci, tovbbi finomtsokkal egy konkrt gp konkrt utastskszletig jut a megolds, melyeket tesztekkel lehet ellenrizni.

29

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Az itt hasznlhat hrom megklnbztetnk: soros (szekvencia), elgazsos (szelekci) s ciklikus (iterci) szerkezetet.

programstruktra

3.1

brn

lthat,

ahol

Ezek a megoldsok keverednek a programokban.

3.1 bra: a hromfle programszerkezet Az objektumorientlt programozs (OOP) kialakulsa a 70-es vekre tehet. 1969-ben Alen Key dilplomamunkjban jelenik meg az egr, ikon, ablak s menrendszer. 1972-ben konkrt elkpzelsek jelennek meg az OOP-re. Az OOP-re jellemz, hogy: az adat s a funkcionlis modell nem elvlaszthat, az adatok s a rajtuk vgrehajthat mveletek elvlaszthatatlanok s ezek is algoritmikus nelvek. Az objektumorientlt nyelv tulajdonsgai: objektum, ami a vltoz ltalnostsa: az llapotait (atributumok) tetszolegesen komplex adatok irjk le (adatelemek + szerkezet), a viselkedst mdszerek rjk le (fgvnyek s eljrsok ), az objektum-llapotok lekrdezhetk (mi az rtke egy-egy objektumnak), egyik llapotbl a msik llapotba lteznek tviv mdszerek (rtkvltoztats), egy objektum csak nmagval azonos s minden mik objektumtl klnbzik (azonossg), megllapthat, hogy azonos llapotban vannak-e, megllapthat, hogy ugyanarrl az objektumrl van-e sz, osztly, a tpus fogalmnak ltalnostsa: azonos attributum s mdszer objektumok egyttese az osztly, az objektumok az osztly pldnyai, bezrs, vagyis a hatskr fogalmnak ltalnostsa:
30

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK olyan eszkzrendszer, mely segtsgvel megmondhat, hogy az osztly attributumaibl s mdszereibl kvlrl mi ltszik, absztrakci, mely sorn a specifikci s az implementci elvlik, de ez szabadon elrhat, rkls, vagyis az jrafelhasznlhatsg cscsa: szuper osztly elsdleges a kapcsolatban, alosztly csak hozz kapcsoldhat, alosztly: rkli a szuperosztly attributumait s mdszereit, j attributumokat s mdszereket definilhat ezek mell, elhagyhat bellk, tnevezheti az atributumokat s mdszereket, megvltoztathatja a lthatsgi viszonyokat, fellbrlhatja a mdszerek implementciit, lehetsgek: egy alosztlynak egy szuperosztlya lehet (1-szeres rklodst tmogat nyelvek), a hiearchia alakja egy fa, egy alosztlynak tbb szuperosztlya lehet (tbszrs rklodst tmogat nyelvek), a hierarchia elkja egy grf, polimorfizmus, vagyis tbbalaksg: pldny polimorfizmus (egy konkrt hromszg pldnya a hromszg osztlynak is s a poligon osztlynak is, mdszer polimorfuzmus, az alosztly jraimplementlhat egy mdszert krds melyik kd fut le, ezt a kts mondja meg, kts: korai kts, fordtskor eldl, hogy a meghvott mdszerhez melyik kd tartozik, ksi kts, futs kzben dl el, hogy a mdszerspecifikcihoz melyik kd tartozik, minden pldny tudja melyik osztly kzvetlen pldnya (aktulis pldny), minden pldny egy jl definilt pldny aktulis pldnya, elny, pl. ha egy mdszer (A) hv egy msikat (B) a msikat jraimplementlom s meghvom (A)-t, ez esetben az jraimlementlt fut le az els esetben az eredeti, zenet (az objektumok kztti kapcsolat): osztlyokat definilsa, az rklodsi hiearchik elhelyezse, osztlyokon belli objektumok szrmaztatsa, a program futsa kzben az objektumok mkdnek, hatnak egymsra, zeneteket kldenek egymsnak, vlaszolnak az zenetekre, az zenet nem ms, mint egy mdszer meghvsa (eljrs vagy fggvnyhvs), Az objetumorientlt nyelvek lehetnek: tiszta nyelvek: csak az objektumorientlt eszkzrendszer van,

31

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK van egy standard osztlyhiearchia, a programoz mindig ezt a hiearchit bvti, ezekhez fz objektumokat, minden eszkz objektum (az osztly, a mdszer s az attributum is) Smalltalk, Eiffel, Hibrid nyelvek: eljrsorientlt nyelvek objektumorientlt eszkzrendszerrel kiegsztve, C++, Java nyelv a tiszta s hibrid nyelvek kztt helyezkedik el. A TP6.0 nhny jellegzetessge: osztlyt csak a legkls szinten lehet definilni, csak nll osztlyokat lehet definilni, egyszeres rklds lehetsges (Object(szuperosztly nv), az osztlyt tpusknt rtelmezi (TYPE nv = object), az eszkzrendszert a rekordon pti fel, a rekord lehet: o attributm rekordmez o mdszerspecifikci rekordmez

32

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4. ASSEMBLY PROGRAMOZS
4.1 BEVEZETS
A klnfle mikroprocesszorok, mikrovezrlk mind sajt, hardverhez kttt bels, alacsonyszint utastskszlettel rendelkeznek. Ez az utastskszlet adott, kizrlag az ebben lev utastsokat tudja a processzor vgrehajtani. Az utastsok gpi kdok, melyek 0 s 1 szmok kombincijbl tevdnek ssze. Az egyes utastsok egyms utn elhelyezve adjk a programot, mely a szmtgp operatv memrijban helyezkedik el vgrehajtsakor, illetve a httrtrakon trols cljbl. Egy program sszelltsa (megrsa) gpi kdban rendkvl bonyolult, gyakorlatilag kivitelezhetetlen. Ennek oka az, hogy egy adott gpi kd utasts nehezen megjegyezhet, valamint nehezen rhat le. Clszerbb bevezetni egy olyan szimblikus lersi mdot, ahol knnyen megjegyezhet rvidtsek jellik az utastsokat, valamint a hardver elemeit. Ezeket a mnemonikus kdokat egy segdprogram, az asszembler fordtja le gpi kdra. Itt kell megjegyezni, hogy a magasszint programozsi nyelveken megrt programok is vgl gpi kdd alakulnak t a fordtprogram (compiler) segtsgvel. Kln csoportba sorolhatk azok a magasszint nyelvek, amelyek interpreteresek, itt nem trtnik fordts. Feltehet a krds, mi az oka annak, hogy tanulni kell az assembly programozst, akkor, amikor ma mr igen knnyen kezelhet, nagy hatkonysg objektum orientlt programnyelvek llnak rendelkezsnkre? A magasszint programozsi nyelvek nem hasznljk ki optimlisan egy szmtgp hardver kpessgeit. Sokszor a mikrogpek, mikrovezrlk, teht kisebb rendszerek legfeljebb 20 % -ban hatsosak. Amikor nincsenek klnleges ignyek, akkor ez nem problma, de ha nagy vlaszid-igny jelemtkezik, vagy kis rendszereknl kicsi az operatv memria kapacitsa, akkor fontos az assembly hasznlata. Egy plda, PC szmtgpen szmoljunk el a kpernyn 0-tl 65535-ig. A 4.1 tblzatban lthatk az eredmnyek. Innen ltszik, hogy klnlegesen gyors vlaszigny esetn csak asszemblerben tudunk dolgozni, ezek klnlegesen gyors adattvitelek, jtkprogramok. 4.1 tblzat: klnbz programnyelveken sszehasonltsa programnyelv a program hossza [bjt] Borland Turbo C 2.0 8994 Borland Pascal 6.0 3888 Assembly 80 megrt program

futsi id [sec] 2.4 0.5 0.15

4.2 ASSEMBLY PROGRAMOZSHOZ SZKSGES HARDVER ISMERETEK Amikor assembly programozst hasznlunk, akkor teljesen tisztban kell lenni a processzor, memrik, ki- s bimen egysgek, teht a mikroszmtgp, mikrovezrl felptsvel, hiszen a gpi kd utasts kti ssze a programozsi szintet a hardverrel. Minden mikroszmtgpnek ms s ms a hardver felptse, valamint a hardvert mkdtet utastsok alakja. Ennek ellenre vannak hasonlsgok

33

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK a klnbz megoldsok kztt, gyhogy egy mikroprocesszor megismerse mr igen j alap arra, hogy egy msik processzort knnyebben ismerjnk meg. Melyik processzorral ismerkedjnk meg elszr? Termszetesen azzal, amelyikhez a legknnyebben hozzfrnk, ez pedig a minden szemlyi szmtgpben, az IBM PCben, vagy azzal kompatibilis gpben megtallhat Intel 8086-os processzor (vagy annak tovbbfejlesztett vltozata).

4.3 IBM PC S KOMPATIBILIS SZEMLYI SZMTGPEK


4.3.1 Bevezets A mikroprocesszor 1974-es megjelense lehetv tette a szmtstechnika igen gyors, tmeges elterjedst. Igen rvid id alatt az ipari vezrl-, irnyt-, adatgyjt berendzsek nlklzhetetlen ptelemeiv vltak ezek az eszkzk. Nagyon gyorsan igny jelentkezett szemlyi szmtgpek kifejlesztsre, melyek ra alacsony, gy akr irodai, akr otthoni hasznlatra is a szles rtegek szmra elrhet a berendezs. A kezdeti ksrleteknl 8 bites processzorokat ptettek be a szmtgpekbe, a hardver arnylag egyszer volt, de mindig specifikus. Jelentkezett egy msik nagy problma, ami az olcs httrtrak hinya volt. A ZX Spectrum, Atari vagy Commodore a maga idejben forradalmian j berendezs volt alcsony ron, de mindegyik fejleszts hibja a nem tovbbfejleszthet hardver s szoftver. Az 1981-ben megjelent IBM PC XT gyrtmny szemlyi szmtgp (PC Personal Computer) dnten meghatrozta s ma is meghatrozza a szmtstechnika fejldst. Elrhet ron egy nyitott (knnyen tovbbfejleszthet, bvthet) hardverrel s szoftverrel rendelkez rendszer szletett s fejldik llandan. Az Intel 8088 (illetve a vele teljesen kompatibilis 8086) processzorral megptett szmtgp az otthoni, irodai s ipari alkalmazsok nlklzhetetlen eszkze. Dnten megszabta a mikroprocesszorok, merevlemezes httrtrak, az Internet s mg sok minden hihetetlen mret tovbbfejldst. Az IBM PC gpekre jellemz tulajdonsgok: nyitott hardver s szoftver felpts, vagyis az ignyeknek megfelel egysgek, programok rendszerbe ptse, ami a gp legklnbzbb terleteken val hassznlatt teszi lehetv egy viszonylag egysges magra tmaszkodva, szabvnyos, piacon kaphat elemekre pl hardver, ami egyszer tervezst, kivitelezst tesz lehetv, az jabb gpek lefel szoftverkompatibilisak, vagyis a rgebbi tpusokra megrt programok futnak az jabb gpeken, az IBM nem szabadalmaztatta a gpet, ami lehetv teszi a brki ltal val gyrtst, ezzel versenyhelyzetet hozva ltre a piacon. Meg kell emlteni a PC-k azon tulajdonsgt is, hogy ipari berendezsekben is elszeretettel hasznljk alacsony ra s gyors mkdse, szabadon kialakthat hardver-szoftver konfigurcija miatt.

34

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.3.2 A 8086, 8088 mikroprocesszor bels felptse Tbb ms komoly cg fejlesztsi stratgijval ellenttben az Intel fejlesztsi staratgijnak rsze volt mindig a kompatibilits, vagyis a hardver s szoftver azon tulajdonsga, hogy a technika, technolgia fejldse ne olyan j megoldsok kifejlesztst eredmnyezze, melyeknl a rgebbi berendezsek, eszkzk teljesen hasznlhatatlann vlnnak. Ennek az elvnek ksznheten az Intel gyrtmnyok ma is nagyban uraljk a piacot, ezzel a cg dnten meghatrozza a fejlds mai s jvbeli irnyait. 4.3.2.1 Az Intel 8086 processzor felptse Ennek a processzornak 2 vltozata ltezik, a 8 bites kls sinnel rendelkez 8088-as s a 16 bites 8086-os, melyeknl teljes a szoftverkompatibilits. A 4.1 brn lthat a processzorarchitektra.

4.1 bra: Az Intel 8086 processzor architektrja Az brn szerepl vgrehajt egysg (EU Execution Unit) s busz interfsz egysg (BIU Bus Interface Unit) adatcsert vgez egymssal, de feladatuk teljesen ms. A BIU feladata a klvilggal val kapcsolattarts. A 4.2 brn az Intel 8086 processzor legfontosabb regiszterei lthatk.

35

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4.2 bra: Az Intel 8086 legfontosabb programozshoz szksges regiszterei Ez a 16 bites architektra megrklt nhny 8 bites gpnl is hasznlt megoldst, pl. a 16 bites akkumultor 2 8 bitesknt is hasznlhat, vagy a memria cmzsre itt is 16 bites regiszterek szolglnak, de rdekes megoldsokkal kilpett a 8 bites struktra korltai kzl. A processzor regiszterei a kvetkezk: AX ltalnos cl 16 bites akkumultor, hasznlhat mint 2 8 bites akkumultor is (AH s AL), BX 16 bites bzis (base) regiszter, lehet mint 2 8 bites regisztert is hasznlni (BH s BL), CX 16 bites szmll regiszter (count), mint 2 8 bites regiszter is hasznlhat (CH s CL), DX 16 bites adatregiszter (data), mely kt 8 bites regiszterknt is hasznlhat (DH s DL), SP 16 bites veremtr mutat regiszter (stack pointer), BP 16 bites bzismutat regiszter (base pointer), SI 16 bites forrsindex regiszter (source index), DI 16 bites clindex regiszter (destination register), FLAGS 16 bites regiszter, mely rszletesen a 3. brn lthat, IP 16 bites utasts mutat regiszter (instruction pointer), DS 16 bites adatszegmens-regiszter (data segment), az adatk rhetk el ezzel a regiszterrel, CS 16 bites kdszegmens-regiszter (code segment), programutastsok rhetk el ezen a regiszteren keresztl, SS 16 bites veremtr-szegmens regiszter (stack segment), a veremtr cmzsre szolgl s ES 16 bites klnleges memria regiszter (extra segment), egyb memriaterletek terletek rhetk el ezen a regiszteren keresztl. A 4.3 bra a mveletekkel vezrelt jelzbiteket mutatja.

36

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4.3 bra: A jelzbitek (FLAGS)

regiszter bitjei

4.3.2.2 A 8086 mikroprocesszor mkdse Mint a 4.2 brn lthat, a processszorban kt egysg tallhat, az EU, vagy vgrehajt egysg, illetve a BIU, vagy buszilleszt egysg. A BIU a FIFO (First In First Out az elszr bert adatot veszi ki elszr) regiszterblokkba elre beolvassa az utastsokat az operativ memribl, amit utastslehvsnak neveznk. Az EU vgrehajt egysg ebbl a FIFO memribl veszi ki ezek utn az utastsokat s az operandusokat, gy nincs szksg kivrni a memriahozzfrs idejt. A BIU msik feladata az operandusok, esemnyek tovbbtsa, tvitele az EU, a memria s az I/O eszkzk kztt. Ezt a feladatot gy tudja vgrehajtani, hogy ltrehozza a fizikai cmeket egy beptett sszeadm segtsgvel. Ez a mechanizmus azrt lnyeges, mert gy lehet nagy sebessg processzorok mellett viszonylag lass memrikat hasznlni. Az EU, a vgrehajt egysg az ltalnos cl regeszterekbl, az ALU aritmetikailogikai egysgbl, az operandusregiszterbl s flag, vagy jelzbitregiszterbl ll. Ez az egysg rtelmezi s hajtja vgre a BIU ltal lehvott utastsokat, valamint adja t az adatokat a BIU-nak. sszehasonltva az els 8 bites gpekkel az elszr nagyobb mretekben elterjedt Intel 8086 16 bites gpet, megllapthatjuk, hogy kb. ngyszeres rajelfrekvecia a hatkonysgban mr mint tzszeres rtk jelentkezik. Ennek oka nemcsak abban keresend, hogy 8 helyett 16 bites adattvitellel, ALU-val stb. dolgozik a rendszer, hanem a fent ismertetett tlapolsos zemmddal. Ez a pipeline technolgia, mely megalapozta a RISC struktrk kialakulst. RISC (reduced instruction set computer): cskkentett utastskszlet szmtgp. Mivel a tapasztalat az, hogy az utastsok egy rszt keveset, vagy egyltaln nem hasznljk a programozk, ezrt hoztak rszre olyan gpeket, amelyeknek optimalizlt, kevs utastsbl ll kszlete van.

37

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4.3.2.3 A 8086 cmzsi technikja A gpnl alkalmazott 16 bites cmregiszterek nem teszik lehetv 64 kB-nl nagyobb memria kzvetlen cmzst. Ezt a problmt egy egyszer technikval lehet thidalni, mely a szegmens regiszter tartalmbl s egy effektv memriacm sszegbl hatrozza meg az effektv, fizikai memriacmet. Ez a megolds lthat a 4.4 brn.

4.4 bra: A fizikai cm meghatrozsa szegmensregiszter s cm sszegeknt A fizikai cm kiszmtsa gy trtnik, hogy az adott szegmensregiszter tartalmat balra ellpteti a rendszer 4 bittel, teht szorozza 16-tal (16 x 64 kB = 1 MB), majd az effektv memria cmet hozzadja, a legnagyobb helyrtken, 4 biten 0 kerl. A szegmensregiszterek tartalmra nincs semmilyen megkts, gy tetszs szerinti szegmensregisztertartalom tlapoldst lehet hasznlni. A 8086 cmzsei a kvetkezk: programmemria cmzs s adatmemria cmzs. 4.3.2.4 A programozsi cmzsi mdok A kiszmtott fizikai cmrl a processzor bekri az utastst, az operandusokkal, CISC (complex instruction set sszetett utastscmekkel egytt, ez a fetch eljrs, a PC computer): kszlet szmtgp. Viszonylag programszmll (program counter) rtke ezutn annyival n, amennyi az utasts nagy szm utastst (tbb mint hossza volt (CISC struktra miatt az 200) hasznl gp, ahol az utastsok hossza vltoz), gy az jabb utastsok vgrehajtsi ideje is utasts kezdetre, a mveleti kdra mutat. klnbz. Minden esetben, amikor nem kvetkez cmrl kell az utastst bekrni, vagyis ugrsra, alprogramhvsra kerlt sor, a kvetkez mdon szmolja ki a processzor az j cm helyt:

38

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK program-relatv, szegmensen belli cmzs, ahol a szegmensen bell egy az utastsban kzvetlenl szerepl 8 vagy 16 bites eljeles adat hozzaddik PC tartalmhoz, direkt cmzssel, szegmensek kztti cmzssel, amikor az utastsban mint adat foglal helyet a cm, ez PC-be, illetve a szegmensregiszterbe tltdik, indirekt cmzssel, amikor egy adatot a JUMP (ugrs), vagy CALL (szubrutinhvs) memriacmknt rtelmez.

4.3.2.5 Adatmemria cmzsi mdok Eltren a 8 bites mikroprocesszoroktl, de akr a RISC struktrj gpektl a 8086 igen sok, vltozatos cmzsi mddal rendelkezik, amik a kvetkezk: kzvetlen cmzsi md, direkt cmzsi md, direkt, indexelt cmzsi md, implicit cmzsi md, bzis relatv cmzsi md s stack cmzsi md. 4.3.3 80286, 80386, 80486, Pentium, Pentium II s Pentium III processzorok A technolgia fejldse az jabb tpus mikroszmtgpeknl mindig nagyobb mkdsi sebessget biztost az elz tpusokhoz kpest, amit nemcsak rajelfrekvencia-nvelssel rnek el, hanem prhuzamos feldolgozssal, gyorstmemrikkal. Az Intel processzorok fejlesztsnl az alapelv az, hogy a ksbbi tpusok kpesek a rgebbi, egyszerbb tpusokra fejlesztett szoftver futtatsra. gy csak rdekessgknt emltjk meg, hogy az jabb 32 bites processzorok termszetesen 32 bites ltalnos cl regiszterekkel rendelkeznek, amikor 16 bites szoftverrel dolgoznak, akkor csak az als 16 bitet hasznljk. 4.3.4 Az IBM PC sinrendszere 4.3.4.1 Bevezets Az IBM PC alaplap a szksges mikroelektronikai elemek (mikroprocesszor, memria, I/O eszkzk stb.) mellett tartalmaz csatlakozkat (slot), melyek az IBM PC mikroszmtgp kls busznak jeleit tartalmazzk. Tbb fajta csatlakoz hasznlatos, szerepk akkor van, ha a szmtgp hardvert szeretnnk j egysgekkel bvteni, pl. EPROM programozval, MODEM-mel, A/D, D/A krtyval stb. Termszetesen ltalunk fejlesztett eszkzk is csatlakoztathatk a rendszerhez ezen a sinen keresztl, ilyenkor a laptervezskor, illetve megptsekor tiszteletben kell tartani a klnfle elektromos, mechanikai, illesztsi elrsokat. A mikroszmtgp buszrendszere tbb tucat vezetkbl ll, melyeken cmek, adatok, parancsok jelenhetnek meg.

39

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

A kiegszt lap tervezsekor a kvetkez feladatokat kell megoldani: eszkzk kijellse, ez a cmvezetken rkez cm azonostsa, felismerse, adattviteli irny meghatrozsa (rkapcsolds az adatvezetkre s lekapcsolds az adatvezetkrl) s az adattvitelben szerepl eszkzk szinkronizlsa. IBM PC mikroszmtgpek esetn kt sinrendszer ltezik: bels s kls. 4.3.4.2 IBM PC bels sinredszer (busz) Ez a sinrendszer az alaplap tulajdonsgt hatrozza meg, melyet az elrni kvnt teljestmny szab meg. Hrom fle kialaktsa lehetsges: nagyobb sebessgeknl 3-sines rendszer hasznlatos, ahol a cmsin mellett kln adatsin van rsra s kln adatsin olvassra, gy, ha lehet azonos idej adatolvass s adatrs alakthat ki, 2-sines rendszer, vagyis kln cmsin s kln adatsin tallhat a legtbb gpnl s kzs adat- s cmsin olyan rendszereknl, ahol egyszer clfeladatok ltrehozsa szksges. A bels sinrendszerhez hardver eszkzkkel nem frhetnk hozz, ez adott az alaplapoknl. 4.3.5 A szmtgp felptse a programozs szempontjbl Akkkor, amikor programozni szeretnnk egy mikroszmtgpet assembly nyelven, szksgnk van bizonyos hardver alapismeretekre, a rendszer felptsre. Ezek az ismeretek egyszerbbek, mint a hardver tervezsekor szksgesek. A Neumann-fle szmtgp (4.5 bra) egy vezrlegysgbl, valamint operatv memribl ll, a megfelel input-output egysgekkel kielgtve. Az operatv memria az adatokat s programot trolja. A vezrl egysg egyenknt, sorban rtelmezi s vgrehajtja az utastsokat.

40

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4.5 bra: Neumann-fle szmtgpmodell A 4.6 brn lthat Harvard-fle szmtgp nagyban hasonlt a Neumann-gphez, csak itt az operatv memria kt egymstl teljesen elvlasztott rszbl ll, a programmemribol, illetve adatmemribl.

4.6 bra: Harvard-fle szmtgpmodell A 4.5 s 4.6 brn lthat modelleknl a vezrl egysg (CU Control Unit) s az aritmetikai-logikai egysg (ALU Arithmetical and Logical Unit) a kzponti egysg (CPU Central Processing Unit). Az aritmetikai-logikai egysg, mint ahogyan a neve is jelzi klnbz aritmetikai (sszeads, kivons, szorzs s oszts) s logikai (S, VAGY, NEM s KIZR VAGY) mveletek vgrehajtst teszi lehetv, a kzponti egysgben elhelyezked klnbz regiszterek segtsgvel. Ezeket a regisztereket gyorsabban ri el az aritmetikai-logikai egysg, mint az operatv memrit s httrtrakat.

41

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4.4 EGYSZER ASSEMBLY PROGRAMOK


Anlkl, hogy bvebben magyarznnk, vgezzk el a kvetkez egyszer feladatot. A PC szmtgpen vltsunk t DOS zemmdba. Ezt a kvetkez mdon tehetjk meg: a START menben kijelljk a PROGRAM rszt, megkeressk a DOS szimblumot s rkattintunk. A gp a WINDOWS opercis rendszert elhagyja s tvlt DOS opercis rendszerre. Itt a fknyvtrbl nyissunk egy ASS nev alknyvtrat, ahol dolgozunk (d:\ ENTER s md ASS ENTER s cd ASS ENTER). Vigyk be az ELSO.EXE programba a kvetkez nhny szmot : 180, 2, 178, 49, 205, 33, 205, 32. Ezt a copy con elso.exe ENTER utastssal tehetjk meg, gy, hogy az ALT billenty folyamatos tartsa mellett berjuk a szmot, ALT elengedse berja a kdot, azzal, hogy a kpernyn mindenfle karakter megjelenik. Az utols szm bevitele utn CTRL Z utastssal zrjuk be a fjlt, ami a D:\ASS alknyvtrba msolja. Ellenrizzk az elso.exe fjl megltt a DIR paranccsal, a type elso.exe DOS parancs pedig a bert kdokat kilistzza a kpernyre, ami szmunkra rthetetlen jelek sorozata. Ez a programunk gpi kdja, ezek utn rjuk be az elso programnevet. Ha mindent jl csinltunk, megjelenik egy 1 szm a kpernyn. Valjban kzvetlenl PC gpi kdot tltttnk egy llomnyba, ami mnemonikus (teht szimblikus) kdrendszerben a kvetkez:

4.7 bra: Assembly program az 1 szm kirsra A programban, mivel assembly programozsnl ttekinthetbb a rendszer ltalban hexadecimlis alakban adjuk meg a szmrtkeket. 4.4.1 A DEBUG program rdemes megismerkedni a DEBUG programmal, hiszen egyszeren s gyorsan lehet vele ltrehozni rvid assembly programokat. Indtsa a debug fjlnvvel trtnik, ami utn egy - (godolatjel), a prompt jelenik meg. A ? (krdjel) s ENTER begpelse kiadja a lehetsges parancsokat s azok formai megadst. Az a parancs az asszembler indtsa, ami hatsra kirdik a szegmenscm s a program helye a memriban. Itt kell megadnunk a mnemonikus kdokat az operandusokkal egytt, ami ennl a programnl csak hexadecimlis rtk lehet (a

42

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK valdi asszemblernl szimblikus cmekkel is dolgozhatunk). Az ENTER utn a kvetkez sor bersa lehetsges, egszen a CTRL C befejez parancsig. A mveletsor a 4.8 brn lthat.

4.8 bra: Els pldaprogramunk bersa a DEBUG program a utastsval Az 164C cm a kdszegmens-cm, a 0100, 0102 stb. A gpi kd cme, ami most azrt lp 2-vel, mert minden utastsunk 2 bjtos (1. bra). A - prompt utni g s ENTER hatsra a program vgrehajtdik s a kpernyre kirdik az 1 szm, majd egy zenetet kld a kpernyre a DEBUG, a program helyesen fejezdtt be, vagyis sikeresen visszaadta a vezrlst a DEBUG-nak. Ha hibsan fejezzk be a programunkat, akkor elszll a szmtgp, vagyis a mi esetnkben nem tud DOS zemmdban tovbb dolgozni, a WINDOWS visszaveszi a vezrlst. A DEBUG alkalmas a gpi kdokbl visszalltani az assembly programot, ahogyan azt a 4.9 brn lthatjuk.

4.9 bra: a DEBUG disassembll utastsa A 0108 cmtl kirt (visszafejtett) program a szmunkra rtelmetlen, ugyanis a mi programunk a 0107 cmen r vget, a memriban pedig az elz programok maradvnyai vannak. Elemezzk, mit jelentenek az egyes sorok a programban: mov ah,02 az ax akkumultor fels 8 bitjbe 02 rtk betltse, mov dl,31 a dx regiszter als 8 bitjbe az 1-es szm ASCII kdjnak betltse, int 21 a rendszer bels
43

ASCII (American Standard Code for Information Interchange): a 7 bites kdok s a betk, szmok, rsjelek s vezrl jelek kztti egyrtelm kapcsolatot adja meg. A berendezsek mind ismerik ezt a kdrendszert, gy egyszer kzttk kapcsolatot teremteni. Pl. Nyomtat.

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK alprogramja, amely tbbek kztt egy karaktert tud kirni a kpernyre, ha elzleg ax regiszter fels bjtjba 2-t runk s a dl-be a kvnt rtket rtuk be s int 20 alprogram-hvs. Mely biztostja azt, hogy a DEBUG-bl meghvott programunk visszaadja a vezrlst ismt a DEBUG-nak.

A d utasts egy memriarsz tartalmt kldi ki a kpernyre hexadecimlis s ASCII alakban. Szmunkra, az adott programnl csak az els 8 bjt rtelmes, a tbbi adat vletlenszer. Vegyk szre azt, hogy az ASCII rtkeknl a ...1.! sorban megjelen 1-es szm az 1 ASCII kdja, amit mi tltttnk be a dl regiszterbe. A . Akkor jelenik meg, ha a kdnak nincs megfelel kpe, pl. kpernyvezrl parancskd. Az 4.2 tblzat tartalmazza az ASCII kdokat. Meg kell jegyezni, hogy a D7 bit hasznlata az ASCII tblzatnl megduplzza a tblzat mrett, hiszen 8 bites lesz, az gy keletkezett jabb 128 helyre szintn kdok rhatk, amik mr egy adott rendszernl eltrhetnek egy msik rendszer kdjaitl, gy lehet kezetes karakterekkel is dolgozni. DOS-ban az ALT billenty folyamatos lenyomsa mellet rjuk be a 144 szmot, majd engedjk el az ALT billentyt, megjelenik az bet. 4.2 tblzat: az ASCII kdtblzat 000 001 010 0000 NUL DLE blank 0001 SOH DC1 ! 0010 STX DC2 0011 ETX DC3 # 0100 EDT DC4 $ 0101 ENQ NAK % 0110 ACK SYN & 0111 BEL ETB 1000 BS CAN ( 1001 HT EM ) 1010 LF SUB * 1011 VT ESC + 1100 FF FS , 1101 CR GS 1110 SO RS . 1111 SI US /

011 0 1 2 3 4 5 6 7 8 9 : ; < = > ?

100 @ A B C D E F G H I J K L M N O

101 P Q R S T U V W X Y Z [ \ ] ^ _

110 a b c d e f g h i j k l m n o

111 p q r s t u v w x y z { | } ~ DEL

A regiszterek s jelzbtek, flagek tartalma a DEBUG-ban az r paranccsal jelentethet meg. A p (proceed) parancs egyenknt hajtja vgre az utastsokat (a g paranccsal ellenttben), de emellett mindig kirja az r parancs ltal is megjelentett tartalmat, a regisztereket s flageket. Mit kell tenni akkor, ha nem az 1-es szmot, hanem pldul az A bett szeretnnk kiratni? Termszetesen nem kell az egsz programot jbl begpelni, csak a megfelel sort kell jbl rni. Az u paranccsal fejtsk vissza a programot, itt lthatjuk,

44

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK hogy a 0102 cmen tallhat a helettestend sor, majd rjuk be a kvetkezt: a 0102, ekkor erre a helyre enged berst a DEBUG. Az ASCII tblzatbl keressk az A bet kdjt, ami binrisan 0100 0001, vagyis 41h (illetve 65d). gy az j sor bersa a 4.10 brn lthat. A DEBUG most is folyamatosan engedi az utastsok berst, a CTRL C paranccsal lphetnk ki.

4.10 bra: j rtk bersa a programba A DEBUG program segtsgvel sok mindent el lehet rni, kzvetlenl a hardver elemeket prgramozhatjuk. Mgsem ezt a programot hasznljuk assembly fejlesztsre, hiszen az arnylag egyszer kezels nem tesz lehetv valdi programfejlesztst. Tbbfle fejlesztszoftver ll rendelkezsnkre a programok rsra, vannak kzttk bonyolultak, de megtallhatk az egyszer vltozatok is. Az eltrsek mellett is nagyon sok a hasonlsg a hasznlatukban, knnyen tudunk ttrni ms rendszerekre. 4.2.2 Assembly programok rsa, fordtsa, szerkesztse s futtatsa Az assembly programok ltrehozst klnbz segdprogramok biztostjk. A 4.11 bra mutatja a program ltrehozsnak fzisait.

4.11 bra: assembly program lterehozsa A forrskd, vagyis az adott processzor (esetnkben Intel 8086) utastskszlett s a fordt utastsait tiszteletben tartva megrt program egy ASCII szvegszerkesztvel *.asm fjlba kerl a Winchesterre. Az asm, rvidts utal arra, hogy asszemblerben dolgozunk. Szvegszerkeszt
45

*.asm: a * (csillag) a DOS (s sok ms) opercis rendszerben az llomnynv helyn szerepel, ami mindig betvel kezddik, szmokat is tartalmazhat s hossza legfeljebb 8 karakter.

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK brmely ismert program lehet, pl. a Norton Comander F4 helyn lev beptett szvegszerkesztje. Az *.asm llomnyt le kell fordtani, amit szintn tbbfle szoftverrel elvgezhetnk, itt a Turbo Assemblert hasznljuk, ami a TASM nevet viseli. Egyszeren be kell rni a D:\ASS>\TASM *.asm utastst. A fordtk rendszerint kt menetben (lpsben) mkdnek: a nv, rtk s tpus alapjn kitltik a szimblumtblzatot, majd lefordtjk a mnemonikokkal megadott utastskdokat gpi kdokk s kitltik szmrtkekkel a szimblumtblban tallhat rtkeket, lterhozva az *.obj (object) trgykdot. A kapott trgykd szabvnyos felpts, ilyen kdot ms programnyelvek is ltrehoznak, ezzel biztostva azt, hogy a szerkesztprogramok tbb programozsi nyelv *.obj llomnyait egy programm kssk ssze. Erre a feladatra is tbb klnbz ksz szoftvert hasznlhatunk, mi a Turbo Link programot hasznljuk. Be kell rni a D:\ASS\>TLINK *.obj utasutastst, ami vgl *.EXE vgrehajthat kdot ad. A TLINK program engedlyezi egy sznettel (blank) elvlasztva tbb trgykd felsorolst, ami ezen kdok sszefzst biztostja.

46

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Az *.exe s *.com program felptse A 4.12 a) brn egy *.EXE, mg a 4.12 b) brn egy *.COM programszerkezet lthat. Az *.EXE program brmilyen hosszsg lehet, a COM bele kell hogy frjen egy szegmensbe, gy legfeljebb 64 kB hossz lehet. *.EXE szerkezet Kd Segment assume CS:Kd,DS:Adat,SS:Stack Start: . . . Kd Ends Adat Segment . . . Adat Ends Stack Segment . . . Stack Ends End Start a) *.COM szerkezet Kd Segment assume CS:Kd,DS:Kd Org 100h Start . . . Kd Ends End Start

b)

4.12 bra: a *.EXE s a *.COM tpus fjlok felptse Segment jelli a szegmens kezdett, eltte egy tetszleges elnevezs a szegmerns nevt, a szegmens vgt pedig az Ends kifejezs. Az assume a szegmensregiszterekbe tlti a hozz tartoz szegmenscmet. SS nem ktelez, gy elhagyhat. A COM programoknl kd s adatszegmens kezdet megegyezhet.. Org adja meg a szegmensen bell a program kezdett, 100h alatt programparamterek tallhatk. A PC szemlyi szmtgp BIOS (Basic Input/Output System) szoftvere tartalmaz mr megrt alprogramokat, amiket elnysen hasznlhatunk fel. gy az int 21h utasts is egy ilyen alprogram, melynek paramtere szabja meg a visszatrs mdjt, a mintapldban a 4c00 rtk a programbl val zenet nlkli vsszatrst jelenti.

47

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.4.3.1 - 1. Feladat A programbl trjnk vissza a DOS-ba. ;******************************************************************** Prog01 Segment ;szegmensdefinico assume CS:Prog01,DS:Prog01 ;CS es DS beallitas a szegmens ;elejere ;******************************************************************** Start: mov ax,Prog01 ;DS regiszter beallitasa mov ds,ax mov ax,4c00h ;kilepes a DOS-ba int 21h ;******************************************************************** Prog01 Ends ;a szegmens vege End Start ;******************************************************************** A programban a ; (pontosvessz)utni szveg tetszleges, nem kerl fordtsra. A programrs lpsei: Pl. a Norton Commander SHIFT F4 utastsval elindtjuk a szvegszerkesztt, ahova berjuk a fenti programot, a TASM Prog01 ENTER utastssal fordtsuk le a programot (eredmnye Prog01.obj), a Link ENTER utn rjuk be a Prog01 fjlnevet s minden krdsre ENTER-rel vlaszoljunk, ltrejn a Prog01.exe fjl, rjuk be, teht futtassuk a programot. Ennl a prgramnl, ha minden rendben van, csak azt ltjuk, hogy jbl megjelenik az alknyvtr promptja. A Prog01.asm programban a mov utasts hromszor is szerepel. Ez az utasts a leggyakrabban hasznlatos, nagyon sok vltozata van. Ezekbl a mov utastsokbl a 4.3 tblzatban tallhatunk meg nhnyat. Az sszes lehetsg az utastskszletben tallhat. 4.3 tblzat: nhny mov utasts mov ax,1839 ax akkumulatorba kerl az 1839-es szm mov ax,3Bh az akkumulatorba kerl a szm hexadecimlis alakban mov al,45 ax akkumultor alacsonyabb helyrtk al bjtjba kel 45 mov ax,bx ax be kerl bx regiszter rtke, bx rtke vltozatlan marad mov al,bh al be kerl bh regiszter tartalma, bh vltozatlan marad mov ax,cimke ax be kerl a cmke szegmenscmt A mov, de ms utasts is igen sokfle kombinlst enged meg, ennek ellenre rdemes nhny alapvet szablyt megtanulni, mely szablyok ms utastsoknl is elfordulnak: az utasts utni operandusok legalbb egyike regiszter, az els operandusba (cl) kerl a msodik (forrs) operandus, a forrs tartalma az utasts vgrehajtsa utn nem vltozik,
48

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK amennyiben az adat a memriban van, akkor a memria cme [ ] (szgletes) zrjelek kztt van, ha az adatot cimke hatrozza meg, akkor az elrend adat tpust meg kell adni (pl. word ptr), a kt operandus mrete azonos kell hogy legyen (a mov ax,3Bh esetben ax be 003Bh kerl).

A PC szemlyi szmtgpek kpernykezelsnl ismerni kell a kirs mdjt. Az operatv memria 0b800h cmtl (szegmenscm) kezddik a video memria, ahova ASCII alakban bert karaktereket tudunk kldeni, amiket azutn a hardver a kpernyn jelent meg. Ez a pont a kperny bal fels sarka. Tetszleges pozciba lehet rni a kvetkez kplet alapjn, ha tudjuk azt, hogy egy karakterhez kt bjt tartozik, a kd s a szn: cm = 80 * 2 * sor + 2 * oszlop. Plda: rjunka 7. sor 13. oszlopba, 1146-ot kapunk, ami 47ah, vagyis a cm 0b800:47ah. A sznkdok a 4.4 tblzatban tallhatk. 4.4 tblzat: a karakterek sznkdjai bit jelents 0. az eltr kk sznsszetevje 1. az eltr zld sznsszetevje 2. az eltr piros sznsszetevje 3. az eltr intenzitsa 4.4.3.2 - 2. feladat A kperny 7. sornak 13. oszlopba rjunk egy X bett. ;******************************************************************** Prog02 Segment ;szegmensdefinico assume CS:Prog02,DS:Prog02 ;CS es DS beallitas a szegmens elejere ;******************************************************************** Start: mov ax,Prog02 ;DS regiszter beallitasa mov ds,ax mov ax,0b800h ;es regiszterbe videomemoria mov es,ax mov di,1146 ;offset-cim di-be mov al,"X" ;al-be X betu mov ah,7 ;fekete alapon feher szin mov es:[di],ax ;betu a videomemoriaba mov ax,4c00h ;kilepes a DOS-ba int 21h ;******************************************************************** Prog02 Ends ;a szegmens vege End Start ;******************************************************************** bit 4. 5. 6. 7. jelents a httr kk sznsszetevje a httr zld sznsszetevje a httr piros sznsszetevje villogs ki- bekapcsolsa

49

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.4.3.3 3. feladat: A kperny tetszleges helyre rjunk ki egy karaktert, de a cimkek tartalmazzak a sort, oszlopot, karaktert s sznt, amely adatok alapjn kiszmolja a program a helyt. ;******************************************************************** Prog03 Segment ;szegmensdefinico assume CS:Prog03,DS:Prog03 ;CS es DS beallitas a szegmens ;elejere ;******************************************************************** Start: mov ax,Prog03 ;DS regiszter beallitasa mov ds,ax mov ax,0b800h ;es regiszterbe videomemoria mov es,ax mov al,byte ptr [Y] ;y betoltese mov ah,0 mov bl,160 ;1 sor 80 * 2 bajt mul bl ;ax = al * bl mov di,ax ;di-be tolteni a helyet mov al,byte ptr [X] ;vizszintes koordinata mov ah,0 mov bl,2 ;vizszintes koord. * 2 mul bl add di,ax ;vegleges koordinata mov al,byte ptr [KARAKT] ;karakter kodja mov ah,byte ptr [SZIN] ;szinkod mov es:[di],ax ;betu a videomemoriaba mov ax,4c00h ;kilepes a DOS-ba int 21h ;******************************************************************** X: db 40 Y: db 12 KARAKT:db "X" SZIN: db 7 ;******************************************************************** Prog03 Ends ;a szegmens vege End Start ;******************************************************************** Azt, hogy hova kerl a bet a memriban troljuk, mgpedig gy, hogy megadjuk a vltoz szimblikus nevt, a db direktvval meghatrozzuk hogy ez az adat a memriba kerl, vgl megadjuk az rtket (pl. X: db 40). A mul a bl s al regisztereket szorozza ssze, de mivel kt nyolcbites szm szorzata egy 16 bites szm, ezrt az eredmny ax-ben kapjuk. A 16 bites szorzs ax s bx kztt trtnik, az eredmny dx s ax regiszterekbe rdik.

50

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.4.3.4 4. feladat rjunk ki a kpernyre egy szveget, a szveget a memriban troljuk, gy, hogy a vgre egy nem nyomtatand karaktert, pl. 0-t tegynk. ;******************************************************************** Prog04 Segment ;szegmensdefinico assume CS:Prog04,DS:Prog04 ;CS es DS beallitas a szegmens ;elejere ;******************************************************************** Start:mov ax,Prog04 ;DS regiszter beallitasa mov ds,ax mov ax,0b800h ;es regiszterbe videomemoria mov es,ax mov al,byte ptr [Y] ;Y betoltese mov ah,0 mov bl,160 ;1 sor 80 * 2 bajt mul bl ;ax = al * bl mov di,ax ;di-be tolteni a helyet mov al,byte ptr [X] ;vizszintes koordinata mov ah,0 mov bl,2 ;vizszintes koord. * 2 mul bl add di,ax ;vegleges koordinata mov ah,byte ptr [SZIN] ;szinkod mov si,offset SZOVEG ;a szoveg cime si-be cikl: mov al,[si] ;adat al-be (betu) cmp al,0 ;szoveg vege? jz vege ;vege mov es:[di],ax ;videomemoriaba betu add di,2 ;kovetkezo hely kepernyon inc si ;kovetkezo betu jmp cikl ;tovabb vege: mov ax,4c00h ;kilepes a DOS-ba int 21h ;******************************************************************** X: db 30 Y: db 12 SZOVEG: db "SZABADKAI MUSZAKI FOISKOLA",0 SZIN: db 7 ;******************************************************************** Prog04 Ends ;a szegmens vege End Start ;******************************************************************** A cmke egy hivatkozsi hely, ugrskor, alprogram kezdetekor. Mindig : (kettspont) kveti. A programban sszehasonltsra a cmp utasts szolgl, ami lltja a jelzbteket, mi jelen estben a Z bitet ellenrizzk sszehasonlts utn. Az inc utasts eggyel nveli az adott opernadus rtkt.

51

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.4.3.5 5. feladat A program kt nyolcbites szm kztt vgezze el a logikai S mveletet, rja ki a kt binris szmot, valamint az eredmnyt is. A kpernytrls trtnjen meg a szmok kirsa eltt, alkalmazzon alprogramot az azonos feladatok megoldsra, mint pldul a szveg kirsa, a binris szmok kirsa. ;******************************************************************** Prog05 Segment ;szegmensdefinico assume CS:Prog05,DS:Prog05 ;CS es DS beallitas a szegmens elejere ;******************************************************************** Start:mov ax,Prog05 ;DS regiszter beallitasa mov ds,ax mov ax,0b800h ;es regiszterbe videomemoria mov es,ax mov ax,3 ;80*25 uzemmod, kepernyotorles int 10h mov di,0*160 ;elso szoveg kezdocim mov si,offset SZOV1 ;SZOV1 szoveg kezdocime call szovir ;alprogram szovegirasra mov bl,byte ptr [SZ1] ;szam beallitas call szamir ;alprogram szamirasra mov di,1*160 ;masodik szoveg kezdocime mov si,offset SZOV2 ;SZOV2 kezdocime call szovir mov bl,byte ptr [SZ2] ;szam beallitas call szamir mov di,2*160 mov si,offset SZOV3 call szovir mov bl,byte ptr [SZ1] ;elso szam and bl,byte ptr [SZ2] ;masodik szammal AND call szamir mov ax,0 ;varakozas billentyure int 16h vege: mov ax,4c00h ;kilepes a DOS-ba int 21h ;******************************************************************** szovir Proc ;szovegkiiro alprogram mov cx,16 ;16 karakteres szoveg mov ah,15 ;fekete hatter, feher betu cikl1:mov al,[si] ;kiirando betu al-be mov es:[di],ax ;videomemoriaba betu add di,2 ;kovetkezo pozicio inc si ;kovetkezo karakter loop cikl1 ;cx=cx-1 es ugras ha cx<>0 ret ;visszateres foprogramba szovir Endp ;alprogram vege

52

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK ;******************************************************************** szamir Proc ;szamkiiro alprogram add di,6 ;harom hellyel tovabb mov cx,8 ;8 bites adat mov ah,15 ;fekete hatter, feher betu cikl2:mov al,48 ;0 ASCII kodja shl bl,1 ;CY <== d7 bit jnc ki2 ;ha 0, ugras ki2-re mov al,49 ;1 ASCII kodja ki2: mov es:[di],ax ;szam kiirasa videomemoriaba add di,2 ;kovetkezo hely loop cikl2 ;cx=cx-1 es ugras ha cx <>0 ret ;alprogram vege szamir Endp ;alprogram vege ;******************************************************************** SZOV1: db "Az elso byte :" SZOV2: db "A masodik byte :" SZOV3: db "Az eredmeny :" SZ1: db 01011101b SZ2: db 10101011b ;******************************************************************** Prog05 Ends ;a szegmens vege End Start ;******************************************************************** A program bemutatja az alprogram hasznlatt s annak rst is. Minden esetben, amikor valamely programrsz-ismtldsre kerl sor, alprogramot runk, egyrszt rvidebb, msrszt ttekinthetbb tve magt a programot. A szmll hasznlata is ltszik, a cx regiszter tartalmt a loop utasts cskkenti s egyben ellenrzi a kapott eredmnyt, a felttel teljeslsekor feltteles ugrst hajt vgre a program, nem teljeslsekor pedig a kvetkez utaststl folytatja a program vgrehajtst. Az int 10h megszakts a 0 rtkkel a kperny 80*25 zemmdjt lltja be, az int16 megszakts pedig a billenty lenyomsig vr, a bettt karakter ASCII kdjt pedig ah regiszterben trolja (a pldban ezt nem hasznltuk). 4.4.3.6 6. feladat Olvassuk ki a szmtgp rjt s rjuk ki a kpernyre. Prog06 Segment ;szegmensdefinico assume CS:Prog06,DS:Prog06 ;CS es DS beallitas a szegmens elejere ;******************************************************************** Start:mov ax,Prog06 ;DS regiszter beallitasa mov ds,ax mov ax,0b800h ;es regiszterbe videomemoria mov es,ax mov ax,3 ;80*25 uzemmod, kepernyotorles

53

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK int 10h cikl: mov ax,0200h ;idokiolvasas int 1ah call ir ;az ido kiirasa mov ax,0100h ;billentyu? int 16h jz cikl ;nincs, vissza mov ax,0 ;kiolvassa az erteket int 16h mov ax,4c00h ;vissza a DOS-ba int 21h ;******************************************************************** ir Proc ;kiiras alprogram mov di,0 ;kepernyo bal felso sarka mov ah,15 ;fekete hatter, feher betu mov bx,cx ;bx <== ora, perc call ir1 ;ora kiirasa inc di ;elvalasztojel helye inc di call ir1 ;perc kiirasa inc di ;elvalsztojel helye inc di mov bh,dh ;bh <== masodperc call ir1 ;masodperc kiirasa mov al,"-" ;elvalasztojel mov es:[di-6],ax ;a megfelelo helyre mov es:[di-12],ax ret ;visszateres foprogramba ir Endp ;alprogram vege ;******************************************************************** ir1 Proc ;alprogram mov cx,2 ;2 szamjegy kiirasa cikl1:push cx mov cx,4 ;BCD szam (4 bit) mov al,0 cikl2:shl bx,1 ;bx felso BCD szamjat rcl al,1 ;al- be teszi at loop cikl2 or al,30h ;bin ==> ASCII mov es:[di],ax ;kepernyore inc di ;kovetkezo hely inc di pop cx ;masik szamjegy loop cikl1 ret ;alprogram vege ir1 Endp ;alprogram vege ;******************************************************************** Prog06 Ends ;a szegmens vege End Start ;********************************************************************

54

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

A program egy bels beptett rbl olvassa ki az idt, ciklikusan. Itt BCD-ben jelenik meg az rtk, ezt kell talaktani ASCII alakk, a 4 bites binris szmhoz 48-at kell hozzadni. A megoldsban az or al,30h ugyanezt az eredmnyt adja. 4.4.3.7 7. feladat rjunk egy programot, mely a kperny trlse utn kir a kpernyre 5 sorban vlasztsi lehetsget a kvetkez alakban: ELSO MASODIK HARMADIK NEGYEDIK OTODIK.

Jelenjen meg egy zld httr az ELSO felirat mgtt, amit a lefel s felfel nyllal lehet mozgatni. A kivlasztott sor utn az ENTER lenyomsa utn a program rja ki a kvetkez szveget: KIVALASZTVA: xxxxx MENU,

majd tegye fel a kvetkez krdst: UJ VALASZTAS? (i/n),

ami utn ismtelhet a program, illetve ki lehet lpni belle. Hibs bet megnyomsa esetn ne trtnjen semmi. Ez a szveg piros betkkel jelenjen meg. Prog07 ;szegmensdefinico ;CS es DS beallitas a szegmens ;elejere ;******************************************************************** Start:mov ax,Prog07 ;DS regiszter beallitasa mov ds,ax mov ax,0b800h ;es regiszterbe videomemoria mov es,ax mov ax,3 ;80*25uzemmod,kepernyotorles int 10h call write1 ;a menupontok kiirasa cimke1:call line ;a mutato megjelenitese cimke2:mov ax,0100h ;billentyuzet? int 16h jz cimke2 mov ax,0 int 16h cmp ah,1ch ;ENTER? jz ent ;igen cmp ah,48h ;^? jnz cimke3 ;nem, tovabb vizsgalni
55

Segment assume CS:Prog07,DS:Prog07

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK cmp byte ptr [POINTER],1 ;POINTER nem 1, jz cimke2 dec byte ptr [POINTER] ;POINTER - 1 jmp cimke1 ;ujbol billentyufigyeles cimke3:cmp ah,50h ;nyil lefele? jnz cimke2 ;nem, billentyufigyeles cmp byte ptr [POINTER],5 ;POINTER nem mutat az jz cimke2 ;5. helyre, novelni inc byte ptr [POINTER] jmp cimke1 ;ujbol billentyufigyeles ent: mov cl,byte ptr [POINTER] ;cl-be POINTER erteke mov si,offset ADDRESS ;cimbetoltes bs-be, ahova ent1: mov bx,[si] ;POINTER mutat add si,2 loop ent1 jmp bx ;ugras bx tartalma alapjan ent2: mov si,offset QUEST ;kerdes kiirasa call write2 ent3: mov ax,0100h ;igen? nem? int 16h jz ent3 mov ax,0 int 16h cmp ah,31h ;nem, kilepes jz ent4 cmp ah,17h ;mas, ujbol figyelni jnz ent3 jmp start ;igen, program elejere ent4: mov ax,4c00h ;vissza a DOS-ba int 21h ;******************************************************************** pr1: mov si,offset TXT1 ;szovegek kiirasa call write2 jmp ent2 pr2: mov si,offset TXT2 ;szovegek kiirasa call write2 jmp ent2 pr3: mov si,offset TXT3 ;szovegek kiirasa call write2 jmp ent2 pr4: mov si,offset TXT4 ;szovegek kiirasa call write2 jmp ent2 pr5: mov si,offset TXT5 ;szovegek kiirasa call write2 jmp ent2 ;******************************************************************** line Proc ;csik alprogram mov al,byte ptr [POINT2] ;a mutato elozo erteket mov bl,160 ;al, be a hosszat bl-be

56

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK mov ah,0 mul bl ;mutato kezdocimenek meghat. add ax,1499 mov di,ax mov cx,21 mov al,7 ;fekete hatter, feher betu line1:mov es:[di],al ;szininformacio video memoriaba add di,2 loop line1 mov al,byte ptr [POINTER] ;mint elozoleg, de uj pozicio mov byte ptr [POINT2],al ;es kiemelt hatter szin mov bl,160 mov ah,0 mul bl add ax,1499 mov di,ax mov cx,21 mov al,47 line2:mov es:[di],al add di,2 loop line2 ret ;visszateres foprogramba line Endp ;alprogram vege ;******************************************************************** write1Proc ;szoveg kiiro alprogram mov si,offset CHOICE ;0 ==> di+160 (soremeles) mov ah,7 ;255 ==> szoveg vege es kilepes mov di,1660 wr1: push di wr2: mov al,[si] inc si cmp al,0 jz wr3 cmp al,0ffh jz wr4 mov es:[di],ax add di,2 jmp wr2 wr3: pop di add di,160 jmp wr1 wr4: pop di ret ;alprogram vege write1Endp ;alprogram vege ;******************************************************************** write2Proc ;szovegkiiras mov al,[si] ;elso 2 byte koordinata mov ah,0 ;amibol memoriacim szamolhato shl ax,1

57

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK mov di,ax mov al,[si+1] mov bl,160 mul bl add di,ax add si,2 mov ah,12 wr21: mov al,[si] inc si cmp al,0 jz wr22 mov es:[di],ax add di,2 jmp wr21 wr22: ret write2Endp ;******************************************************************** POINTER:db 1 POINT2:db 1 CHOICE:db "ELSO",0 db "MASODIK",0 db "HARMADIK",0 db "NEGYEDIK",0 db "OTODIK",255 TXT1: db 22,5,"KIVALASZTVA: EGYES MENU",0 TXT2: db 21,5,"KIVALASZTVA: KETTES MENU",0 TXT3: db 21,5,"KIVALASZTVA: HARMAS MENU",0 TXT4: db 21,5,"KIVALASZTVA: NEGYES MENU",0 TXT5: db 21,5,"KIVALASZTVA: OTOS MENU",0 QUEST:db 28,20,"UJ VALASZTAS? (i/n)",0 ADDRESS:dw offset pr1 dw offset pr2 dw offset pr3 dw offset pr4 dw offset pr5 ;******************************************************************** Prog07Ends ;a szegmens vege End Start ;********************************************************************

58

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.4.3.8 8. feladat rjunk olyan programot, amelyik 1 kHz-es frekvecival egy csipog hangot ad. Mieltt a programrshoz kezdennk, meg kell vizsglni, mi ll rendelkezsnkre a hang ellltsra. A kpernyre val kirs azrt viszonylag egyszer, mert a videomemria rsze a gp operatv memrijnak, gy egyszeren csak azt kellett tudnunk, hol kezddik a videomemria, milyen a szervezse. Gyakorlatilag egy hardver oldja meg ezutn a kpernyre val informci (esetnkben a szveg) kirst. Ez gy is kell hogy legyen, hiszen a gyakorlatban a legtbb mvelet a kperny fel trtnik, itt kapjuk a legtbb informcit, akr szveg, akr kp alakjban. A 4.13 brn lthat a hardver egy rszlete, ahonnan megrthetjk a hangszr hasznlatt, illetve ahol megtallhatjuk a hangszr megszlaltatst biztost paramtereket, amik segtsgvel programozhatjuk a hardvert.

4.13 bra: A PC egy hardver-rszlete az i8253 idzt / szmll ramkrrel Az 1. csatorna egy i8259 megszaktsvezrlre van ktve, ami msodpercenknt 18.2szer kld megszaktst a szmtgp fel, a 2. csatorna az i8237 DMA (kzvetlen memriahozzfrst vezrl) ramkrrel van kapcsolatban, szmunkra a 3. csatorna az rdekes, amely a hangszrra kapcsoldik (a megfelel elektronika segtsgvel). A hangszr megszlaltatsa a 3. csatorna segtsgvel gy trtnik, hogy az alapfrekvencit (1.19318 MHz-et) leosztjuk 1 kHz-re. Ehhez szksges az i8253 ramkr programozst ismerni. Az ramkr a 043h cmen fogadja a parancsokat, amiket rsparanccsal kzlhetnk, az egyes bitek jelentse a kvetkez (4.14 bra):

59

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

4.14 bra: az i8253 idzt / szmll vezrlbitjeinek jelentse A periodikus ngyszgjelek belltsa utn a hnagszr bekapcsolsa az i8255 porton keresztl trtnik. Ez a port 3 8 bites kapuramkrt tartalmaz, a hangszrt a B port D1-D0 bitje befolysolja. A program a kvetke Prog08 Segment ;szegmensdefinico assume CS:Prog08,DS:nothing ;CS beallitas a szegmens elejere ;es nincs adat ;******************************************************************** prog_55 equ 061h ;8255 port cime prog_53 equ 043h ;8253 cime ido equ 042h ;******************************************************************** ****** Start: mov al,10110110b ;timer2 lesz az oszto out prog_53,al ;kivinni mov ax,1193 ;osztasarany 1 kHz out ido,al mov al,ah out ido,al ;******************************************************************** in al,prog_55 ;hangszoro bekapcsolasa, de mivel ;ez a port mas periferiakat is ;vezerel, ezek bitjeit nem szabad ;valtoztatni or al,00000011b ;bekapcsolas D1,D0 bitekkel out prog_55,al mov cx,0ffffh ;varakozas 0ffffh ideig cikl: loop cikl ;a hang ideje in al,prog_55 ;kikapcsolni a hangszorot and al,11111100b out prog_55,al mov ax,4c00h ;visszateres DOS-ba int 21h ;******************************************************************** Prog08 Ends ;a szegmens vege End Start
;********************************************************************

60

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 4.4.4 Az IBM PC grafikus krtyjnak vezrlse assembly-bl A szveges zemmd hasznlata nem enged meg rajzolst, csak nhny karakter egyms mell helyezsvel lehet igen egyszer brkat ltrehozni. Amennyiben bonyolultabb brkat szeretnnk ltrehozni, esetleg azokat mg mozgatni is, akkor grafikus zemmdban kell hasznlni a gpet. Az IBM PC gpekre jellemz az, hogy a felhasznl ignyeihez mrten alaktja ki a hardver konfigurcit, illetve vlasztja meg a szoftver eszkztrat. Ez a nagy szabadsg a hardver megvlasztsnl azzal jr, hogy tbbfle videokrtyval is tallkozhatunk a gpeknl. A grafikus krtyk igen eltr kpessgek, sok tipus ma mr nem is hasznlatos kzlk. 4.4.4.1 Klnfle grafikus zemmdok programozsa Tbb mdon is megoldhat a grafikus krtya programozsa: egyik mdszer az, amikor a mr meglev BIOS alprogramokat hasznljuk, ez knyelmes, hiszen mr helyettnk megrtk a programokat, csak a megfelel paramtereket kell belltani az alprogram meghvsakor, a msik mdszer, amikor az gynevezett direkt programozst alkalmazzuk, ez ugyan nehezebb mint az elz, de sokkal gyorsabban mkdnek a programok. A szveges kirsnl egy mtrix megfelel helyeire rtunk ASCII karaktereket, azok alakjt, kpt nem mi hatroztuk meg. A felbonts 80*25 volt, a grafikus zemmdnl csak pontokat tudunk egy sokkal nagyobb felbonts mtrix egyes pontjaiba helyezni. Ha alakzatot akarunk ltrehozni, akkor azt neknk kell sszerakni, pldul az A bett sok kis pontbl hozhatjuk ltre. 4.4.4.2 Az IBM PC szmtgp CGA grafikus zemmdja Ez a krtya egy egyszer, kis felbonts hardver, amely az els IBM PC szmtgpeknl jelent meg. Felbontsa 320*200 kppont, legfeljebb ngy sznnel. Ezt a ngy sznt 16 sznbl lehet kivlasztani. Ha nincs szksgnk sznre, pontosabban egy httrszn s egy eltrszn elegend, akkor bellthatjuk a 640*200as felbontst. 1 bjton 4 kppont trolhat, hiszen a 4 sznhez 2 bit kell. A 320*200 kppont 8000 bjton gy elfr. Egy kis furcsasg is tallhat ennl a krtynl, a memria els rszben a pros, mg a msodik rszben a pratlan sorokat trolja, gy 0b800:0000h a pros, a 0b800:2000 pedig a pratlan sorok kezdcme. A 4.5 tblzat szerint lehet a szneket kivlasztani. 4.5 Tblzat: a CGA krtya sznei 1. paletta 0 httrszn 2. paletta 0 httrszn 1 zld 1 trkiz 2 piros 2 lila 3 srga/barna 3 fehr/szrke

A 16 sznt az intenzits belltsval lehet ltrehozni.


61

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Feladat: CGA zemmdban a bal fels sarokba rajzoljon ki a program egy kk, lila s fehr vonalat. Az els billnetylenyoms utn trtnjen meg a palettavlts, msodik billentynyoms utn sttre vltsanak a sznek, egyidejleg a httr kk szn legyen. Az utols billenty lltsa vissza az ersebb sznintenzitst. A program felttlenl DOS zemmdba vltson vissza a kilps eltt. A program listja a kvetkez: Prog10 Segment ;szegmensdefinico assume CS:Prog10,DS:Prog10 ;CS es DS beallitas a szegmens elejere ;******************************************************************** Start:mov ax,Prog10 ;DS beallitas a szegmens elejere mov ds,ax ;******************************************************************** mov ax,0b800h ;CGA videomemoria kezdocime mov es,ax ;******************************************************************** mov ax,4 ;ah=0, kepernyo uzemmod int 10h ;al=4, CGA, 320*200/4 ;grafikus uzemmod ;******************************************************************** mov ah,0bh ;1-es paletta mov bh,1 ;palettaallitas mov bl,1 ;1-es paletta sorszam int 10h ;0 vagy 1 lehet ;******************************************************************** mov al,01010101b ;8 1-es szinkod bal felso sarokba mov es:[0],al mov al,10101010b ;8 2-es szinkod melle mov es:[1],al mov al,11111111b ;8 3-as szinkod melle mov es:[2],al ;******************************************************************** xor ax,ax ;billentyu lenyomasra varni int 16h ;******************************************************************** mov ah,0bh ;0. paletta beallitasa mov bh,1 mov bl,0 int 10h ;******************************************************************** xor ax,ax ;billentyu lenyomasra varni int 16h ;******************************************************************** mov ah,0bh ;bh = 0, akkor mov bh,0 mov bl,1 ;akkor bl hatterszin, most kek int 10h

62

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK ;******************************************************************** xor ax,ax ;billentyu lenyomasra varni int 16h ;******************************************************************** mov ah,0bh ;hatter 4. bit eloter intenzitasa mov bh,0 ;barna => sarga mov bl,1+16 ;szurke => feher int 10h ;******************************************************************** xor ax,ax ;billentyu lenyomasra varni int 16h ;******************************************************************** mov ax,3 ;80*25 karakteres mod visszaallitas int 10h ;******************************************************************** mov ax,4c00h ;visszateres DOS-ba int 21h ;******************************************************************** Prog10 Ends ;a szegmens vege End Start ;******************************************************************** A program rtkelse: A CGA 320*200-as zemmd belltsa utn az egyes palettt vlasztjuk ki. Ezutn a kperny bal fels sarkba egyms mell 3 vonal kerl kirajzolsra, egy kk, egy lila s egy fehr. A programba egy BIOS rutinnal billentyvrakozst ptettnk be. A billenty lenyomsakor a sznek vltoznak, mgpedig zldre, pirosra s srgra. A kvetkez billentylenyomskor elsttlnek a sznek, ugyanakkor a httr kk szn lesz. Az utols eltti billentylenyoms nagyobb intenzitssal jelenti meg a vonalakat. Legutols billenty hatsra a program visszaadja a vezrlst a DOS-nak. Nem szabad elfelejteni a grafikus zemmdot visszavltani szveges zemmdra. 4.4.4.3 Az IBM PC szmtgp VGA grafikus zemmdja Feladat: A program rajzoljon ki VGA grafikus zemmdban egy zszlt. A program listja a vetkez: Prog11 Segment ;szegmensdefinico assume CS:Prog11,DS:Prog11 ;CS es DS beallitas a szegmens elejere ;******************************************************************** ****** Start: mov ax,Prog11 ;DS beallitas a szegmens elejere mov ds,ax ;******************************************************************** mov ax,0a000h ;VGA videomemoria kezdocime mov es,ax ;******************************************************************** mov ax,13h ;VGA 320*200 /256 szin

63

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK int 10h ;******************************************************************** call color ;szinbeallitas ;******************************************************************** mov di,320*69 ;hova, 70. sor eleje mov al,1 ;piros eloterszin cld ;di novekedjen mov cx,3 ;3 szin kirajzolasa ;******************************************************************** cikl1: push cx ;szamlalot elmenteni mov cx,320*30 ;30 keppont rep stosb ;kiiras ismetles pop cx ;szamlalot visszamenteni inc al ;kovetkezo szin loop cikl1 ;******************************************************************** mov ax,0 ;billentyu? int 16h ;******************************************************************** mov ax,3 ;szoveges kepernyo int 10h ;******************************************************************** mov ax,4c00h ;visszateres DOS-ba int 21h ;******************************************************************** ;#################################################################### color Proc ;szinbeallitas alprogram ;a hatter es 3 zaszloszin beallitasa ;******************************************************************** push ax ;a hasznalt regiszterek mentese push cx push dx ;******************************************************************** mov dx,3c9h mov cx,4 ;hatterszin + 3 eloterszin xor al,al ;hatterszin mov si,offset colors ;******************************************************************** vga: push ax dec dx out dx,al inc dx mov al,[si] out dx,al mov al,[si+1] out dx,al mov al,[si+2] out dx,al add si,3 pop ax

64

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK inc al ;kovetkezo szin loop vga ;******************************************************************** pop dx ;regiszterertekek visszaallitasa pop cx ;vigyazat, forditott sorrendben pop ax ret ;******************************************************************** color Endp ;alprogram vege ;#################################################################### ;******************************************************************** colors: db 0,0,63 ;kek hatter db 63,0,0 ;piros eloter db 63,63,63 ;feher eloter db 0,63,0 ;zold eloter ;******************************************************************** Prog11 Ends ;a szegmens vege End Start ;******************************************************************** Az elz pldban CGA (vagyis a legegyszerbb zemmdban) lltottuk be a kpernyt. Ma mr gyakorlatilag nem hasznljuk ezt az elgg korltozott kpessgekkel rendelkez krtyt. A sokkal jobb felbonts s sokkal tbb sznt hasznl VGA zemmd (krtya) hasznlata indokolt. A program elemzse: Mivel a programban a httrszn meghatrozsa utn hrom klnbz tglalapbl lltjuk ssze a piros-fehr-zld zszlt, ezrt itt is alprogramot hasznlunk az azonos, vagy hasonl feladatok megoldsra. A programbl val kilpst brmely billentyvel megvalsthatjuk. Fontos a kilps eltt a szveges zemmd visszalltsa is. A VGA videomemrinak a cme 0a000h, gy ezt kell belltani.gyszintn szksges a 320*200 / 256 szn zemmd belltsa, amit az int 10h megszakts 13h paramtervel hozhatunk ltre. A megolds hasznl egy sszetett utastst, a rep stosb tulajdonkppen a kvetkez mveleteket valstja meg: ciklus: mov es:[di],al inc di loop ciklus. mivel di ignyli a nvekeds, illetve cskkens meghatrozst, ezt a cld utastssal rjk el (pldnkban nvekszik). A sznek belltsra egy color nev alprogramot hasznlunk, ahol a httrszn s a hrom eltrszn meghatrozsa ugyanazon eljrssal trtnik.

65

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Fontos rsze az alprogramnak az alprogramban hasznlt regisztertartalmak belpskor val elmentse. Ez azrt fontos, mert az alprogram hvsakor meghatrozott regiszterrtkekre a programnak az alprogrambl val viszatrskor szksge lesz. A alprogrambl val kilpskor a regisztertartalmakat a pop utastssal vissza kell tlteni az erdeti helyekre. Az alprogram vgn ez fordtott sorrendben trtnik (a mentshez kpest), hiszen a hasznlt stack memria LIFO tpus, vagyis a legutoljra bert adat helyezkedik el a stack-memria legtetejn. Az elfelejtett, vagy a rossz sorrend regisztertartalom-visszaments sszezavarja a programvgrehjtst, ami a szmtgp lellshoz vezet. Itt kell megjegyezni, hogy nha szndkosan, adatcserre is felhasznlhatjuk a nem sorrendben vgrehajtott adtvisszamentst.

66

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

5 PROLOG
5.1 BEVEZETS
A Prolog egy deklaratv szmtgpes programozsi nyelv, amely lnyegesen eltr a procedurlis (eljrsalap) szmtgpes nyelvektl. Az eltrsek a kvetkezk: a Prologban tnyek halmaza van, amelyek a vals vilg objektumaira vonatkoznak, valamint szablyok, amelyek ezen objektumokra vonatkoznak, a Prolog program vgrehajtst a rszproblmk megoldshoz szksges informcik befolysoljk, s nem a program utastsainak sorrendje s a Prolog program egy krdssel indul, amely az informciszerzs elsdleges kiindul pontja Nzznk a fentiekre egy pldt: A Prolog objektumokat s azok kapcsolatait hasznlja a vals vilg lersra. Vegyk a kvetkez deklarcit: Az oktat rt tart. Ez a mondat a tart viszonyt lltja fel kt objektum (az oktat s ra) kztt. A viszony (relci) elvontabb fogalom, mint az objektum. Ez azt jelenti, hogy ugyanazt a viszonyt ms objektumok kztt is felllthatjuk: A tanrsegg rt tart. Az oktat tanfolyamot tart. A meghvott oktat rt tart. A tnyek ezen halmazval megadott kis vilgban krdseket tehetnk fel errl a vilgrl. (Ezt a zrt vilg felttelezsnek nevezik, mert csak a lert tnyek s szablyok kpviselik az igazsgot. Ha nincs rgztve, akkor akrmilyen ms llts hamis rtk.) Pldul ha azt mondjuk: "Igaz-e, hogy a meghvott oktat rt tart?" A vlasz erre Igen. Arra a krdsre, hogy "Igaz-e, hogy a meghvott oktat tanfolyamot tart?" a vlasz termszetesen Nem. Radskppen megkrdezhetjk, hogy "Ki tart rt?" A vlasz: az oktat, a tanrsegd, a meghvott oktat azrt, mert ezek a szemlyek elgtik ki a tart relcit az ra objektummal.

67

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A tnyek mellett az objektumoknl absztraktabb (elvontabb) s ltalnosabb fogalom mg a szably. Ugyanannl a pldnl maradva tegyk fel, hogy minden rt tart szemly tanr. Felllthatjuk ezek szerint a kvetkez szablyt: Ha VALAKI rt tart akkor VALAKI tanr. Itt VALAKI objektumok halmaznak egy elemt trol hely (vltoz). Megjegyzend, hogy a szably Ha rsze ltalnos szablyt fogalmaz meg a vilgra vonatkozan, mert kapcsolatot ad a VALAKI-ben trolt ismeretlen (vltoz) objektum s az 'ra' kztt a 'tart' relcival. Ha behelyettestnk egy rtket a VALAKI trolba, meg tudjuk mondani, hogy ez kapcsolatban van-e a tanr objektummal vagy sem. Az rtelmes megfogalmazs a programoz dolga, teht hogy a vltozba egy szemly neve kerljn. Ezzel a szabllyal s a fenti tnyekkel kvetkeztethetnk nhny j kapcsolatra, pldul: Az oktat tanr. A tanrsegd tanr. A meghvott oktat tanr. Ezek abbl kvetkeznek, hogy az oktat, a tanrsegd s a meghvott oktat teljestik azt a szablyt, hogy: VALAKI rt tart. Hasonlkppen krdseket fogalmazhatunk meg kizrlag a tnyek halmaznak s a szablynak a felhasznlsval. Pldul ha megkrdezzk: "Az oktat tanr" ? A vlasz az lesz, hogy IGEN. sszetettebb krds a "Ki tanr ?" A vlasz erre az oktat, a tanrsegd, a meghvott oktat lenne. gy mkdik a PROLOG, deklarlni kell a tnyek halmazt a fentiekhez hasonlan, majd nhny ltalnos szablyt az objektumok halmazra vonatkozan, aztn a PROLOG kombinlja a tnyek s szablyok halmazait a krdsekre adand vlasz keresse sorn.

5.2 A PROLOG NYELVTANI SZABLYAI


A PROLOG tnyek s szablyok halmazbl ll. A tnyek objektumok kztti, mg a szablyok a tnyek ltalnostsai kztti viszonyokat rnak le. Tnyek Vegyk a mr bemutatott tnyeket:

az oktat rt tart. a tanrsegd rt tart. a tanszkvezet tanfolyamot tart. a meghvott oktat rt tart.

68

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A tart relcit a Prologban mint predikcit vagy kijelentst a kvetkezkppen rjuk le:

tart(oktato, ora)

amely gy olvasand, hogy az els objektum (oktato) 'tart' relciban van a msodik objektummal, azaz az ora-val. Ebben az esetben a 'tart' relci kt objektum kztt teremt kapcsolatot, de ezek szma brmely nemnegatv szm lehet. Ezt a szmot a kijelents argumentum-szmnak nevezzk. A Prolog nyelvtani szablyai nhny megszortst tartalmaznak a tnyekre vonatkozlag:

A kijelentsek s az objektumok kisbetvel kezddnek. gy a "oktat", "tanrsegd" s "tanszkvezet" objektumok rsmdja "oktato", "tanarseged" s "tanszekvezeto" lesz. A kijelentsek neve rand elre, s ha vannak objektumok (argumentumknt), azokat zrjelben, vesszvel elvlasztva kell rni. Minden tnylltst ponttal kell lezrni. tart(oktato, ora). tart(tanarseged, ora). tart(oktato, tanfolyam). tart(meghivott_oktato, ora).

E szablyok figyelembe vtelvel a fenti plda a kvetkezkppen rand:


Meg kell jegyeznnk azt, hogy ezeket a szablyokat csak egyflekppen olvashatjuk: az els objektum ll kapcsolatban a msodikkal. gy a

tart(ora, oktato). tart(oktato, ora). apja(peter, alice). tulajdonos(gerry, arany). szereti(janos, hal). lany(maria). fiu(janos). jatekos(michael, rugby). allat(koala). osszead(2,3,5).

nem ugyanaz, mint:

Nhny tovbbi tny ismers lehet:


69

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

5.2.1 Lekrdezs tnyek alapjn Ha mr vannak tnyeink, krdseket tehetnk fel velk kapcsolatban. Egy Prolog program egy krds feltevsvel indul. Szintaktikailag a krds a tnyekhez hasonlt, de ez a tnyllts vltozkat is tartalmazhat. Ezek a vltozk, pldul objektumokat trol memriahely-jellk mindig nagybetvel kezddnek, pldul: X, Nev, TANAR, ... A krdsre adott vlasz vagy Igen/Nem [Yes/No] vagy egy objektumhalmaz azon objektumokkal, amelyek szerepelhetnek az adott relciban. Nzznk nhny Igen/Nem lekrdezst. Legyen adott a tnyek kvetkez halmaza:

tart(oktato, ora). tart(tanarseged, ora). tart(oktato, tanfolyam). tart(meghivott_oktato, ora). tart(tanarseged, ora). tart(tanarsegd, tanfolyam).

Egy krds lehet a kvetkez:

amelyre a vlasz Yes, mg a:

krdsre adott vlasz No lesz. Az ltalnosabb krdsek objektumok halmazra vonatkoznak, mint pldul: "Ki tart rt?" Prologban ezt gy kell feltenni:

tart(X, ora).

ahol X brmely (szemly tartalm) objektumot kpviselhet, amely kielgti az ora objektummal val relcit. A vlasz a kvetkez lehet:

X = oktato X = tanarseged X = meghivott_oktato tart(oktato, X). X = ora X = tanfolyam

Msrszrl megkrdezhetjk, hogy "Mit tart Jnos?", aminek Prologbeli megfelelje:

A vlasz a kvetkez lesz:


70

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

5.2.1.1 - 1. plda rjuk be az elz pldt a PROLOG szvegszerkeszt segtsgvelk s fordtsuk le: tart(oktato, ora). tart(tanarseged, ora). tart(oktato, tanfolyam). tart(meghivott_oktato, ora). Ha berjuk a kvetkezt, a PROLOG rtelmez (interprter) elemzi a krdsnket: tart(tanarseged, ora). s a kvetkez vlaszt adja: Yes. A PROLOG a kvetkez sorra: tart(X, ora). a kvetkez vlaszokat adja: X = oktat X = tanarseged X = meghivott_oktato. Ahogyan lthat, roppant egyszer a tnyek halmazra vonatkoz krdseket feltenni. Btran prblkozzon az albbiakhoz hasonl krdsek feltevsvel:

tart(oktato, Mit). tart(Ki, tanfolyam). tart(Ki, Mit).

s gy tovbb. Egy krds emellett tartalmazhat logikai S kapcsolatokat is. Pldul megkrdezhetjk, hogy "Ki tart rt is s tanfolyamot is?". Ezt kt relcit sszekapcsol AND mvelettel tehetjk meg, amelyet a Prologban a vessz "," kpvisel. A fenti krds teht Prologban gy teend fel: ------------------------------------tart(X, ora) , tart(X, tanfolyam). X = oktato

71

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 5.2.1.2 - 2. plda rjuk meg a kvetkez programot: szuloje(a,b). szuloje(a,c). szuloje(b,d). szuloje(e,f). ferfi(b). fiutestver(Y,X) :- szuloje(P1,X), szuloje(P1,Y), ferfi(Y), not (X=Y). Futtassuk a kvetkez krdseket:

fiutestver(a,b). fiutestver(b,c). fiutestver(c,b).

s figyelje meg az eremnyeket. Megfelel a vrakozsainak? Nvelje a tnyek szmt s futtasson tovbbi krdseket. A fiutestver szablybl kiindulva rjon szablyokat a:

nover nagyapa nagymama

szmra! Futtasson krdseket az jonnan bert szablyokra is!

5.2.2 A rekurzi A Prolog egyik legrdekesebb vonsa a rekurzv informcik definilsnak lehetsge. Rekurzirl akkor beszlnk, ha valamit nmagval s egy kilp felttellel definilunk. A klasszikus plda a faktorilis definilsa, amely a kvetkez:

N faktorilisa brmely pozitv szmra egyenl N-1 faktorilisnak s N-nek a szorzatval. Nulla faktorilisa legyen egyenl 1-el.

Ez a nagyon egyszer, mgis hatkony s teljes faktorilis-definci knnyen kifejezhet Prologban: faktorialis(0,1). faktorialis(N,X):- M is N - 1, faktorialis(M,Y), X is N * Y.

72

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Ebben az esetben a tnylltsnak meg kell elznie a szablyt, mert A Prolog a faktorialis(M,Y) megoldst a szablyok lert sorrendjben prblja megoldani. Maga a program is itt vgzdik, mert a szmll itt cskken zrusra. Ellenkez esetben a program vgtelen ciklusba esne. A rekurzi nagyon jl hasznlhat, egyszer s elegns programot eredmnyez, de knnyen kicsszhat az ellenrzsnk all. Ezrt nagyon vatosan jrjunk el rekurzv programok futtatsakor. Nagyon gyakran hasznlunk rekurzit adatszerkezetek megadsakor is. Prologban az adat lehet atomi (egyszer rtk) vagy lista (rtksorozat). A lista elemek halmaza, amelyek lehetnek szmok, betk, szvegek s listk (listk listja). A listk elemei szgletes zrjelek kz randk s vesszvel vlasztandk el. Nhny plda egyszer listkra: [szomba, konyha, frdszoba, nappali] [123, 12, 45] [a, b, c, d, e, f, g,h] Mivel a lista elemek halmaza, nhny alapvet mvelet kapcsoldhat a listkhoz, mint pldul a metszet-, ni- s klnbsg kpzse, stb., amelyeket knnyen megfogalmazhatunk Prologban. Pldul a bennevan1(X,L) szably igaz, ha X eleme az L listnak. Ezt a szablyt Prologban gy fogalmazzuk meg: bennevan1(X,[X|_]). bennevan1(X, [_|L]) :- bennevan1(X,L). A "|" jel osztja kell a listt az els elemre ("fej elem") s a lista maradkra. A fenti szablyok kzl az els bennevan1(X,[X|_]) akkor teljesl, ha X a lista els eleme. (Az alhzsjel azt jelenti, hogy a lista azon rsznek rtke a megoldsban most rdektelen. Ha az els szably nem teljeslne, akkor a szably msodik sora leveszi a lista els elemt, s rekurzv hvssal ismt vgrehajtdik a bennevan1 szably szerint, de mr a lista els eleme nlkl. 5.2.2.1 - 3. plda rja be a bennavan1 szablyokat egy llomnyba s ellenrizze a mkdst a kvetkez krdsekkel: bennevan1(a,[b,c,a,d]). bennevan1(a,[b,c,f,d]). bennevan1(20, [15,16, 17, 18, 19, 20]). bennevan1(mike, [ana, paul, mary, tom]). Hogy kvethesse azt, amit a Prolog tesz a vgrehajts sorn, figyelje meg azt nyomkvetssel. A nyomkvets bekapcsolshoz rja be a krds kiadsa eltt: trace. Ezek utn <enter> -t kell nyomnia minden kvetkez lps vgrehajtshoz. Prblja ki ezt a fenti krdsek nmelyikvel s tanulmnyozza a kirtakat!

73

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Egy msik hasznos mvelet a reszhalmaza. A reszhalmaza1(X,Y) igaz, ha X minden eleme eleme az Y listnak is. Ennek a problmnak a megoldshoz ellenriznnk kell X minden elemre, hogy az (az elz szably szerint) bennevan az Y listban is. A program akkor ll le igaz rtkkel, ha nincs mr tbb elem az X listban, ellenkez esetben hamis rtket ad a lellsa utn. Maga a program a kvetkez: reszhalmaza1([],_). reszhalmaza1([X|L],Y) :- bennevan1(X,Y), reszhalmaza1(L,Y). ahol [] az res listt jelenti. Helyezze be ezt a szablyrendszert abba az llomnyba, amelyben a bennevan1 is van, s hajtassa vgre a kvetkez lekrdezseket:

reszhalmaza1([a,b,c],[x,a,f,b,g,h,c]). reszhalmaza1([1,2,100],[100,2,1,3]). reszhalmaza1([1,2,100],[100,2]).

5.2.3 Tagads Elfordulhat, hogy gy tallja, jobb lenne, ha egy felttel NEM teljeslne. Ezt a Prologban a not meta-kijelentssel valsthatjuk meg. A Prologban a not azt jelenti, hogy: "amennyiben a program tnyei s szablyai szerint az, hogy ezt a felttelt NEM lehet teljesteni: IGAZ, akkor a felttel minden bizonnyal HAMIS". Ez a zrt vilg felttelezse. Pldul egy szobt (ngy falval) a kvetkezkppen definilunk: szoba(E,D,N,K), ahol E szakit, D dlit, N nyugatit s K keletit jelent, s brmelyik vltoz felveheti a kvetkez rtkeket:

'ajto' ha ott ajt van, 'ablak' ha ott ablak van, 'fal' ha ott csupasz fal van

Ha egy olyan szobt akarunk, amelynek nincs szakra nyl ajtaja, akkor a kvetkez szablyt kell megfogalmaznunk: szoba1(E,D,N,K) :- szoba(E,D,N,K), not (E=ajto). ahol a szoba1 csak olyan szobkra vonatkozhat, amelyeknek nincs szaki oldalukon ajt. Mieltt ellenriznnk ennek a szablynak a mkdst, definilnunk kell a szoba kijelentst. Definilhatnnk egy halom tnylltst az ajtnak, az ablaknak s a csupasz falaknak az sszes lehetsges irnyban val elhelyezsvel. De ahelyett, hogy ezt a 81 tnylltst lernnk, elllthatjuk ezeket a kvetkez kijelentssel: szoba(E,D,N,K) :- faltipus(E), faltipus(D), faltipus(N),

74

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK faltipus(K). s a kvetkez tnylltsokkal: faltipus(ajto). faltipus(ablak). faltipus(fal). rja meg a program szablyait a szoba, szoba1 s faltipus kijelentsekre. Futtassa a kvetkez krdsekkel (';'-vel az sszes lehetsges vlaszrt):

szoba1(E,ajto,N,K). ** ez lekrdezi az sszes olyan elrendezst, amelyben a nem szaki, hanem dlre nyl ajtaj szobk vannak, keletre s nyugatra pedig brmi llhat. Figyelje meg a krds msodik, konstans 'ajto' rtk argumentumt. szoba1(E,D,N,K). ** Ez a lekrdezs megadja az sszes olyan elrendezst, amelyben az ajt nem szaki fekvs.

5.2.3.1 - 4. plda Mdostsa a fenti programot azzal, hogy legyen egy szoba2, amelynek pontosan egy ajtaja van, de az vagy dli vagy szaki lehet csak. 5.2.3.2 - 5. plda Adjon hozz mg egy faltipust s futtassa az egszet jra, hogy lssa a kombincik sokkal nagyobb szmt. rdekes megfontolni, hogyan kombinljuk ssze a tagadst a rekurzival. Tegyk fel, hogy meg akarjuk szmolni egy adott lista adott tulajdonsg elemeinek a szmt. A lista_elemszam(L,Q,E) az L lista Q tulajdonsg elemeinek E szmval tr vissza. A megvalsts egy mdja a kvetkez: lista_elemszam([],_,0). lista_elemszam([X|L],X,N) :- lista_elemszam(L,X,N1), N is N1 + 1. lista_elemszam([Y|L],X,N) :- not (X=Y), lista_elemszam(L,X,N). Ezek a szablyok a rekurzi egy rdekes formjt hasznljk, amikoris a rekurzibl val visszatrskor valamilyen mveletet hajt vgre. Ebben az esetben a rekurzibl val kilpskor szmllja a megfelel tulajdonsg elemeket. A program teljes megrtshez nzzk sorra az egyes szablyokat. A lista_elemszam([],_,0). res lista esetn befejezi a rekurzit s nullt ad eredmnyl. A lista_elemszam([X|L],X,N) :- lista_elemszam(L,X,N1), N is N1 + 1. szably akkor teljesl, ha a keresett X elem a lista fejeleme is. Ebben az esetben a lista_elemszam ismt meghvsra kerl a lista fejelem nlkli L maradkval. Ha

75

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK ebbl a rekurzibl visszatr, akkor eggyel nveli az L-ben lv megfelel elemek szmt tartalmaz N1 rtkt, s ezt az sszeget teszi az N-be vlaszknt. Vgl a lista_elemszam([Y|L],X,N) :- not (X=Y), lista_elemszam(L,X,N). csak rekurzv lista_elemszam hvst tartalmaz abban az esetben, amikor a lista Y fejeleme nem egyenl a keresett X elemmel. Eltren az elz szablytl, most nem csinl semmit amikor a rekurzibl visszatr. rja be a lista_elemszam szablyokat a programba s futtassa a kvetkez krdsek kiadsval:

lista_elemszam([a,b,c,a,f],a,N). ** leszmolja az 'a' elemeket a [a,b,c,a,f] listban lista_elemszam([a,b,c,a,f],g,N). lista_elemszam([john,peter,jose,mary,peter],mary,N).

5.2.4 Az eredmnyek kijelzse A legtbb esetben a keres rendszerek megadjk a minket rdekl lekrdezsek eredmnyeit. De ha mi a vlaszt egyni formban s tartalommal akarjuk, akkor szksgnk lesz az elre definilt write kijelentsre. Pldul a szoba(E,D,N,K) kijelents eredmnyt kirhatjuk a szoba_kiiras(E,D,N,K) szabllyal: szoba_kiiras(E,D,N,K) :- write(E), write(' '), write(D), write(' '), write(N), write(' '), write(K), nl. Ez a szoba falainak tpusait egy-egy szkzzel elvlasztva rja ki. Az 'nl' egy soremelst hajt vgre a standard kimeneten. 5.2.4.1 - 6. plda Ebben a feladatban hasznlhatja a mr definilt

szoba faltipus lista_elemszam szoba_kiiras

szablyokat. Definiljon egy kln szablyt a nappali szobra! A nappali szobnak pontosan kt ajtaja van.

76

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Ksztsen egy msik szablyt egy ktszobs laksra, ahol az egyik egy nappali, a msik egy szoksos szoba. A szobknak egy kzs ajtajuk van. rassa ki a szobk falainak elhelyezkedst a kvetkezhz hasonlan: terv1(X). nappali szoba d d w w masik szoba d w w w X = 'tovabbi valasz ?' ; nappali szoba d d w w masik szoba d w w d X = 'tovabbi valasz ?' ; nappali szoba d d w w masik szoba d w w x X = 'tovabbi valasz ?' Hasznlja a ';'-et az sszes vlasz lekrdezshez! Ehhez effle kijelentst kell ksztenie: terv1(X) :- ..... valami van itt.. ...... X = 'tovabbi valasz ?', ..... tovabbi sorok vannak itt.....

5.2.5 Levgs s kudarc Az eddigiekbl lthatja, hogy a Prolognak van egy beptett rendszere a megoldsok s bizonytsok megkeressre. Alapesetben ezek az eljrsok elegendk a lehetnek minden problma megoldsra, de a hatkonysg s a kisebb kdmret kedvrt kt meta-kijelents is rendelkezsnkre ll a Prolog mkdsnek befolysolsra: a cut (levgs) s a fail (kudarc). 5.2.6 Levgs A felkiltjellel jellt levgs a visszalpses keress lelltsra szolgl, s akkor hasznljuk, ha egy ponttl kezdve brmilyen eset kudarchoz vezetne. Pldul az albbi bennevan(E,L) szably akkor teljesl, ha az E elem benne van az L listban: bennevan(X,[X|L]) :- !. bennevan(X,[_|L]) :- bennevan(X,L). Az els szablyban lv levgs szerint ha egyszer mr megtalltuk az elemet a listban, akkor nem szksges visszalpni s tovbbi megoldsokat keresni. Egy msik egyszer plda a max(X,Y,Z) kijelents, amely Z-ben megadja az X vagy az Y kzl a nagyobbat. A kijelents szablyai a kvetkezk lehetnek: max(X,Y,X) :- X >= Y.

77

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK max(X,Y,Y) :- X < Y. Ha megfigyeli, akkor rjhet, hogy ezek a szablyok egymst klcsnsen kizrjk. Ha az els teljesl, akkor a msodik nem s fordtva. Elkerlend a ksbbi problmkat, lehetsges (s haszontalan) visszalpseket, a jobb szablyok ezek: max(X,Y,X) :- X >= Y, !. max(X,Y,Y). Ha az els szably teljesl, akkor a Prolog nem keres tovbbi megoldsokat a msodik szably segtsgvel. A levgs hasznlatnak van mg sok ms, bonyolultabb oka is. KUDARC A fail (kudarc) egy a Prologba beptett kijelents, amely hamis logikai rtket ad a vgrehajtsa esetn. Ez azt is jelenti, hogy a Prolog visszatr az ezt megelz esetvizsglathoz. Pldul lljon a kvetkez program: allat(koala). allat(tigris). allat(kutya). allat(X), write(X), nl. csak a koala vlaszt adja eredmnyl a kpernyre. Mdostjuk a programot azrt, hogy a visszalpses keresssel minden megoldst kirjon a program: allat(koala). allat(tigris). allat(kutya). allat(X), write(X), nl, fail. Mikor a Prolog vgrehajtja a fail kijelentst, visszatr tovbbi megoldsokat keresni. A write s nl beptett kijelentsek nem adnak tovbbi megoldsokat, de az allat() szably ms esetben is teljeslhet. A Prolog addig keres jabb s jabb megoldsokat amg csak lehetnek, azutn ll csak le azzal, hogy nincs megolds. Ezrt lt ennek vgrehajtsakor No -t a program vgrehajtsa utn. Hogy ezt a 'No'-t ne kapjuk meg, adjunk hozz egy res 'run' szablyt is: allat(koala). allat(tigris). allat(kutya). run :- allat(X), write(X), nl, fail. run. amely gy rkk teljesl.

78

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

5.3 A TURBO-PROLOG BETLTSE, INDTSA S MENRENDSZERE.


A C:>prolog billentyzssel betltdik s el is indul a program. A mensor als sorban vannak az aktulis legfontosabb parancsok jelei, melyek zme mindig valamelyik F funkcibillenty. A men a szoksos mdon, a vzszintes kurzorvezrl billentykkel s az ENTER lenyomsval mkdik, amire ltalban egy jabb, most mr lefut menben talljuk magunkat. Ezek kzl a fggleges kurzorvezrlkkel s az ENTER-rel vlaszthatunk. A programozs els (technikai) lpse a program szvegnek ellltsa, vagyis a forrskd megrsa. Erre hasznljuk az EDIT funkcit. A program lefordtsa a COMPILE funkcival lehetsges, aminek eredmnye egy *.obj kiterjeszts trgykd. Hiba esetn kijelzi a hiba helyt s az szlelt hibt, br ez nem garancia arra, hogy az igazi hiba is ott van. Hiba esetn -mg a menpont hatskre alatt- kijavthatjuk a hibt, az F10-re pedig befejezi a fordtst. A memriban lv program futtatsa a RUN opci alatt trtnik. Ha eltte nem fordtottuk le a programot, vagy a legcseklyebb mrtkben megvltoztattuk, akkor a futst megelzi a fordtsi procedra. A futsi kp a legegyszerbb esetben a DIALOG nev ablakban trtnik, erre akkor kerl sor, ha nem hatroztunk meg ablakot, vagy ablakokat a felhasznl s program kztti adatcerre. A programszveg mentsre, betltsre, tnevezsre, az aktulis drive s alknyvtr vltoztatsra s az opercis rendszerbe trtn ideiglenes kilpsre a FILE funkci ll rendelkezsnkre.

5.4 A LOGIKAI NYELVEKRE VONATKOZ NHNY FONTOSABB DEFINCI


A logikai program alapstruktrja a kifejezs. A kifejezs lehet konstans (lland), vltoz vagy sszetett kifejezs. A konstansok szmok vagy elemi (atomi) jellegek lehetnek, mg a vltozk egyedi, de nem specifiklt egyedeket jelentenek. Az "atomok" szimbluma brmilyen karakterlnc lehet, amely kizrja brmely ms (vltoz vagy szm) szimblummal val sszetveszts lehetsgt. A vltozk neveit a kezd nagybet klnbzteti meg. A szably egy fggvnynevet (a szably megklnbztet jelt) s egy vagy tbb kifejezst, mint argumentumot tartalmaz. A szably jellemzi teht a neve, amely tovbb nem bonthat, s a kiterjedse (dimenzija), vagyis az argumentumainak a szma. A tnyek nulla vltozs szablyoknak tekinthetk.

79

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Szintaktikailag a szably formja: f(t1,t2,...,tn) ahol a szably neve f, dimenzija n, s az argumentumai ti. A logikai program szablyok vges kszlete. A felttel vagy szably A :- B1,B2,...,Bk. k>0 ltalnos alak mondatok, ahol A s Bi clkifejezsek. Az ilyen mondatok kijelent md deklaratv olvassa: A tartalmazza Bi egyttes teljeslst. Vgrehajts szempontjbl procedurlisan ugyanez gy hangzik: az A krdsre vlaszolni annyi, mint vlaszolni a B1,B2,...,Bk krdsekre. "A" a szably feje, mg Bi a teste. Ha k=0, akkor a szablyt tnynek nevezzk, s A.-tal jelljk. Ha k=1, akkor a szablyt iteratv szablynak nevezzk. A krds az A1,...,An? n>0 alak kifejezs, ahol A clkifejezsek. A krdsben lv vltozk rtelme azok ltezsnek meghatrozsa. A P logikai program lefuttatsa egy olyan eset keresse, amely az adott krdsre a programbl logikailag kvetkezik. A G clllts kvetkezik a P programbl, ha a Gnek van olyan A esete, ahol A:-B1,...,Bn, n>0, A a P program egy szablynak alaphelyettestse s Bi-k a P programbl kvetkeznek.

5.5 A PROLOG-PROGRAM TULAJDONSGA


A jl ismert Pascal, a BASIC s a tbbi hagyomnyos programozsi nyelv procedurlis: a programoznak kell lpsrl lpsre lernia az eljrsokat, amelyek megmondjk a szmtgpnek, hogy hogyan kell a problmt megoldani. Ezzel szemben a PROLOG deklaratv nyelv. Ez azt jelenti, hogy megadva a szksges tnyeket s szablyokat, kpes deduktv kvetkeztetsekkel megoldani a programozott problmkat. A PROLOG-programoznak csak a problma lerst (goal=cl) kell fellltania a megolds alapszablyaival, s a PROLOG rendszer fogja a megoldshoz vezet utat meghatrozni. A clkifejezsrl elbb-utbb kiderti a Prolog rendszer, hogy az adott krlmnyek kztt teljesl-e vagy nem, illetve milyen felttellel teljeslhet. A clkifejezs vizsglatnak teht ktfle mdja van: ha a clkifejezsben lv szably csak konstansokat tartalmaz, akkor a rendszernek nincs ms dolga, mint addg helyettestgetni a megengedett tnylltsokat a beptett backtrack (visszalps) algoritmus segtsgvel, amg a szably nem teljesl, amikoris vlaszknt kzli, hogy TRUE, ellenkez esetben, teht ha az sszes lehetsg kimerlt, s mg mindig nem volt sikeres a keress, a vlasz FALSE s

80

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK ha a clkifejezsben van vltoz, akkor a rendszernek az a feladata, hogy ennek keressen legalbb egy olyan rtket, amely kielgti a clt, bizonyos krlmnyek kztt az sszes megoldst megkapjuk.

Hogyan kapcsoldik ssze procedurlis s a deklaratv gondolkodsmd a logikai program ptsnl? Clszersgbl ltalban mindenki procedurlisan gondolkodik, amikor programoz. Azonban deklaratvan gondolkodik, amikor a program kvnt s a megvalstott jelentsnek eredmnyt veti ssze. Ezek keversnek egy mdja a logikai programozsban a program szablyait procedurlisan sszelltani, majd az eredmnyt mint deklaratv lltst rtelmezni. ptsk fel teht procedurlis gondolkodsmddal a programot, majd mrlegeljk, hogy a klnbz alkalmazsok sorn az milyen deklaratv rtelmet kap. Ezt majd a feladatokon keresztl be is mutatjuk.

5.6 A TURBO-PROLOG PROGRAM SZERKEZETE


Nagy hatssal volt a programok vilgos szerkezetnek kialaktsban a fellrl lefel (top down) val kivitelezs metdusnak hangslyozsa, amit a lpsenknti finomts elvvel egytt hasznlunk. Nagy vonalakban ez a metdus azt jelenti, hogy fellltjuk a f problmt, szttrdeljk alproblmkra, majd megoldjuk ezeket a rszeket. A fellrl lefel val programozs termszetes mdja a logikai programok felptsnek. A kzlt programlersok is kizrlag fellrl lefel haladnak. Egy Prolog program tnyek s szablyok alapjn keresi a megoldst. Ehhez ismernie kell a szablyok szerkezett, s a szerkezeti elemek minsgt. Az igazn teljes Prolog rendszerek ezt automatikusan elvgzik, br gy sok hiba rejtve is maradhat. Valsznleg a takarkos memriagazdlkods knyszersge s a hibk korai kiszrse miatt a Turbo-Prolog megkveteli az elemi objektumok s a szablyok formai deklarcijt. Ennek kt lpcsje: domains Az elemi objektumok tpusainak deklarcija. Ez a rsz nem ktelez. Ha a szablyok lersnl (predicates, lsd ksbb) csak a rendszer ltal biztostott alaptpusokkal definilunk, akkor kihagyhat. Ellenkez esetben -s a beszdes vltoznevek elve betartsakor mginkbb- nem kerlhetjk meg. Az sem rt, hogy a paramterek tadsakor ezltal elkerlhetjk a nem kvnt adatkeveredst is. Az elemi objektumok nevei kisbetkkel kezddnek. A nv s egy egyenlsgjel utn vagy egy mr ltez standard vltoztpus nevt, vagy egy konstanskifejezst kell tenni, ahogyan az az albbi pldk mutatjk. A standard tpusok a kvetkezk: integer, real, char, symbol, string. Pldul elem = symbol

81

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK szam = integer nagyszam = real i,j,k = integer rud = kozepso Ezek utn teht pldul az elem sz felhasznlhat a szablyok megfogalmazsnl olyan pozcikban, ahol szimblumokat kvnunk elhelyezni, illetve ahol szimblumokat vrunk eredmnyknt. Az elmondottak szerint a rud olyan tpus, ahol az egyetlen behelyettesthet rtk a kozepso sz. Ennek persze nem sok rtelme lenne, ezrt rgtn ejtsnk szt egy fontos lehetsgrl, amelyet alternatv deklarcinak nevezhetnk. Itt olyan deklarcirl van sz, ahol egy tpusnv tbbfle tpust jelenthet. Legegyszerbben ezt konstansokkal szemlltethetjk: rud = jobboldali ; kozepso ; baloldali Most a rud tpus hromfle rtket kaphat, ezeket a pontosvessz vlasztja el egymstl. Az alternatv deklarci kezelse nagy vatossgot, gyakorlatot ignyel. A meglv tpusokkal jabb deklarcik pthetk fel, mint azt az albbi plda mutatja: elem = symbol ujelem = elem Md van arra, hogy egy meglv tpust felhasznljunk sszetettebb adatszerkezet ellltsra. Ennek legegyszerbb s elnyben rszestett mdja a lista definilsa. A ksbbiekben ltni fogjuk, hogy a lista, illetve a listval val mveletek a Prolog egy fontos tulajdonsga. Ha egy szably egyik paramtere nem elemi objektum, hanem egy lista, akkor definilni kell egy ilyen tpust a kvetkez mdon: adat = symbol* Az adat nev tpus ezek utn olyan adatszerkezet, amelyben symbol tpus elemi objektumok vannak listaszeren sszefzve. Az sem helytelen, ha a lista helyett a verem (stack) fogalmval azonostjuk a Prolog-beli listt, mert kzvetlenl csak a lista els tagja (a verem legfels eleme) kezelhet, illetve vlaszthat le a listrl, teht inkbb veremszernek kpzelhet el ez az adatszerkezet. Jellsmdja egyszer: ha az elemeket a,b,c,d-vel jelljk, akkor elfogadottak az albbiak: ["a","b","c","d"] ["a"|["b","c","d"]] ["a"|["b"|["c"|["d"]]]] Az res lista jele a [], amely minden lista vgre implicite odartend. predicates

82

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A szablyok felsorolsa a formalizmus rgztsvel. Ebben a szekciban azokat a szablyokat kell bevezetnnk, amelyeket alkalmazni fogunk. Ezzel rgztjk az alkalmazott szablyok neveit s a hasznlhat paramterek tpusait. Legalbb egy ilyen szablynak kell lennie, msklnben nem is beszlhetnk Prolog programrl. Nhny plda: szabaly1(symbol) szabaly2(integer,integer,symbol) masik_szabaly(real,symbol) uj_szabaly(adat,symbol,adat) A deklarcival foglalkoz szekcik utn most a tovbbi program-egysgek kvetkeznek. Ezek kzl az els a program cljt van hivatva rgzteni. goal A program addg fut, amg ez a cl nem teljesl, vagy meg nem llaptja, hogy sosem teljeslhet. Ez a rsz is elmaradhat, de a lte vagy nemlte ersen befolysolhatja a program mkdst. Ha van, akkor pontosan azt teszi, amire az ezt kvet utastsok knyszertik, s az els kielgt eset utn lell (hacsak msra nem utastjuk). Ha nincs, akkor a menbl vlasztott RUN parancsra a DIALOG ablakban megjelenik a GOAL=? kirs, ami utn az aktulis cl, msnven a krds begpelse kvetkezhet. Maga a program teht csak egy bizonyos krds megvlaszolsrt hajland futni. A cl elrsre kt fontos, a nyelvbe beptett mechanizmus mkdik. Az egyik a mintailleszts, amely kt kifejezs (az elrend cl s a rendelkezsre ll szablyok egyike) kztti, argumentumonknti sszehasonltsra szolgl. A msik a backtrack algoritmus, amely a megoldshalmaz sszes elemt igyekszik megtallni. Ha a lehetsges sszes (j s rossz) megoldst egy binris fa gaiba s leveleibe helyezzk, akkor az emltett algoritmus a fa mdszeres bejrst vgzi, minden megolds utn visszalpve az utols elgazsra ahonnan jra prblkozik msik megoldst tallni. clauses A Prolog program utols rsze a tnyek s szablyok felsorolsa. A tnyek s szablyok tetszleges sorrendben kvethetik egymst, az azonban fontos, hogy az azonos nev szablyok egymst kveten lljanak, az azon belli sorrend viszont mr a vgrehajts sorrendjt fogja befolysolni. A szablyok formai megjelensben lnyegben ktflk. Az egyik neve tnyllts. Ez konstans argumentum felttel nlkli szably, a szably nevvel s argumentumlistval, a vgn egy pont. A msik egy olyan kifejezs, amely egy vagy tbb kisebb clllts logikai kapcsolatbl ll. A rszclok argumentumlistiban szerepelhet egy vagy tbb vltoz, s az azonos nev vltoznevek egy szablyon bell mindig ugyanazt a behelyettestst jelentik. A szably teljeslse felttelektl fgg.

83

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK A felttelek az if kulcssz vagy a vele ekvivalens :- jel utn llnak, s tbb szably esetn logikai kapcsolatukat is meg kell jellnnk. Ilyen logikai alapszavak s a vele ekvivalens rsjelek a kvetkezk: and illetve , (vessz) or illetve ; (pontosvessz) not Nhny Prolog implementci csak az egyik formt fogadja el, msok egy szablyon bell csak egyfajta jellst engednek meg, a Turbo Prolog viszont teljes szabadsgot ad a program szerkesztinek e krdsben. Stilisztikai szempontbl azonban j, ha egysges jellsrendszernl maradunk, n pldul a kulcsszavas rsmdhoz igyekszem ragaszkodni, mert a szavak kifejezbbek s fleg kevsb tveszthetek, mint az rsjelek. Termszetesen a felttelek vgn minden esetben ott kell lennie a szablyt lezr pontnak.

5.7 A LEGGYAKRABBAN HASZNLT PROLOG ALGORITMUSOK


Az eldnts programozsi ttele arra ad algoritmust, hogy egy adatstruktrban van-e T tulajdonsg elem. A Prolog legtermszetesebb adatstruktrja a lista, gy a feladatot egy kicsit egyszerstve gy fogalmazzuk t, hogy van-e a listban egy bizonyos elem? Lssunk egy ksz megoldst: domains elem = symbol lista = elem* predicates bennevan(elem,lista) clauses bennevan(E,[E|_]). bennevan(E,[_|Lv]) if bennevan(E,Lv). A domains szekci deklarl egy elem nev, tetszleges szimblumbl ll elemi objektumot, valamint egy lista nev, elem tpus tagokbl ll listt. A predicates egyetlen szablyt deklarl, amelynek a neve bennevan, kt argumentummal, amelyek kzl az els elem tpus, a msodik pedig lista tpus. E deklarci utn ragaszkodnunk kell a paramterek ilyen sorrendjhez!

84

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK Az a tny, hogy nincs goal, vagyis a programban meghatrozott clkifejezs, azt eredmnyezi, hogy egy RUN parancsra megkrdezi a clt. Ezt beadva fog csak mkdni a program. A clauses szekci tartalmazza a bennevan szablyait. Az els szabllyal nincs is semmi problma: az elem tpus, teht szimblumot tartalmaz E vltoz benne van a listban, ha az E a lista feje, akrmi is ll a lista tovbbi rszben. Ha ez teljesl, akkor mr nem kell semmi mst csinlni, ezt jelzi az, hogy elrtk a szably vgt jelz pontot. Ez egy eklatns plda az argumentumaikban kielgtett szablyokra. Aki rt mr rekurzv programot, annak a msodik szably nem klnsebben meglep: az E elem benne van a listban, ha a lista elsn kvli rszben benne van. Ezzel a lehetsges eseteket sztvlasztottuk, hiszen egy lista a lista fejbl s a lista elsnkvli elemeibl ll listbl ll. A szably nemrekurzv els sora elintzi az els esetet, a msodik, rekurzv sor pedig a msodikat. Procedurlisan gy kpzelhetjk el a program mkdst, hogy megnzi a lista els elemt, s ha az egyenl a keresett szimblummal, akkor a bennevan-sg teljesl. Ha nem, akkor keres egy jabb szablyt, ami most azt mondja ki, hogy akkor teljesl a bennevan-sg, ha a lista maradk rszre az teljesl. Teht jra kezdi a vizsglatot, mr egy rvidebb listval, s termszetesen jbl az els szablyt prblja alkalmazni. Ha valaha teljesl az egyezs, akkor visszalp a rekurzi egy magasabb szintjre, ahol most pontot tall. Ennek az a jelentse, hogy nincs tovbbi teend, teht ismt visszalp, egszen addg, amg a parancs-szintig el nem r. Itt kirja, hogy True, angolul ez igaz-at jelent. Ha a sorozatos rekurzv hvsok ltal annyira lervidl a lista, hogy mr nincs benne semmi, csak az res lista, akkor konstatlja, hogy nincs meg a keresett elem a listban, majd a rekurzv hvsokbl visszalpve azt rja a kpernyre, hogy False. Nzzk a fenti program futst: Goal:bennevan("f",["a","b","f","c"]) cllal, a TRACE bekapcsolsakor adott visszajelzsen keresztl: CALL: bennevan("f",["a","b","f","d"]) REDO: bennevan("f",["a","b","f","d"]) CALL: bennevan("f",["b","f","d"]) REDO: bennevan("f",["b","f","d"]) CALL: bennevan("f",["f","d"]) RETURN:*bennevan("f",["f","d"]) RETURN: bennevan("f",["b","f","d"]) RETURN: bennevan("f",["a","b","f","d"]) True Most egy olyan cllltsrl krdezzk a gp vlemnyt, amely szemmel lthatan kudarccal fog vgzdni: Goal:bennevan("z",["a","b","c"]) A nyomkvets eredmnye az albbi lista: CALL: bennevan("z",["a","b","c"])

85

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK REDO: bennevan("z",["a","b","c"]) CALL: bennevan("z",["b","c"]) REDO: bennevan("z",["b","c"]) CALL: bennevan("z",["c"]) REDO: bennevan("z",["c"]) CALL: bennevan("z",[]) REDO: bennevan("z",[]) FAIL: bennevan("z",[]) False 5.7.1 szlsrtk-kivlaszts (legkisebb, legnagyobb elem keresse) Ez a ttel tulajdonkppen az adathalmazbl egy minimum- vagy maximumrtk kiszmtsra ad algoritmust. a Prologban nincs ciklusutasts, ezrt egszen ms mdon kell a problmt megoldani. Az els s legegyszerbb szably az lehet, hogy az egyelem lista egyetlen eleme maga szlsrtk is: maximum([E],E). illetve minimum([E],E). Az alkalmazott E vltoz olyan tpus, amilyent a szably e helyre deklarltunk, rtket pedig akkor kap, ha a szably ilyen formja valaha teljesl. Konkrtan teht akkor, amikor olyan paramterekkel hvjuk meg a szablyt, hogy a lista az E elembl ll, s az elem (amit a msodik helyre tettnk), ugyanez az elem. A kvetkez kt-kt szably gondoskodik az sszes tovbbi esetrl. Az msodik szerint a lista E feje nem a szlsrtk, mert a lista E nlkli rsznek F maximuma vagy minimuma nagyobb vagy egyenl, illetve kisebb vagy egyenkl, mint az E. maximum([E|List],F) if maximum(List,F) and F >= E and !. illetve minimum([E|List],F) if minimum(List,F) and F <= E and !. A sorok vgn ll felkiltjelekrl mg sok sz esik, most csak nhny szt a szereprl. A ! funkci neve cut, ami vgst, elvgst jelent, s rtelme az, hogy a lehetsges megolds keresst ezen az ton mr nem engedjk meg. A harmadik szably szerint a lista feje szlsrtk, mert az E fej nlkli lista F szlsrtke kisebb illetve nagyobb, mint E. maximum([E|List],E) if maximum(List,F) and F < E. illetve minimum([E|List],E) if minimum(List,F) and F > E. Nzzk ezek utn a kt szlsrtk kiszmtst vgz programot! domains elem = symbol

86

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK lista = elem* predicates maximum(lista,elem) minimum(lista,elem) clauses maximum([E],E). maximum([E|List],F) if maximum(List,F) and F >= E and !. maximum([E|List],E) if maximum(List,F) and F <= E. minimum([E],E). minimum([E|List],F) if minimum(List,F) and F <= E and !. minimum([E|List],E) if minimum(List,F) and F > E. A teljes program kt klnbz funkcira oszlik. Fontos formai szably, hogy az sszetartoz szablyok szigoran egymst kveten helyezkedjenek el. Nagyon fontos ezen bell mg az is, hogy a szablyok milyen sorrendben kvetik egymst, hiszen a mr emltett szekvencilis vgrehajtsi md miatt az oly szokvnyos rekurzv hvsok mindig ellrl kezdik rtkelni a szablyokat. Ilyen egyszer relcik lersa esetn az eszttikus s elegns axima-felllts tnik a nyilvnvalan leghelyesebbnek. Valban, de az elegancia legtbbszr nem addik azonnal, hanem sok gondolkods gymlcse. Prologban is lehet ugyanarra a feladatra tbbfle megolds, ez ltalban a programoztl fgg. A vgeredmny elegancija viszont mr sokat sejtet a megolds jsgrl s a programoz gyakorlatrl, de fleg a kpessgrl. 5.7.2 sszegzs Egy listban elhelyezett szmsorozat sszegt kell most kiszmtanunk. Mivel itt az elemek nem akrmilyen szimblumok, hanem szmok, az elem sem symbol, hanem integer vagy real lesz. elem = integer lista= elem* A szably alakja hasonl az elzekhez: osszegzes(lista,osszeg) Maga a szably rekurzv. Els sora (a vszkijrat...) azt mondja, hogy egy egyelem lista sszege maga az elem rtke: osszegzes([E],E). A msodik szably pedig azt mondja ki, hogy egy lista sszege gy szmtand ki, hogy a lista fejnek rtkt hozzadjuk a lista farknak sszeghez:

87

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

osszegzes([Fej|Farok],Osszeg) if Osszegzes(Farok,Reszeredmeny)and Osszeg=Fej+Reszeredmeny. Deklaratv olvasata a szablynak az, hogy az sszegszmts gy teljeslhet, hogy az Osszeg a Fej s a Farokra vonatkoz rszeredmny sszege. A teljes program teht: domains elem = integer lista = elem* predicates osszegzes(lista,elem) clauses osszegzes([E],E). osszegzes([Fej|Farok],Osszeg) if osszegzes(Farok,Reszeredmeny) and Osszeg=Fej+Reszeredmeny. A program nem tartalmaz cllltst, teht a RUN parancsra egy krdst vr. Legyen ez a Goal:osszegzes([1,3,5,7],Sum) A cl most az, hogy meghatrozzuk, ez az llts milyen felttel mellett teljesl. A Prolog rendszer azt vlaszolja, hogy ez csak a Sum=16 mellett teljesl, egyben vlaszt is adva szmunkra. Ha nem vltozt, hanem konstanst, azaz egsz rtket tesznk az sszeg helyre, akkor a cllltst mskppen rtelmezi a rendszer: Goal:osszegzes([1,2,3],6) hatsra azt vizsglja, hogy igaz-e az llts, azaz tnyleg 6-e az sszeg. Mivel ezt igaznak tallja, azt rja ki, hogy True, s befejezi a program futst. Hasonlkppen rtelmezi a feladatt akkor, ha a Goal:osszegzes([1,2,3],5) cllltssal kerl szembe, de ekkor az lltst nem tudvn soha kielgteni, a vlasza False. Nem szabad viszont az els pozcira vltozt helyezni, mert a szablyokban szabad, teht nem levezethet vltozk szerepelnnek. 5.7.3 elem trlse listbl Nem tartozik a klasszikus programozsi ttelek kz, de egyike a legszksgesebb s legtanulsgosabb programoknak, gy itt kell rla beszlnnk. Az els s legfontosabb

88

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK lps meghatrozni a relci kvnt rtelmezst. Vilgos, hogy a lista egy elemt trl programnak hrom argumentuma lesz: a trlend E elem, az E elemet tartalmaz L1 lista s az E elemet sehol sem tartalmaz L2 lista. Az alkalmas relci alakja teht: torol(L1,X,L2). Szveges rtelmezse pedig az, hogy L2 minden esetben L1, elhagyva E minden elfordulst. A program tgondolsnl a legegyszerbb egy specilis esetre gondolni. Gondoljuk vgig a torol([a,b,c,b],b,L) krds megoldst, amely tipikus esete az elem trlse utn marad lista megkeressnek. A vlasz itt L=[a,c]. A program rekurzv lesz az els argumentumra nzve. Vegyk el a procedurlis gondolkodsmdunkat! Kezdjk a rekurzv rsszel. A listkra ltalnosan hasznlt rekurzv forma az [E|Lista]. Kt lehetsges eset van: az egyik, mikor az E fej-elem a trlni kvnt elem, a msik, mikor nem az. Az els esetben E-nek a Lista listbl val rekurzv trlsnek eredmnye adja a kielgt eredmnyt a krdsre. Az alkalmas szably teht: torol([E|Lista],E,Maradek]) if torol(Lista,E,Maradek). Gondolkodsmdot vltva, a szably deklaratv olvasata ez: E-nek [E|Lista]-bl val trlse Maradek, ha E-nek Lista-bl val trlsnek eredmnye Maradek. A felttel, hogy a lista feje s a trlend elem ugyanaz, a szably fejben lv E vltoz ltal biztostott, hiszen ha a szably igaznak bizonyul, akkor azonos vltoznv helyn csak azonos rtkek llhatnak. A msodik esetben, ahol a trlend elem klnbzik F-tl, azaz a lista fejtl, egyszer. A kvnt eredmny egy lista, amelynek a feje F s farka az elem rekurzv trlsnek eredmnye. A szably: torol([F|Lista],E,[F|Maradek]) if E<>F and torol(Lista,E,Maradek). A szably deklaratv olvasata: E trlse [F|Lista]-bl [F|Maradek], ha E klnbzik Ftl s E Lista-bl val trlsnek eredmnye Maradek. Az elz szabllyal ellenttben

89

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK a felttel, hogy a lista feje s a trlni kvnt elem klnbzik, explicit mdon ki van fejezve a szably trzsben, klnben az E s az F vltozk felvehetnk ugyanazt az rtket is. Az alapeset (vszkijrat...) egyrtelm. res listbl nem lehet elemet trlni, s az elvrt eredmny szintn az res lista. Ez adja az utols szablyt: torol([],_,[]). Az alhzsjel a kzps paramter helyn azt jelenti, hogy itt akrmi llhat, a szably szempontjbl kzmbs. gy lehet kivdeni a rendszer egy hibazenett, mely szerint a torol([],E,[]). szablyban az E csak egyszer szerepel, gy definilatlan. A teljes program teht: domains elem = symbol lista = elem* predicates torol(lista,elem,lista) clauses torol([E|Lista],E,Maradek]) if torol(Lista,E,Maradek). torol([F|Lista],E,[F|Maradek]) if E<>F and torol(Lista,E,Maradek). torol([],_,[]). Nzzk t jra a megrt programot, s prblkozzunk alternatv megoldsokkal. Elhagyva a msodik szablybl az E<>F felttelt, egy msik varinst kapunk a trl programunkra. Ez a varins kisebb megszortst tartalmaz, rtelmezse tgabb lesz, mint a minden elfordulst trl teljes programnak. Pldul a torol([a,b,c,b],b,[a,c]), torol([a,b,c,b],b,[a,c,b]), torol([a,b,c,b],b,[a,b,c]) mindegyike benne van a varins rtelmezsben, teht clknt megadva a ezeket, a vlasz mindig True. Mind a fenti, mind a teljes program rtelmezsi tartomnyba beletartozik az az eset, amikor a trlni kvnt elem nincs benne egyik listban sem, pldul a torol([a],b,[a]) igaz llts. Vannak esetek, amikor ez nem kvnatos.

90

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 5.7.4 sszefuttats Ez a ttel mr egy kiss bonyolultabb. Adott kt rendezett lista, ezekbl kell egy olyan listt kszteni, amely tovbbra is rendezett s tartalmazza a kt kiindul lista elemeit, az azonosakat persze csak egyszer. A program a kvetkez: domains elem = symbol lista = elem* predicates osszefut(lista,lista,lista) clauses osszefut([X|Xs],[Y|Ys],[X|Zs]) if X<Y and ! and osszefut([X|Xs],Ys,Zs). osszefut([],[],[]). osszefut(Xs,[],Xs). osszefut([],Ys,Ys). Vegyk sorra a szablyokat! osszefut([X|Xs],[Y|Ys],[X|Zs]) if X<Y and ! and osszefut([X|Xs],Ys,Zs). Vzlatosan: kt nem res lista sszefuttatst gy kapjuk meg, hogy ha az elsnek a fej-eleme kisebb, ez lesz a fej-eleme annak az eredmny-listnak, amit a Harmadik szablyunkban pontosan az trtnik, ami az elsben, csak most a kt lista szerepe felcserldtt. osszefut([],[],[]). osszefut(Xs,[],Xs). osszefut([],Ys,Ys). Az utols hrom szably "csupn" trivilis dolgokat mond. De pontosan ezek a trivialitsok vetnek vget a rekurzv hvsoknak, s kezdik visszafejteni a megoldst. A szablyok szerint az res listk sszefuttatsnak eredmnye az res lista, valamint egy res lista s egy tetszleges lista sszefuttatsnak eredmnye maga az emltett lista, akr az els, akr a msodik helyen ll is a nemres lista. 5.7.5 nikpzs, metszetkpzs Az nikpzs ttele szerint az adott kt -azonos elemeket egyenknt nem tartalmazhalmaz elemeit gy kell sszegezni, hogy az eredmnyhalmazban mindkt halmaz elemei szerepeljenek, de ne legyen benne kt azonos elem. A metszetkpzs

91

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK eredmnye a kzs elemeket egyetlen egyszer tartalmaz halmaz. A halmazokra nem tesznk ms (pl. rendezettsgi) kiktst. A kt ttel megoldsa Prologban teljesen hasonl elveken nyugszik, ezrt is vonhat ssze, mint az albbi programlista is mutatja: domains elem = symbol lista = elem* predicates bennevan(elem,lista) nincsbenne(elem,lista) unio(lista,lista,lista) metszet(lista,lista,lista) clauses bennevan(E,[E|_]). bennevan(E,[_|Lv]) if bennevan(E,Lv). nincsbenne(F,L) if not(bennevan(F,L)). unio([E|L1],L2,[E|L3]) if unio(L1,L2,L3) and nincsbenne(E,L3) and !. unio([_|L1],L2,L3) if unio(L1,L2,L3) and !. unio([],_,_). metszet([E|L1],L2,[E|L3]) if metszet(L1,L2,L3) and bennevan(E,L2) and !. metszet([_|L1],L2,L3) if metszet(Lista1,Lista2,Lista3) and !. metszet([],_,[]). Kezdjk az elemzst a bennevan szably ellenttvel, a nincsbenne szabllyal! Ennek kpzse egyszeren a not beptett fggvnnyel trtnhet. Ha teljesl a bels kifejezs, akkor hamiss vlik az rtk, mg a bels kifejezs kudarca esetn lesz kielgtve az egsz szably. Az nikpzs els s legfontosabb szablya szerint: unio([E|L1],L2,[E|L3]) if unio(L1,L2,L3) and nincsbenne(E,L3) and !. azaz az els lista E feje akkor lesz eleme az eredmnylistnak, ha van olyan L3 lista, ami az els lista maradka s az L2 lista nija rvn keletkezik, s nincs benne E az L3 listban. Az azonnali rekurzv hvs azt eredmnyezi, hogy az els lista rgtn "elfogy", gy vglis htulrl kezdi majd a kvetkez szablyok alapjn felpteni az eredmnylistt. unio([_|L1],L2,L3) if unio(L1,L2,L3) and !. Ez a szably az elz kudarca esetn lp letbe, s azt fejezi ki, hogy az els lista feje nem lehet eleme az eredmnylistnak, s az nikpzst a maradkkal kell folytatni. unio([],_,_).

92

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Itt van az a szably, ami visszafordtja az els kt szably rekurzv hvsait, mert azt mondja, hogy egy res lista s egy tetszleges lista nija egyenl ugyanazzal a listval. Az metszetkpzs az elztl csak nagyon kicsiben klnbzik. Az els szably: metszet([E|L1],L2,[E|L3]) if metszet(L1,L2,L3) and bennevan(E,L2) and !. mely szerint az E elem benne van az eredmnylistban, ha benne van a msik listban is, s az eredmnylista tovbbi rsze metszete az els lista maradknak s a msodik "rintetlen" listnak. metszet([_|L1],L2,L3) if metszet(Lista1,Lista2,Lista3) and !. A metszetkpzs szablycsoportjnak msodik sorra ugyanaz vonatkozik, mint az nikpzs megfelel sorra. metszet([],_,[]). E harmadik sornak a magyarzata is a metszetkpzs defincijra utal, hiszen egy res lista s brmi msnak a metszete csakis az res lista lehet. ppen gy, ahogyan az nikpzsnl, ennl is itt fordul vissza a rekurzv hvsok sorozata. E kt ttel egyszersge s hasonlatossga taln az Olvast is meggyzte a Prolog flnyrl ms nyelvekkel szemben a tiszta s az emberi gondolkodsmdot kvet feladatmegfogalmazsa ltal. 5.7.6 Rendezs permutlssal A listk rendezsnek logikai specifikcija az, hogy keressk a lista olyan permutcijt, amely rendezett. Ez azonnal lerhat, mint egy logikai program. Az alaprelci: rendperm(Xs|Ys) ahol Ys az Xs elemeibl ll nvekven rendezett lista: rendperm(Xs,Ys) if permutacio(Xs,Ys) and rendezett(Ys) and !. A felkiltjel (cut) letiltja a tovbbi megoldsok keresst, hiszen annak nincs rtelme. A rendezs legfels szintjt lebontottuk, a fellrl lefel halad programfejleszts szellemben. Most mr csak a permutacio s a rendezett szablyokat kell definilnunk. Annak eldntse, hogy egy lista nvekven rendezett-e, kifejezhet az albbi kt szabllyal. Az egyik kijelents szerint az egyelem lista szsgszeren rendezett. A msik szably szerint egy lista rendezett, ha az els eleme kisebb vagy egyenl mint a msodik, s a maradk lista a msodik elemtl kezdve rendezett. rendezett([_]).

93

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK rendezett([X|[Y|Ys]]) if X<=Y and rendezett([Y|Ys]). A permutlst vgz program mg rdekesebb. A permutlsi eljrs egy megoldsa az lehet, hogy vletlenszeren vlasztunk egy elemet a listbl, azt a lista elejre helyezzk, majd rekurzvan permutljuk a maradk listt. Az alapkijelents szerint az res lista egyetlen permutcija nmaga. permutacio(Xs,[Z|Zs]) if kiejt(Z,Xs,Ys) and permutacio(Ys,Zs). permutacio([],[]). A kiejt szably szerepe az, hogy a lista elejtl kezdve a vizsglatot, az els kvnt elemet kiemelve adja vissza a bemen listt. Teht ez nem azonos azzal a programmal, amely az sszes elfordulst kitrli, csak hasonlt r. Deklaratv olvassban gy hangzik: E-t kiemelhetjk az [E|Lista] listbl a Lista visszaadsval, vagy E-t kiemelhetjk az [F|Lista1]-bl, ha megadjuk az [F|Lista2] listt, ahol a Lista2 egyenl az E elemnek Lista1-bl val kiemelse eredmnyvel. rdemes most ttekinteni a teljes programot: domains elem = symbol lista= elem* predicates permutacio(lista,lista) kiejt(lista,elem,lista) rendezett(lista) rendperm(lista,lista) clauses rendperm(Xs,Ys) if permutacio(Xs,Ys) and rendezett(Ys) and !. permutacio(Xs,[Z|Zs]) if kiejt(Xs,Z,Ys) and permutacio(Ys,Zs). permutacio([],[]). kiejt([E|Lista],E,Lista). kiejt([F|Lista1],E,[F|Lista2]) if kiejt(Lista1,E,Lista2). rendezett([_]). rendezett([X|[Y|Ys]]) if X<=Y and rendezett([Y|Ys]). A permutcis rendezs sajnos nem tl szerencss megolds, mert a permutcik ellltsa csak 1/n!-al nveli a rendezettsg elrsnek valsznsgt lpsrl lpsre. A permutcik sorban "egyszer csak" felbukkan az "igazi", s ennek ugyanakkora a valsznsge, mint brmely msik permutcinak.

94

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 5.7.7 Rendezs minimumkivlasztssal A listk rendezsnek egy msik mdja, hogy az adott listbl kiemeljk a legkisebbet s az eredmnylista elejre tesszk, amelynek a "vge" mr rendezett, ugyanilyen mdon. Deklaratvan megfogalmazva ez gy hangzik, hogy egy lista akkor rendezett, ha a lista feje kisebb a rendezett rszlistban szerepl sszes elemnl. Ez utbbi megkzelts ihlette a minimumkivlasztsos rendezs megvalstst az albbi mdon: domains elem = symbol lista = elem* predicates minimum(lista,elem) kiejt(lista,elem,lista) rendmin(lista,lista) clauses minimum([E],E). minimum([E|Lista],F) if minimum(Lista,F), F<=E and !. minimum([E|Lista],E) if minimum(Lista,F) and F>E. kiejt([E|Lista],E,Lista) if !. kiejt([F|Lista1],E,[F|Lista2]) if kiejt(Lista1,E,Lista2) and !. kiejt([],_,[]). rendmin([],[]). rendmin(Lista1,[E|Lista2]) if minimum(Lista1,E) and kiejt(Lista1,E,Lista3) and rendmin(Lista3,Lista2) and !. A program trkkje az, hogy kivlasztjuk az adott Lista1 E minimumt a minimum szablyokkal, majd ezt az elemet kiejtjk a Lista1 eredeti listbl, hogy egy olyan Lista2 vgre fzhessk, amit mr lerendeztnk. A Lista3 olyan tmeneti lista, amely mr nem tartalmazza az E elemet. Az els szably szerint az res lista eleve rendezett. Az emltett kiejts az elz fejezetben emltett kiejt eljrssal trtnik. 5.7.8 Rendezs beszrssal A rendezsi feladatnak az eddiektl eltr megoldsa az lehet, hogy ha adott egy rendezett lista (s az res lista mindig adott!), akkor a kvnt E elemet gy illesztjk bele a rendezett listba, hogy azt sztvlogatjuk E-nl kisebb-egyenl s nagyobb rszekre, majd sszerakjuk a hrom rszlistt. Ennek megvalstsa a kvetkez program:
95

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

domains elem = symbol lista = elem* predicates rendbesz(lista,lista) szetval(lista,elem,lista,lista) osszerak(lista,lista,lista) clauses szetval([F|L1],E,[F|L2],L3) if F <= E and szetval(L1,E,L2,L3). szetval([F|L1],E,L2,[F|L3]) if F > E and szetval(L1,E,L2,L3). szetval([],_,[],[]). osszerak([E|L1],L2,[E|L3]) if osszerak(L1,L2,L3). osszerak([],Lista,Lista). rendbesz([E|L1],L2) if rendbesz(L1,L3) and szetval(L3,E,Lk,Ln)and osszerak(Lk,[E|Ln],L2) and !. rendbesz([],[]). Kezdjk az ismerkedst a szetval rszprogrammal, amelynek az a feladata, hogy az els paramterknt megadott [F|L1] lista F elemt elhelyezze vagy a kisebb-egyenlk kz (l.szably), vagy az F-nl nagyobbak kz (2.szably), attl fggen, hogy melyik relci teljesl. Mieltt azonban elhelyezn, egy rekurzv hvsra knyszerti nmagt, hogy az L2 s az L3 listk mr rendelkezsre lljanak. Ha az els paramter az res lista, akkor persze nincs mit tenni, kt res listt ad vissza eredmnyknt. Msik segdprogramocsknk az osszerak nev, amely szintn ravasz mdon dolgozik. Feladata az, hogy egyestsen kt listt. Az ni-kpzssel ellenttben most nem kell azt vizsglnunk, hogy ltezik-e egy elem mr a listban, mert ez megengedett. Ellenben gyelni kell a sorrendre, amit gy old meg, hogy sorozatos rekurzv hvsokkal "kirti" az els argumentumban adott listt, majd rvnybe lp a msodik 5.7.9 Gyorsrendezs (quicksort) Az egyik leghatkonyabb rendezsi algoritmus a Quicksort. Elve az, hogy egy elemet kivlasztva, kettosztjuk a listt nla kisebb s nla nagyobb elemekbl ll rszlistkra, majd ezeket rendezzk, vgl jra egyestjk a kisebbek listjt, a kiemelt elemet s a nagyobbak listjt. Mr az elve is rekurzit sejtet, gy igazn hatkonyan csak a rekurzit megenged programozsi nyelvekben valsulhat meg. Tulajdonkppen csak a f eljrs az j, azok a rszprogramok, amiket hasznl, mr ismersek a beszrsos rendezsbl. Maga a program az albbi:

96

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

domains elem = symbol lista = elem* predicates rendquick(lista,lista) szetval(lista,elem,lista,lista) osszerak(lista,lista,lista) clauses szetval([F|L1],E,[F|L2],L3) if F <= E and szetval(L1,E,L2,L3). szetval([F|L1],E,L2,[F|L3]) if F > E and szetval(L1,E,L2,L3). szetval([],_,[],[]). osszerak([E|L1],L2,[E|L3]) if osszerak(L1,L2,L3). osszerak([],Lista,Lista). rendquick([E|L1],L2) if szetval(L1,E,Kis,Nagy) and rendquick(Kis ,Kisrend) and rendquick(Nagy,Nagyrend) and osszerak(Kisrend,[E|Nagyrend],L2). rendquick([],[]). Nzzk meg ugyanennek a feladatnak a megoldst Pascalban. A Pascalban megengedett a rekurzi, ellenttben a BASIC-el ahol erre nincs lehetsg. A programlista hossza s ttekinthetsge magrt beszl. Adottnak ttelezzk fel az egszekkel feltlttt a[1..vege] tmbt. procedure quick(also,felso:integer); procedure quick1(also,felso:integer); var bal,jobb,valaszto,id : integer; begin bal:=also; jobb:=felso; valaszto:=a[(also+felso) DIV 2]; repeat while a[bal] < valaszto do bal:=bal+1; while a[jobb] > valaszto do jobb:=jobb-1; if bal<=jobb then begin id:=a[bal]; a[bal]:=a[jobb]; a[jobb]:=id; bal:=bal+1; jobb:=jobb-1 end; until bal>jobb; if also < jobb then quick1(also,jobb); if bal < felso then quick1(bal,felso); end; begin

97

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK quick1(1,vege) end;

98

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK 6.2 I8086 SSZEFOGLAL


i8086 16 bites regiszterei - ltalnos cl regiszterek ax (al,ah): akkumultor bx (bl,bh): bzis regiszter cx (cl,ch): szmll regiszter dx (dl,dh): adat regiszter - stack kezels regiszterei sp : stack pointer bp : bzis (frame) pointer - specilis regiszterek ip : utasits szmll status: sttusz s vezrl regiszter Cimzsi mdok Az i86 szegmentlt memriakpet valsit meg a modulris programozs tmogatsra. fizikai cim = szegmens * 16 + offset Hossz (FAR) cimzsnl a szegmens cimet explicite meg kell adni. Rvid (SHORT) cimzsnl a szegmens cim egy szegmens regiszter tartalma. A vonatkoz szegmens regisztert meg kell adni, vagy az rtelemszer alaprtelmezst hasznlhatjuk: vonatkoz szegmensregiszterek adatmveletek stack s BP relativ mveletek ugrsok, szubrutin hivsok blokk cl operandusok ds ss cs es Pl.: sub and stosb push mov inc call cx, kivon cx, es:valt ax dx, [bp-8] cs:valt1 rutin ;ds ;es ;es ;ss ;ss ;cs ;cs - index regiszterek si : forrs index regiszter di : cl index regiszter - szegmens regiszterek ds :adat szegmens regiszter cs :program szegmens regiszter ss :stack szegmens regiszter es :extra adat regiszter

Az offset kialakitshoz hasznlhat cimzsi mdok s pldk -memria direkt: mov BYTE PTR cim, 1 -regiszter direkt: xor ax, ax -regiszter indirekt: cmp [bx], 2 (csak si,di,bx s bp) -bzis relativ: inc [bp-6] (csak si,di,bx s bp) -indexelt: and tomb[si](csak si,di,bx s bp) -bzisrelativ indexelt: dec [bx+si+3](csak si,di,bx s bp) Utasits kszlet (real md) Az utasts alakja: cimke mnemonik cl-, forrsoperandus pl: add ax, bx -------------> ; mvelet ax = ax + bx sub dx, 1

ahol forrsoperandus lehet konstans, pl.

99

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK

Adatmozgat utastsok MOV op1, op2 op1 = op2 XCHG op1, op2 op1 s op2 felcserlse LEA reg, cim reg = cim; LDS reg, cim reg = *(cim) ; ds = *(cim+2) LES reg, cim reg = *(cim); es = *(cim+2) LAHF ah = flag-ek SAHF flag-ek = ah XLAT al = *(bx + al) Stack kezel utasitsok PUSH op SP -= 2; stack[ SP ] = op; POP op op = stack[ SP ]; SP += 2; PUSHA, POPA ltalnos, index s stack kezel regiszterek mentse s visszallitsa PUSHF, POPF flag-ek mentse visszallitsa I/O mveletek: IN al, portcim IN al, dx OUT portcim, al OUT dx, al portcim-rl beolvass *(dx)-rl beolvassa portcim-re kiirs *(dx)-re kiirs

Aritmetikai utasitsok: carry, auxiliary-carry, parity, zero, sign, overflow bitek lltsa ADD op1, op2 op1 = op1 + op2 ADC op1, op2 op1 = op1 + op2 + carry SUB op1, op2 op1 = op1 - op2; SBB op1, op2 op1 = op1 - op2 - carry; INC op op+1; DEC op op-1; NEG op op = 2-s komplemens( op ); NEG op op = 1-s komplemens( op ); CMP op1,op2 flag-ek = (op1 - op2) tulajdonsgai CBW ax = eljelkiterjeszts(al) CWD dx:ax = eljelkiterjeszts(ax) Eljel nlkli szmokra: MUL byteop ax = al * byteop MUL wordop (dx,ax) = ax * wordop DIV byteop al = ax / byteop; ah = ax % byteop; DIV wordop ax = (dx,ax)/byteop; dx = (dx,ax)%byteop; Eljeles szmokra: IMUL byteop ax = al * byteop IMUL wordop (dx,ax) = ax * wordop IDIV byteop al = ax / byteop; ah = ax % byteop; IDIV wordop ax = (dx,ax)/byteop; dx = (dx,ax)%byteop;

Logikai mveletek zero, carry, overflow flagek lltsa NOT op op = ~op; AND op1, op2 op1 = op1 & op2; OR op1, op2 op1 = op1 | op2; XOR op1, op2 op1 = op1 ^ op2; TEST op1, op2 flag-ek mint AND op1, op2 SHL op1,op2 op1 <<= op2; (eljel nlkl)

100

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


SHR op1,op2 SAL op1,op2 SAR op1,op2 op1 >>= op2; (eljel nlkl) op1 <<= op2; (eljel marad) op1 >>= op2; (eljel marad)

Ciklikus lptetsek: ROL, RCL, ROR, RCR BCD aritmetika: AAA, AAD, AAM, AAS, DAA, DAS

Blokk (string) kezel utasitsok: MOVSB (es:di)byte = (ds:si)byte; si+= dsi; di+= ddi; MOVSW (es:di)word = (ds:si)word; si+= dsi; di+= ddi; CMPSB CMP (es:di)byte, (ds:si)byte; si+= dsi; di+= ddi; CMPSW CMP (es:di)word, (ds:si)word; si+= dsi; di+= ddi; SCASB CMP al, (es:di)byte; si+= dsi; di+= ddi; SCASW CMP ax, (es:di)word; si+= dsi; di+= ddi; LODSB MOV al, (es:di)byte; si+= dsi; di+= ddi; LODSW MOV ax, (es:di)word; si+= dsi; di+= ddi; STOSB MOV (es:di)byte, al; si+= dsi; di+= ddi; STOSW MOV (es:di)word, ax; si+= dsi; di+= ddi; INSB IN (es:di)byte, dx; di+= ddi; INSW IN (es:di)word, dx; di+= ddi; OUTSB OUT dx, (ds:si)byte, dx; si+= dsi; OUTSW OUT dx, (ds:si)word, dx; si+= dsi; Vezrls tad utasitsok: JMP cim JZ, JNZ JE, JNE, JL, JG, JLE, JGE JE , JNE, JB, JA, JBE, JAE JCXZ, JNO, JS, JNS, JP, JPO

felttel nlkli ugrs Logikai mvelet utn Eljeles aritmetikai mvelet utn Eljel nlkli mveletek utn Specilis

Feltteles ugrst csak 128 byte-tal nem messzebbi cimkre lehet kiadni. Szubrutinhivs: CALL cimke CALL op RET INT vector IRET cimkn kezdd rutin meghivsa indirekt szubrutinhivs szubrutinbl visszatrs software interrupt visszatrs software s hardware interrupt rutinbl Carry flag: Direction flag: Interrupt Engedlyezs: Processzor lellits: res operci:

Processzorvezrl utastsok CLC-trls, STC-bellits, CMC-komplementls CLD-trls, STD-bellits CLI-tilts, STI-engedlyezs HLT NOP

MACRO-ASSEMBLY PROGRAMOK FELPTSE


Utasits szerkezet: [cimke:] [mnemonik [operandusok] ] Modulszerkezet kialakitshoz hasznlhat direktivk: SEGMENT - szegmens definici kezdete szegmensnv SEGMENT [igazits][kombinci]['osztlynv'] [;megjegyzs]

101

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


BYTE WORD PARA PAGE ENDS - szegmens definici vge szegmensnv ENDS END - forrs file vge END [program belpsi pont] PUBLIC STACK COMMON MEMORY AT cim

GROUP - szegmens csoportok kialakitsa csoportnv GROUP szegmensnevek felsorolsa vesszvel elvlasztva ASSUME - szegmens regiszterek tltsekor a cimek referencijnak megadsa ASSUME szegmens-regiszter: szegmensnv ORG - szegmens kezdcimnek a rgzitse ORG kezdcim

PROC - szubrutin definils kezdete szubrutin-nv PROC [tipus] NEAR FAR ENDP - szubrutin definils vge szubrutin-nv ENDP Utasitskszletet bellit direktivk: .8086 - alap utasitskszlet .8087 - +lebegpontos coprocesszor utasitsok .80286 - 286 utasitsok .80286p - 286 protected md utasitsok Adatok definilsa: Adatok szmra helyfoglals a memriban: [azonosit] tipus kezdrtkek DB ;byte felsorols DW ;sz szm DUP(kezdrtk) DD ;duplasz ? ;inicializlatlan Igy annyi memrit foglalunk le az adatok szmra, amennyi a megadott szm kezdrtk s a mret szerint szksges. Constansdeklarcik: azonosit EQU rtk

Assembler mveletei: Objektummret explicit megadsa tipus PTR kifejezs BYTE WORD DWORD FAR NEAR

102

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


Pl.: mov ax, WORD PTR adat call FAR PTR rutin Cim szegmens s offset rtknek a meghatrozsa: SEG adat OFFSET adat Pl.: mov ax, SEG adat mov ds, ax mov bx, OFFSET adat ; ds:bx -> adat Tbb file-bl ll programok: Szimblumok exportlsa(PUBLIC) s importlsa(EXTRN): PUBLIC nv EXTRN nv: elrs hasznljuk NEAR FAR Pl. FILE1: ============= EXTRN dat: FAR ; ebben a file-ban definilt nv ms file-bl ; is elrhet ; ms file-ban definilt nevet innen is ; a nv ugyanebben a szegmensmensben van ; a nv ms szegmensben van. FILE2: =============== EXTRN rutin: FAR dat DW 0 PUBLIC dat ... call rutin

PUBLIC rutin rutin PROC NEAR ... rutin ENDP ... mov ax, WORD PTR dat ... I8086 MEGSZAKITS RENDSZERE

Az i8086 vektoros megszakitsi rendszerrel rendelkezik, amely az IT rutin cimt a hw IT kiszolglsa alatt a kr egysg (illetve az i8259 IT vezrl ) ltal beadott vektor alapjn, illetve sw. IT alatt az int utasits paramtereknt tadott vektor hatrozza meg: IT rutin offset = vector * 4 IT rutin szegmens = vector * 4 + 2 A lehetsges vektorok 0..255 tartomnyban lehetnek, igy a fizikai memria els 1kb tartomnyt a IT rutinok cimeivel kell feltlteni. Egy IT-re rkapcsolds esetn az IT tbla megfelel elemt kell tirni, s az i8259 megszakitsvezrl egysgben az IT-t engedlyezni (ha idig nem volt). Ehhez az i8259 mask ( 21h I/O cim) regiszternek a IRQ szmnak megfelel bitjt kell 0-ba llitani. IBM AT IT KIOSZTSA Vektor 00 01 02 03 04 i8259 #IT Processzor exception-ok 0-val oszts exception Lpsenknti utasits vgrehajts excetion NMI - nem maszkolhat IT Trspont (breakpoint) Tulcsorduls (overflow)

Hardware IT-k

103

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


08 09 0A 0B 0C 0D 0E 0F 70 71 75 76 IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 IRQ8 IRQ9 IRQ13 IRQ14 Timer IT Klaviatra IT Slave IT kontroller COM2 IT COM1 IT Winchester controller IT Floppy controller IT Nyomtat IT Real-time ra IT LAN adapter IT Matemetikai koprocesszor IT Msodik Winchester controller IT ;i8259 bzis cim

Pl. a COM1 IT (IRQ4) engedlyezse: I8259_BAS EQU 20h cli in and out sti al, I8259_BAS+1 al, 0efh I8259_BAS+1, al

;reset 4. bit

Pl. a COM1 IT (IRQ4) tiltsa: cli in al, I8259_BAS+1 or al, 10h out I8259_BAS+1, al sti

;set 4. bit

Az IT_NUM vektorral jelzett megszakitsra sajt FUNCTION fggvnyt a kvetkez MACRO-val kapcsolhatunk: SET_IT MACRO IT_NUM, FUNCTION push ax ; regiszter ment push bx push es mov ax, 0 ; IT tbla megfelel bejegyzsnek cime es:bx mov es, ax mov bx, 4 * (IT_NUM) cli ; IT tilt mov ax, OFFSET FUNCTION ;tbla kitlts mov WORD PTR es:[bx], ax mov ax, SEG FUNCTION mov WORD PTR es:[bx+2], ax sti ; IT engedlyezs pop es ; regiszter vissza pop bx pop ax ENDM Az IT tbla egy elemnek mentse s visszallitsa, a code szegmensben lefoglalt mentsi terlet felttelezsvel: SAVE_IT MACRO IT_NUM, SAVE_AREA push ax ; regiszter ment push bx push es mov ax, 0 ; IT tbla megfelel bejegyzsnek cime es:bx mov es, ax mov bx, 4 * (IT_NUM)

104

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


mov mov mov mov pop pop pop ENDM ax, WORD WORD PTR ax, WORD WORD PTR es bx ax PTR es:[bx] cs:SAVE_AREA, ax PTR es:[bx+2] cs:SAVE_AREA[2], ax ; regiszter vissza

RESTORE_IT MACRO IT_NUM, SAVE_AREA push ax ; regiszter ment push bx push es mov ax, 0 ; IT tbla megfelel bejegyzsnek cime es:bx mov es, ax mov bx, 4 * (IT_NUM) cli ; IT tilt mov ax, WORD PTR cs:SAVE_AREA, ax mov WORD PTR es:[bx], ax mov ax, WORD PTR cs:SAVE_AREA[2], ax mov WORD PTR es:[bx+2], ax sti ; IT engedlyezs pop es ; regiszter vissza pop bx pop ax ENDM IT rutin szerkezete teljesen tvett IT esetben I8259_BAS EQU 20h ;i8259 bzis cim EOI EQU 20h ;i8259 End-of-IT karakter ITrutin: pusha push . . . mov mov . . . mov out pop popa iret ; regiszterek mentse ; szegmens regiszterek mentse ; ha hasznlunk globlis adatokat ;i8259 fel az IT vg jelzse ;regiszterek visszallitsa ;IT-bl visszatrs rutin cim a code

ds ax, adatszegmens ds, ax al, EOI I8259_BAS, al ds

IT rutin szerkezete felfztt IT esetben Felttelezzk, hogy az elmentett korbbi IT szegmensben lv oldIT cimen kerlt elmentsre. ITrutin: pusha push . . . mov mov . . . pop popa jmp

ds ax, adatszegmens ds, ax ds DWORD PTR cs:oldIT

; regiszterek mentse ; szegmens regiszterek mentse ; ha hasznlunk globlis adatokat ;regiszterek visszallitsa ;rgi IT-re ugrs ;i8259 bzis cim

Pl. a COM1 IT (IRQ4) teljes tvtele: I8259_BAS EQU 20h

105

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


COM1_IT com1it ... SAVE_IT SET_IT cli in and out sti EQU 0ch DD ? ;COM1 IT vektor ;IT vector save area

COM1_IT, com1it COM1_IT, ITrutin al, I8259_BAS+1 al, 0efh I8259_BAS+1, al ;reset 4. bit

DOS HIVSOK A DOS opercis rendszer szolgltatsai a hrom software interrupton keresztl hivhatk: int 21h - ltalnos DOS szolgltatsok int 25h - lemez szektor kzvetlen olvassa int 26h - lemezszektor kzvetlen irsa Az int 21h-n megvalsitott fontosabb funkcik: A funkci kdot a DOS az ah regiszterben vrja. getche - Klaviatra beolvass echo-val Vr amig a kezel let egy billentyt a klaviatrn, azt echo-za, s az ASCII kdot visszaadja. be: ah = 1 ki: al = ASCII kd, ha norml billenty elszr 0, majd kd, ha kiterjesztett billentykd getch - Klaviatra beolvass echo nlkl Vr amig a kezel let egy billentyt a klaviatrn, s az ASCII kdot visszaadja. be: ah = 8 ki: al = ASCII kd, ha norml billenty elszr 0, majd kd, ha kiterjesztett billentykd putch - kpernyre karakter kivitel Egy karaktert a standard outputra kivisz, be: ah = 2, dl = kiviend karakter kd ki: puts - kpernyre string kivitel Egy stringet $ vgjelig a standard outputra kivisz, be: ah = 9, ds:dx = kiviend string cime ki: exit - visszatrt a DOS-hoz Kilp az adott programbl. be: ah = 4ch, al = exit kd ki: DOS FILE KEZELS Create - file ltrehozsa: adott nvvel s attribtummal ltrehoz egy file-t, illetve a mr ltezt 0 hosszra csonkitja, s megnyitja a file-t update mveletre. A file pointer a file elejre mutat. be: ah = 3ch, ds:dx = path nv cime (string 0 vgjellel), cx = file attribtum ki: Ha sikerlt: carry = 0, ax = file handle Hiba esetn: carry = 1, ax = hiba kd Open - file megnyitsa Mr ltez file-t a megadott mveletre megnyit. A file pointer a file elejre mutat.

106

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


be: ah = 3dh, ds:dx = path nv cime (string 0 vgjellel), al = mvelet (0-olvass, 1-irs, 2-update) ki: Ha sikerlt: carry = 0, ax = file handle Hiba esetn: carry = 1, ax = hiba kd Close - file lezrsa Megnyitott file-t lezr. be: ah = 3eh, bx = file handle ki: Ha sikerlt: carry = 0 Hiba esetn: carry = 1, ax = hiba kd Read - file-bl olvass A file handle ltal megadott file-bl a file pointer ltal mutatott helyrl a bufferbe adott szm byte-t olvas. A file pointer tovbbviszi s visszaadja a tnylegesen beolvasott byte-ok szmt. be: ah = 3fh, bx = file handle, ds:dx = buffer cim, cx = byte szm ki: Ha sikerlt: carry = 0, ax = olvasott byte szm Hiba esetn: carry = 1, ax = hiba kd Write - file-bl olvass A file handle ltal megadott file-ba a file pointer ltal mutatott helyre a bufferbl adott szm byte-t ir. A file pointer-t tovbbviszi s visszaadja a tnylegesen kiirt byte-ok szmt. be: ah = 40h, bx = file handle, ds:dx = buffer cim, cx = byte szm ki: Ha sikerlt: carry = 0, ax = olvasott byte szm Hiba esetn: carry = 1, ax = hiba kd Seek - file pointer mozgatsa A file pointernek j rtket ad, referencia + 32 bites eltols formban. be: ah = 42h, bx = file handle, cx:dx = eltols, al = referencia (0-file eleje, 1-aktulis file pointer, 2file vge) ki: Ha sikerlt: carry = 0, dx:ax = j file pointer Hiba esetn: carry = 1, ax = hiba kd A lehetsges hibazenetek: 1- rvnytelen seek referencia tipus 2- nincs ilyen nev file 3- nincs ilyeb path 4- tl sok file van nyitva egyidejleg 5- tiltott hozzfrs 6- rvnytelen file handle 12- rvnytelen mvelet Lemezszektor kzvetlen olvassa int25h DOS hivssal be: al = meghajt szm, cx = egyszerre olvasand szektorok szma ds = elsnek olvasand szektor szma, ds:bx = buffer cim Lemezszektor kzvetlen irsa int26h DOS hivssal be: al = meghajt szm, cx = egyszerre irand szektorok szma ds = elsnek irand szektor szma, ds:bx = buffer cim Kperny zemmd kezel zemmd llits be: ah = 0, al = 0 - 40x25 al = 1 - 40x25 al = 2 - 80x25 BIOS hivs - int10h fekete-fehr karakteres szines karakteres fekete-fehr karakteres

107

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


al al al al = = = = 3 4 5 6 80x25 szines karakteres 320x200 pixeles szines grafikus 320x200 pixeles fekete-fehr grafikus 640x200 pixeles fekete-fehr grafikus

Egy karakter be: ah = al = bl = bh =

kivitele 14 kiirand karakter karakter szine (grafikus mdban) szvegmd

Klavitra kezels BIOS int16h hivssal: getch - Klaviatra beolvass echo nlkl Vr amig a kezel let egy billentyt a klaviatrn, s az ASCII kdot visszaadja. be: ah = 0 ki: al = ASCII kd, ha norml billenty 0, ha kiterjesztett billentykd ah = scan kd kbhit - klaviatrn billenty lets ellenrzse Ellenrzi, hogy a kezel lenyomott-e billentyt be: ah = 1 ki: zero flag = 1, ha van vrakoz karakter = 0, ha nincs vrakoz karakter ;******************************************** ; VII. Mintaprogram ;******************************************** NAME proba ;program nv .286 ;utasits kszlet direktiva ;*------------------------------------------;* KONSTANSOK ;*------------------------------------------TERMINATE EQU 04ch CR EQU 0dh ;*------------------------------------------;* MACROK ;*------------------------------------------CALLDOS MACRO FUNCTION mov ah, FUNCTION int 21h ENDM ;*------------------------------------------;* ADAT SZEGMENS ;*------------------------------------------data SEGMENT WORD PUBLIC 'DATA' ASSUME ds:data valt DW 0 ; "valt" 2 byte-s adat 0 kezdrtkkel tomb DB 10 DUP(' ') ; 10 byte-s "tomb" SPACE kezdrtkkel szoveg DB 'Hello' ; ASCII string DB 13, 0ah, '$' ; CRLF + lezr $ az int21h/9 -nek data ENDS ;*------------------------------------------;* STACK SZEGMENS ;*------------------------------------------stack SEGMENT WORD STACK 'STACK' ASSUME ss:stack DW 2048 DUP(?) ;2048 byte-os inicializlatlan stack terlet stack ENDS ;*-------------------------------------------

108

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


;* KD SZEGMENS ;*------------------------------------------code SEGMENT WORD PUBLIC 'CODE' ASSUME cs:code ;*------------------------------------------;* Szubrutin ;*------------------------------------------hello PROC NEAR push dx ;regiszter ments push ds lds dx, szoveg ;paramter tads mov ah, 09h ;DOS print string ($-ig) pop ds ;regiszter visszallits pop dx ret ;visszatrs hello ENDP ;*-------------------------------------------;* Fprogram ;*-------------------------------------------foprog: mov ax, data ;adatszegmens regiszter bellitsa mov ds, ax mov WORD PTR valt, 1 ;word vltoz elrse mov si, 0 ;ciklus egy tomb CR-kkel feltltsre CIC:mov BYTE PTR tomb[si],CR inc si cmp si,10 jl CIC call hello ;fggvny hivs CALLDOS TERMINATE ;macro hivs code ENDS ;code szegmens vge END foprog ;program belpsi pont PROGRAMBETLTS A DOS a program inditsa sorn a kvetkez feladatokat vgzi el: 1. 256 byte-os program szegmens prefix (PSP) ltrehozsa a memriban: A PSP szerkezete: offset tartalom ----------------------------0 int 20h 2 memria limit 5 call far 0ah program befejezsi cime 0eh Ctrl break rutin cime 12h Hibakezel rutin cime 2ch environment cime 50h int 21h ret 6ch file leir blokk 80 parancssor argumentumok szma ill. diszk buffer 81-0ffh parancssor parancsot kvet rsze ill. diszk buffer 2. A program adat s stack szegmensek elhelyezse a memriban a PSP utn relokci elvgzse 3. cs = ds = es = &PSP 4. ss = stack szegmens, sp = stack szegmens utols szava 5. jmp program belpsi pont Mivel az inditskor a ds nem a program adatszegmensre mutat, a programokat ltalban a kvetkez sorral kell kezdeni: MOV ax, adatszegmens

109

A PROGRAMOZS ALAPJAI S PROGRAMOZSI NYELVEK


MOV ds, ax

6.0 MELLKLET
6.1 ASCII KDTBLZAT
4.2 tblzat: az ASCII kdtblzat 000 001 010 0000 NUL DLE blank 0001 SOH DC1 ! 0010 STX DC2 0011 ETX DC3 # 0100 EDT DC4 $ 0101 ENQ NAK % 0110 ACK SYN & 0111 BEL ETB 1000 BS CAN ( 1001 HT EM ) 1010 LF SUB * 1011 VT ESC + 1100 FF FS , 1101 CR GS 1110 SO RS . 1111 SI US /

011 0 1 2 3 4 5 6 7 8 9 : ; < = > ?

100 @ A B C D E F G H I J K L M N O

101 P Q R S T U V W X Y Z [ \ ] ^ _

110 a b c d e f g h i j k l m n o

111 p q r s t u v w x y z { | } ~ DEL

7. IRODALOM
-: Dictionary of Computing, Oxford University Press, Oxford Agrdi Gbor: IBM PC gyakorlati Assembly, LSI, Budapest Agrdi Gbor, goston Gyrgy: Assembly, LSI, Budapest Angszter Erzsbet: Programozs tanknyv I s II, GDF, Budapest Aszals Jnos, Erki Irn: Bevezets a strukturlt programozsba, Szmok, Budapest Cserny Lszl: Mikroszmtgpek, LSI, Budapest Dujmovi Jozo: Programski jezici i metode programiranja, Nauna Knjiga, Sarajevo Kovaevi Vladimir: Programska podrka raunarskih sistema

110

Vous aimerez peut-être aussi