assembly prpgramozás

Upload: nagyond

Post on 13-Oct-2015

45 views

Category:

Documents


1 download

DESCRIPTION

Hungarian assembly textbook

TRANSCRIPT

  • Assembly Programozs

    Rodek Lajos Dis Gbor

  • Tartalomjegyzk

    brk jegyzke Tblzatok jegyzke Elosz

    Ajnlott irodalom 1. Az Assembly nyelv jelentosge 12. A PC-k hardvernek felptse 4

    3. Szmrendszerek, gpi adatbrzols 7

    4. A 8086-os processzor jellemzoi 134.1. Memriakezels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.2. Regiszterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3. Adattpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.4. Memriahivatkozsok, cmzsi mdok . . . . . . . . . . . . . . . . . . . . . 18

    4.4.1. Kzvetlen cmzs . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.4.2. Bziscmzs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.4.3. Indexcmzs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.4.4. Bzis+relatv cmzs . . . . . . . . . . . . . . . . . . . . . . . . . 184.4.5. Index+relatv cmzs . . . . . . . . . . . . . . . . . . . . . . . . . 184.4.6. Bzis+index cmzs . . . . . . . . . . . . . . . . . . . . . . . . . . 184.4.7. Bzis+index+relatv cmzs . . . . . . . . . . . . . . . . . . . . . 18

    4.5. Veremkezels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.6. I/O, megszakts-rendszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    5. Az Assembly nyelv szerkezete, szintaxisa 24

    6. A 8086-os processzor utastskszlete 296.1. Prefixek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    6.1.1. Szegmensfellbrl prefixek . . . . . . . . . . . . . . . . . . . . . 296.1.2. Buszlezr prefix . . . . . . . . . . . . . . . . . . . . . . . . . . . 306.1.3. Sztringutastst ismtlo prefixek . . . . . . . . . . . . . . . . . . . 30

    6.2. Utastsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

  • TARTALOMJEGYZK

    6.2.1. Adatmozgat utastsok . . . . . . . . . . . . . . . . . . . . . . . . 306.2.2. Egsz szmos aritmetika . . . . . . . . . . . . . . . . . . . . . . . 316.2.3. Bitenknti logikai utastsok . . . . . . . . . . . . . . . . . . . . . 316.2.4. Bitlpteto utastsok . . . . . . . . . . . . . . . . . . . . . . . . . . 326.2.5. Sztringkezelo utastsok . . . . . . . . . . . . . . . . . . . . . . . 326.2.6. BCD aritmetika . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326.2.7. Vezrlstad utastsok . . . . . . . . . . . . . . . . . . . . . . . 326.2.8. Rendszervezrlo utastsok . . . . . . . . . . . . . . . . . . . . . . 336.2.9. Koprocesszor-vezrlo utastsok . . . . . . . . . . . . . . . . . . . 336.2.10. Specilis utastsok . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    7. Assembly programok ksztse 35

    8. Vezrlsi szerkezetek megvalstsa 378.1. Szekvencilis vezrlsi szerkezet . . . . . . . . . . . . . . . . . . . . . . . . 378.2. Szmllsos ismtlses vezrls . . . . . . . . . . . . . . . . . . . . . . . . 408.3. Szelekcis vezrls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438.4. Eljrsvezrls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    9. A Turbo Debugger hasznlata 52

    10. Szmols elojeles szmokkal 5610.1. Matematikai kifejezsek kirtkelse . . . . . . . . . . . . . . . . . . . . . . 5610.2. BCD aritmetika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6010.3. Bitforgat utastsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6210.4. Bitmanipull utastsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    11. Az Assembly s a magas szintu nyelvek 6711.1. Paramterek tadsa regisztereken keresztl . . . . . . . . . . . . . . . . . . 6711.2. Paramterek tadsa globlisan . . . . . . . . . . . . . . . . . . . . . . . . . 6911.3. Paramterek tadsa a vermen keresztl . . . . . . . . . . . . . . . . . . . . 7011.4. Loklis vltozk megvalstsa . . . . . . . . . . . . . . . . . . . . . . . . . 73

    12. Muveletek sztringekkel 75

    13. Az .EXE s a .COM programok, a PSP 8113.1. A DOS memriakezelse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8113.2. ltalban egy programrl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8213.3. Ahogy a DOS indtja a programokat . . . . . . . . . . . . . . . . . . . . . . 8413.4. .COM llomnyok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8513.5. Relokci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8613.6. .EXE llomnyok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

    14. Szoftver-megszaktsok 9014.1. Szvegkirats, billentyuzet-kezels . . . . . . . . . . . . . . . . . . . . . . 9114.2. Szveges kpernyo kezelse . . . . . . . . . . . . . . . . . . . . . . . . . . 9214.3. Munka llomnyokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9614.4. Grafikus funkcik hasznlata . . . . . . . . . . . . . . . . . . . . . . . . . . 99

  • TARTALOMJEGYZK

    15. Hardver-megszaktsok, rezidens program 10215.1. Szoftver-megszakts tirnytsa . . . . . . . . . . . . . . . . . . . . . . . . 10315.2. Az idozto (timer) programozsa . . . . . . . . . . . . . . . . . . . . . . . . 10715.3. Rezidens program ksztse . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    16. Kivtelek 114

    A. tvlts klnfle szmrendszerek kztt 116B. Karakter kdtblzatok 120

    Trgymutat 125

    Irodalomjegyzk 130

  • brk jegyzke

    2.1. A PC-k felptse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    3.1. A NOT muvelet igazsgtblja . . . . . . . . . . . . . . . . . . . . . . . . . 83.2. Az AND muvelet igazsgtblja . . . . . . . . . . . . . . . . . . . . . . . . 83.3. Az OR muvelet igazsgtblja . . . . . . . . . . . . . . . . . . . . . . . . . 83.4. A XOR muvelet igazsgtblja . . . . . . . . . . . . . . . . . . . . . . . . . 94.1. Az AX regiszter szerkezete . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.2. A Flags regiszter szerkezete . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    9.1. A Turbo Debugger kpernyoje . . . . . . . . . . . . . . . . . . . . . . . . . 54

  • Tblzatok jegyzke

    8.1. Elojeles aritmetikai feltteles ugrsok . . . . . . . . . . . . . . . . . . . . . 458.2. Elojeltelen aritmetikai feltteles ugrsok . . . . . . . . . . . . . . . . . . . . 458.3. Specilis feltteles ugrsok . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    14.1. Gyakran hasznlt szoftver-megszaktsok . . . . . . . . . . . . . . . . . . . 9114.2. llomny- s lemezkezelo DOS-szolgltatsok . . . . . . . . . . . . . . . . 9814.3. Standard I/O eszkzk handle rtke . . . . . . . . . . . . . . . . . . . . . . 9814.4. Sznkdok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    16.1. A 8086-os processzoron ltezo kivtelek . . . . . . . . . . . . . . . . . . . . 115

    A.1. tvlts a 2-es, 8-as, 10-es s 16-os szmrendszerek kztt . . . . . . . . . . 116B.1. ASCII s EBCDIC vezrlokdok . . . . . . . . . . . . . . . . . . . . . . . . 120B.2. ASCII s EBCDIC karakterkdok . . . . . . . . . . . . . . . . . . . . . . . 121

  • Elosz

    Valami . . .

  • Ajnlott irodalomA kvetkezo lista tartalmazza azon muvek adatait, amelyek elolvassa elosegt(het)i a jegy-

    zet knnyebb megrtst:

    1. Petho dm: Assembly alapismeretek 1. ktet, Szmalk, Budapest, 19922. Peter Norton John Socha: Az IBM PC Assembly nyelvu programozsa, Novotrade, Bu-

    dapest, 1991

    3. Peter Norton: Az IBM PC programozsa, Muszaki Knyvkiad, Budapest, 1992

    4. Lszl Jzsef: A VGA-krtya programozsa Pascal s Assembly nyelven, ComputerBo-oks, Budapest, 1994

    5. Abonyi Zsolt: PC hardver kziknyv

    6. Dr. Kovcs Magda: 32 bites mikroprocesszorok 80386/80486 I. s II. ktet, LSI, Budapest

    Az (1), (2) s (3) knyvek a kezdoknek, az Assemblyvel most ismerkedoknek valk.A (4) s (5) knyvek a hardverrel foglalkoznak, az Assemblyt ezekbol nem fogjuk megta-

    nulni.Vgl a (6) egy referenciaknyv, gy ezt foleg az Assemblyben mr jrtas, de mlyebb

    ismeretekre vgyknak ajnljuk.

  • 1. fejezet

    Az Assembly nyelv tulajdonsgai,jelentosge

    A szmtgpes problmamegolds sorn a kituztt clt megvalst algoritmust mindig va-lamilyen programozsi nyelven (programming language) rjuk, kdoljuk le. A nyelvet sokszoraz adott feladat alapjn vlasztjuk meg, mg mskor aszerint dntnk egy adott nyelv mellett,hogy az hozznk, az emberi gondolkodshoz mennyire ll kzel. Ez utbbi tulajdonsg alapjncsoportosthatk a szmtgpes programozsi nyelvek: megklnbztetnk alacsony szintu(low-level) s magas szintu programozsi nyelveket (high-level programming language). Azelobbire j pldk az Assembly s rszben a C, az utbbira pedig a Pascal ill. a BASIC nyelvek.Ha a nyelvek szolgltatsait tekintjk, akkor szembetlo, hogy ahogy egyre fentebb haladunkaz alacsony szintu nyelvektol a magas szintuek fel, gy egyre nagyobb szabadsggal, egyreltalnosabb megoldsokkal tallkozunk.

    Az Assembly teht egy alacsony szintu programozsi nyelv, mghozz nagyon alacsonyszintu, ebbol kvetkezoen pedig sokkal kzelebb ll a hardverhez, mint brmely ms nyelv.Fobb jellemzoi:

    nagyon egyszeru, elemi muveletek

    tpustalansg

    rgztett utastskszlet

    vilgos, egyszeru szintaxis

    kevs vezrlsi szerkezet

    nagyon kevs adattpus; ha tbb is van, akkor ltalban egymsbl szrmaztathatk vala-hogyan

    De mirt is van szksg az Assemblyre, ha egyszer ott van a tbbi nyelv, amikben jvalknyelmesebben programozhatunk? Erre egyik indok, hogy a magas szintu nyelvek eljrsai,fggvnyei sokszor ltalnosra lettek megrva, gy teljesen feleslegesen foglalkoznak olyan dol-gokkal, amikre esetleg soha sem lesz szksgnk. Erre j pldk lehetnek a Borland Pascal/Cgrafikus eljrsai, valamint ki-/bemeneti (I/O) szolgltatsai. Krt rajzolhatunk a Circle elj-rssal is, de ennl gyorsabb megoldst kapunk, ha vesszk a fradsgot, s mi magunk runk

  • 2egy olyan krrajzolt, ami semmi mst nem csinl, csak ami a feladata: helyesen kirajzolja akrt a kpernyore, de nem foglalkozik pl. hibaellenorzssel, a kpernyo szln kvlre kerlopontok kiszursvel stb. Hasonl a helyzet a fjlkezelssel is. Ha nem akarunk specilis tpuso-kat (mondjuk objektumokat, rekordokat) llomnyba rni, mindssze valahny bjtot szeretnnkbeolvasni vagy kirni a lemezre, akkor felesleges a fenti nyelvek rutinjait hasznlni. Mindktfeladat megoldhat Assemblyben is, mghozz hatkonyabban, mint a msik kt nyelvben.

    Akkor mirt hasznljk mgis tbben a C-t, mint az Assemblyt? A vlaszt nem nehz meg-adni: magasabb szintu nyelvekben a legtbb problma gyorsabban lerhat, a forrs rvidebb,strukturltabb, s ezltal ttekinthetobb lesz, knnyebb lesz a ksobbiekben a program karbantar-tsa, s ez nem csak a program szerzojre vonatkozik. Mgsem mellozhetjk az Assemblyt, sokdolgot ugyanis vagy nagyon nehz, vagy egyszeruen kptelensg megcsinlni ms nyelvekben,mg Assemblyben nmi energia befektetse rn ezek is megoldhatk. Aki Assemblyben akarprogramozni, annak nagyon elszntnak, trelmesnek, kitartnak kell lennie. A hibalehetosgekugyanis sokkal gyakoribbak itt, s egy-egy ilyen baki megkeresse sokszor van olyan nehz,mint egy msik program megrsa.

    Rgen, mikor mg nem voltak modern programozsi nyelvek, fordtprogramok, akkor iskellett valahogy dolgozni az embereknek. Ez egy gpi kdnak (machine code) nevezett nyel-ven trtnt. A gpi kd a processzor sajt nyelve, csak s kizrlag ezt rti meg. Ez volt ma fraszt dolog! A gpi kd ugyanis nem ms, mint egy raks szm egyms utn rva. Aki-nek ebben kellett programozni, annak fejbol tudnia kellett az sszes utasts sszes lehetsgesvltozatt, ismernie kellett a rendszert teljes mrtkben. Ha egy kvlll rtekintett egy gpikd programra, akkor annak mukdsbol, jelentsbol jobbra semmit sem rtett meg. Nz-znk egy pldt: 0B8h 34h 12h // 0F7h 26h 78h 56h // 0A3h 78h 56h, ahol a dupla trtvonalaz utastshatrt jelzi. Ez a tz hexadecimlis (tizenhatos szmrendszerbeli) szm nem mond tlsokat elso rnzsre. ppen ezrt kidolgoztak egy olyan jellsrendszert, nyelvet, amiben em-berileg emsztheto formban lerhat brmely gpi kd program. Ebben a nyelvben a hasonlfolyamatot vgrehajt gpi kd utastsok csoportjt egyetlen szval, az .n. mnemonikkal(mnemonic) azonostjk. Termszetesen van olyan mnemonik is, ami egyetlen egy utastsravonatkozik. Ez a nyelv lett az Assembly. Ebben az j jellsrendszerben a fenti programrszleta kvetkezo formt lti:

    MOV AX,1234h ;0B8h 34h 12hMUL WORD PTR [5678h] ;0F7h 26h 78h 56hMOV [5678h],AX ;0A3h 78h 56h

    Nmi magyarzat a programhoz:

    az elso sor egy szmot (1234h) rak be az AX regiszterbe, amit most tekinthetnk mondjukegy specilis vltoznak

    a msodik sor a fenti rtket megszorozza a memria egy adott cmn (5678h) tallhatrtkkel

    a harmadik sor az eredmnyt berakja az elobbi memriarekeszbe a pontosvesszo utni rsz csak megjegyzs az elso oszlop tartalmazza a mnemonikot

    a memriahivatkozsokat szgletes zrjelek ( [ s ] ) kz rjuk

  • 3Teht a fenti hrom sor egy vltoz tartalmt megszorozza az 1234h szmmal, s az ered-mnyt visszarakja az elobbi vltozba.

    Mik az Assembly elonyei?

    korltlan hozzfrsnk van a teljes hardverhez, belertve az sszes perifrit (billentyu-zet, nyomtat stb.)

    pontosan ellenorizhetjk, hogy a gp tnyleg azt teszi-e, amit elvrunk tole ha szksges, akkor minimalizlhatjuk a program mrett s/vagy sebessgt is (ez az

    .n. optimalizls)Most lssuk a htrnyait:

    a forrs sokszor ttekinthetetlen mg a szerzonek is

    a kdols nagy figyelmet, trelmet, s foleg idot ignyel

    sok a hibalehetosg

    a hardver alapos ismerete elengedhetetlen

    a forrs nem hordozhat (nem portolhat), azaz ms alapokra plo szmtgpre trsnlkl nem viheto t (ez persze igaz a gpi kdra is)

    Br gy tunhet, tbb htrnya van mint elonye, mgis rdemes alkalmazni az Assemblyt ott,ahol ms eszkz nem segt. A befektetett erofesztsek pedig meg fognak trlni.

  • 2. fejezet

    A PC-k hardvernek felptse

    Az IBM PC-k felptst szemllteti a 2.1. bra elgg leegyszerustve:

    KRELEMMEGSZAKTS-

    ADAT

    PORTOK

    TEREK

    REGISZ-

    CM

    MEMRIA

    CPU

    PERIFRIK

    2.1. bra. A PC-k felptse

    Az elso IBM PC az Intel 8086-os mikroprocesszorval jelent meg, s hamarosan kvetteaz IBM PC XT, ami mr Intel 8088-os maggal ketyegett. Ksobb beksznttt az AT-k ido-szaka, s vele jttek jabb processzorok is: Intel 80286, 80386 (SX s DX), 80486 (SX, DX,DX2 s DX4), majd eljtt az 586-os s 686-os gpek vilga (Pentium, Pentium Pro, Pentium IIstb.) Nem csak az Intel gyrt processzorokat PC-kbe, de az sszes tbbi gyrt termkre jel-lemzo, hogy (elvileg) 100%-osan kompatibilis az Intel gyrtmnyokkal, azaz ami fut Intel-en,az ugyangy elfut a msik procin is, s viszont. Az sszes ksobbi processzor alapja tulajdon-kppen a 8086-os volt, ppen ezrt mondjk azt, hogy a processzorok ezen csaldja az Intel

  • 580x86-os (rviden x86-os) architektrjra pl.A tovbbiakban kizrlag az Intel 8086/8088-os processzorok ltal biztostott programozsi

    krnyezetet vizsgljuk. (A kt proci majdnem teljesen megegyezik, a klnbsg mindssze azadatbuszuk szlessge: a 8086 16 bites, mg a 8088-as 8 bites klso adatbusszal rendelkezik.)

    A 2.1. brn a CPU jelli a processzort (Central Processing Unit kzponti feldolgoz egy-sg). Mint neve is mutatja, o a gp agya, de persze gondolkodni nem tud, csak vgrehajtja, amitparancsba adtak neki. A CPU-n tbbek kztt tallhat nhny klnleges, kzvetlenl elrhetotrolhely. Ezeket regisztereknek (register) nevezzk. A processzor mukds kzbeni jrain-dtst resetnek hvjuk. (Az angol reset sz egyik magyar jelentse az utnllt, bellt, dea szmtstechnikban ltalban jraindtsknt fordtjk.) Reset esetn a processzor egy jlmeghatrozott llapotba kerl (pl. minden regiszterbe valamilyen rgztett rtk lesz betltve).A szmtgp bekapcsolsakor is lezajlik a reset. Az jraindts egy finomabb fajtja az inicia-lizls vagy rviden init (initialization, init). Az init sorn nhny regiszter rtke megorzsrekerl, a reset-tol eltroen.

    A memria adja a szmtgp emlkezett. Hasonlan az emberi memrihoz, van nekifelejto (az informcit csak bizonyos ideig megorzo) s emlkezo vltozata. Az elobbi neveRAM (Random Access Memory vletlen hozzfrsu memria), mg az utbbi ROM (ReadOnly Memory csak olvashat memria). A ROM fontos rszt kpezi az .n. BIOS (BasicInput/Output System alapveto ki-/bemeneti rendszer). A gp bekapcsolsa (s reset) utn aBIOS-ban levo egyik fontos program indul el eloszr (pontosabban minden processzort gyterveznek, hogy a BIOS-t kezdje el vgrehajtani ilyenkor). Ez leellenorzi a hardverelemeket,teszteli a memrit, megkeresi a jelenlevo perifrikat, majd elindtja az opercis rendszert, halehet. A BIOS ezenkvl sok hasznos rutint tartalmaz, amikkel vezrelhetjk pldul a billen-tyuzetet, videokrtyt, merevlemezt stb.

    Busznak (bus) nevezzk vezetkek egy csoportjt, amik bizonyos specilis clt szolgl-nak, s a CPU-t ktik ssze a szmtgp tbbi fontos rszvel. Megklnbztetnk adat-, cm-ill. vezrlobuszt (data bus, address bus, control bus). A cmbusz szlessge (amit bitekben ill. avezetkek szmban mrnk) hatrozza meg a megcmezheto memria maximlis nagysgt.

    A CPU a perifrikkal (pl. hangkrtya, videovezrlo, DMA-vezrlo, nyomtat stb.) az.n. portokon keresztl kommunikl. (Tekinthetjk oket egyfajta tjrnak is.) Ezeket egyszm azonostja, de ne gy kpzeljk el, hogy annyi vezetk van bektve, ahny port van.Egyszeruen, ha egy eszkzt el akar rni a CPU, akkor kirja a cmbuszra a port szmt, s haott van eszkz (teht egy eszkz arra van belltva, hogy erre a portszmra reagljon), akkoraz vlaszol neki, s a kommunikci megkezdodik.

    Azonban nem csak a CPU szlhat valamelyik eszkzhz, de azok is jelezhetik, hogy valamimondanivaljuk van. Erre szolgl a megszakts-rendszer (interrupt system). Ha a CPU rz-kel egy megszakts-krelmet (IRQ Interrupt ReQuest), akkor abbahagyja az ppen aktulismunkjt, s kiszolglja az adott eszkzt. A megszaktsok eloszr a megszakts-vezrlohz(interrupt controller) futnak be, s csak onnan mennek tovbb a processzorhoz. Az XT-k 8,az AT-k 16 db. fggetlen megszakts-vonallal rendelkeznek, azaz ennyi perifrinak van le-hetosge a megszakts-krsre. Ha egy perifria hasznl egy megszakts-vonalat, akkor aztkizrlagosan birtokolja, teht ms eszkz nem krhet megszaktst ugyanazon a vonalon.

    A fentebb felsorolt rendszerelemek (CPU, memria, megszakts-vezrlo, buszok stb.) smg sok minden ms egyetlen ramkri egysgen, az .n. alaplapon (motherboard) tallhat.

    Van mg hrom fontos eszkz, amikrol rdemes szt ejteni. Ezek az rajel-genertor, azidozto s a DMA-vezrlo.

    A CPU s a perifrik mukdst szablyos idokznknt megjeleno elektromos impul-zusok vezrlik. Ezeket nevezik rajelnek (clock, clocktick), msodpercenknti darabszmuk

  • 6mrtkegysge a Hertz (Hz). gy egy 4.77 MHz-es rajel msodpercenknt 4770000 impulzustjelent. Az rajelet egy kvarckristlyon alapul rajel-genertor (clock generator) lltja elo.

    A RAM memrik minden egyes memriarekeszt folyamatosan ki kell olvasni s visszakell rni msodpercenknt tbbszr is, klnben tnyleg felejtov vlna. Erre a frisstsnek(memory refresh) nevezett muveletre felptsk miatt van szksg. (A korrektsg kedvrt: ezcsak az .n. dinamikus RAM-okra, avagy DRAM-okra igaz.) A muveletet pontos idokznkntkell vgrehajtani, ezt pedig egy klnleges egysg, az idozto (timer) intzi el. Ennek egyikdolga az, hogy kb. 15.09 s-onknt elindtsa a frisstst (ez nagyjbl 66287 db. frisstst jelentmsodpercenknt). Ezenkvl a rendszerrt (system clock) is ez a szerkezet szinkronizlja.

    A memria elrse a CPU-n keresztl igen lass tud lenni, radsul erre az idore a pro-cesszor nem tud mssal foglalkozni. E clbl bevezettk a kzvetlen memria-hozzfrs(DMA Direct Memory Access) mdszert. Ez gy mukdik, hogy ha egy perifrinak szk-sge van valamilyen adatra a memribl, vagy szeretne valamit berni oda, akkor nem a CPU-nak szl, hanem a DMA-vezrlonek (DMA controller), s az a processzort kikerlve elintzi akrst.

  • 3. fejezet

    Szmrendszerek, gpiadatbrzols, aritmetika s logika

    Az emberek ltalban tzes (decimlis decimal) szmrendszerben szmolnak a minden-napjaik sorn, hiszen ezt tantottk nekik, s ez az elfogadott konvenci a vilgon. A processzortazonban (de a tbbi hardversszetevot, pl. a memrit is) feleslegesen tlbonyoltan, ha nekiis ezekkel a szmokkal kellene dolgoznia. Ennl jval egyszerubb s kzenfekvo megolds, hakettes alap (binris binary) szmrendszerben kezel minden adatot. Az informci alapegy-sge gy a binris szmjegy, a bit (BInary digiT) lesz, ezek pedig a 0 s az 1. Binris szmokbrzolsakor ugyangy helyirtkes felrst hasznlunk, mint a decimlis szmok esetn. Pl. a10011101 binris szmnak 128+ 16+ 8+ 4+ 1 = 157 az rtke. Az egyes helyirtkek jobbrlbalra 2-nek egyms utn kvetkezo hatvnyai, teht 1, 2, 4, 8, 16, 32 stb. Ha sokszor dolgozunkbinris szmokkal, akkor nem rt, ha a hatvnyokat fejbol tudjuk a 0-diktl a 16-odikig.

    Egy-egy arnylag kicsi szm binris lershoz sok 0-t s 1-et kell egyms mell raknunk, ezpedig nha fraszt. Ezt kikszblendo a szmokat sokszor rjuk tizenhatos alap (hexadecimlis hexadecimal) szmrendszerben. Itt a szmjegyek a megszokott 10 arab szmjegy, plusz az angol(latin) bc elso hat betuje (A, B, C, D, E, F), tovbb A = 10, B = 11 stb. Mivel 16 = 24,ezrt ngy binris szmjegy ppen egy hexadecimlis (rviden hexa) szmjegyet tesz ki. Azelozo plda alapjn 10011101b = 9Dh = 157d. Ahhoz, hogy mindig tudjuk, a lert szmot mi-lyen alap rendszerben kell rtelmezni, a szm utn runk egy b, h vagy d betut. Ha nemjelljk kln, akkor ltalban a tzes szmrendszert hasznljuk. Szoks mg nha a nyolcasalap (oktlis octal) felrst is alkalmazni. Ekkor a 0 7 szmjegyeket hasznljuk, s 3 binrisjegy tesz ki egy oktlis szmjegyet. Az oktlis szmok vgre o betut runk.

    Most eleventsk fel a legegyszerubb, kzismert logikai muveleteket. Ezek ugyanis fontosszerepet jtszanak mind a programozs, mind a processzor szempontjbl. A kt logikai igazs-grtket itt most binris szmjegyek fogjk jellni. Megszokott dolog, hogy 1 jelenti az igazrtket.

    A negci (tagads negation) egyvltozs (unris) muvelet, eredmnye a bemeneti igaz-sgrtk ellentettje. A muveletet jellje NOT az angol tagads mintjra. Hatsa a 3.1. brnlthat.

    A konjunkci (S) mr ktvltozs (binris) muvelet. Jele AND (az s angolul), ered-mnyt a 3.2. bra szemllteti:

  • 8NOT0 11 0

    3.1. bra. A NOT muvelet igazsgtblja

    AND 0 10 0 01 0 1

    3.2. bra. Az AND muvelet igazsgtblja

    A diszjunkci (VAGY) szintn binris muvelet. Jele OR (a vagy angolul), s a ktvltozn MEGENGED O VAGY muveletet hajt vgre. Igazsgtblja a 3.3. brn lthat.

    OR 0 10 0 11 1 1

    3.3. bra. Az OR muvelet igazsgtblja

    Utols muveletnk az antivalencia (KIZR VAGY, az ekvivalencia tagadsa). Jele azXOR (eXclusive OR), hatsa a 3.4. brn kvetheto.

    A legtbb processzor kizrlag egsz szmokkal tud szmolni, esetleg megenged racionlis(vals) rtkeket is. Az brzolhat szmok tartomnya mindkt esetben vges, ezt ugyanisa processzor regisztereinek bitszlessge hatrozza meg. A szmtstechnikban a legkisebbbrzolhat informcit a bit kpviseli, de mindenhol az ennl nagyobb, egszen pontosan 8 db.bitbol ll bjtot (byte) hasznljk az adatok alapegysgeknt, s pl. a regiszterek s az adatbuszszlessge is ennek tbbszrse. Szoks mg ms, a bjt fogalmra plo mrtkegysget ishasznlni, ilyen a sz (word; ltalban 2 vagy 4 bjt), a duplasz (doubleword; a sz mretnekktszerese) s a kvadrasz (quadword; kt duplasz mretu). A bjt als ill. felso felnek (4bitjnek) neve nibble (ez egy angol kifejezs, s nincs magyar megfeleloje). gy beszlhetnkals s felso nibble-rol. A bjtban a biteket a lers szerint jobbrl balra 0-tl kezdve szmozzk,s egy bjtot kt hexadecimlis szmjeggyel lehet lerni.

    A szmtstechnikban a kilo- (k, K) s mega- (M) elottszavak a megszokott 1000 s1000000 helyett 1024-et (= 210) ill. 1048576-ot (= 220) jelentenek. A giga- (G), tera- (T),peta- (P) s exa- (E) hasonlan 230-t, 240-t, 250-t ill. 260-t jelentenek.

    Fontos szlni egy fogalomrl, az .n. endianizmusrl (endianism). Ez azt a problmt je-lenti, hogy nincs egyrtelmuen rgztve a tbb bjt hossz adatok brzolsa sorn az egyesbjtok memriabeli sorrendje. Kt logikus verzi ltezik: a legkevsb rtkes bjttal kezdnk,s a memriacm nvekedsvel sorban haladunk a legrtkesebb bjt fel (little-endian t-rols), ill. ennek a fordtottja, teht a legrtkesebbtol haladunk a legkevsb rtkes bjt fel(big-endian trols). Mindkt megoldsra tallhatunk pldkat a klnbzo hardvereken.

    Nzzk meg, hogy brzoljuk az egsz szmokat. Eloszr ttelezzk fel, hogy csak nemne-gatv (elojeltelen unsigned) szmaink vannak, s 1 bjtot hasznlunk a felrshoz. Nyolc biten0 s 255 (= 28 1) kztt brmilyen szm felrhat, ezrt az ilyen szmokkal nincs gond.

  • 9XOR 0 10 0 11 1 0

    3.4. bra. A XOR muvelet igazsgtblja

    Ha negatv szmokat is szeretnnk hasznlni, akkor kt lehetosg addik:

    csak negatv szmokat brzolunk

    az brzolsi tartomnyt kiterjesztjk a nemnegatv szmokra isEz utbbi mdszert szoktk vlasztani, s a tartomnyt praktikus mdon gy hatrozzk meg,hogy a pozitv s negatv szmok nagyjbl azonos mennyisgben legyenek. Ez esetnkben aztjelenti, hogy 128-tl +127-ig tudunk szmokat felrni (belertve a 0-t is). De hogy klnbz-tessk meg a negatv szmokat a pozitvaktl? Termszetesen az elojel (sign) ltal. Mivel ennekkt rtke lehet (ha a nullt pozitvnak tekintjk), trolsra elg egyetlen bit. Ez a kitntetettbit az elojelbit (sign bit), s megegyezs szerint az adat legrtkesebb (most significant), azazlegfelso bitjn helyezkedik el. Ha rtke 0, akkor a tekintett elojeles (signed) szm pozitv (vagynulla), 1 esetn pedig negatv. A fennmarad biteken (esetnkben az als 7 bit) pedig troljukmagt a szmot elojele nlkl. Megtehetnnk, hogy azonos mdon kezeljk a pozitv s negatvszmokat is, de knyelmi szempontok s a matematikai muveleti tulajdonsgok fenntartsa v-gett a negatv szmok ms alakban kerlnek lersra. Ez az alak az .n. kettes komplemens (2scomplement). Ennek kiszmtsa majdnem trivilis, egyszeruen ki kell vonni a szmot a 0-bl.(Ehhez persze ismerni kell a kivons szablyait, amiket albb ismertetnk.) Egy msik md-szerhez vezessk be az egyes komplemens (1s complement) fogalmt is. Ezt gy kpezzkbrmilyen rtku bjt (sz stb.) esetn, hogy annak minden egyes bitjt negljuk (invertljuk).Ha vesszk egy tetszoleges szm egyes komplemenst, majd ahhoz hozzadunk 1-et (az sszea-dst az albbiak szerint elvgezve), akkor pont az adott szm kettes komplemenst kapjuk meg.Egy szm kettes komplemensnek kettes komplemense a kiindul szmot adja vissza. Ilyenmdon a kettes komplemens kpzse ekvivalens a szm 1-szeresnek meghatrozsval.

    Egy pldn illusztrlva: legyenek az brzoland szmok 0, 1, 2, 127, 128, 255, 1, 2,127 s 128. A szmok lersa ekkor gy trtnik:

    0 (elojeltelen vagy elojeles pozitv) = 00000000b 1 (elojeltelen vagy elojeles pozitv) = 00000001b 2 (elojeltelen vagy elojeles pozitv) = 00000010b 127 (elojeltelen vagy elojeles pozitv) = 01111111b 128 (elojeltelen) = 10000000b 255 (elojeltelen) = 11111111b 1 (elojeles negatv) = 11111111b 2 (elojeles negatv) = 11111110b 127 (elojeles negatv) = 10000001b

  • 10

    128 (elojeles negatv) = 10000000bLthatjuk, hogy az elojeltelen s elojeles brzols tartomnyai kztt tfeds van (0 127),mg ms rtkek esetn tkzs ll fenn (128 255 ill. 1 128). Azaz a 11111111b szmotolvashatjuk 255-nek de akr 1-nek is!

    Ha nem bjton, hanem mondjuk 2 bjtos szban akarjuk trolni a fenti szmokat, akkor eztgy tehetjk meg:

    0 = 00000000 00000000b

    1 = 00000000 00000001b

    2 = 00000000 00000010b

    127 = 00000000 01111111b

    128 = 00000000 10000000b

    255 = 00000000 11111111b

    1 = 11111111 11111111b

    2 = 11111111 11111110b

    127 = 11111111 10000001b

    128 = 11111111 10000000b

    Ebben az esetben meg tudjuk klnbztetni egymstl a 1-et s a 255-t, de tkzo rsz itt isvan (32768 65535 ill. 1 32768).

    Vgl megnzzk, hogy vgezhetok el a legegyszerubb matematikai muveletek. A muve-letek kzs tulajdonsga, hogy az eredmny mindig hosszabb 1 bittel, mint a kt szm kzshossza (gy tekintjk, hogy mindketto tag azonos bitszlessgu). gy kt 1 bites szm sszeges klnbsge egyarnt 2 bites, mg kt bjt 9 bites lesz. A +1 bit tulajdonkppen az esetlegestvitelt trolja.

    Kt binris szmot ugyangy adunk ssze, mint kt decimlis rtket:

    1. kiindulsi pozci a legalacsonyabb helyirtku jegy, innen haladunk balra2. az tvitel kezdetben 0

    3. az aktulis pozciban levo kt szmjegyet sszeadjuk, majd ehhez hozzadjuk az elozotvitelt (az eredmny kt jegyu binris szm lesz)

    4. a ktbites eredmny als jegyt lerjuk az sszeghez, az tvitel pedig felveszi a felsoszmjegy rtkt

    5. ha mg nem rtnk vgig a kt sszeadandn, akkor menjnk ismt a (3)-ra6. az tvitelt mint szmjegyet rjuk hozz az sszeghez

    Az sszeadsi szablyok pedig a kvetkezoek:

    0 + 0 = 00 (szmjegy = 0, tvitel = 0)

  • 11

    0 + 1 = 01 (szmjegy = 1, tvitel = 0) 1 + 0 = 01 (szmjegy = 1, tvitel = 0) 1 + 1 = 10 (szmjegy = 0, tvitel = 1) 10 + 01 = 11 (szmjegy = 1, tvitel = 1)

    Ezek alapjn ellenorizhetjk, hogy a fent definilt kettes komplemens alak valban teljestiazt az alapveto algebrai tulajdonsgot, hogy egy szmnak s additv inverznek (teht 1-szeresnek) sszege 0 kell legyen. s valban:

    1d + (1d) = 00000001b+ 11111111b = 1 00000000b

    Az eredmny szintn egy bjt lesz (ami tnyleg nulla), valamint keletkezik egy tvitel is. Azegyes komplemens is rendelkezik egy rdekes tulajdonsggal. Nevezetesen, ha sszeadunk egyszmot s annak egyes komplemenst, akkor egy csupa egyesekbol ll szmot, azaz 1-et(avagy a legnagyobb elojeltelen szmot) fogunk kapni!

    Kivonskor hasonlan jrunk el, csak ms szablyokat alkalmazunk: 0 0 = 00 (szmjegy = 0, tvitel = 0) 0 1 = 11 (szmjegy = 1, tvitel = 1) 1 0 = 01 (szmjegy = 1, tvitel = 0) 1 1 = 00 (szmjegy = 0, tvitel = 0) 11 01 = 10 (szmjegy = 0, tvitel = 1)

    tovbb a fenti algoritmusban a (3) lpsben az tvitelt le kell vonni a kt szmjegy klnbs-gbol. Ezek alapjn ugyancsak teljesl, hogy

    1d 1d = 00000001b 00000001b = 0 00000000b

    azaz egy szmot nmagbl kivonva 0-t kapunk. Viszont lnyeges eltrs az elozo esettol (ami-kor a kettes komplemens alakot adtuk hozz a szmhoz), hogy itt sose keletkezik tvitel a mu-velet elvgzse utn.

    A kivons szablyainak ismeretben mr ellenorizheto, hogy a kettes komplemenst valbanhelyesen definiltuk:

    00000000b 00000001b = 1 11111111b

    A szorzs s az oszts mr macersabbak. Mindkt muvelet elvgzse elott meghatrozzukaz eredmny (szorzat ill. hnyados) elojelt, majd az elojeleket levlasztjuk a tagokrl. Mindktmuveletet ezutn ugyangy vgezzk, mint ahogy papron is csinlnnk. Oszts alatt itt mara-dkos egsz osztst rtnk. A szorzat hossza a kiindul tagok hosszainak sszege, a hnyadosaz osztand s oszt hosszainak klnbsge, mg a maradk az osztand hosszt rkli. (Eztazrt nem kell szigoran venni. Egy szt egy bjttal elosztva a hnyados nyudodtan hosszabb le-het 8 bitnl. Pl.: 0100h/01h = 0100.) A maradk elojele az osztandval egyezik meg, tovbbteljesl, hogy a maradk abszolt rtkben kisebb mint az oszt abszolt rtke.

  • 12

    A muveletek egy specilis csoportjt alkotjk a 2 hatvnyaival val szorzs s oszts. Ezeketkzs nven shiftelsnek (eltolsnak, lptetsnek) hvjuk.

    2-vel gy szorozhatunk meg egy szmot a legegyszerubben, ha a binris alakban utna runkegy 0-t. De ez megegyezik azzal az esettel, hogy minden szmjegy eggyel magasabb helyir-tkre csszik t, az als, resen marad helyet pedig egy 0-val tltjk ki. Erre azt mondjuk,hogy a szmot egyszer balra shifteltk. Ahnyszor balra shiftelnk egy szmot, mindannyiszormegszorozzuk 2-vel, vgeredmnyben teht 2-nek valamely hatvnyval szorozzuk meg. Ez amdszer minden szmra alkalmazhat, legyen az akr negatv, akr pozitv.

    Hasonlan definilhat a jobbra shiftels is, csak itt a legfelso megresedo bitpozcit tlt-jk fel 0-val. Itt azonban felmerl egy bkkeno, nevezetesen negatv szmokra nem fogunkhelyes eredmnyt kapni. A problma az elojelbitben keresendo, mivel az ppen a legfelso bit,amit pedig az elobb 0-val helyettestettnk. A gond megszntetheto, ha bevezetnk egy elojeless egy elojel nlkli jobbra shiftelst. Az elojeltelen vltozat hasonlan mukdik a balra shifte-lshez, az elojelesnl pedig annyi a vltozs, hogy a legfelso bitet vltozatlanul hagyjuk (vagyami ugyanaz, az eredeti elojelbittel tltjk fel).

    Megjegyezzk, hogy az angol terminolgia megklnbzteti az sszeadskor keletkezo t-vitelt a kivonsnl keletkezotol. Az elobbit carry-nek, mg az utbbit borrow-nak nevezik.

    Tlcsordulsrl (overflow) beszlnk, ha a muvelet eredmnye mr nem trolhat a kijellthelyen. Ez az aritmetikai muveleteknl, pl. shiftelskor, szorzskor, osztskor fordulhat elo. Az1 rtku tvitel mindig tlcsordulst jelez.

    Egy elojeles bjt elojeles kiterjesztsn (sign extension) azt a muveletet rtjk, mikor abjtot sz mretu szmm alaktjuk t gy, hogy mindketto ugyanazt az rtket kpviselje. Eztgy vgezzk el, hogy a cl sz felso bjtjnak minden bitjt a kiindul bjt elojelbitjvel tltjkfel. Teht pl. a 3d = 11111101b szm elojeles kiterjesztse az 11111111 11111101b szm lesz,mg a +4d = 00000100b szmbl 00000000 00000100b lesz. Ezt a fogalmat ltalnosthatjukis: bjt kiterjesztse duplaszv, sz kiterjesztse duplaszv, kvadraszv stb.

    Az elozovel rokon fogalom az elojeltelen kiterjeszts vagy ms nven zr-kiterjeszts(zero extension). Egy elojeltelen bjt elojeltelen kiterjesztsekor a bjtot olyan szv alakt-juk t, amely a bjttal megegyezo rtket tartalmaz. Ehhez a cl sz hinyz, felso bjtjnakminden bitjt 0-val kell feltlteni. Teht pl. a 5d = 00000101b szm elojeltelen kiterjesztseaz 00000000 00000101b szm, mg a 128d = 10000000b szmot 00000000 10000000b alakrahozzuk. Ez a fogalom is ltalnosthat s rtelmezheto szavakra, duplaszavakra stb. is.

  • 4. fejezet

    A 8086-os processzor jellemzoi,szolgltatsai

    Ismerkedjnk most meg az Intel 8086-os mikroprocesszorral kzelebbrol.

    4.1. MemriakezelsA szmtgp memrijt gy tudjuk hasznlni, hogy minden egyes memriarekeszt meg-

    szmozunk. Azt a mdszert, ami meghatrozza, hogy hogyan s mekkora terlethez frhetnkhozz egyszerre, memria-szervezsnek vagy memria-modellnek nevezzk. Tbb elterjedtmodell ltezik, kzlk a legfontosabbak a lineris s a szegmentlt modellek.

    Lineris modellen (linear memory model) azt rtjk, ha a memria teljes terletnek va-lamely bjtja egyetlen szmmal megcmezheto (kivlaszthat). Ezt az rtket ekkor linerismemriacmnek (linear memory address) nevezzk. Az elrheto (hasznlhat) lineris cmektartomnyt egy szval cmterletnek (address space) hvjuk.

    Szegmensen (segment) a memria egy sszefggo, rgztett nagysg darabjt rtjk most(ltezik egy kicsit msfle szegmens-fogalom is), ennek kezdocme (teht a szegmens legelsobjtjnak memriacme) a szegmens bziscm avagy szegmenscm (segment base address). Aszegmensen belli bjtok elrsre szksg van azok szegmenscmhez kpesti relatv tvols-gra, ez az offszetcm (offset address). Szegmentlt modell (segmented memory model) esetna logikai memriacm (logical memory address) teht kt rszbol tevodik ssze: a szegmens-cmbol s az offszetcmbol. E ketto rtk mr elegendo a memria lefedshez. Jells:

    SZEGMENSCM:OFFSZETCM,teht eloszr lerjuk a szegmenscmet, azutn egy kettospontot, majd az offszet jn.

    A 8086-os processzor 20 bites cmbusszal rendelkezik, teht a memriacmek 20 biteseklehetnek. Ez 1 Mbjt (= 220 = 1024 1024 bjt) mretu memria megcmzshez elegendo. Aprocesszor csak a szegmentlt cmzst ismeri. A szegmensek mrett 64 Kbjtban szabtk meg,mivel gy az offszet 16 bites lesz, ez pedig belefr brmelyik regiszterbe (ezt majd ksobb ltnifogjuk). A szegmensek kezdocmre is tettek azonban kiktst, mgpedig azt, hogy mindenszegmens csak 16-tal oszthat memriacmen kezdodhet (ezek a cmek az .n. paragrafus-hatrok, a paragrafus pedig egy 16 bjt hossz memriaterlet). Ez annyit tesz, hogy minden

  • 4.2. REGISZTEREK 14

    szegmenscm als 4 bitje 0 lesz, ezeket teht felesleges lenne eltrolni. gy marad pont 16 bit aszegmenscmbol, azaz mind a szegmens-, mind az offszetcm 16 bites lett. Nzznk egy pldt:

    1234h:5678h

    A szegmenscm felso 16 bitje 1234h, ezrt ezt balra shifteljk 4-szer, gy kapjuk az 1 2340h-t.Ehhez hozz kell adni az 5678h szmot. A vgeredmny a 1 79B8h lineris cm. szrevehetjk,hogy ugyanazt a memriarekeszt tbbflekppen is megcmezhetjk, gy pl. a 179Bh:0008h,15AFh:1EC8h, 130Dh:48E8h cmek mind az elozo helyre hivatkoznak. Ezek kzl van egykitntetett, a 179Bh:0008h. Ezt a cmet gy alkottuk meg, hogy a lineris cm als ngy bitje(1000b = 0008h) lesz az offszetcm, a felso 16 bit pedig a szegmenscmet alkotja. Ezrt azilyen cmeket nevezhetjk bizonyos szempontbl normltnak (normalized address), hiszen azoffszet itt mindig 0000h s 000Fh kztt lesz.

    Most tekintsk a kvetkezo logikai cmet:

    0FFFFh:0010h

    Az elobb lertak szerint a szegmens bzicme 0F FFF0h lesz, ehhez hozz kell adni a 0 0010hoffszetcmet. A muveletet elvgezve az 10 0000h lineris memriacm lesz az eredmny. Akielgg szemfles, annak rgtn feltunhet valami: ez a cm 21 bit hossz! Ez azrt furcsa,mert azt rtuk fenntebb, hogy a 8086-os processzor 20 bites memriacmekkel tud dolgozni.Nos, ilyen esetekben a processzor megszabadul a legfelso, 21. bittol, teht azt mindig 0-nakfogja tekinteni. (Matematikai szhasznlattal gy fogalmazhatunk, hogy a processzor a lineriscmeket modulo 10 0000h kpezi.) gy hiba 21 bites a lineris cm, a memrihoz ennek acmnek csak az als 20 bitje jut el. Ez azt eredmnyezi, hogy a 10 0000h s a 00 0000h lineriscmek ugyanarra a memriarekeszre fognak hivatkozni. Ezt a jelensget nevezik cmterlet-krbefordulsnak (address space wrap-around). Az elnevezs onnan ered, hogy a lineris cmmegtrik, tesik, krbefordul az 1 Mbjtos cmterlet felso hatrn.

    Zrsknt mg egy fogalmat megemltnk. Fizikai memriacm (physical memory add-ress) alatt azt a cmet rtjk, amit a memria a processzortl megkap. Kicsit pontostva, acmbuszra kerlo rtket nevezzk fizikai cmnek. A fizikai cm nem felttlenl egyezik mega lineris cmmel. Erre ppen az elobb lthattunk pldt, hiszen a 10 0000h lineris cmhez a00 0000h fizikai cm tartozik.

    4.2. RegiszterekMint mr a 2. fejezetben is emltettk, a processzor (CPU) tartalmaz nhny specilis, kz-

    vetlenl elrheto trolhelyet, amiket regisztereknek neveznk. (A kzvetlenl elrhetojelzo arra utal, hogy a regiszterek olvasshoz/rshoz nem kell a memrihoz fordulnia aprocesszornak).

    A 8086-os processzor sszesen 14 db. 16 bites regiszterrel gazdlkodhat:

    4 ltalnos cl adatregiszter (AX, BX, CX, DX) 2 indexregiszter (SI s DI) 3 mutatregiszter (SP, BP, IP) 1 sttuszregiszter vagy Flags regiszter (SR vagy Flags)

  • 4.2. REGISZTEREK 15

    4 szegmensregiszter (CS, DS, ES, SS)

    Most nzzk rszletesebben:

    AX (Accumulator) Sok aritmetikai utasts hasznlja a forrs s/vagy cl trolsra. BX (Base) Memriacmzsnl bzisknt szolglhat. CX (Counter) Sok ismtlses utasts hasznlja szmllknt. DX (Data) I/O utastsok hasznljk a portszm trolsra, ill. egyes aritmetikai utast-

    sok szmra is klns jelentosggel br. SI (Source Index) Sztringkezelo utastsok hasznljk a forrs sztring cmnek trol-

    sra.

    DI (Destination Index) A cl sztring cmt tartalmazza. SP (Stack Pointer) A verem tetejre mutat (azaz a verembe legutbb berakott rtk c-

    mt tartalmazza). BP (Base Pointer) ltalnos pointer, de alapesetben a verem egy elemt jelli ki. IP (Instruction Pointer) A kvetkezo vgrehajtand utasts memriabeli cmt tartal-

    mazza. Kzvetlenl nem rheto el, de tartalma rhat s olvashat is a vezrlstadutastsokkal.

    SR avagy Flags (Status Register) A processzor aktulis llapott, az elozo muvelet ered-mnyt mutat, ill. a proci mukdst befolysol biteket, .n. flag-eket (jelzoket) tartal-maz. Szintn nem rheto el kzvetlenl, de manipullhat klnfle utastsokkal.

    CS (Code Segment) A vgrehajtand program kdjt tartalmaz szegmens cme. Nemllthat be kzvetlenl, csak a vezrlstad utastsok mdosthatjk.

    DS (Data Segment) Az alaprtelmezett, elsodleges adatterlet szegmensnek cme. ES (Extra Segment) Msodlagos adatszegmens cme. SS (Stack Segment) A verem szegmensnek cme.

    A ngy ltalnos cl regiszter (AX, BX, CX s DX) als s felso nyolc bitje (azaz als sfelso bjtja) kln neveken rheto el: az als bjtokat az AL, BL, CL, DL, mg a felso bjtokat azAH, BH, CH, DH regiszterek jellik, amint ezt a 4.1. bra is mutatja (a rvidtsekben L Low,H High). ppen ezrt a kvetkezo (Pascal-szeru) muveletek:

    AX:=1234hAL:=78hAH:=56h

    vgrehajtsa utn AX tartalma 5678h lesz, AH 56h-t, AL pedig 78h-t fog tartalmazni.A Flags regiszter felptse a 4.2. brn lthat. Az egyes bitek a kvetkezo informcit

    szolgltatjk:

  • 4.2. REGISZTEREK 16

    0815 7

    AH AL

    AX

    4.1. bra. Az AX regiszter szerkezete

    0815 7

    O D I T S Z A P C

    4.2. bra. A Flags regiszter szerkezete

    C (Carry) 1, ha volt aritmetikai tvitel az eredmny legfelso bitjnl (elojeltelen aritme-tikai tlcsorduls), 0, ha nem.

    P (Parity even) 1, ha az eredmny legals bjtja pros szm 1-es bitet tartalmaz, kln-ben 0.

    A (Auxilliary carry, Adjust) 1 jelzi, ha volt tvitel az eredmny 3-as s 4-es bitje (tehtaz als s a felso nibble) kztt.

    Z (Zero) rtke 1, ha az eredmny zrus lett. S (Sign) rtke az eredmny legfelso bitjnek, az elojelbitnek a tkrkpe. T (Trap) Ha 1, akkor a lpsenknti vgrehajts (single-step execution) engedlyezve

    van.

    I (Interrupt enable) Ha 1, akkor a maszkolhat hardver-megszaktsok engedlyezettek. D (Direction) Ha 0, akkor a sztringutastsok nvelik SI-t s/vagy DI-t, klnben csk-

    kents trtnik.

    O (Overflow) Ha 1, akkor elojeles aritmetikai tlcsorduls trtnt.

    Ha hivatkozunk valamelyik flag-re, akkor a fenti betujelekhez mg hozzrjuk az F betutis. A CF, IF s DF flag-ek rtkt kzvetlenl is befolysolhatjuk. Ezrt pl. a CF nem csakakkor lehet 1, ha volt tlcsorduls (tvitel), hanem sajt clbl egyb dolgot is jelezhet.

    A Flags regiszter 1, 3, 5, 12, 13, 14 s 15 szm bitjei fenntartottak. Ezek rtke gyrilagrgztett, gy nem is mdosthatjuk oket.

  • 4.3. ADATTPUSOK 17

    Aritmetikai flag-ek alatt, ha kln nem mondjuk, a CF, PF, AF, ZF, SF s OF flag-eketrtjk.

    Ha azt akarjuk kifejezni, hogy kt vagy tbb regiszter tartalmt egyms utn fuzve akarunkmegadni egy rtket, akkor az egyes regisztereket egymstl kettosponttal elvlasztva soroljukfel, szintn a helyirtkes felrst kvetve. Teht pl. a DX:AX jells azt jelenti, hogy a 32bites duplasznak az als szava AX-ben, felso szava DX-ben van (a lersi sorrend megfelel abitek sorrendjnek a bjtokban). Rviden: a DX:AX regiszterpr (register pair) egy 32 bitesduplaszt tartalmaz. Ez a jells azonban bizonyos esetekben mst jelent, mint a memriacmekbrzolsra hasznlt SZEGMENS:OFFSZET felrsok! Teht a DX:AX jells jelenthet egylogikai memriacmet DX szegmenssel s AX offszettel, de jelentheti azt is, hogy mi egy 32bites rtket trolunk a nevezett kt regiszterben (ami azonban lehet egy lineris cm is), sennek als szavt AX, felso szavt pedig DX tartalmazza.

    Ha ltalnos (cl) regiszterekrol beszlnk, akkor ltalban nemcsak az AX, BX, CX sDX regiszterekre gondolunk, hanem ezek 8 bites prjaira, tovbb az SI, DI, SP, BP regiszte-rekre is.

    A kvetkezo vgrehajtsra kerlo utasts (logikai) cmt a CS:IP, mg a verem tetejt azSS:SP regiszterprok ltal meghatrozott rtkek jellik.

    A CS s IP regisztereken kvl mindegyik regiszter tartalmazhat brmilyen rtket, tehtnem csak az eredeti funkcijnak megfelelo tartalommal tlthetjk fel oket. Ennek ellenre azSS, SP s Flags regiszterek ms cl hasznlata nem javasolt.

    4.3. AdattpusokA sz mrett 2 bjtban llaptottk meg az Intel-nl, ezrt pl. a BX s DI regiszterek szava-

    sak, BL s DH bjtosak, mg az 1234 5678h szm egy duplasz.A processzor csak egszekkel tud dolgozni, azon bell ismeri az elojeles s elojeltelen arit-

    metikt is. A tbb bjt hossz adatokat little-endian mdon trolja, ezrt pl. a fenti 1234 5678hszm a kvetkezo mdon lesz eltrolva: a legalacsonyabb memriacmre kerl a 78h bjt, eztkveti az 56h, majd a 34h, vgl pedig a 12h. Logikai, lebegopontos vals tpusokat nem tmo-gat a processzor!

    Az egszek rszhalmazt alkotjk a binrisan kdolt decimlis egsz szmok (Binary Co-ded Decimal numbers BCD numbers). Ezek kt csoportba sorolhatk: vannak pakolt (packed)s pakolatlan BCD szmok (unpacked BCD number). (Hasznljk mg a csomagolt s ki-csomagolt elnevezseket is.) Pakolt esetben egy bjtban kt decimlis szmjegyet trolnak gy,hogy a 4 7 bitek a szm magasabb helyirtku jegyt, mg a 0 3 bitek az alacsonyabb helyi-rtku jegyet tartalmazzk. A szmjegyeket a 0h 9h rtkek valamelyike jelli. Pakolatlanesetben a bjtnak a felso fele kihasznlatlan, gy csak 1 jegyet tudunk 1 bjtban trolni.

    A sztring (string) adattpus bjtok vagy szavak vges hossz folytonos sort jelenti. Ezzela tpussal bovebben egy ksobbi fejezetben foglalkozunk.

    Specilis egsz tpus a mutat (pointer). Mutatnak hvunk egy rtket, ha az egy mem-riacmet tartalmaz, azaz ha azt a memria elrsnl felhasznljuk. Kt tpusa van: a kzelivagy rvid mutat (near, short pointer) egy offszetcmet jelent, mg tvoli, hossz vagy teljesmutatn (far, long, full pointer) egy teljes logikai memriacmet, teht szegmens:offszet alakcmet rtnk. A kzeli mutat hossza 16 bit, a tvoli pedig 32 bit. Fontos, hogy mutatkntbrmilyen rtket felhasznlhatunk. Szintn j, ha tudjuk, hogy a tvoli mutatknak az offszetrsze helyezkedik el az alacsonyabb memriacmen a little-endian trolsnak megfeleloen, amita szegmens kvet 2-vel magasabb cmen.

  • 4.4. MEMRIAHIVATKOZSOK, CMZSI MDOK 18

    4.4. Memriahivatkozsok, cmzsi mdokLttuk, hogy a memria szervezse szegmentlt mdon trtnik. Most lssuk, tnylegesen

    hogy adhatunk meg memriahivatkozsokat.Azokat a, regiszterek s konstans szmok (kifejezsek) kombincijbl ll jellseket,

    amelyek az sszes lehetsges szablyos memriacmzsi esetet reprezentljk, cmzsi mdok-nak (addressing mode) nevezzk. Tbb tpusuk van, s mindenhol hasznlhat mindegyik, aholvalamilyen memriaoperandust meg lehet adni. A memriahivatkozs jelzsre a szgletes z-rjeleket ([ s ]) hasznljuk.

    4.4.1. Kzvetlen cmzsA cmzs alakja [offs16], ahol offs16 egy 16 bites abszolt, szegmensen belli offszetet

    (rvid mutatt) jell.

    4.4.2. BziscmzsA cmzs egy bzisregisztert hasznl az offszet megadsra. A lehetsges alakok: [BX],

    [BP]. A cl bjt offszetcmt a hasznlt bzisregiszterbol fogja venni a processzor.

    4.4.3. IndexcmzsHasonl a bziscmzshez, mukdst tekintve is annak tkletes prja. Alakjai: [SI], [DI].

    4.4.4. Bzis+relatv cmzsIde a [BX+rel8], [BX+rel16], [BP+rel8], [BP+rel16] formj cmmegadsok tartoznak. A

    rel16 egy elojeles sz, rel8 pedig egy elojeles bjt, amit a processzor elojelesen kiterjeszt szv.Ezek az .n. eltolsok (displacement). Brmelyik vltozatnl a megcmzett bjt offszetjt abzisregiszter tartalmnak s az elojeles eltolsnak az sszege adja meg.

    4.4.5. Index+relatv cmzsHasonlan a bziscmzs/indexcmzs proshoz, ez a bzis+relatv cmzsi md prja. Alak-

    jai: [SI+rel8], [SI+rel16], [DI+rel8], [DI+rel16].

    4.4.6. Bzis+index cmzsA kt nevezett cmzsi md keverke. A kvetkezo formkat ltheti: [BX+SI], [BX+DI],

    [BP+SI] s [BP+DI]. A regiszterek sorrendje termszetesen kzmbs, gy [BP+SI] s [SI+BP]ugyanazt jelenti. A cl bjt offszetjt a kt regiszter rtknek sszegeknt kapjuk meg.

    4.4.7. Bzis+index+relatv cmzsEz adja a legkombinltabb cmzsi lehetosgeket. ltalnos alakjuk [bzis+index+rel8] s

    [bzis+index+rel16] lehet, ahol bzis BX vagy BP, index SI vagy DI, rel8 s rel16 pedig elojelesbjt ill. sz lehet.

  • 4.4. MEMRIAHIVATKOZSOK, CMZSI MDOK 19

    A bzis+relatv s index+relatv cmzsi mdok msik elnevezse a bzisrelatv ill. index-relatv cmzs.

    A kzvetlen cmzsben szereplo abszolt offszetet, illetve a tbbi cmzsnl elofordul el-tolst nem csak szmmal, de numerikus kifejezssel is megadhatjuk.

    Megjegyezzk, hogy az emltett cmzsi mdoknak ltezik egy alternatv alakja is. Ez annyi-ban tr el az elozoktol, hogy a tbbtag cmzsek tagjait kln-kln szgletes zrjelekberjuk, tovbb elhagyjuk a + jeleket. (Az eltolsban esetlegesen szereplo - jelre viszontszksg van.) Az eltolst nem ktelezo zrjelbe teni. A kvetkezo felsorolsban az egy sorbanlevo jellsek ekvivalensek:

    [BX+rel16], [BX][rel16], [BX]rel16 [DI+rel8], [DI][rel8], rel8[DI] [BP+SI], [BP][SI] [BX+SI+rel16], [BX][SI][rel16], rel16[BX][SI]Minden cmzsi mdhoz tartozik egy alaprtelmezett (default) szegmensregiszter-elors.

    Ez a kvetkezoket jelenti: brmely, BP-t nem tartalmaz cmzsi md a DS-t fogja hasznlni a BP-t tartalmaz cmzsi mdok SS-t hasznljkHa az alaprtelmezett bellts nem tetszik, akkor mi is elorhatjuk, hogy melyik szegmens-

    regisztert hasznlja a cm meghatrozshoz a processzor. Ezt a szegmensfellbrl prefixek-kel tehetjk meg. A prefixek alakja a kvetkezo: CS:, DS:, ES:, SS:, teht a szegmensregiszterneve plusz egy kettospont. Ezeket a prefixeket legjobb kzvetlenl a cmzsi md jellse elrni.

    Most lssunk nhny pldt szablyos cmzsekre:

    [12h*34h+56h] (kzvetlen cmzs) ES:[09D3h] (kzvetlen cmzs, szegmensfellbrlssal) CS:[SI-500d] (indexrelatv cmzs, szegmensfellbrlssal) SS:[BX+DI+1999d] (bzis+index+relatv cmzs, szegmensfellbrlssal) DS:[BP+SI] (bzis+index cmzs, szegmensfellbrlssal)A kvetkezo jellsek viszont hibsak: [AX] (az AX regiszter nem hasznlhat cmzsre) [CX+1234h] (a CX regiszter sem hasznlhat cmzsre) [123456789ABCh] (tl nagy az rtk) [SI+DI] (kt indexregiszter nem hasznlhat egyszerre) [SP+BP] (az SP regiszter nem hasznlhat cmzsre) [IP] (az IP regiszter nem rheto el)

  • 4.5. VEREMKEZELS 20

    A hasznlt cmzsmd ltal hivatkozott logikai memriacmet (ill. gyakran csak annak off-szet rszt) tnyleges vagy effektv cmnek (effective address) nevezzk. gy pl. ha BX rtke1000h, akkor a [BX+0500h] cmzsmd effektv cme a DS:1500h, hiszen bzisrelatv cmzs-kor a bzisregiszter (BX) s az eltols (0500h) rtke sszeaddik egy offszetcmet alkotva,tovbb a korbbi megjegyzs alapjn a szegmenscmet DS tartalmazza.

    4.5. VeremkezelsVermen (stack) a kvetkezo tulajdonsgokkal rendelkezo adatszerkezetet rtjk: rtelmezve van rajta egy Push muvelet, ami egy rtket rak be a verem tetejre egy msik muvelet, a Pop, a verem tetejn levo adatot olvassa ki s trli a verembol mukdse a LIFO (Last In First Out) elvet kveti, azaz a legutoljra betett adatot vehetjk

    ki eloszr a verembol

    verem mretn azt a szmot rtjk, ami meghatrozza, hogy maximlisan mennyi adatotkpes eltrolni

    verem magassga a benne levo adatok szmt jelenti ha a verem magassga 0, akkor a verem res

    ha a verem magassga elri a verem mrett, akkor a verem tele van

    res verembol nem vehetnk ki adatot

    teli verembe nem rakhatunk be tbb adatot

    Az Intel 8086-os processzor esetn a verem mrete maximlisan 64 Kbjt lehet. Ez annaka kvetkezmnye, hogy a verem csak egy szegmensnyi terletet foglalhat el, a szegmensek m-rete pedig szintn 64 Kbjt. A verem szegmenst az SS regiszter trolja, mg a verem tetejreaz SP mutat. Ez a verem lefel bovlo (expand-down) verem, ami azt jelenti, hogy az jonnanbetett adatok egyre alacsonyabb memriacmen helyezkednek el, s gy SP rtke is folyama-tosan cskken a Push muveletek hatsra. SP-nek mindig pros rtket kell tartalmaznia, s averembe betenni ill. onnan kiolvasni szintn csak pros szm bjtot lehet. (Ez egy kis fllents,de a legjobb, ha kvetjk ezt a tancsot.)

    A lefel bovlsbol kvetkezik, hogy SP aktulis rtkbol nem derl ki, hny elem is vana veremben (azaz milyen magas a verem). Ugyangy nem tudhat, mekkora a verem mrete.Ehhez szksg van a verem alja kezdocmnek (azaz SP legnagyobb hasznlhat rtknek)ismeretre. Az az egy biztos, hogy egszen addig pakolhatunk elemet a verembe, amg SP elnem ri a 0000h-t.

    A Push s Pop muveleteknek megfelelo utastsok mnemonikja szintn PUSH ill. POP, gymegjegyzsk nem tl nehz. A PUSH eloszr cskkenti SP-t a betenni kvnt adat mretnekmegfelelo szm bjttal, majd az SS:SP ltal mutatott memriacmre berja a krdses rtket.A POP ezzel ellenttes mukdsu, azaz eloszr kiolvas az SS:SP cmrol valahny szm bjtot,majd SP-hez hozzadja a kiolvasott bjtok szmt.

    Nzznk egy pldt a verem mukdsnek szemlltetsre! Legyen AX tartalma 1212h,BX tartalma 3434h, CX pedig legyen egyenlo 5656h-val. Tekintsk a kvetkezo Assemblyprogramrszletet:

  • 4.5. VEREMKEZELS 21

    PUSH AXPUSH BXPOP AXPUSH CXPOP BXPOP CX

    SP legyen 0100h, SS rtke most kzmbs. A verem s a regiszterek llapott mutatjk akvetkezo brk az egyes utastsok vgrehajtsa utn:

    Kezdetben:SS:0102h : ??

    SP SS:0100h : ??SS:00FEh : ??SS:00FCh : ??SS:00FAh : ??

    AX = 1212h, BX = 3434h, CX = 5656hPUSH AX utn:

    SS:0102h : ??SS:0100h : ??

    SP SS:00FEh : 1212hSS:00FCh : ??SS:00FAh : ??

    AX = 1212h, BX = 3434h, CX = 5656hPUSH BX utn:

    SS:0102h : ??SS:0100h : ??SS:00FEh : 1212h

    SP SS:00FCh : 3434hSS:00FAh : ??

    AX = 1212h, BX = 3434h, CX = 5656hPOP AX utn:

    SS:0102h : ??SS:0100h : ??

    SP SS:00FEh : 1212hSS:00FCh : 3434hSS:00FAh : ??

    AX = 3434h, BX = 3434h, CX = 5656hPUSH CX utn:

    SS:0102h : ??SS:0100h : ??SS:00FEh : 1212h

    SP SS:00FCh : 5656hSS:00FAh : ??

    AX = 3434h, BX = 3434h, CX = 5656h

  • 4.5. VEREMKEZELS 22

    POP BX utn:SS:0102h : ??SS:0100h : ??

    SP SS:00FEh : 1212hSS:00FCh : 5656hSS:00FAh : ??

    AX = 3434h, BX = 5656h, CX = 5656h

    POP CX utn:SS:0102h : ??

    SP SS:0100h : ??SS:00FEh : 1212hSS:00FCh : 5656hSS:00FAh : ??

    AX = 3434h, BX = 5656h, CX = 1212h

    Az utastsok vgrehajtsa teht azt eredmnyezi, hogy AX felveszi BX rtkt, BX a CXrtkt, CX pedig az AX eredeti rtkt (olyan, mintha krbeforgattuk volna a regiszterektartalmt egyms kztt). Mivel ugyanannyi PUSH volt, mint amennyi POP, SP rtke a vg-rehajts utn visszallt a kezdetire.

    Figyeljk meg, hogy a PUSH-sal berakott rtkek a memriban bentmaradnak akkor is, haksobb egy POP-pal kivesszk oket, br ekkor mr nem rszei a veremnek (azaz nincsenek averemben). Ez nem tl meglepo dolog, ha figyelembe vesszk az utastsok mukdst.

    A verem sok dologra hasznlhat a programozs sorn:

    regiszterek, vltozk rtknek megcserlsre

    regiszterek ideiglenes trolsra

    loklis vltozk elhelyezsre

    eljrshvskor az argumentumok tadsra, ill. a visszatrsi rtk trolsraA veremregisztereknek (SS s SP) mindig rvnyes rtkeket kell tartalmazniuk a program

    futsakor, mivel azt a processzor s ms programok (pl. a hardvermegszaktsokat lekezelorutinok) is hasznljk.

  • 4.6. I/O, MEGSZAKTS-RENDSZER 23

    4.6. I/O, megszakts-rendszerEz a processzor 16 biten brzolja a portszmokat, gy sszesen 65536 db. portot rhetnk

    el a klnfle I/O (Input/Output ki-/bemeneti) utastsokkal. Ezek kzl a 0000h s 00FFhkztti tartomnyt az alaplapi eszkzk hasznljk, s mivel a legfontosabb perifrik cmtrgztettk, a klnbzo PC-s rendszerekben ezeket ugyanazon a porton rhetjk el. Brme-lyik porton kezdemnyezhetnk olvasst s rst egyarnt, de ezzel azrt nem rt vigyzni, egyflresikeredett rssal ugyanis knnyen megadsra ksztethetjk a szmtgpet.

    Egy megszaktst kivlthat egy hardvereszkz (ez a hardver-megszakts), de a felhasznls a programok is elindthatnak ilyen esemnyt (ez a szoftver-megszakts). A megszaktsokkt tpusa nem csak a szmukban, de tulajdonsgaikban is eltr egymstl.

    A hardver-megszaktsokat a megszakts-vezrlon keresztl rzkeli a processzor. A ve-zrlo 8 klnbzo megszakts-vonalat tart fent (AT-k esetn kt vezrlot ktttek sorba, gylett a 8-bl 16 vonal). Ezen megszaktsokat az IRQ0, IRQ1, . . . , IRQ7 (tovbb IRQ8, . . . ,IRQ15) szimblumokkal jelljk. Fontos jellemzojk, hogy a program futsval prhuzamosanaszinkron keletkeznek, s hogy maszkolhatk. Ez utbbi fogalom azt takarja, hogy az egyesIRQ vonalakat egyenknt engedlyezhetjk ill. tilthatjuk le. Ha egy vonal tiltva (mskppenmaszkolva) van, akkor az arra vonatkoz krsek nem jutnak el a processzorhoz. Ezen kvl aprocesszor Flags regiszternek IF bitjvel az sszes hardver-megszakts rzkelst letilthatjukill. jra engedlyezhetjk.

    Ezzel szemben szoftver-megszaktsbl 256 darab van, jellskre az INT 00h, . . . , INT 0FFhkifejezseket hasznljuk. A program futsa sorn szinkron keletkeznek (hiszen egy gpi kdutasts vltja ki oket), s nem maszkolhatk, nem tilthatk le. Az IF flag llstl fggetlenlmindig rzkeli oket a CPU.

    A kt megszakts-tpus lekezelsben kzs, hogy a CPU egy specilis rutint (program-rszt) hajt vgre a megszakts detektlsa utn. Ez a rutin a megszakts-kezelo (interrupthandler). Az opercis rendszer felllsa utn sok hardver- s szoftver-megszaktsnak mrvan kezeloje (pl. a BIOS is jpr ilyen megszaktst zemeltet), de lehetosg van arra is, hogybrmelyik ilyen rutint lecserljk egy sajt programunkra.

    A hardver-megszaktsok a szoftveresek egy adott tartomnyra kpzodnek le, ez alaplla-potban az INT 08h, . . . , INT 0Fh (IRQ8-tl IRQ15-ig pedig az INT 70h, . . . , INT 77h) megsza-ktsokat jelenti, teht ezek a megszaktsok msra nem hasznlhatk. gy pl. IRQ4 keletkez-sekor a processzor az INT 0Ch kezelojt hvja meg, ha IF = 1 s az IRQ4 nincs maszkolva.

    A megszaktsok egy specilis csoportjt alkotjk azok, amiket valamilyen vszhelyzet, s-lyos programhiba vlt ki. Ezeket sszefoglal nven kivtelnek (exception) nevezzk. Kivteltokoz pl. ha nullval prblunk osztani, vagy ha a verem tl- vagy alulcsordul.

  • 5. fejezet

    Az Assembly nyelv szerkezete,szintaxisa

    Az Assembly nyelven megrt programunkat egy szveges forrsfjlban troljuk, amit aztnegy erre specializlt fordtprogrammal talaktunk trgykdd (object code). A trgykd mgnem futtathat kzvetlenl, ezrt a szerkeszto (linker) elvgzi rajta az talaktsokat. Vglaz egy vagy tbb trgykd sszefuzse utn kialakul a futtathat program. Az emltett fordt-programot assemblernek nevezzk. A forrsfjlok llomnynv-kiterjesztse ltalban .ASMvagy .INC, a trgykd .OBJ, a futtathat fjlok pedig .COM vagy .EXE. Ezek az elnevezseka PC-s DOS rendszerekre vonatkoznak, ms opercis rendszerek alatt (pl. UNIX, OS/2, Li-nux) ezek eltrhetnek. Az Assembly forrsfjloknak tiszta szveges (text) llomnyoknak kelllennie, mert az assemblerek nem szeretik a mindenfle binris szemetet tartalmaz dokumen-tumokat.

    Az Assembly nem rzkeny a kis- s nagybetukre, gy teht a PUSH, Push, push, PusHszavak ugyanazt a jelentst kpviselik. Ez elg nagy szabadsgot ad a klnbzo azonostkelnevezsre, s a forrst is ttekinthetobb teszi.

    Az Assembly forrs sorai a kvetkezo elemeket tartalmazhatjk: assembler utastsok (foleg ezek alkotjk a tnyleges program kdjt) pszeudo utastsok (pl. makrk, helyettesto szimblumok) assembler direktvk

    A direktvk (directive) olyan, az assemblernek szl utastsok, melyek kzvetlenl gpikdot nem felttlenl generlnak, viszont a fordts menett, az elkszlt kdot befolysoljk.

    Az rvnyes assembler utastsok szintaxisa a kvetkezo:

    {Cmke:} {Utasts {Operandus}} {;Megjegyzs}A kapcsos zrjelek ({ s }) az opcionlis (nem ktelezo) rszeket jelzik, mg a cscsos zrje-lek (< s >) 0 vagy tbb elofordulsra utalnak. Ezek alapjn az assembler utastsok szintaxisaszavakban a kvetkezo: a sor elejn llhat egy Cmke, amit kvethet valahny Prefix, majdrhatunk legfeljebb egy Utastst, aminek valahny Operandusa lehet, s vgl a sort egy Meg-jegyzs zrhatja. A megfogalmazs mutatja, hogy a csak egy cmkt, megjegyzst tartalmazsorok, sot mg az res sor is megengedett az Assembly forrsban.

  • 25

    A cmke (label) deklarcija az azonostjbl s az azt kveto kettospontbl ll. rtkeaz aktulis sor memriacme (helyesebben offszetje). Szerepe azrt fontos, mert segtsgvelknnyen rhatjuk le a klnfle vezrlsi szerkezeteket. A gpi kd utastsok ugyanis relatvvagy abszolt memriacmekkel dolgoznak, neknk viszont knyelmesebb, ha egy szimblum-mal (a cmke nevvel) hivatkozunk a krdses sorra. A tnyleges cm megllaptsa a szerkesztofeladata lesz.

    A prefix olyan utastselem, amely csak az ot kveto gpi kd utastsra (avagy Assemblymnemonikra) hat, annak mukdst vltoztatja meg ill. egszti ki.

    Ezeket kveti az utasts (instruction), ami egy assembler direktva, egy pszeudo utastsvagy egy Assembly mnemonik lehet. Emlkeztetol, a mnemonik (mnemonic) azonos muve-letet vgzo klnbzo gpi kd utastsok csoportjt jello szimblum (sz). Az Intel mne-monikok legalbb ktbetusek, s nmelyik mg szmot is tartalmaz. A mnemonikok gpi kdalakjt muveleti kdnak (operation code, opcode) nevezzk.

    A tovbbiakban a mnemonik sz helyett inkbb az utastst fogjuk hasznlni.Az mnemonik ltal meghatrozott utasts valamilyen dolgokon hajtja vgre a feladatt.

    Ezeket a dolgokat mutatjk az operandusok (operand), amelyeket (ha tbb van) vesszovel el-vlasztva sorolunk fel. Operandusok ptokvei a kvetkezok lehetnek:

    regiszterek

    numerikus (szm) konstansok karakteres (sztring) konstansok szimblumok

    opertorok (muveletek)Regiszterekre a kvetkezo szavakkal utalhatunk: AL, AH, AX, BL, BH, BX, CL, CH, CX,

    DL, DH, DX, SI, DI, SP, BP, CS, DS, ES s SS.A numerikus konstansnak szmjeggyel kell kezdodnie, azutn tartalmazhatja a tz szm-

    jegyet ill. az A F betuket, a vgn pedig a szmrendszerre utal jells llhat. Alapesetbenminden szmot decimlisnak rtelmez az assembler, kivve ha:

    tlltottuk az alaprtelmezst a RADIX direktvval

    a szm vgn a d (decimlis), b (binris), h (hexadecimlis) vagy o (oktlis) betull

    Fontos, hogy a betuvel kezdodo hexadecimlis szmok el tegynk legalbb egy 0-t, mert k-lnben szimblumnak prbln rtelmezni a szmunkat az assembler.

    Karakteres konstansokat aposztrfok(. . . ) vagy idzojelek (". . . ") kztt adhatunk meg.Ha numerikus konstans helyett llnak, akkor lehetsges hosszuk az adott direktvtl (pl. a DWesetn 2 bjt) ill. a msik operandustl fgg.

    Szimblumok pldul a konstans azonostk, vltozk, cmkk, szegmensek, eljrsok ne-vei. Szimblum azonostja tartalmazhat szmjegyet, betuket (csak az angol bc betuit), al-hzsjelet ( _ ), dollrjelet ($) s kukacot (@). Fontos, hogy az azonostk nem kezdodhetnekszmjeggyel!

    Specilis szimblum az egymagban ll dollrjel, ennek neve pozci-szmll (locationcounter). rtke az aktulis sor szegmensbeli (avagy szegmenscsoportbeli) offszetje.

    Opertorbl rengeteg van, a legfontosabbak taln a kvetkezok:

  • 26

    kerek zrjelek szoksos aritmetikai muveleti jelek (+, -, *, /, MOD) mezokivlaszt opertor (.) szegmens-elors/-fellbrls (:) memriahivatkozs ([. . . ]) bitenknti logikai muveletek (AND, OR, XOR, NOT) tpusfellbrls (PTR) adattpus megads (BYTE, WORD, DWORD) duplikl opertor (DUP) relcis opertorok (EQ, NE, GT, GE, LT, LE) pointer tpusok (NEAR, FAR) szegmens/offszet lekrdezs (SEG, OFFSET) lpteto opertorok (SHL, SHR) mretlekrdezo opertorok (LENGTH, SIZE, TYPE, WIDTH)Az operandusok ezek alapjn hrom csoportba sorolhatk: regiszter-, memria- s kons-

    tans (kzvetlen rtku) operandusok. A klnbzo mnemonikok lehetnek nulla-, egy-, ketto-,hrom- vagy ngyoperandusak.

    Fontos megjegyezni, hogy a ktoperandus mnemonikok elso operandusa a cl, a msodikpedig a forrs. Ezt a konvencit egybknt csak az Intel Assembly hasznlja, az sszes tbbi(pl. Motorola) Assemblyben az elso a forrs, a msodik pedig a cloperandus. Az elnevezsekarra utalnak, hogy a muvelet eredmnye a cloperandusban troldik el. Ha szksges, a c-loperandus msodik forrsknt is szolglhat. Egy operandust hasznl utastsoknl az az egyoperandus sokszor egyben forrs s cl is.

    Vgl az assembler utasts sornak vgn megjegyzst is rhatunk egy pontosvesszo utn.Ezeket a karaktereket az assembler egyszeruen tugorja, gy teht brmilyen szveget tartal-mazhat (mg kezetes betuket is). A megjegyzs a pontosvesszotol a sor vgig tart.

    Most tisztznunk kell mg nhny fogalmat. Korbban mr emltettk, hogy a processzorszegmentlt memria-modellt hasznl. Hogy teljes legyen a kavarods, az assemblernek is elokell rnunk a memria-modellt, s szegmenseket is ltre kell hoznunk. A kt szegmens- smemria-modell fogalmak azonban egy picit klnbznek.

    Az assemblerben ltrehozott szegmenseknek van nevk (azonostjuk, ami teht egy szim-blum), mretk legfeljebb 64 Kbjt lehet, s nem felttlenl kell sszefggonek lennie egyszegmens defincijnak. Ez utbbi tulajdonsg tbb szabadsgot enged a programoznak, mi-vel megteheti, hogy elkezd egy szegmenst, majd definil egy msikat, azutn megint visszatraz elso szegmensbe. Az azonos nven megkezdett szegmensdefincikat az assembler s a szer-keszto szpen sszefuzi egyetlen darabb, teht ez a jellsrendszer a processzor szmra tlt-sz lesz. Msrszt a mretre vonatkoz kijelents mindssze annyit tesz, hogy ha nem tltnkki teljesen (kddal vagy adatokkal) egy memriaszegmenst (ami viszont 64 Kbjt nagysg),

  • 27

    akkor a fennmarad bjtokkal az assembler nem foglalkozik, a program futsakor ezek valamiszemetet fognak tartalmazni.

    A memria-modell elorsa akkor fontos, ha nem akarunk foglalkozni klnbzo szegmen-sek (adat-, kd-, verem- stb.) ltrehozsval, s ezt a folyamatot az assemblerre akarjuk hagyni.Ehhez viszont jeleznnk kell az assemblernek, hogy elorelthatlag mekkora lesz a programunkmemriaignye, hny s milyen tpus szegmensekre van szksgnk. Ezt a tpus szegmens-megadst egyszerustett szegmensdefincinak (simplified segment definition) nevezzk.

    A kt mdszert keverve is hasznlhatjuk kedvnk s ignyeink szerint, nem fogjk egymstzavarni (mi is ezt fogjuk tenni). Ha magas szintu nyelvhez runk klso Assembly rutinokat,akkor az egyszerustett szegmensmegads sokszor egyszerubb megoldst szolgltat.

    Most pedig lssunk nhny fontos direktvt:

    modul/forrsfjl lezrsa (END) szegmens definilsa (SEGMENT . . . ENDS) szegmenscsoport definilsa (GROUP) szegmens hozzrendelse egy szegmensregiszterhez (ASSUME) rtkads a $ szimblumnak (ORG) memria-modell megadsa (MODEL) egyszerustett szegmensdefincik (CODESEG, DATASEG, FARDATA, UDATASEG, UFAR-

    DATA, CONST, STACK, .CODE, .DATA, .STACK) helyfoglals (vltoz ltrehozsa) (DB, DW, DD, DF, DQ, DT) konstans/helyettesto szimblum ltrehozsa (=, EQU) cmke ltrehozsa (LABEL) eljrs definilsa (PROC . . . ENDP) klso szimblum definilsa (EXTRN) szimblum lthatv ttele a klvilg szmra (PUBLIC) feltteles fordts elorsa (IF, IFccc, ELSE, ELSEIF, ENDIF) klso forrsfjl beszrsa az aktulis pozciba (INCLUDE) felhasznli tpus definilsa (TYPEDEF) struktra, uni, rekord definilsa (STRUC . . . ENDS, UNION . . . ENDS, RECORD) a szmrendszer alapjnak tlltsa (RADIX) makrdefinci (MACRO . . . ENDM) makrmuveletek (EXITM, IRP, IRPC, PURGE, REPT, WHILE) utastskszlet meghatrozsa (P8086, P186, P286, P386 stb.; .8086, .186, .286, .386

    stb.)

  • 28

    A direktvk hasznlatra ksobb mg visszatrnk.

    Assemblerbol tbb is ltezik PC-re, ilyenek pl. a Microsoft Macro Assembler (MASM),Turbo Assembler (TASM), Netwide Assembler (NASM), Optimizing Assembler (OPTASM).Ebben a jegyzetben a programokat a TASM jellsmdban rjuk le, de tbb-kevesebb trssalmsik assembler al is tvihetok a forrsok. A TASM specialitsait nem fogjuk kihasznlni,ahol nem muszj. A TASM sajt linkert hasznl, ennek neve Turbo Linker (TLINK).

  • 6. fejezet

    A 8086-os processzorutastskszlete

    Itt az ideje, hogy megismerkedjnk a kivlasztott processzorunk ltal ismert utastsokkal(pontosabban mnemonikokkal). Az utastsok kzs tulajdonsga, hogy az operandusoknakteljestenik kell a kvetkezo feltteleket:

    Ha egyetlen operandusunk van, akkor az ltalban csak az ltalnos regiszterek kzlkerlhet ki, vagy pedig memriahivatkozs lehet (nhny esetben azonban lehet konstanskifejezs vagy szegmensregiszter is).

    Kt operandus esetn bonyolultabb a helyzet: mindkt operandus egyszerre nem lehetszegmensregiszter, memriahivatkozs s kzvetlen (konstans) rtk, tovbb szegmens-regiszter mellett vagy ltalnos regiszternek vagy memriahivatkozsnak kell szerepel-nie. (A sztringutastsok kivtelek, ott mindkt operandus memriahivatkozs lesz, deerrol majd ksobb.) A kt operandus mretnek majdnem mindig meg kell egyeznie, ezall csak nhny specilis eset kivtel.

    6.1. PrefixekEloszr lssuk a prefixeket, zrjelben megadva a gpi kdjukat is (ez utbbit persze nem

    kell megjegyezni):

    6.1.1. Szegmensfellbrl prefixekEzek a CS: (2Eh), DS: (3Eh), ES: (26h) s SS: (36h). A TASM ezeken kvl ismeri a

    SEGCS, SEGDS, SEGES s SEGSS mnemonikokat is. A SCAS s a STOS utastsok ki-vtelvel brmely ms utasts elott megadva oket az alaprtelmezs szerinti szegmensregiszterhelyett hasznland regisztert adjk meg. Termszetesen ez csak a valamilyen memriaoperan-dust hasznl utastsokra vonatkozik.

  • 6.2. UTASTSOK 30

    6.1.2. Buszlezr prefixMnemonikja LOCK (0F0h). Hatsra az adott utasts ltal mdostott memriarekeszt az

    utasts vgrehajtsnak idejre a processzor zrolja gy, hogy a buszokhoz ms hardverelemnem frhet hozz a muvelet lefolysig. (A teljessg kedvrt: ebben a processzor LOCK#jelu kivezetse vesz rszt.) Csak a kvetkezo utastsok esetn hasznlhat: ADD, ADC, SUB,SBB, AND, OR, XOR, NOT, NEG, INC, DEC, XCHG, ms esetekben hatsa definilatlan. Azemltett utasts cloperandusnak ktelezoen memriahivatkozsnak kell lennie.

    6.1.3. Sztringutastst ismtlo prefixekLehetsges alakjaik: REP, REPE, REPZ (0F3h), REPNE, REPNZ (0F2h). Csak a sztring-

    kezelo utastsok elott hasznlhatk, ms esetben kvetkezmnyk kiszmthatatlan. Mukd-skrol s hasznlatukrl ksobb szlunk.

    6.2. UtastsokMost jjjenek az utastsok, tpus szerint csoportostva:

    6.2.1. Adatmozgat utastsok MOV adatok mozgatsa

    XCHG adatok cserje PUSH adat bettele a verembe

    PUSHF Flags regiszter bettele a verembe

    POP adat kivtele a verembol

    POPF Flags regiszter kivtele a verembol

    IN adat olvassa portrl

    OUT adat kirsa portra

    LEA tnyleges memriacm betltse

    LDS, LES teljes pointer betltse szegmensregiszter:ltalnos regiszter regiszterprba CBW AL elojeles kiterjesztse AX-be CWD AX elojeles kiterjesztse DX:AX-be XLAT, XLATB AL lefordtsa a DS:BX cmu fordt tblzattal

    LAHF Flags als bjtjnak betltse AH-ba SAHF AH betltse Flags als bjtjba CLC CF flag trlse

    CMC CF flag komplementlsa (invertlsa)

  • 6.2. UTASTSOK 31

    STC CF flag belltsa

    CLD DF flag trlse

    STD DF flag belltsa

    CLI IF flag trlse

    STI IF flag belltsa

    6.2.2. Egsz szmos aritmetika ADD sszeads

    ADC sszeads tvitellel (CF) egytt SUB kivons

    SBB kivons tvitellel (CF) egytt CMP sszehasonlts (flag-ek belltsa a cl s a forrs klnbsgnek megfeleloen) INC inkrementls (nvels 1-gyel), CF nem vltozik DEC dekrementls (cskkents 1-gyel), CF nem vltozik NEG kettes komplemens kpzs (szorzs 1-gyel) MUL elojeltelen szorzs IMUL elojeles szorzs DIV elojeltelen maradkos oszts IDIV elojeles maradkos oszts

    6.2.3. Bitenknti logikai utastsok (Boole-muveletek) AND logikai AND

    OR logikai OR

    XOR logikai XOR

    NOT logikai NOT (egyes komplemens kpzs) TEST logikai bit tesztels (flag-ek belltsa a kt op. logikai AND-jnek megfeleloen)

  • 6.2. UTASTSOK 32

    6.2.4. Bitlpteto utastsok SHL elojeltelen lptets (shiftels) balra SAL elojeles lptets balra (ugyanaz, mint SHL) SHR elojeltelen lptets jobbra SAR elojeles (aritmetikai) lptets jobbra ROL balra forgats (rotls) RCL balra forgats CF-en t

    ROR jobbra forgats RCR jobbra forgats CF-en t

    6.2.5. Sztringkezelo utastsok MOVS, MOVSB, MOVSW sztring mozgatsa

    CMPS, CMPSB, CMPSW sztringek sszehasonltsa

    SCAS, SCASB, SCASW keress sztringben

    LODS, LODSB, LODSW betlts sztringbol

    STOS, STOSB, STOSW trols sztringbe

    6.2.6. Binrisan kdolt decimlis (BCD) aritmetika AAA ASCII igazts sszeads utn

    AAS ASCII igazts kivons utn

    AAM ASCII igazts szorzs utn

    AAD ASCII igazts oszts elott

    DAA BCD rendezs sszeads utn

    DAS BCD rendezs kivons utn

    6.2.7. Vezrlstad utastsok JMP felttel nlkli ugrs

    JCXZ ugrs, ha CX = 0000h

    Jccc feltteles ugrs (ccc egy felttelt r le) LOOP CX dekrementlsa s ugrs, ha CX , 0000h

    LOOPE, LOOPZ CX dekrementlsa s ugrs, ha ZF = 1 s CX , 0000h

  • 6.2. UTASTSOK 33

    LOOPNE, LOOPNZ CX dekrementlsa s ugrs, ha ZF = 0 s CX , 0000h

    CALL eljrs (szubrutin) hvsa RET, RETF visszatrs szubrutinbl

    INT szoftver-megszakts krse

    INTO INT 04h hvsa, ha OF = 1, klnben NOP-nak felel meg

    IRET visszatrs megszaktsbl

    6.2.8. Rendszervezrlo utastsok HLT processzor lelltsa, amg megszakts (vagy reset) nem rkezik

    6.2.9. Koprocesszor-vezrlo utastsok WAIT adatszinkronizls a koprocesszorral

    ESC utasts kldse a koprocesszornak

    6.2.10. Specilis utastsok NOP res utasts (igazbl XCHG AX,AX)

    Az adatmozgat utastsok a leggyakrabban hasznlt utastsok kategrijt alkotjk. Eztermszetes, hiszen ms (magasabb szintu) programozsi nyelvekben is sokszor elofordul, hogyvalamilyen adatot olvasunk ki vagy tltnk be egy vltozba, avagy valamelyik portra. Kicsitkilgnak ebbol a sorbl a CBW, CWD, XLAT utastsok, de mondjuk a flag-eket llt CLC,CMC stb. utastsok is kerlhettek volna msik kategriba.

    Az egsz aritmetiks utastsokat szintn nagyon sokszor hasznljuk programozskor. ACMP utastsnak pl. kulcsszerepe lesz a klnfle elgazsok (feltteles vezrlsi szerkezetek)lekdolsban.

    A Boole-muveletekkel mindenfle bitmuveletet (bellts, maszkols, tesztels) el tudunkvgezni, a munkk sorn ppen ezrt nlklzhetetlenek.

    Shiftelo muveleteket foleg a mr emltett, 2 hatvnyval val szorzs gyors megvalstsraalkalmazunk. Ezenkvl nagy precizits, sajt aritmetikai muveletek fejlesztsekor is fontosszerepet kapnak a rotl utastsokkal egytt.

    Sztringen (string) itt bjtok vagy szavak vges hossz folytonos sort rtjk. A sztringekenoperl utastsok pl. a nagy mennyisgu adatok msolsnl, vizsglatnl segtenek.

    BCD aritmetikt csak az emberi knyelem miatt tmogat a processzor. Ezek az utast-sok kt csoportra oszthatk: pakolatlan (AAA, AAD, AAM, AAS) s pakolt (DAA,DAS) BCDaritmetikra. Kifejezetten ritkn hasznljuk oket, br ez elg szubjektv kijelents.

    A vezrlstad utastsok a programok egyik alappillrt alkotjk, helyes hasznlatuk a jlmukdo algoritmus alapfelttele.

    Rendszer- s koprocesszor-vezrlo utastsokat csak specilis esetekben, klso hardverrelval kapcsolatfenntartsra s kommunikcira szoks hasznlni.

    Klnleges csemege a NOP (No OPeration), ami eredete szerint adatmozgat utastslenne (mivel az XCHG AX,AX utasts lneve), viszont mukdst tekintve gyakorlatilag nem

  • 6.2. UTASTSOK 34

    csinl semmit. Hasznos lehet, ha a kdba olyan res bjtokat akarunk beszrni, amit ksobbesetleg valami egyb clra hasznlunk majd, de nem akarjuk, hogy a processzor azt valamilyenegyb utastsnak rtelmezve nemkvnatos mellkhats lpjen fel. A NOP kdja egyetlen bjt(90h).

    Szegmensregiszter-operandust (ami nem egyenlo a szegmensfellbrl prefixszel) a fentiutastsok kzl csak a MOV, PUSH s POP kaphat, de ezzel egyelore ne foglalkozzunk, k-sobb mg visszatrnk rjuk.

  • 7. fejezet

    Assembly programok ksztse

    Az Assembly nyelvu programozs folyamata 3 jl elklntheto fzisra bonthat: forrselksztse, fordts, majd szerkeszts. Nzzk meg egyenknt ezeket a lpseket!

    A programok forrsllomnynak a knnyebb azonosts vgett (s a hagyomnyok be-tartsa rdekben is) clszeru egy .ASM kiterjesztsu nevet adni. A forrst brmilyen sz-vegszerkesztovel (pl. a DOS-os EDIT, valamilyen commander program szerkesztoje, WindowsNotePad-je stb.) elkszthetjk, csak az a fontos, hogy a kimentett llomny ne tartalmazzonmindenfle formzsi informcit, kpeket stb., pusztn a forrs szvegt.

    Ha ez megvan, akkor jhet a fordts. A TASM program szintaxisa a kvetkezo:TASM {opcik} forrs{,trgykd}{,lista}{,xref}

    Az opcik klnfle kapcsolk s paramterek, amik a fordts menett s a generlt fjlok tar-talmt befolysoljk. A kimeneti llomny trgykd (object, .OBJ kiterjesztssel) formtum,s alapesetben a fjl neve megegyezik a forrs nevvel. Ha akarjuk, ezt megvltoztathatjuk.Krhetjk az assemblert, hogy a fordts vgeztvel ksztsen listt s/vagy keresztreferencia-tblzatot (cross reference table, xref). A listban a forrs minden egyes sorhoz generlt gpikd fel van tntetve, ezenkvl tartalmazza a definilt szegmensek adatai, valamint a hasz-nlt szimblumokat sszegyujto szimblumtblt. A keresztreferencia-tblzat azt tartalmazza,hogy a klnbzo szimblumokat hol definiltk, ill. mely helyeken hivatkoztak rjuk. Ez a fjlbinris (teht nem szveges), rtelmes informcit belole a TCREF programmal nyerhetnk.

    Legtbbszr csak a lefordtand forrs nevt adjuk meg a TASM-nak, hacsak nincs valami-lyen klnleges ignynk. Nhny fontos kapcsolt azrt felsorolunk:

    /a, /s A szegmensek szerkesztsi sorrendjt befolysoljk. Az elso bc rend szerint,mg a msodik a definils sorrendje szerinti szegmens-sorrendet r elo. Alaprtelmezsa /s.

    /l, /la A listzs formtumt befolysoljk: norml (opcio/l) ill. kibovtett (/la) lista fogkszlni. Alaprtelmezsben nem kszl lista.

    /m# A fordts # menetes lesz (a # helyre egy szmot kell rni). Alaprtk a 2. /z Hiba esetn a forrs megfelelo sort is kirja. /zi, /zd, /zn A trgykdba bekerlo nyomkvetsi informcit befolysoljk: teljes (/zi),

    csak a programsorok cmei (/zd) vagy semmi (/zn). Alaprtelmezs a /zn.

  • 36

    Miutn mindegyik forrst lefordtottuk trgykdra, jhet a szerkeszts. A TLINK is szmosargumentummal indthat:

    TLINK {opcik} trgykd fjlok{, futtathat fjl}{, trkp}{, knyvtrak}Az opcik esetleges megadsa utn kell felsorolni azoknak a trgykd llomnyoknak a neveit,amiket egy futtathat fjlba akarunk sszeszerkeszteni. A foprogram trgykdjt kell legelso-nek megadnunk. A futtathat fjl nevt kvnsgunk szerint megadhatjuk, klnben a legelsotrgykd fjl (a foprogram) nevt fogja kapni. A trkpfjl (map file) az egyes modulokbandefinilt szegmensek, szimblumok adatait tartalmazza, valamint kln krsre azoknak a pro-gramsoroknak a sorszmait, amikhez kd kerlt lefordtsra. A knyvtrakban (library) tbbtrgykd llomny lehet sszegyujtve, a program rsakor teht ezekbol is hasznlhatunk ruti-nokat, ha akarunk.

    Most lssunk nhny megadhat opcit:

    /x, /m, /l, /s A trkp (map) tartalmt befolysoljk: nincs trkp (/x), publikus szimb-lumok listja lesz (/m), kdhoz tartoz sorszmok lesznek (/l), szegmensinformci lesz(/s). Alaprtelmezs a /s.

    /c rzkeny lesz a kisbetukre s nagybetukre. /v Engedlyezi a nyomkvetsi informcik beptst a futtathat fjlba. /t Az alaprtelmezett .EXE helyett .COM tpus futtathat fjlt kszt.Most lssunk egy pldt! Tegyk fel, hogy elksztettnk egy Assembly forrsfjlt PELDA.ASM

    nven, s hogy a programunk csak ebbol az llomnybl ll. A fordtst ekkor a

    TASM PELDA

    utasts kiadsval intzhetjk el. A fordts sorn valami ilyesmi jelenik meg a kpernyon:

    Turbo Assembler Version 4.0 Copyright (c) 1988, 1993 Borland International

    Assembling file: pelda.asm

    Error messages: None

    Warning messages: None

    Passes: 1

    Remaining memory: 355k

    Az Error messages: cmkju sor a hibk, a Warning messages: cmkju a figyelmez-tetsek, a Passes: cmkju pedig a menetek szmt mutatja; a None jelenti azt, ha nincshiba.

    Sikeres fordts esetn elkszl a PELDA.OBJ llomny (ez a trgykd). Most kvetkezika szerkeszts. Ehhez a kvetkezo utastst kell kiadni:

    TLINK PELDA

    Ennek hatsra (ha nem jelenik meg semmilyen figyelmezteto- vagy hibazenet) elkszl afuttathat llomny, ami a PELDA.EXE nevet kapja.

    Ha a szerkeszo a Warning: No stack zenetet jelenti meg, az azt jelenti, hogy nemhoztunk ltre a programban vermet. Ez elg gyakori hiba a tapasztalatlan Assembly-programozknl.Mivel veremre mindenkppen szksge van a programnak, srgosen javtsuk ki mulasztsunkat!

  • 8. fejezet

    Vezrlsi szerkezetek megvalstsa

    Ennyi elmlet utn ideje, hogy belefogjunk az Assembly programok rsba! Eloszr n-hny pldn keresztl megnzzk, hogy kdolhat le nhny gyakran hasznlt vezrlsi szerke-zet Assemblyben.

    8.1. Szekvencilis vezrlsi szerkezetA processzor mindig szekvencilis utasts-vgrehajtst alkalmaz, hacsak nem hasznlunk

    valamilyen vezrlstad utastst. Lssuk ht elso Assembly programunkat, ami nem sok hasz-nos dolgot csinl, de kezdsnek megteszi.

    Pelda1.ASM:

    MODEL SMALL

    .STACK

    ADAT SEGMENTKar DB aSzo DW "Ha"Szam DB 12hEred DW ?ADAT ENDS

    KOD SEGMENTASSUME CS:KOD,DS:ADAT

    @Start:MOV CX,ADATMOV DS,CXMOV BL,[Kar]MOV AX,[Szo]XOR BH,BHADD AX,BXSUB AL,[Szam]MOV [Ered],AX

  • 8.1. SZEKVENCILIS VEZRLSI SZERKEZET 38

    MOV AX,4C00hINT 21h

    KOD ENDSEND @Start

    A programban hrom szegmenst hozunk ltre: egy ADAT nevut az adatoknak, egy KODnevut az utastsoknak, illetve egy vermet. Utbbit a .STACK egyszerustett szegmensdefincisdirektva kszti el, a szegmens neve STACK, mrete 0400h (1 Kbjt) lesz. Ezt a direktvtegszti ki a MODEL, itt a memria-modellnek SMALL-t rtunk elo, ami annyit tesz, hogy akd- s az adatterlet mrete kln-kln max. 64 Kbjt lehet.

    Szegmensdefincit a szegmens nevbol s a SEGMENT direktvbl ll sorral kezdnk,ezt kveti a szegmens tartalmnak lersa. Lezrsknt a szegmens nevt s az azt kveto ENDSfoglalt szt tartalmaz sort rjuk. Azaz:

    Nv SEGMENT {attribtumok}defincikNv ENDS

    A SEGMENT kulcssz utn a szegmens jellemzoit meghatroz klnfle dolgokat rhatunkmg, ezek a szegmens illeszkedst (alignment), kombinlst (combine type), osztlyt (class),operandusmrett (operand size) s hozzfrsi mdjt (access mode) hatrozzk meg. Ezekkelegyelore mg ne trodjnk.

    Az adatszegmensben ngy vltozt hozunk ltre. Ebbol hromnak (Kar, Szo s Szam) kez-deti rtket is adunk, ezek teht inkbb hasonltanak a Pascal tpusos konstansaihoz. Vltoznakgy foglalhatunk helyet:

    Nv Dx Kezdetirtk

    ahol Dx helyn DB, DW, DD, DF, DQ s DT llhat (jelentsk Define Byte, Word, Doubleword,Farword, Quadword s Ten byte unit). Ezek sorban 1, 2, 4, 6, 8 ill. 10 bjtnyi terletet foglalnakle a Nv nevu vltoznak. A kezdeti rtk megadsnl rhatunk kznsges szmokat (12h),karakter-konstansokat (a), sztring-konstansokat ("Ha"), ezek valamilyen kifejezst, illetve hanem akarunk rtket adni neki, akkor egy ?-et is. A krdojellel definilt vltozkat a leg-tbb assembler 00h-val tlti fel, de az is megoldhat, hogy ezeket a terleteket ne trolja el afuttathat llomnyban, s indtskor ezek helyn valami vletlenszeru rtk legyen. Vesszovelelvlasztva tbb rtket is felsorolhatunk, ekkor mindegyik rtkhez egy jabb terlet lesz le-foglalva. gy pl. a kvetkezo plda 10 bjtot foglal le, a terlet elejre pedig a Valami cmke fogmutatni:

    Valami DB 1,2,#,"Szveg",6+4

    A kdszegmens megnyitsa utn jeleznnk kell az assemblernek, hogy ez valban kd-szegmens, illetve meg kell adnunk, hogy melyik szegmens szerint szmolja a memriahivatko-zsok offszetcmt. Mindezeket az ASSUME direktvval intzzk el. Az ASSUME direktvaszintaxisa:

    ASSUME SzegReg:SzegNvASSUME NOTHING

  • 8.1. SZEKVENCILIS VEZRLSI SZERKEZET 39

    A SzegReg valamilyen szegmensregisztert jelent, a SzegNev helyre pedig egy definilt szeg-mens vagy szegmenscsoport nevt, vagy a NOTHING kulcsszt rhatjuk. Utbbi esetben azadott szegmensregisztert egyetlen szegmenshez sem kti hozz, s nem ttelez fel semmit semaz adott regiszterrel kapcsolatban. Az ASSUME NOTHING minden elozo hozzrendelst meg-szntet.

    Rgtn ezutn egy cmke kvetkezik, aminek a @Start nevet adtuk. (A kukac most csakarra utal, hogy ez nem vltoz-, hanem cmkeazonost. Ennek hasznlata csak megszokskrdse, de ebben a jegyzetben az sszes cmke nevt a @ karakterrel fogjuk kezdeni.) Ren-deltetse az, hogy a program indulsnak helyt jelezze, erre az informcira ugyanis az as-semblernek, linkernek s az opercis rendszernek is szksge van. A cmke nmagban nemlesz elg, az indulsi cm kijellst a ksobb lert END direktva fogja elvgezni.

    Az elso utastst, ami vgrehajthat gpi kdot generl, a MOV (MOVe data) kpviseli. Ezkt operandussal rendelkezik: az elso a cl, a msodik a forrs (ez persze az sszes ktope-randus utastst jellemzi). Mukdse: egyszeruen veszi a forrs tartalmt, s azt bemsolja(eltrolja) a cl op. terletre. Ekzben a forrs tartalmt, ill. a flag-eket bkn hagyja, csak acl tartalma mdosul(hat). Operandusknt ltalnos regiszteren s memriahivatkozson kvlkonstans rtket (kifejezst) s szegmensregisztert is megadhatunk.

    Az elso kt sor az adatszegmens-regiszter (DS) tartalmt lltja be, hogy az ltalunk ltreho-zott ADAT-ra mutasson. Ezt nem teszi meg helyettnk az assembler annak ellenre sem, hogyaz ASSUME direktvban mr szerepel a DS:ADAT elors. Lthat, hogy az ADAT szegmenscmt eloszr betltjk egy ltalnos regiszterbe (CX), majd ezt bemozgatjuk DS-be. Viszonta MOV DS,ADAT utasts rvnytelen lenne, mert az Intel 8086-os processzor csak memriavagy ltalnos regiszter tartalmt tudja szegmensregiszterbe trakni, s ez a fordtott irnyra isvonatkozik (mellesleg pl. a MOV 1234h,DS utastsnak nem lenne semmi rtelme).

    Most jegyezznk meg egy fontos dolgot: CS tartalmt ilyen mdon nem tlthetjk fel (azaza MOV CS, . . . forma rvnytelen), csak a vezrlstad utastsok vltoztathatjk meg CS-t!Olvasni viszont lehet belole, gy pl. a MOV SI,CS helyes utasts lesz.

    A kvetkezo sor a Kar vltoz tartalmt BL-be rakja. Lthat, hogy a memriahivatkozsta szgletes zrjelpr jelzi. Ez egybknt j plda a kzvetlen cmzsre, a sort ugyanis azassembler a MOV BL,[0000h] gpi utastsra fordtja le. Ha jobban megnzzk, 0000h ponta Kar vltoz ADAT szegmensbeli offszetje. Ezrt van teht szksg az ASSUME direktvamegadsra, mert klnben az assembler nem tudta volna, hogy a hivatkozs mire is vonatkozik.

    AX-be hasonl mdon a Szo vltoz rtke kerl.A XOR BH,BH kicsit trkks dolgot muvel. Ha visszaemlksznk a KIZR VAGY rtk-

    tblzatra, akkor knnyen rjhetnk, hogy ha egy szmot nmagval hozunk KIZR VAGYkapcsolatba, akkor minden esetben nullt kapunk. gy teht ez a sor megfelel a MOV BH,00hutastsnak, de ezt rhattuk volna mg SUB BH,BH-nak is. Teht mr hromflekppen tudunkkinullzni egy regisztert!

    Hogy vgre szmoljunk is valamit, az ADD AX,BX sszeadja a BX tartalmt az AX tartal-mval, majd az eredmnyt az AX-be teszi. Rviden: hozzadja BX-et az AX regiszterhez. Amuvelet elvgzse sorn belltja az OF, SF, ZF, AF, PF s CF flag-eket.

    Kitallhat, hogy a kvetkezo sorban a Szam vltoz tartalmt vonjuk le az AL regiszterbol,a SUB (SUBtract) ugyanis a forrs tartalmt vonja ki a clbl.

    Mind az ADD, mind a SUB utastsra igaz, hogy operandusknt ltalnos regisztert, mem-riahivatkozst s kzvetlen (konstans) rtket kaphatnak.

    Szmolsunk eredmnyt el is kell tenni, ezt vgzi el a MOV [Ered],AX sor.Ha befejeztk dolgunkat, s ki akarunk lpni a programbl, akkor errol az aktulis oper-

    cis rendszert (ez most a DOS) kell rtesteni, s az majd cselekedni fog. Ezt vgzi el programunk

  • 8.2. SZMLLSOS ISMTLSES VEZRLS 40

    utols kt sora. Magyarzatkppen csak annyit, hogy a 21h szoftver-megszakts alatt rhetjkel a DOS funkciit, ennek 4Ch szm szolgltatsa jelenti a programbl val kilpst (vagymskppen a program befejezst, terminlst). A szolgltats szmt AH-ban kell megad-nunk, AL-be pedig egy visszatrsi rtket, egyfajta hibakdot kell rni (ez lesz az ERROR-LEVEL nevu vltoz rtke a DOS-ban). A megszaktst az egyoperandus INT (INTerruptrequest) utasts vltja ki, s ezzel a program futsa befejezodik. Az INT operandusa csak egybjt mretu kzvetlen rtk lehet. A megszaktsok hasznlatt ksobb trgyaljuk, most egye-lore fogadjuk el, hogy gy kell befejezni a programot. (Persze mskppen is lehetne, de mostgy csinljuk.)

    Az aktulis forrsfjlt az END direktvval kell lezrni, klnben az assembler morcos lesz.Ha ez a fo forrsfjl, azaz ez tartalmazza azt a programrszt, aminek el kell indulnia a programbetltse utn, akkor az END utn egy cmke nevnek kell szerepelnie. Az itt megadott cmrefog addni a vezrls a futtathat programfjl betltse utn.

    Vajon mi lett a szmols eredmnye? BL-be az a karaktert raktuk, ennek ASCII kdja61h. A Szo rtknek megadshoz tudni kell, hogy a sztring-konstansokat is helyirtkesrendszerben rtelmezi az assembler, 256-os alap szmknt tekintve oket. Ezrt a Szo tartalma4861h. Az sszeads utn gy 4861h+ 61h = 48C2h lesz AX-ben. Ebbol mg levonjuk a Szamtartalmt (12h), s ezzel kialakul a vgeredmny: 48B0h.

    8.2. Szmllsos ismtlses vezrlsMagas szintu nyelvekben igen gyakran alkalmaznak olyan ciklusokat, ahol a ciklusvltoz

    egy bizonyos tartomnyt fut be, s a ciklus magja a tartomny minden rtkre lefut egyszer.Ezt valstjk meg a klnfle FOR utastsok.

    Assemblyben is md nylik szmllsos ismtlses vezrlsre, viszont van nhny megk-ts a tbbi nyelvvel szemben: ciklusvltoznak csak CX hasznlhat, s nem adhat meg aciklusvltoz ismtlsi tartomnya, csak a lefutsok szmt rhatjuk elo.

    A kvetkezo program kt vektor (egydimenzis tmb) tartalmt sszegzi egy harmadik vek-torba. Az egyik vektor elojeles bjtokbl, mg a msik elojeles szavakbl fog llni.

    Pelda2.ASM:

    MODEL SMALL

    .STACK

    ADAT SEGMENTElemSzam EQU 5Vekt1 DB 6,-1,17,100,-8Vekt2 DW 1000,1999,-32768,4,32767Eredm DW ElemSzam DUP (?)ADAT ENDS

    KOD SEGMENTASSUME CS:KOD,DS:ADAT

    @Start:MOV AX,ADATMOV DS,AX

  • 8.2. SZMLLSOS ISMTLSES VEZRLS 41

    MOV CX,ElemSzamXOR BX,BXMOV SI,BX

    @Ciklus:MOV AL,[Vekt1+BX]CBWADD AX,[Vekt2+SI]MOV [Eredm+SI],AXINC BXLEA SI,[SI+2]LOOP @CiklusMOV AX,4C00hINT 21h

    KOD ENDSEND @Start

    Az elso jdonsgot az adatszegmensben szereplo EQU (define numeric EQUate) kulcsszkpviseli. Ez a fordtsi direktva numerikus konstanst (pontosabban helyettesto makrt) tudltrehozni, ezrt leginkbb a C nyelv #define utastshoz hasonlthat. Hatsra az ElemSzamszimblum minden elofordulst az EQU jobb oldaln ll kifejezs rtkvel (5) fogja helyet-testeni az assembler.

    Az eredmny vektor nyilvn ugyanolyan hossz lesz, mint a kt kiindul vektor, tpusaszerint szavas lesz. Szmra a helyet a kvetkezokppen is lefoglalhattuk volna:

    Eredm DW 0,0,0,0,0

    Ez a megolds azonban nem tl rugalmas. Ha ugyanis megvltoztatjuk az ElemSzam rtkt,akkor az Eredm defincijhoz is hozz kell nylni, illetve ha nagy az elemek szma, akkor sokfelesleges 0-t vagy krdojelet kell kirnunk. Ezeket a knyelmetlensgeket sznteti meg a dup-likl opertor. A DUP (DUPlicate) hatsra az opertor bal oldaln ll szm (ElemSzam),adott tpus (DW) elemekbol ll terlet lesz lefoglalva, amit az assembler a DUP jobb oldalnzrjelben szereplo kifejezssel (most ?) inicializl (azaz ez lesz a kezdortk). Ez a mdszerteht jval leegyszerusti a nagy vltozterletek ltrehozst is.

    A ciklusvltoz szerept a CX regiszter tlti be, ami nem vletlen, hiszen a regiszter neve isinnen szrmazik (Counter).

    A vektorelemek elrsre most nem hasznlhatunk kzvetlen cmzst, hiszen azzal csak avektorok legelso elemt tudnnk kivlasztani. Ehelyett kt megolds knlkozik: minden adat-terlethez hozzrendelnk egy-egy pointert (mutatt), vagy pedig valamilyen relatv cmzstalkalmazunk.

    A pointeres megoldsnak akkor van