You are on page 1of 138

Assembly Programozs

Rodek Lajos Dis Gbor

Tartalomjegyzk
brk jegyzke Tblzatok jegyzke El osz Ajnlott irodalom 1. Az Assembly nyelv jelent osge 2. A PC-k hardvernek felptse 3. Szmrendszerek, gpi adatbrzols 4. A 8086-os processzor jellemz oi 4.1. Memriakezels . . . . . . . . . . . . 4.2. Regiszterek . . . . . . . . . . . . . . 4.3. Adattpusok . . . . . . . . . . . . . . 4.4. Memriahivatkozsok, cmzsi mdok 4.4.1. Kzvetlen cmzs . . . . . . 4.4.2. Bziscmzs . . . . . . . . . 4.4.3. Indexcmzs . . . . . . . . . 4.4.4. Bzis+relatv cmzs . . . . 4.4.5. Index+relatv cmzs . . . . 4.4.6. Bzis+index cmzs . . . . . 4.4.7. Bzis+index+relatv cmzs 4.5. Veremkezels . . . . . . . . . . . . . 4.6. I/O, megszakts-rendszer . . . . . . . 5. Az Assembly nyelv szerkezete, szintaxisa 6. A 8086-os processzor utastskszlete 6.1. Prexek . . . . . . . . . . . . . . . . . . 6.1.1. Szegmensfellbrl prexek . . 6.1.2. Buszlezr prex . . . . . . . . 6.1.3. Sztringutastst ismtl o prexek 6.2. Utastsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4 7 13 13 14 17 18 18 18 18 18 18 18 18 20 23 24 29 29 29 30 30 30

TARTALOMJEGYZK

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 31 31 32 32 32 32 33 33 33 35 37 37 40 43 48 52 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 56 60 62 64 67 67 69 70 73 75 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 81 82 84 85 86 88 90 91 92 96 99

6.2.1. 6.2.2. 6.2.3. 6.2.4. 6.2.5. 6.2.6. 6.2.7. 6.2.8. 6.2.9. 6.2.10.

Adatmozgat utastsok . . . . . Egsz szmos aritmetika . . . . Bitenknti logikai utastsok . . Bitlptet o utastsok . . . . . . . Sztringkezel o utastsok . . . . BCD aritmetika . . . . . . . . . Vezrlstad utastsok . . . . Rendszervezrl o utastsok . . . Koprocesszor-vezrl o utastsok Specilis utastsok . . . . . . .

7. Assembly programok ksztse 8. Vezrlsi szerkezetek megvalstsa 8.1. Szekvencilis vezrlsi szerkezet 8.2. Szmllsos ismtlses vezrls 8.3. Szelekcis vezrls . . . . . . . 8.4. Eljrsvezrls . . . . . . . . . 9. A Turbo Debugger hasznlata 10. Szmols el ojeles szmokkal 10.1. Matematikai kifejezsek kirtkelse 10.2. BCD aritmetika . . . . . . . . . . . 10.3. Bitforgat utastsok . . . . . . . . 10.4. Bitmanipull utastsok . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

11. Az Assembly s a magas szintu nyelvek 11.1. Paramterek tadsa regisztereken keresztl 11.2. Paramterek tadsa globlisan . . . . . . . 11.3. Paramterek tadsa a vermen keresztl . . 11.4. Loklis vltozk megvalstsa . . . . . . . 12. Muveletek sztringekkel 13. Az .EXE s a .COM programok, a PSP 13.1. A DOS memriakezelse . . . . . . 13.2. ltalban egy programrl . . . . . . 13.3. Ahogy a DOS indtja a programokat 13.4. .COM llomnyok . . . . . . . . . . 13.5. Relokci . . . . . . . . . . . . . . 13.6. .EXE llomnyok . . . . . . . . . . 14. Szoftver-megszaktsok 14.1. Szvegkirats, billenty uzet-kezels 14.2. Szveges kperny o kezelse . . . . 14.3. Munka llomnyokkal . . . . . . . 14.4. Grakus funkcik hasznlata . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

TARTALOMJEGYZK

102 103 107 111 114 116 120 125 130

15. Hardver-megszaktsok, rezidens program 15.1. Szoftver-megszakts tirnytsa . . . . . . . . . . . . . . . . . . . . . . . . 15.2. Az id ozt o (timer) programozsa . . . . . . . . . . . . . . . . . . . . . . . . 15.3. Rezidens program ksztse . . . . . . . . . . . . . . . . . . . . . . . . . . . 16. Kivtelek A. tvlts klnfle szmrendszerek kztt B. Karakter kdtblzatok Trgymutat Irodalomjegyzk

brk jegyzke
2.1. 3.1. 3.2. 3.3. 3.4. 4.1. 4.2. 9.1. A PC-k felptse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A NOT m uvelet igazsgtblja . Az AND m uvelet igazsgtblja Az OR m uvelet igazsgtblja . A XOR m uvelet igazsgtblja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 8 8 8 9 16 16 54

Az AX regiszter szerkezete . . . . . . . . . . . . . . . . . . . . . . . . . . . A Flags regiszter szerkezete . . . . . . . . . . . . . . . . . . . . . . . . . . A Turbo Debugger kperny oje . . . . . . . . . . . . . . . . . . . . . . . . .

Tblzatok jegyzke
8.1. 8.2. 8.3. 14.1. 14.2. 14.3. 14.4. El ojeles aritmetikai feltteles ugrsok . . . . . . . . . . . . . . . . . . . . . El ojeltelen aritmetikai feltteles ugrsok . . . . . . . . . . . . . . . . . . . . Specilis feltteles ugrsok . . . . . . . . . . . . . . . . . . . . . . . . . . . Gyakran hasznlt szoftver-megszaktsok . . . llomny- s lemezkezel o DOS-szolgltatsok Standard I/O eszkzk handle rtke . . . . . . Sznkdok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 45 46

. 91 . 98 . 98 . 101

16.1. A 8086-os processzoron ltez o kivtelek . . . . . . . . . . . . . . . . . . . . 115 A.1. B.1. B.2. tvlts a 2-es, 8-as, 10-es s 16-os szmrendszerek kztt . . . . . . . . . . 116 ASCII s EBCDIC vezrl okdok . . . . . . . . . . . . . . . . . . . . . . . . 120 ASCII s EBCDIC karakterkdok . . . . . . . . . . . . . . . . . . . . . . . 121

El osz
Valami . . .

Ajnlott irodalom
A kvetkez o lista tartalmazza azon m uvek adatait, amelyek elolvassa el osegt(het)i a jegyzet knnyebb megrtst: 1. Peth o dm: Assembly alapismeretek 1. ktet, Szmalk, Budapest, 1992 2. Peter Norton John Socha: Az IBM PC Assembly nyelv u programozsa, Novotrade, Budapest, 1991 3. Peter Norton: Az IBM PC programozsa, M uszaki Knyvkiad, Budapest, 1992 4. Lszl Jzsef: A VGA-krtya programozsa Pascal s Assembly nyelven, ComputerBooks, 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 kezd oknek, az Assemblyvel most ismerked oknek valk. A (4) s (5) knyvek a hardverrel foglalkoznak, az Assemblyt ezekb ol nem fogjuk megtanulni. Vgl a (6) egy referenciaknyv, gy ezt f oleg az Assemblyben mr jrtas, de mlyebb ismeretekre vgyknak ajnljuk.

1. fejezet

Az Assembly nyelv tulajdonsgai, jelent osge


A szmtgpes problmamegolds sorn a kit uztt clt megvalst algoritmust mindig valamilyen programozsi nyelven (programming language) rjuk, kdoljuk le. A nyelvet sokszor az 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 alapjn csoportosthatk a szmtgpes programozsi nyelvek: megklnbztetnk alacsony szintu (low-level) s magas szintu programozsi nyelveket (high-level programming language). Az el obbire j pldk az Assembly s rszben a C, az utbbira pedig a Pascal ill. a BASIC nyelvek. Ha a nyelvek szolgltatsait tekintjk, akkor szembetl o, hogy ahogy egyre fentebb haladunk az alacsony szint u nyelvekt ol a magas szint uek fel, gy egyre nagyobb szabadsggal, egyre ltalnosabb megoldsokkal tallkozunk. Az Assembly teht egy alacsony szint u programozsi nyelv, mghozz nagyon alacsony szint u, ebb ol kvetkez oen pedig sokkal kzelebb ll a hardverhez, mint brmely ms nyelv. F obb jellemz oi: nagyon egyszer u, elemi m uveletek tpustalansg rgztett utastskszlet vilgos, egyszer u szintaxis kevs vezrlsi szerkezet nagyon kevs adattpus; ha tbb is van, akkor ltalban egymsbl szrmaztathatk valahogyan De mirt is van szksg az Assemblyre, ha egyszer ott van a tbbi nyelv, amikben jval knyelmesebben programozhatunk? Erre egyik indok, hogy a magas szint u nyelvek eljrsai, fggvnyei sokszor ltalnosra lettek megrva, gy teljesen feleslegesen foglalkoznak olyan dolgokkal, amikre esetleg soha sem lesz szksgnk. Erre j pldk lehetnek a Borland Pascal/C grakus eljrsai, valamint ki-/bemeneti (I/O) szolgltatsai. Krt rajzolhatunk a Circle eljrssal is, de ennl gyorsabb megoldst kapunk, ha vesszk a fradsgot, s mi magunk runk

2 egy olyan krrajzolt, ami semmi mst nem csinl, csak ami a feladata: helyesen kirajzolja a krt a kperny ore, de nem foglalkozik pl. hibaellen orzssel, a kperny o szln kvlre kerl o pontok kisz ursvel stb. Hasonl a helyzet a fjlkezelssel is. Ha nem akarunk specilis tpusokat (mondjuk objektumokat, rekordokat) llomnyba rni, mindssze valahny bjtot szeretnnk beolvasni vagy kirni a lemezre, akkor felesleges a fenti nyelvek rutinjait hasznlni. Mindkt feladat 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 megadni: magasabb szint u nyelvekben a legtbb problma gyorsabban lerhat, a forrs rvidebb, strukturltabb, s ezltal ttekinthet obb lesz, knnyebb lesz a ks obbiekben a program karbantartsa, s ez nem csak a program szerz ojre vonatkozik. Mgsem mell ozhetjk az Assemblyt, sok dolgot ugyanis vagy nagyon nehz, vagy egyszer uen kptelensg megcsinlni ms nyelvekben, mg Assemblyben nmi energia befektetse rn ezek is megoldhatk. Aki Assemblyben akar programozni, annak nagyon elszntnak, trelmesnek, kitartnak kell lennie. A hibalehet osgek ugyanis 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 is kellett valahogy dolgozni az embereknek. Ez egy gpi kdnak (machine code) nevezett nyelven trtnt. A gpi kd a processzor sajt nyelve, csak s kizrlag ezt rti meg. Ez volt m a fraszt dolog! A gpi kd ugyanis nem ms, mint egy raks szm egyms utn rva. Akinek ebben kellett programozni, annak fejb ol tudnia kellett az sszes utasts sszes lehetsges vltozatt, ismernie kellett a rendszert teljes mrtkben. Ha egy kvlll rtekintett egy gpi kd programra, akkor annak m ukdsb ol, jelentsb ol jobbra semmit sem rtett meg. Nzznk egy pldt: 0B8h 34h 12h // 0F7h 26h 78h 56h // 0A3h 78h 56h, ahol a dupla trtvonal az utastshatrt jelzi. Ez a tz hexadecimlis (tizenhatos szmrendszerbeli) szm nem mond tl sokat els o rnzsre. ppen ezrt kidolgoztak egy olyan jellsrendszert, nyelvet, amiben emberileg emszthet o formban lerhat brmely gpi kd program. Ebben a nyelvben a hasonl folyamatot vgrehajt gpi kd utastsok csoportjt egyetlen szval, az .n. mnemonikkal (mnemonic) azonostjk. Termszetesen van olyan mnemonik is, ami egyetlen egy utastsra vonatkozik. Ez a nyelv lett az Assembly. Ebben az j jellsrendszerben a fenti programrszlet a kvetkez o formt lti:
MOV MUL MOV AX,1234h WORD PTR [5678h] [5678h],AX ;0B8h 34h 12h ;0F7h 26h 78h 56h ;0A3h 78h 56h

Nmi magyarzat a programhoz: az els o sor egy szmot (1234h) rak be az AX regiszterbe, amit most tekinthetnk mondjuk egy specilis vltoznak a msodik sor a fenti rtket megszorozza a memria egy adott cmn (5678h) tallhat rtkkel a harmadik sor az eredmnyt berakja az el obbi memriarekeszbe a pontosvessz o utni rsz csak megjegyzs az els o oszlop tartalmazza a mnemonikot a memriahivatkozsokat szgletes zrjelek ( [ s ] ) kz rjuk

3 Teht a fenti hrom sor egy vltoz tartalmt megszorozza az 1234h szmmal, s az eredmnyt visszarakja az el obbi vltozba. Mik az Assembly el onyei? korltlan hozzfrsnk van a teljes hardverhez, belertve az sszes perifrit (billenty uzet, nyomtat stb.) pontosan ellen orizhetjk, hogy a gp tnyleg azt teszi-e, amit elvrunk t ole 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 szerz onek is a kdols nagy gyelmet, trelmet, s f oleg id ot ignyel sok a hibalehet osg a hardver alapos ismerete elengedhetetlen a forrs nem hordozhat (nem portolhat), azaz ms alapokra pl o szmtgpre trs nlkl nem vihet o t (ez persze igaz a gpi kdra is) Br gy t unhet, tbb htrnya van mint el onye, mgis rdemes alkalmazni az Assemblyt ott, ahol ms eszkz nem segt. A befektetett er ofesztsek pedig meg fognak trlni.

2. fejezet

A PC-k hardvernek felptse


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

MEMRIA
CM
ADAT

PORTOK

CPU
REGISZTEREK
MEGSZAKTSKRELEM

PERIFRIK
2.1. bra. A PC-k felptse Az els o IBM PC az Intel 8086-os mikroprocesszorval jelent meg, s hamarosan kvette az IBM PC XT, ami mr Intel 8088-os maggal ketyegett. Ks obb beksznttt az AT-k id oszaka, 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 II stb.) Nem csak az Intel gyrt processzorokat PC-kbe, de az sszes tbbi gyrt termkre jellemz o, hogy (elvileg) 100%-osan kompatibilis az Intel gyrtmnyokkal, azaz ami fut Intel-en, az ugyangy elfut a msik procin is, s viszont. Az sszes ks obbi processzor alapja tulajdonkppen a 8086-os volt, ppen ezrt mondjk azt, hogy a processzorok ezen csaldja az Intel

5 80x86-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 az adatbuszuk szlessge: a 8086 16 bites, mg a 8088-as 8 bites kls o adatbusszal rendelkezik.) A 2.1. brn a CPU jelli a processzort (Central Processing Unit kzponti feldolgoz egy a gp agya, de persze gondolkodni nem tud, csak vgrehajtja, amit sg). Mint neve is mutatja, o parancsba adtak neki. A CPU-n tbbek kztt tallhat nhny klnleges, kzvetlenl elrhet o trolhely. Ezeket regisztereknek (register) nevezzk. A processzor m ukds kzbeni jraindtst resetnek hvjuk. (Az angol reset sz egyik magyar jelentse az utnllt, bellt, de a szmtstechnikban ltalban jraindtsknt fordtjk.) Reset esetn a processzor egy jl meghatrozott llapotba kerl (pl. minden regiszterbe valamilyen rgztett rtk lesz betltve). A szmtgp bekapcsolsakor is lezajlik a reset. Az jraindts egy nomabb fajtja az inicializls vagy rviden init (initialization, init). Az init sorn nhny regiszter rtke meg orzsre kerl, a reset-t ol eltr oen. A memria adja a szmtgp emlkezett. Hasonlan az emberi memrihoz, van neki felejt o (az informcit csak bizonyos ideig meg orz o) s emlkez o vltozata. Az el obbi neve RAM (Random Access Memory vletlen hozzfrs u memria), mg az utbbi ROM (Read Only Memory csak olvashat memria). A ROM fontos rszt kpezi az .n. BIOS (Basic Input/Output System alapvet o ki-/bemeneti rendszer). A gp bekapcsolsa (s reset) utn a BIOS-ban lev o egyik fontos program indul el el oszr (pontosabban minden processzort gy terveznek, hogy a BIOS-t kezdje el vgrehajtani ilyenkor). Ez leellen orzi a hardverelemeket, teszteli a memrit, megkeresi a jelenlev o perifrikat, majd elindtja az opercis rendszert, ha lehet. A BIOS ezenkvl sok hasznos rutint tartalmaz, amikkel vezrelhetjk pldul a billenty uzetet, videokrtyt, merevlemezt stb. Busznak (bus) nevezzk vezetkek egy csoportjt, amik bizonyos specilis clt szolglnak, s a CPU-t ktik ssze a szmtgp tbbi fontos rszvel. Megklnbztetnk adat-, cmill. vezrl obuszt (data bus, address bus, control bus). A cmbusz szlessge (amit bitekben ill. a vezetkek szmban mrnk) hatrozza meg a megcmezhet o memria maximlis nagysgt. A CPU a perifrikkal (pl. hangkrtya, videovezrl o, DMA-vezrl o, nyomtat stb.) az ket egyfajta tjrnak is.) Ezeket egy .n. portokon keresztl kommunikl. (Tekinthetjk o szm azonostja, de ne gy kpzeljk el, hogy annyi vezetk van bektve, ahny port van. Egyszer uen, ha egy eszkzt el akar rni a CPU, akkor kirja a cmbuszra a port szmt, s ha ott van eszkz (teht egy eszkz arra van belltva, hogy erre a portszmra reagljon), akkor az vlaszol neki, s a kommunikci megkezd odik. Azonban nem csak a CPU szlhat valamelyik eszkzhz, de azok is jelezhetik, hogy valami mondanivaljuk van. Erre szolgl a megszakts-rendszer (interrupt system). Ha a CPU rzkel egy megszakts-krelmet (IRQ Interrupt ReQuest), akkor abbahagyja az ppen aktulis munkjt, s kiszolglja az adott eszkzt. A megszaktsok el oszr a megszakts-vezrl ohz (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 lehet osge a megszakts-krsre. Ha egy perifria hasznl egy megszakts-vonalat, akkor azt kizrlagosan birtokolja, teht ms eszkz nem krhet megszaktst ugyanazon a vonalon. A fentebb felsorolt rendszerelemek (CPU, memria, megszakts-vezrl o, buszok stb.) s mg sok minden ms egyetlen ramkri egysgen, az .n. alaplapon (motherboard) tallhat. Van mg hrom fontos eszkz, amikr ol rdemes szt ejteni. Ezek az rajel-genertor, az id ozt o s a DMA-vezrl o. A CPU s a perifrik m ukdst szablyos id okznknt megjelen o elektromos impulzusok vezrlik. Ezeket nevezik rajelnek (clock, clocktick), msodpercenknti darabszmuk

6 mrtkegysge a Hertz (Hz). gy egy 4.77 MHz-es rajel msodpercenknt 4770000 impulzust jelent. Az rajelet egy kvarckristlyon alapul rajel-genertor (clock generator) lltja el o. A RAM memrik minden egyes memriarekeszt folyamatosan ki kell olvasni s vissza kell rni msodpercenknt tbbszr is, klnben tnyleg felejt ov vlna. Erre a frisstsnek (memory refresh) nevezett m uveletre felptsk miatt van szksg. (A korrektsg kedvrt: ez csak az .n. dinamikus RAM-okra, avagy DRAM-okra igaz.) A m uveletet pontos id okznknt kell vgrehajtani, ezt pedig egy klnleges egysg, az id ozt o (timer) intzi el. Ennek egyik dolga az, hogy kb. 15.09 s-onknt elindtsa a frisstst (ez nagyjbl 66287 db. frisstst jelent msodpercenknt). Ezenkvl a rendszerrt (system clock) is ez a szerkezet szinkronizlja. A memria elrse a CPU-n keresztl igen lass tud lenni, radsul erre az id ore a processzor nem tud mssal foglalkozni. E clbl bevezettk a kzvetlen memria-hozzfrs (DMA Direct Memory Access) mdszert. Ez gy m ukdik, hogy ha egy perifrinak szksge van valamilyen adatra a memribl, vagy szeretne valamit berni oda, akkor nem a CPUnak szl, hanem a DMA-vezrl onek (DMA controller), s az a processzort kikerlve elintzi a krst.

3. fejezet

Szmrendszerek, gpi adatbrzols, aritmetika s logika


Az emberek ltalban tzes (decimlis decimal) szmrendszerben szmolnak a mindennapjaik sorn, hiszen ezt tantottk nekik, s ez az elfogadott konvenci a vilgon. A processzort azonban (de a tbbi hardversszetev ot, pl. a memrit is) feleslegesen tlbonyoltan, ha neki is ezekkel a szmokkal kellene dolgoznia. Ennl jval egyszer ubb s kzenfekv o megolds, ha kettes alap (binris binary) szmrendszerben kezel minden adatot. Az informci alapegysge gy a binris szmjegy, a bit (BInary digiT) lesz, ezek pedig a 0 s az 1. Binris szmok brzolsakor ugyangy helyirtkes felrst hasznlunk, mint a decimlis szmok esetn. Pl. a 10011101 binris szmnak 128 + 16 + 8 + 4 + 1 = 157 az rtke. Az egyes helyirtkek jobbrl balra 2-nek egyms utn kvetkez o hatvnyai, teht 1, 2, 4, 8, 16, 32 stb. Ha sokszor dolgozunk binris szmokkal, akkor nem rt, ha a hatvnyokat fejb ol tudjuk a 0-diktl a 16-odikig. Egy-egy arnylag kicsi szm binris lershoz sok 0-t s 1-et kell egyms mell raknunk, ez pedig nha fraszt. Ezt kikszblend o a szmokat sokszor rjuk tizenhatos alap (hexadecimlis hexadecimal) szmrendszerben. Itt a szmjegyek a megszokott 10 arab szmjegy, plusz az angol (latin) bc els o hat bet uje (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. Az el oz o plda alapjn 10011101b = 9Dh = 157d. Ahhoz, hogy mindig tudjuk, a lert szmot milyen alap rendszerben kell rtelmezni, a szm utn runk egy b, h vagy d bet ut. Ha nem jelljk kln, akkor ltalban a tzes szmrendszert hasznljuk. Szoks mg nha a nyolcas alap (oktlis octal) felrst is alkalmazni. Ekkor a 0 7 szmjegyeket hasznljuk, s 3 binris jegy tesz ki egy oktlis szmjegyet. Az oktlis szmok vgre o bet ut runk. Most eleventsk fel a legegyszer ubb, kzismert logikai m uveleteket. Ezek ugyanis fontos szerepet jtszanak mind a programozs, mind a processzor szempontjbl. A kt logikai igazsgrtket itt most binris szmjegyek fogjk jellni. Megszokott dolog, hogy 1 jelenti az igaz rtket. A negci (tagads negation) egyvltozs (unris) m uvelet, eredmnye a bemeneti igazsgrtk ellentettje. A m uveletet jellje NOT az angol tagads mintjra. Hatsa a 3.1. brn lthat. A konjunkci (S) mr ktvltozs (binris) m uvelet. Jele AND (az s angolul), eredmnyt a 3.2. bra szemllteti:

8 NOT 0 1

1 0

3.1. bra. A NOT m uvelet igazsgtblja AND 0 1 0 0 0 1 0 1

3.2. bra. Az AND m uvelet igazsgtblja A diszjunkci (VAGY) szintn binris m uvelet. Jele OR (a vagy angolul), s a kt VAGY m vltozn MEGENGEDO uveletet hajt vgre. Igazsgtblja a 3.3. brn lthat. OR 0 1 0 0 1 1 1 1

3.3. bra. Az OR m uvelet igazsgtblja Utols m uveletnk az antivalencia (KIZR VAGY, az ekvivalencia tagadsa). Jele az XOR (eXclusive OR), hatsa a 3.4. brn kvethet o. A legtbb processzor kizrlag egsz szmokkal tud szmolni, esetleg megenged racionlis (vals) rtkeket is. Az brzolhat szmok tartomnya mindkt esetben vges, ezt ugyanis a processzor regisztereinek bitszlessge hatrozza meg. A szmtstechnikban a legkisebb brzolhat informcit a bit kpviseli, de mindenhol az ennl nagyobb, egszen pontosan 8 db. bitb ol ll bjtot (byte) hasznljk az adatok alapegysgeknt, s pl. a regiszterek s az adatbusz szlessge is ennek tbbszrse. Szoks mg ms, a bjt fogalmra pl o mrtkegysget is hasznlni, ilyen a sz (word; ltalban 2 vagy 4 bjt), a duplasz (doubleword; a sz mretnek ktszerese) s a kvadrasz (quadword; kt duplasz mret u). A bjt als ill. fels o felnek (4 bitjnek) neve nibble (ez egy angol kifejezs, s nincs magyar megfelel oje). gy beszlhetnk als s fels o nibble-r ol. 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) el ottszavak a megszokott 1000 s 1000000 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 jelenti, hogy nincs egyrtelm uen rgztve a tbb bjt hossz adatok brzolsa sorn az egyes bjtok memriabeli sorrendje. Kt logikus verzi ltezik: a legkevsb rtkes bjttal kezdnk, s a memriacm nvekedsvel sorban haladunk a legrtkesebb bjt fel (little-endian trols), ill. ennek a fordtottja, teht a legrtkesebbt ol haladunk a legkevsb rtkes bjt fel (big-endian trols). Mindkt megoldsra tallhatunk pldkat a klnbz o hardvereken. Nzzk meg, hogy brzoljuk az egsz szmokat. El oszr ttelezzk fel, hogy csak nemnegatv (el ojeltelen unsigned) szmaink vannak, s 1 bjtot hasznlunk a felrshoz. Nyolc biten 0 s 255 (= 28 1) kztt brmilyen szm felrhat, ezrt az ilyen szmokkal nincs gond.

9 XOR 0 1 0 0 1 1 1 0

3.4. bra. A XOR m uvelet igazsgtblja Ha negatv szmokat is szeretnnk hasznlni, akkor kt lehet osg addik: csak negatv szmokat brzolunk az brzolsi tartomnyt kiterjesztjk a nemnegatv szmokra is Ez utbbi mdszert szoktk vlasztani, s a tartomnyt praktikus mdon gy hatrozzk meg, hogy a pozitv s negatv szmok nagyjbl azonos mennyisgben legyenek. Ez esetnkben azt jelenti, hogy 128-tl +127-ig tudunk szmokat felrni (belertve a 0-t is). De hogy klnbztessk meg a negatv szmokat a pozitvaktl? Termszetesen az el ojel (sign) ltal. Mivel ennek kt rtke lehet (ha a nullt pozitvnak tekintjk), trolsra elg egyetlen bit. Ez a kitntetett bit az el ojelbit (sign bit), s megegyezs szerint az adat legrtkesebb (most signicant), azaz legfels o bitjn helyezkedik el. Ha rtke 0, akkor a tekintett el ojeles (signed) szm pozitv (vagy nulla), 1 esetn pedig negatv. A fennmarad biteken (esetnkben az als 7 bit) pedig troljuk magt a szmot el ojele nlkl. Megtehetnnk, hogy azonos mdon kezeljk a pozitv s negatv szmokat is, de knyelmi szempontok s a matematikai m uveleti tulajdonsgok fenntartsa vgett a negatv szmok ms alakban kerlnek lersra. Ez az alak az .n. kettes komplemens (2s complement). Ennek kiszmtsa majdnem trivilis, egyszer uen ki kell vonni a szmot a 0-bl. (Ehhez persze ismerni kell a kivons szablyait, amiket albb ismertetnk.) Egy msik mdszerhez vezessk be az egyes komplemens (1s complement) fogalmt is. Ezt gy kpezzk brmilyen rtk u bjt (sz stb.) esetn, hogy annak minden egyes bitjt negljuk (invertljuk). Ha vesszk egy tetsz oleges szm egyes komplemenst, majd ahhoz hozzadunk 1-et (az sszeadst az albbiak szerint elvgezve), akkor pont az adott szm kettes komplemenst kapjuk meg. Egy szm kettes komplemensnek kettes komplemense a kiindul szmot adja vissza. Ilyen mdon 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 (el ojeltelen vagy el ojeles pozitv) = 00000000b 1 (el ojeltelen vagy el ojeles pozitv) = 00000001b 2 (el ojeltelen vagy el ojeles pozitv) = 00000010b 127 (el ojeltelen vagy el ojeles pozitv) = 01111111b 128 (el ojeltelen) = 10000000b 255 (el ojeltelen) = 11111111b 1 (el ojeles negatv) = 11111111b 2 (el ojeles negatv) = 11111110b 127 (el ojeles negatv) = 10000001b

10 128 (el ojeles negatv) = 10000000b Lthatjuk, hogy az el ojeltelen s el ojeles brzols tartomnyai kztt tfeds van (0 127), mg ms rtkek esetn tkzs ll fenn (128 255 ill. 1 128). Azaz a 11111111b szmot olvashatjuk 255-nek de akr 1-nek is! Ha nem bjton, hanem mondjuk 2 bjtos szban akarjuk trolni a fenti szmokat, akkor ezt gy 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 tkz o rsz itt is van (32768 65535 ill. 1 32768). Vgl megnzzk, hogy vgezhet ok el a legegyszer ubb matematikai m uveletek. A m uveletek kzs tulajdonsga, hogy az eredmny mindig hosszabb 1 bittel, mint a kt szm kzs hossza (gy tekintjk, hogy mindkett o tag azonos bitszlessg u). gy kt 1 bites szm sszege s klnbsge egyarnt 2 bites, mg kt bjt 9 bites lesz. A +1 bit tulajdonkppen az esetleges tvitelt trolja. Kt binris szmot ugyangy adunk ssze, mint kt decimlis rtket: 1. kiindulsi pozci a legalacsonyabb helyirtk u jegy, innen haladunk balra 2. az tvitel kezdetben 0 3. az aktulis pozciban lev o kt szmjegyet sszeadjuk, majd ehhez hozzadjuk az el oz o tvitelt (az eredmny kt jegy u binris szm lesz) 4. a ktbites eredmny als jegyt lerjuk az sszeghez, az tvitel pedig felveszi a fels o szmjegy rtkt 5. ha mg nem rtnk vgig a kt sszeadandn, akkor menjnk ismt a (3)-ra 6. az tvitelt mint szmjegyet rjuk hozz az sszeghez Az sszeadsi szablyok pedig a kvetkez oek: 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 ellen orizhetjk, hogy a fent denilt kettes komplemens alak valban teljesti azt az alapvet o algebrai tulajdonsgot, hogy egy szmnak s additv inverznek (teht 1szeresnek) 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. Az egyes komplemens is rendelkezik egy rdekes tulajdonsggal. Nevezetesen, ha sszeadunk egy szmot s annak egyes komplemenst, akkor egy csupa egyesekb ol ll szmot, azaz 1-et (avagy a legnagyobb el ojeltelen 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 klnbsgb ol. Ezek alapjn ugyancsak teljesl, hogy 1d 1d = 00000001b 00000001b = 0 00000000b azaz egy szmot nmagbl kivonva 0-t kapunk. Viszont lnyeges eltrs az el oz o esett ol (amikor a kettes komplemens alakot adtuk hozz a szmhoz), hogy itt sose keletkezik tvitel a m uvelet elvgzse utn. A kivons szablyainak ismeretben mr ellen orizhet o, hogy a kettes komplemenst valban helyesen deniltuk: 00000000b 00000001b = 1 11111111b A szorzs s az oszts mr macersabbak. Mindkt m uvelet elvgzse el ott meghatrozzuk az eredmny (szorzat ill. hnyados) el ojelt, majd az el ojeleket levlasztjuk a tagokrl. Mindkt m uveletet ezutn ugyangy vgezzk, mint ahogy papron is csinlnnk. Oszts alatt itt maradkos egsz osztst rtnk. A szorzat hossza a kiindul tagok hosszainak sszege, a hnyados az osztand s oszt hosszainak klnbsge, mg a maradk az osztand hosszt rkli. (Ezt azrt nem kell szigoran venni. Egy szt egy bjttal elosztva a hnyados nyudodtan hosszabb lehet 8 bitnl. Pl.: 0100h/01h = 0100.) A maradk el ojele az osztandval egyezik meg, tovbb teljesl, hogy a maradk abszolt rtkben kisebb mint az oszt abszolt rtke.

12 A m uveletek egy specilis csoportjt alkotjk a 2 hatvnyaival val szorzs s oszts. Ezeket kzs nven shiftelsnek (eltolsnak, lptetsnek) hvjuk. 2-vel gy szorozhatunk meg egy szmot a legegyszer ubben, ha a binris alakban utna runk egy 0-t. De ez megegyezik azzal az esettel, hogy minden szmjegy eggyel magasabb helyirtkre 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, mindannyiszor megszorozzuk 2-vel, vgeredmnyben teht 2-nek valamely hatvnyval szorozzuk meg. Ez a mdszer minden szmra alkalmazhat, legyen az akr negatv, akr pozitv. Hasonlan denilhat a jobbra shiftels is, csak itt a legfels o megresed o bitpozcit tltjk fel 0-val. Itt azonban felmerl egy bkken o, nevezetesen negatv szmokra nem fogunk helyes eredmnyt kapni. A problma az el ojelbitben keresend o, mivel az ppen a legfels o bit, amit pedig az el obb 0-val helyettestettnk. A gond megszntethet o, ha bevezetnk egy el ojeles s egy el ojel nlkli jobbra shiftelst. Az el ojeltelen vltozat hasonlan m ukdik a balra shiftelshez, az el ojelesnl pedig annyi a vltozs, hogy a legfels o bitet vltozatlanul hagyjuk (vagy ami ugyanaz, az eredeti el ojelbittel tltjk fel). Megjegyezzk, hogy az angol terminolgia megklnbzteti az sszeadskor keletkez o tvitelt a kivonsnl keletkez ot ol. Az el obbit carry-nek, mg az utbbit borrow-nak nevezik. Tlcsordulsrl (overow) beszlnk, ha a m uvelet eredmnye mr nem trolhat a kijellt helyen. Ez az aritmetikai m uveleteknl, pl. shiftelskor, szorzskor, osztskor fordulhat el o. Az 1 rtk u tvitel mindig tlcsordulst jelez. Egy el ojeles bjt el ojeles kiterjesztsn (sign extension) azt a m uveletet rtjk, mikor a bjtot sz mret u szmm alaktjuk t gy, hogy mindkett o ugyanazt az rtket kpviselje. Ezt gy vgezzk el, hogy a cl sz fels o bjtjnak minden bitjt a kiindul bjt el ojelbitjvel tltjk fel. Teht pl. a 3d = 11111101b szm el ojeles kiterjesztse az 11111111 11111101b szm lesz, mg a +4d = 00000100b szmbl 00000000 00000100b lesz. Ezt a fogalmat ltalnosthatjuk is: bjt kiterjesztse duplaszv, sz kiterjesztse duplaszv, kvadraszv stb. Az el oz ovel rokon fogalom az el ojeltelen kiterjeszts vagy ms nven zr-kiterjeszts (zero extension). Egy el ojeltelen bjt el ojeltelen kiterjesztsekor a bjtot olyan szv alaktjuk t, amely a bjttal megegyez o rtket tartalmaz. Ehhez a cl sz hinyz, fels o bjtjnak minden bitjt 0-val kell feltlteni. Teht pl. a 5d = 00000101b szm el ojeltelen kiterjesztse az 00000000 00000101b szm, mg a 128d = 10000000b szmot 00000000 10000000b alakra hozzuk. Ez a fogalom is ltalnosthat s rtelmezhet o szavakra, duplaszavakra stb. is.

4. fejezet

A 8086-os processzor jellemz oi, szolgltatsai


Ismerkedjnk most meg az Intel 8086-os mikroprocesszorral kzelebbr ol.

4.1. Memriakezels
A szmtgp memrijt gy tudjuk hasznlni, hogy minden egyes memriarekeszt megszmozunk. Azt a mdszert, ami meghatrozza, hogy hogyan s mekkora terlethez frhetnk hozz egyszerre, memria-szervezsnek vagy memria-modellnek nevezzk. Tbb elterjedt modell ltezik, kzlk a legfontosabbak a lineris s a szegmentlt modellek. Lineris modellen (linear memory model) azt rtjk, ha a memria teljes terletnek valamely bjtja egyetlen szmmal megcmezhet o (kivlaszthat). Ezt az rtket ekkor lineris memriacmnek (linear memory address) nevezzk. Az elrhet o (hasznlhat) lineris cmek tartomnyt egy szval cmterletnek (address space) hvjuk. Szegmensen (segment) a memria egy sszefgg o, rgztett nagysg darabjt rtjk most (ltezik egy kicsit msfle szegmens-fogalom is), ennek kezd ocme (teht a szegmens legels o bjtjnak memriacme) a szegmens bziscm avagy szegmenscm (segment base address). A szegmensen belli bjtok elrsre szksg van azok szegmenscmhez kpesti relatv tvolsgra, ez az oszetcm (oset address). Szegmentlt modell (segmented memory model) esetn a logikai memriacm (logical memory address) teht kt rszb ol tev odik ssze: a szegmenscmb ol s az oszetcmb ol. E kett o rtk mr elegend o a memria lefedshez. Jells: SZEGMENSCM:OFFSZETCM, teht el oszr lerjuk a szegmenscmet, azutn egy kett ospontot, majd az oszet jn. A 8086-os processzor 20 bites cmbusszal rendelkezik, teht a memriacmek 20 bitesek lehetnek. Ez 1 Mbjt (= 220 = 1024 1024 bjt) mret u memria megcmzshez elegend o. A processzor csak a szegmentlt cmzst ismeri. A szegmensek mrett 64 Kbjtban szabtk meg, mivel gy az oszet 16 bites lesz, ez pedig belefr brmelyik regiszterbe (ezt majd ks obb ltni fogjuk). A szegmensek kezd ocmre is tettek azonban kiktst, mgpedig azt, hogy minden szegmens csak 16-tal oszthat memriacmen kezd odhet (ezek a cmek az .n. paragrafushatrok, 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 a szegmenscmb ol, azaz mind a szegmens-, mind az oszetcm 16 bites lett. Nzznk egy pldt: 1234h:5678h A szegmenscm fels o 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 el oz o helyre hivatkoznak. Ezek kzl van egy kitntetett, a 179Bh:0008h. Ezt a cmet gy alkottuk meg, hogy a lineris cm als ngy bitje (1000b = 0008h) lesz az oszetcm, a fels o 16 bit pedig a szegmenscmet alkotja. Ezrt az ilyen cmeket nevezhetjk bizonyos szempontbl normltnak (normalized address), hiszen az oszet itt mindig 0000h s 000Fh kztt lesz. Most tekintsk a kvetkez o logikai cmet: 0FFFFh:0010h Az el obb lertak szerint a szegmens bzicme 0F FFF0h lesz, ehhez hozz kell adni a 0 0010h oszetcmet. A m uveletet elvgezve az 10 0000h lineris memriacm lesz az eredmny. Aki elgg szemfles, annak rgtn felt unhet 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 legfels o, 21. bitt ol, teht azt mindig 0-nak fogja tekinteni. (Matematikai szhasznlattal gy fogalmazhatunk, hogy a processzor a lineris cmeket modulo 10 0000h kpezi.) gy hiba 21 bites a lineris cm, a memrihoz ennek a cmnek csak az als 20 bitje jut el. Ez azt eredmnyezi, hogy a 10 0000h s a 00 0000h lineris cmek ugyanarra a memriarekeszre fognak hivatkozni. Ezt a jelensget nevezik cmterletkrbefordulsnak (address space wrap-around). Az elnevezs onnan ered, hogy a lineris cm megtrik, tesik, krbefordul az 1 Mbjtos cmterlet fels o hatrn. Zrsknt mg egy fogalmat megemltnk. Fizikai memriacm (physical memory address) alatt azt a cmet rtjk, amit a memria a processzortl megkap. Kicsit pontostva, a cmbuszra kerl o rtket nevezzk zikai cmnek. A zikai cm nem felttlenl egyezik meg a lineris cmmel. Erre ppen az el obb lthattunk pldt, hiszen a 10 0000h lineris cmhez a 00 0000h zikai cm tartozik.

4.2. Regiszterek
Mint mr a 2. fejezetben is emltettk, a processzor (CPU) tartalmaz nhny specilis, kzvetlenl elrhet o trolhelyet, amiket regisztereknek neveznk. (A kzvetlenl elrhet o jelz o arra utal, hogy a regiszterek olvasshoz/rshoz nem kell a memrihoz fordulnia a processzornak). 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 utastsok szmra is klns jelent osggel br. SI (Source Index) Sztringkezel o utastsok hasznljk a forrs sztring cmnek trolsra. DI (Destination Index) A cl sztring cmt tartalmazza. SP (Stack Pointer) A verem tetejre mutat (azaz a verembe legutbb berakott rtk cmt tartalmazza). BP (Base Pointer) ltalnos pointer, de alapesetben a verem egy elemt jelli ki. IP (Instruction Pointer) A kvetkez o vgrehajtand utasts memriabeli cmt tartalmazza. Kzvetlenl nem rhet o el, de tartalma rhat s olvashat is a vezrlstad utastsokkal. SR avagy Flags (Status Register) A processzor aktulis llapott, az el oz o m uvelet eredmnyt mutat, ill. a proci m ukdst befolysol biteket, .n. ag-eket (jelz oket) tartalmaz. Szintn nem rhet o el kzvetlenl, de manipullhat klnfle utastsokkal. CS (Code Segment) A vgrehajtand program kdjt tartalmaz szegmens cme. Nem llthat be kzvetlenl, csak a vezrlstad utastsok mdosthatjk. DS (Data Segment) Az alaprtelmezett, els odleges 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 fels o nyolc bitje (azaz als s fels o bjtja) kln neveken rhet o el: az als bjtokat az AL, BL, CL, DL, mg a fels o bjtokat az AH, BH, CH, DH regiszterek jellik, amint ezt a 4.1. bra is mutatja (a rvidtsekben L Low, H High). ppen ezrt a kvetkez o (Pascal-szer u) m uveletek:
AX:=1234h AL:=78h AH:=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 kvetkez o informcit szolgltatjk:

4.2. REGISZTEREK

16

AX

15

8 7

AH

AL

4.1. bra. Az AX regiszter szerkezete

OD I T S Z
15 8 7

C
0

4.2. bra. A Flags regiszter szerkezete C (Carry) 1, ha volt aritmetikai tvitel az eredmny legfels o bitjnl (el ojeltelen aritmetikai tlcsorduls), 0, ha nem. P (Parity even) 1, ha az eredmny legals bjtja pros szm 1-es bitet tartalmaz, klnben 0. A (Auxilliary carry, Adjust) 1 jelzi, ha volt tvitel az eredmny 3-as s 4-es bitje (teht az als s a fels o nibble) kztt. Z (Zero) rtke 1, ha az eredmny zrus lett. S (Sign) rtke az eredmny legfels o bitjnek, az el ojelbitnek 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 cskkents trtnik. O (Overow) Ha 1, akkor el ojeles aritmetikai tlcsorduls trtnt. Ha hivatkozunk valamelyik ag-re, akkor a fenti bet ujelekhez mg hozzrjuk az F bet ut is. A CF, IF s DF ag-ek rtkt kzvetlenl is befolysolhatjuk. Ezrt pl. a CF nem csak akkor 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 gyrilag ket. rgztett, gy nem is mdosthatjuk o

4.3. ADATTPUSOK

17

Aritmetikai ag-ek alatt, ha kln nem mondjuk, a CF, PF, AF, ZF, SF s OF ag-eket rtjk. Ha azt akarjuk kifejezni, hogy kt vagy tbb regiszter tartalmt egyms utn f uzve akarunk megadni egy rtket, akkor az egyes regisztereket egymstl kett osponttal elvlasztva soroljuk fel, szintn a helyirtkes felrst kvetve. Teht pl. a DX:AX jells azt jelenti, hogy a 32 bites duplasznak az als szava AX-ben, fels o szava DX-ben van (a lersi sorrend megfelel a bitek sorrendjnek a bjtokban). Rviden: a DX:AX regiszterpr (register pair) egy 32 bites duplaszt tartalmaz. Ez a jells azonban bizonyos esetekben mst jelent, mint a memriacmek brzolsra hasznlt SZEGMENS:OFFSZET felrsok! Teht a DX:AX jells jelenthet egy logikai memriacmet DX szegmenssel s AX oszettel, de jelentheti azt is, hogy mi egy 32 bites rtket trolunk a nevezett kt regiszterben (ami azonban lehet egy lineris cm is), s ennek als szavt AX, fels o szavt pedig DX tartalmazza. Ha ltalnos (cl) regiszterekr ol beszlnk, akkor ltalban nemcsak az AX, BX, CX s DX regiszterekre gondolunk, hanem ezek 8 bites prjaira, tovbb az SI, DI, SP, BP regiszterekre is. A kvetkez o vgrehajtsra kerl o utasts (logikai) cmt a CS:IP, mg a verem tetejt az SS:SP regiszterprok ltal meghatrozott rtkek jellik. A CS s IP regisztereken kvl mindegyik regiszter tartalmazhat brmilyen rtket, teht ket. Ennek ellenre az nem csak az eredeti funkcijnak megfelel o tartalommal tlthetjk fel o SS, SP s Flags regiszterek ms cl hasznlata nem javasolt.

4.3. Adattpusok
A sz mrett 2 bjtban llaptottk meg az Intel-nl, ezrt pl. a BX s DI regiszterek szavasak, BL s DH bjtosak, mg az 1234 5678h szm egy duplasz. A processzor csak egszekkel tud dolgozni, azon bell ismeri az el ojeles s el ojeltelen aritmetikt is. A tbb bjt hossz adatokat little-endian mdon trolja, ezrt pl. a fenti 1234 5678h szm a kvetkez o mdon lesz eltrolva: a legalacsonyabb memriacmre kerl a 78h bjt, ezt kveti az 56h, majd a 34h, vgl pedig a 12h. Logikai, lebeg opontos vals tpusokat nem tmogat a processzor! Az egszek rszhalmazt alkotjk a binrisan kdolt decimlis egsz szmok (Binary Coded Decimal numbers BCD numbers). Ezek kt csoportba sorolhatk: vannak pakolt (packed) s pakolatlan BCD szmok (unpacked BCD number). (Hasznljk mg a csomagolt s kicsomagolt elnevezseket is.) Pakolt esetben egy bjtban kt decimlis szmjegyet trolnak gy, hogy a 4 7 bitek a szm magasabb helyirtk u jegyt, mg a 0 3 bitek az alacsonyabb helyirtk u jegyet tartalmazzk. A szmjegyeket a 0h 9h rtkek valamelyike jelli. Pakolatlan esetben a bjtnak a fels o fele kihasznlatlan, gy csak 1 jegyet tudunk 1 bjtban trolni. A sztring (string) adattpus bjtok vagy szavak vges hossz folytonos sort jelenti. Ezzel a tpussal b ovebben egy ks obbi fejezetben foglalkozunk. Specilis egsz tpus a mutat (pointer). Mutatnak hvunk egy rtket, ha az egy memriacmet tartalmaz, azaz ha azt a memria elrsnl felhasznljuk. Kt tpusa van: a kzeli vagy rvid mutat (near, short pointer) egy oszetcmet jelent, mg tvoli, hossz vagy teljes mutatn (far, long, full pointer) egy teljes logikai memriacmet, teht szegmens:oszet alak cmet rtnk. A kzeli mutat hossza 16 bit, a tvoli pedig 32 bit. Fontos, hogy mutatknt brmilyen rtket felhasznlhatunk. Szintn j, ha tudjuk, hogy a tvoli mutatknak az oszet rsze helyezkedik el az alacsonyabb memriacmen a little-endian trolsnak megfelel oen, amit a szegmens kvet 2-vel magasabb cmen.

4.4. MEMRIAHIVATKOZSOK, CMZSI MDOK

18

4.4. Memriahivatkozsok, cmzsi mdok


Lttuk, 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 mdoknak (addressing mode) nevezzk. Tbb tpusuk van, s mindenhol hasznlhat mindegyik, ahol valamilyen memriaoperandust meg lehet adni. A memriahivatkozs jelzsre a szgletes zrjeleket ([ s ]) hasznljuk.

4.4.1. Kzvetlen cmzs


A cmzs alakja [offs16], ahol offs16 egy 16 bites abszolt, szegmensen belli oszetet (rvid mutatt) jell.

4.4.2. Bziscmzs
A cmzs egy bzisregisztert hasznl az oszet megadsra. A lehetsges alakok: [BX],
[BP]. A cl bjt oszetcmt a hasznlt bzisregiszterb ol fogja venni a processzor.

4.4.3. Indexcmzs
Hasonl a bziscmzshez, m ukdst tekintve is annak tkletes prja. Alakjai: [SI], [DI].

4.4.4. Bzis+relatv cmzs


Ide a [BX+rel8], [BX+rel16], [BP+rel8], [BP+rel16] formj cmmegadsok tartoznak. A rel16 egy el ojeles sz, rel8 pedig egy el ojeles bjt, amit a processzor el ojelesen kiterjeszt szv. Ezek az .n. eltolsok (displacement). Brmelyik vltozatnl a megcmzett bjt oszetjt a bzisregiszter tartalmnak s az el ojeles eltolsnak az sszege adja meg.

4.4.5. Index+relatv cmzs


Hasonlan a bziscmzs/indexcmzs proshoz, ez a bzis+relatv cmzsi md prja. Alakjai: [SI+rel8], [SI+rel16], [DI+rel8], [DI+rel16].

4.4.6. Bzis+index cmzs


A kt nevezett cmzsi md keverke. A kvetkez o 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 oszetjt a kt regiszter rtknek sszegeknt kapjuk meg.

4.4.7. Bzis+index+relatv cmzs


Ez adja a legkombinltabb cmzsi lehet osgeket. ltalnos alakjuk [bzis+index+rel8] s [bzis+index+rel16] lehet, ahol bzis BX vagy BP, index SI vagy DI, rel8 s rel16 pedig el ojeles bjt ill. sz lehet.

4.4. MEMRIAHIVATKOZSOK, CMZSI MDOK

19

A bzis+relatv s index+relatv cmzsi mdok msik elnevezse a bzisrelatv ill. indexrelatv cmzs. A kzvetlen cmzsben szerepl o abszolt oszetet, illetve a tbbi cmzsnl el ofordul eltolst nem csak szmmal, de numerikus kifejezssel is megadhatjuk. Megjegyezzk, hogy az emltett cmzsi mdoknak ltezik egy alternatv alakja is. Ez annyiban tr el az el oz okt ol, hogy a tbbtag cmzsek tagjait kln-kln szgletes zrjelekbe rjuk, tovbb elhagyjuk a + jeleket. (Az eltolsban esetlegesen szerepl o - jelre viszont szksg van.) Az eltolst nem ktelez o zrjelbe teni. A kvetkez o felsorolsban az egy sorban lev o 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-el ors. Ez a kvetkez oket jelenti: brmely, BP-t nem tartalmaz cmzsi md a DS-t fogja hasznlni a BP-t tartalmaz cmzsi mdok SS-t hasznljk Ha az alaprtelmezett bellts nem tetszik, akkor mi is el orhatjuk, hogy melyik szegmensregisztert hasznlja a cm meghatrozshoz a processzor. Ezt a szegmensfellbrl prexekkel tehetjk meg. A prexek alakja a kvetkez o: CS:, DS:, ES:, SS:, teht a szegmensregiszter neve plusz egy kett ospont. Ezeket a prexeket legjobb kzvetlenl a cmzsi md jellse el rni. Most lssunk nhny pldt szablyos cmzsekre: [12h*34h+56h] ES:[09D3h] CS:[SI-500d] SS:[BX+DI+1999d] DS:[BP+SI] A kvetkez o jellsek viszont hibsak: [AX] [CX+1234h] [123456789ABCh] [SI+DI] [SP+BP] [IP] (az AX regiszter nem hasznlhat cmzsre) (a CX regiszter sem hasznlhat cmzsre) (tl nagy az rtk) (kt indexregiszter nem hasznlhat egyszerre) (az SP regiszter nem hasznlhat cmzsre) (az IP regiszter nem rhet o el) (kzvetlen cmzs) (kzvetlen cmzs, szegmensfellbrlssal) (indexrelatv cmzs, szegmensfellbrlssal) (bzis+index+relatv cmzs, szegmensfellbrlssal) (bzis+index cmzs, szegmensfellbrlssal)

4.5. VEREMKEZELS

20

A hasznlt cmzsmd ltal hivatkozott logikai memriacmet (ill. gyakran csak annak oszet rszt) tnyleges vagy eektv cmnek (eective address) nevezzk. gy pl. ha BX rtke 1000h, akkor a [BX+0500h] cmzsmd eektv cme a DS:1500h, hiszen bzisrelatv cmzskor a bzisregiszter (BX) s az eltols (0500h) rtke sszeaddik egy oszetcmet alkotva, tovbb a korbbi megjegyzs alapjn a szegmenscmet DS tartalmazza.

4.5. Veremkezels
Vermen (stack) a kvetkez o tulajdonsgokkal rendelkez o adatszerkezetet rtjk: rtelmezve van rajta egy Push m uvelet, ami egy rtket rak be a verem tetejre egy msik m uvelet, a Pop, a verem tetejn lev o adatot olvassa ki s trli a veremb ol m ukdse a LIFO (Last In First Out) elvet kveti, azaz a legutoljra betett adatot vehetjk ki el oszr a veremb ol verem mretn azt a szmot rtjk, ami meghatrozza, hogy maximlisan mennyi adatot kpes eltrolni verem magassga a benne lev o 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 veremb ol 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 annak a kvetkezmnye, hogy a verem csak egy szegmensnyi terletet foglalhat el, a szegmensek mrete pedig szintn 64 Kbjt. A verem szegmenst az SS regiszter trolja, mg a verem tetejre az SP mutat. Ez a verem lefel b ovl o (expand-down) verem, ami azt jelenti, hogy az jonnan betett adatok egyre alacsonyabb memriacmen helyezkednek el, s gy SP rtke is folyamatosan cskken a Push m uveletek hatsra. SP-nek mindig pros rtket kell tartalmaznia, s a verembe betenni ill. onnan kiolvasni szintn csak pros szm bjtot lehet. (Ez egy kis fllents, de a legjobb, ha kvetjk ezt a tancsot.) A lefel b ovlsb ol kvetkezik, hogy SP aktulis rtkb ol nem derl ki, hny elem is van a veremben (azaz milyen magas a verem). Ugyangy nem tudhat, mekkora a verem mrete. Ehhez szksg van a verem alja kezd ocmnek (azaz SP legnagyobb hasznlhat rtknek) ismeretre. Az az egy biztos, hogy egszen addig pakolhatunk elemet a verembe, amg SP el nem ri a 0000h-t. A Push s Pop m uveleteknek megfelel o utastsok mnemonikja szintn PUSH ill. POP, gy megjegyzsk nem tl nehz. A PUSH el oszr cskkenti SP-t a betenni kvnt adat mretnek megfelel o szm bjttal, majd az SS:SP ltal mutatott memriacmre berja a krdses rtket. A POP ezzel ellenttes m ukds u, azaz el oszr kiolvas az SS:SP cmr ol valahny szm bjtot, majd SP-hez hozzadja a kiolvasott bjtok szmt. Nzznk egy pldt a verem m ukdsnek szemlltetsre! Legyen AX tartalma 1212h, BX tartalma 3434h, CX pedig legyen egyenl o 5656h-val. Tekintsk a kvetkez o Assembly programrszletet:

4.5. VEREMKEZELS

21
PUSH PUSH POP PUSH POP POP AX BX AX CX BX CX

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

Kezdetben: SS:0102h : ?? SP SS:0100h : ?? SS:00FEh : ?? SS:00FCh : ?? SS:00FAh : ?? AX = 1212h, BX = 3434h, CX = 5656h


PUSH AX utn: SS:0102h : ?? SS:0100h : ?? SP SS:00FEh : 1212h SS:00FCh : ?? SS:00FAh : ?? AX = 1212h, BX = 3434h, CX = 5656h PUSH BX utn: SS:0102h : ?? SS:0100h : ?? SS:00FEh : 1212h SP SS:00FCh : 3434h SS:00FAh : ?? AX = 1212h, BX = 3434h, CX = 5656h POP AX utn: SS:0102h : ?? SS:0100h : ?? SP SS:00FEh : 1212h SS:00FCh : 3434h SS:00FAh : ?? AX = 3434h, BX = 3434h, CX = 5656h PUSH CX utn: SS:0102h : ?? SS:0100h : ?? SS:00FEh : 1212h SP SS:00FCh : 5656h SS:00FAh : ?? AX = 3434h, BX = 3434h, CX = 5656h

4.5. VEREMKEZELS

22
POP BX utn: SS:0102h : ?? SS:0100h : ?? SP SS:00FEh : 1212h SS:00FCh : 5656h SS:00FAh : ?? AX = 3434h, BX = 5656h, CX = 5656h

POP CX utn: SS:0102h : ?? SP SS:0100h : ?? SS:00FEh : 1212h SS:00FCh : 5656h SS:00FAh : ?? AX = 3434h, BX = 5656h, CX = 1212h

Az utastsok vgrehajtsa teht azt eredmnyezi, hogy AX felveszi BX rtkt, BX a CX rtkt, CX pedig az AX eredeti rtkt (olyan, mintha krbeforgattuk volna a regiszterek tartalmt egyms kztt). Mivel ugyanannyi PUSH volt, mint amennyi POP, SP rtke a vgrehajts utn visszallt a kezdetire. Figyeljk meg, hogy a PUSH-sal berakott rtkek a memriban bentmaradnak akkor is, ha ket, br ekkor mr nem rszei a veremnek (azaz nincsenek a ks obb egy POP-pal kivesszk o veremben). Ez nem tl meglep o dolog, ha gyelembe vesszk az utastsok m ukdst. 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 trolsra A veremregisztereknek (SS s SP) mindig rvnyes rtkeket kell tartalmazniuk a program futsakor, mivel azt a processzor s ms programok (pl. a hardvermegszaktsokat lekezel o rutinok) is hasznljk.

4.6. I/O, MEGSZAKTS-RENDSZER

23

4.6. I/O, megszakts-rendszer


Ez 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 00FFh kztti tartomnyt az alaplapi eszkzk hasznljk, s mivel a legfontosabb perifrik cmt rgztettk, a klnbz o PC-s rendszerekben ezeket ugyanazon a porton rhetjk el. Brmelyik porton kezdemnyezhetnk olvasst s rst egyarnt, de ezzel azrt nem rt vigyzni, egy flresikeredett rssal ugyanis knnyen megadsra ksztethetjk a szmtgpet. Egy megszaktst kivlthat egy hardvereszkz (ez a hardver-megszakts), de a felhasznl s a programok is elindthatnak ilyen esemnyt (ez a szoftver-megszakts). A megszaktsok kt tpusa nem csak a szmukban, de tulajdonsgaikban is eltr egymstl. A hardver-megszaktsokat a megszakts-vezrl on keresztl rzkeli a processzor. A vezrl o 8 klnbz o megszakts-vonalat tart fent (AT-k esetn kt vezrl ot ktttek sorba, gy lett a 8-bl 16 vonal). Ezen megszaktsokat az IRQ0, IRQ1, . . . , IRQ7 (tovbb IRQ8, . . . , IRQ15) szimblumokkal jelljk. Fontos jellemz ojk, hogy a program futsval prhuzamosan aszinkron keletkeznek, s hogy maszkolhatk. Ez utbbi fogalom azt takarja, hogy az egyes IRQ vonalakat egyenknt engedlyezhetjk ill. tilthatjuk le. Ha egy vonal tiltva (mskppen maszkolva) van, akkor az arra vonatkoz krsek nem jutnak el a processzorhoz. Ezen kvl a processzor Flags regiszternek IF bitjvel az sszes hardver-megszakts rzkelst letilthatjuk ill. jra engedlyezhetjk. Ezzel szemben szoftver-megszaktsbl 256 darab van, jellskre az INT 00h, . . . , INT 0FFh kifejezseket hasznljuk. A program futsa sorn szinkron keletkeznek (hiszen egy gpi kd ket), s nem maszkolhatk, nem tilthatk le. Az IF ag llstl fggetlenl utasts vltja ki o ket a CPU. mindig rzkeli o A kt megszakts-tpus lekezelsben kzs, hogy a CPU egy specilis rutint (programrszt) hajt vgre a megszakts detektlsa utn. Ez a rutin a megszakts-kezel o (interrupt handler). Az opercis rendszer felllsa utn sok hardver- s szoftver-megszaktsnak mr van kezel oje (pl. a BIOS is jpr ilyen megszaktst zemeltet), de lehet osg van arra is, hogy brmelyik ilyen rutint lecserljk egy sajt programunkra. A hardver-megszaktsok a szoftveresek egy adott tartomnyra kpz odnek le, ez alapllapotban az INT 08h, . . . , INT 0Fh (IRQ8-tl IRQ15-ig pedig az INT 70h, . . . , INT 77h) megszaktsokat jelenti, teht ezek a megszaktsok msra nem hasznlhatk. gy pl. IRQ4 keletkezsekor a processzor az INT 0Ch kezel ojt hvja meg, ha IF = 1 s az IRQ4 nincs maszkolva. A megszaktsok egy specilis csoportjt alkotjk azok, amiket valamilyen vszhelyzet, slyos programhiba vlt ki. Ezeket sszefoglal nven kivtelnek (exception) nevezzk. Kivtelt okoz 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 aztn egy erre specializlt fordtprogrammal talaktunk trgykdd (object code). A trgykd mg nem futtathat kzvetlenl, ezrt a szerkeszt o (linker) elvgzi rajta az talaktsokat. Vgl az egy vagy tbb trgykd sszef uzse utn kialakul a futtathat program. Az emltett fordtprogramot assemblernek nevezzk. A forrsfjlok llomnynv-kiterjesztse ltalban .ASM vagy .INC, a trgykd .OBJ, a futtathat fjlok pedig .COM vagy .EXE. Ezek az elnevezsek a PC-s DOS rendszerekre vonatkoznak, ms opercis rendszerek alatt (pl. UNIX, OS/2, Linux) ezek eltrhetnek. Az Assembly forrsfjloknak tiszta szveges (text) llomnyoknak kell lennie, mert az assemblerek nem szeretik a mindenfle binris szemetet tartalmaz dokumentumokat. Az Assembly nem rzkeny a kis- s nagybet ukre, gy teht a PUSH, Push, push, PusH szavak ugyanazt a jelentst kpviselik. Ez elg nagy szabadsgot ad a klnbz o azonostk elnevezsre, s a forrst is ttekinthet obb teszi. Az Assembly forrs sorai a kvetkez o elemeket tartalmazhatjk: assembler utastsok (f oleg ezek alkotjk a tnyleges program kdjt) pszeudo utastsok (pl. makrk, helyettest o szimblumok) assembler direktvk A direktvk (directive) olyan, az assemblernek szl utastsok, melyek kzvetlenl gpi kdot nem felttlenl generlnak, viszont a fordts menett, az elkszlt kdot befolysoljk. Az rvnyes assembler utastsok szintaxisa a kvetkez o:
{Cmke:} <Prex> {Utasts {Operandus<,Operandus>}} {;Megjegyzs}

A kapcsos zrjelek ({ s }) az opcionlis (nem ktelez o) rszeket jelzik, mg a cscsos zrjelek (< s >) 0 vagy tbb el ofordulsra utalnak. Ezek alapjn az assembler utastsok szintaxisa szavakban a kvetkez o: a sor elejn llhat egy Cmke, amit kvethet valahny Prex, majd rhatunk legfeljebb egy Utastst, aminek valahny Operandusa lehet, s vgl a sort egy Megjegyzs zrhatja. A megfogalmazs mutatja, hogy a csak egy cmkt, megjegyzst tartalmaz sorok, s ot mg az res sor is megengedett az Assembly forrsban.

25 A cmke (label) deklarcija az azonostjbl s az azt kvet o kett ospontbl ll. rtke az aktulis sor memriacme (helyesebben oszetje). Szerepe azrt fontos, mert segtsgvel knnyen rhatjuk le a klnfle vezrlsi szerkezeteket. A gpi kd utastsok ugyanis relatv vagy abszolt memriacmekkel dolgoznak, neknk viszont knyelmesebb, ha egy szimblummal (a cmke nevvel) hivatkozunk a krdses sorra. A tnyleges cm megllaptsa a szerkeszt o feladata lesz. t kvet A prex olyan utastselem, amely csak az o o gpi kd utastsra (avagy Assembly mnemonikra) hat, annak m ukdst vltoztatja meg ill. egszti ki. Ezeket kveti az utasts (instruction), ami egy assembler direktva, egy pszeudo utasts vagy egy Assembly mnemonik lehet. Emlkeztet ol, a mnemonik (mnemonic) azonos m uveletet vgz o klnbz o gpi kd utastsok csoportjt jell o szimblum (sz). Az Intel mnemonikok legalbb ktbet usek, s nmelyik mg szmot is tartalmaz. A mnemonikok gpi kd alakjt 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) vessz ovel elvlasztva sorolunk fel. Operandusok pt okvei a kvetkez ok lehetnek: regiszterek numerikus (szm) konstansok karakteres (sztring) konstansok szimblumok opertorok (m uveletek) Regiszterekre a kvetkez o 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 kezd odnie, azutn tartalmazhatja a tz szmjegyet ill. az A F bet uket, a vgn pedig a szmrendszerre utal jells llhat. Alapesetben minden 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) bet u ll Fontos, hogy a bet uvel kezd od o hexadecimlis szmok el tegynk legalbb egy 0-t, mert klnben szimblumnak prbln rtelmezni a szmunkat az assembler. Karakteres konstansokat aposztrfok(. . . ) vagy idz ojelek (". . . ") kztt adhatunk meg. Ha numerikus konstans helyett llnak, akkor lehetsges hosszuk az adott direktvtl (pl. a DW esetn 2 bjt) ill. a msik operandustl fgg. Szimblumok pldul a konstans azonostk, vltozk, cmkk, szegmensek, eljrsok nevei. Szimblum azonostja tartalmazhat szmjegyet, bet uket (csak az angol bc bet uit), alhzsjelet ( _ ), dollrjelet ($) s kukacot (@). Fontos, hogy az azonostk nem kezd odhetnek szmjeggyel! Specilis szimblum az egymagban ll dollrjel, ennek neve pozci-szmll (location counter). rtke az aktulis sor szegmensbeli (avagy szegmenscsoportbeli) oszetje. Opertorbl rengeteg van, a legfontosabbak taln a kvetkez ok:

26 kerek zrjelek szoksos aritmetikai m uveleti jelek (+, -, *, /, MOD) mez okivlaszt opertor (.) szegmens-el ors/-fellbrls (:) memriahivatkozs ([. . . ]) bitenknti logikai m uveletek (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/oszet lekrdezs (SEG, OFFSET) lptet o opertorok (SHL, SHR) mretlekrdez o opertorok (LENGTH, SIZE, TYPE, WIDTH) Az operandusok ezek alapjn hrom csoportba sorolhatk: regiszter-, memria- s konstans (kzvetlen rtk u) operandusok. A klnbz o mnemonikok lehetnek nulla-, egy-, kett o-, hrom- vagy ngyoperandusak. Fontos megjegyezni, hogy a ktoperandus mnemonikok els o operandusa a cl, a msodik pedig a forrs. Ezt a konvencit egybknt csak az Intel Assembly hasznlja, az sszes tbbi (pl. Motorola) Assemblyben az els o a forrs, a msodik pedig a cloperandus. Az elnevezsek arra utalnak, hogy a m uvelet eredmnye a cloperandusban troldik el. Ha szksges, a cloperandus msodik forrsknt is szolglhat. Egy operandust hasznl utastsoknl az az egy operandus sokszor egyben forrs s cl is. Vgl az assembler utasts sornak vgn megjegyzst is rhatunk egy pontosvessz o utn. Ezeket a karaktereket az assembler egyszer uen tugorja, gy teht brmilyen szveget tartalmazhat (mg kezetes bet uket is). A megjegyzs a pontosvessz ot ol a sor vgig tart. Most tisztznunk kell mg nhny fogalmat. Korbban mr emltettk, hogy a processzor szegmentlt memria-modellt hasznl. Hogy teljes legyen a kavarods, az assemblernek is el o kell rnunk a memria-modellt, s szegmenseket is ltre kell hoznunk. A kt szegmens- s memria-modell fogalmak azonban egy picit klnbznek. Az assemblerben ltrehozott szegmenseknek van nevk (azonostjuk, ami teht egy szimblum), mretk legfeljebb 64 Kbjt lehet, s nem felttlenl kell sszefgg onek lennie egy szegmens dencijnak. Ez utbbi tulajdonsg tbb szabadsgot enged a programoznak, mivel megteheti, hogy elkezd egy szegmenst, majd denil egy msikat, azutn megint visszatr az els o szegmensbe. Az azonos nven megkezdett szegmensdencikat az assembler s a szerkeszt o szpen sszef uzi egyetlen darabb, teht ez a jellsrendszer a processzor szmra tltsz lesz. Msrszt a mretre vonatkoz kijelents mindssze annyit tesz, hogy ha nem tltnk ki teljesen (kddal vagy adatokkal) egy memriaszegmenst (ami viszont 64 Kbjt nagysg),

27 akkor a fennmarad bjtokkal az assembler nem foglalkozik, a program futsakor ezek valami szemetet fognak tartalmazni. A memria-modell el orsa akkor fontos, ha nem akarunk foglalkozni klnbz o szegmensek (adat-, kd-, verem- stb.) ltrehozsval, s ezt a folyamatot az assemblerre akarjuk hagyni. Ehhez viszont jeleznnk kell az assemblernek, hogy el orelthatlag mekkora lesz a programunk memriaignye, hny s milyen tpus szegmensekre van szksgnk. Ezt a tpus szegmensmegadst egyszerustett szegmensdencinak (simplied segment denition) nevezzk. A kt mdszert keverve is hasznlhatjuk kedvnk s ignyeink szerint, nem fogjk egymst zavarni (mi is ezt fogjuk tenni). Ha magas szint u nyelvhez runk kls o Assembly rutinokat, akkor az egyszer ustett szegmensmegads sokszor egyszer ubb megoldst szolgltat. Most pedig lssunk nhny fontos direktvt: modul/forrsfjl lezrsa (END) szegmens denilsa (SEGMENT . . . ENDS) szegmenscsoport denilsa (GROUP) szegmens hozzrendelse egy szegmensregiszterhez (ASSUME) rtkads a $ szimblumnak (ORG) memria-modell megadsa (MODEL) egyszer ustett szegmensdencik (CODESEG, DATASEG, FARDATA, UDATASEG, UFARDATA, CONST, STACK, .CODE, .DATA, .STACK) helyfoglals (vltoz ltrehozsa) (DB, DW, DD, DF, DQ, DT) konstans/helyettest o szimblum ltrehozsa (=, EQU) cmke ltrehozsa (LABEL) eljrs denilsa (PROC . . . ENDP) kls o szimblum denilsa (EXTRN) szimblum lthatv ttele a klvilg szmra (PUBLIC) feltteles fordts el orsa (IF, IFccc, ELSE, ELSEIF, ENDIF) kls o forrsfjl beszrsa az aktulis pozciba (INCLUDE) felhasznli tpus denilsa (TYPEDEF) struktra, uni, rekord denilsa (STRUC . . . ENDS, UNION . . . ENDS, RECORD) a szmrendszer alapjnak tlltsa (RADIX) makrdenci (MACRO . . . ENDM) makrm uveletek (EXITM, IRP, IRPC, PURGE, REPT, WHILE) utastskszlet meghatrozsa (P8086, P186, P286, P386 stb.; .8086, .186, .286, .386 stb.)

28 A direktvk hasznlatra ks obb mg visszatrnk. Assemblerb ol 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 trssal msik assembler al is tvihet ok 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 processzor utastskszlete


Itt az ideje, hogy megismerkedjnk a kivlasztott processzorunk ltal ismert utastsokkal (pontosabban mnemonikokkal). Az utastsok kzs tulajdonsga, hogy az operandusoknak teljestenik kell a kvetkez o feltteleket: Ha egyetlen operandusunk van, akkor az ltalban csak az ltalnos regiszterek kzl kerlhet ki, vagy pedig memriahivatkozs lehet (nhny esetben azonban lehet konstans kifejezs vagy szegmensregiszter is). Kt operandus esetn bonyolultabb a helyzet: mindkt operandus egyszerre nem lehet szegmensregiszter, memriahivatkozs s kzvetlen (konstans) rtk, tovbb szegmensregiszter mellett vagy ltalnos regiszternek vagy memriahivatkozsnak kell szerepelnie. (A sztringutastsok kivtelek, ott mindkt operandus memriahivatkozs lesz, de err ol majd ks obb.) A kt operandus mretnek majdnem mindig meg kell egyeznie, ez all csak nhny specilis eset kivtel.

6.1. Prexek
El oszr lssuk a prexeket, zrjelben megadva a gpi kdjukat is (ez utbbit persze nem kell megjegyezni):

6.1.1. Szegmensfellbrl prexek


Ezek 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 ket az alaprtelmezs szerinti szegmensregiszter vtelvel brmely ms utasts el ott megadva o helyett hasznland regisztert adjk meg. Termszetesen ez csak a valamilyen memriaoperandust hasznl utastsokra vonatkozik.

6.2. UTASTSOK

30

6.1.2. Buszlezr prex


Mnemonikja LOCK (0F0h). Hatsra az adott utasts ltal mdostott memriarekeszt az utasts vgrehajtsnak idejre a processzor zrolja gy, hogy a buszokhoz ms hardverelem nem frhet hozz a m uvelet lefolysig. (A teljessg kedvrt: ebben a processzor LOCK# jel u kivezetse vesz rszt.) Csak a kvetkez o utastsok esetn hasznlhat: ADD, ADC, SUB, SBB, AND, OR, XOR, NOT, NEG, INC, DEC, XCHG, ms esetekben hatsa denilatlan. Az emltett utasts cloperandusnak ktelez oen memriahivatkozsnak kell lennie.

6.1.3. Sztringutastst ismtl o prexek


Lehetsges alakjaik: REP, REPE, REPZ (0F3h), REPNE, REPNZ (0F2h). Csak a sztringkezel o utastsok el ott hasznlhatk, ms esetben kvetkezmnyk kiszmthatatlan. M ukdskr ol s hasznlatukrl ks obb szlunk.

6.2. Utastsok
Most 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 veremb ol POPF Flags regiszter kivtele a veremb ol IN adat olvassa portrl OUT adat kirsa portra LEA tnyleges memriacm betltse LDS, LES teljes pointer betltse szegmensregiszter:ltalnos regiszter regiszterprba CBW AL el ojeles kiterjesztse AX-be CWD AX el ojeles kiterjesztse DX:AX-be XLAT, XLATB AL lefordtsa a DS:BX cm u fordt tblzattal LAHF Flags als bjtjnak betltse AH-ba SAHF AH betltse Flags als bjtjba CLC CF ag trlse CMC CF ag komplementlsa (invertlsa)

6.2. UTASTSOK

31

STC CF ag belltsa CLD DF ag trlse STD DF ag belltsa CLI IF ag trlse STI IF ag belltsa

6.2.2. Egsz szmos aritmetika


ADD sszeads ADC sszeads tvitellel (CF) egytt SUB kivons SBB kivons tvitellel (CF) egytt CMP sszehasonlts (ag-ek belltsa a cl s a forrs klnbsgnek megfelel oen) INC inkrementls (nvels 1-gyel), CF nem vltozik DEC dekrementls (cskkents 1-gyel), CF nem vltozik NEG kettes komplemens kpzs (szorzs 1-gyel) MUL el ojeltelen szorzs IMUL el ojeles szorzs DIV el ojeltelen maradkos oszts IDIV el ojeles 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 (ag-ek belltsa a kt op. logikai AND-jnek megfelel oen)

6.2. UTASTSOK

32

6.2.4. Bitlptet o utastsok


SHL el ojeltelen lptets (shiftels) balra SAL el ojeles lptets balra (ugyanaz, mint SHL) SHR el ojeltelen lptets jobbra SAR el ojeles (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. Sztringkezel o utastsok


MOVS, MOVSB, MOVSW sztring mozgatsa CMPS, CMPSB, CMPSW sztringek sszehasonltsa SCAS, SCASB, SCASW keress sztringben LODS, LODSB, LODSW betlts sztringb ol 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 el ott 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 0000h

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

6.2. UTASTSOK

33 0000h

LOOPNE, LOOPNZ CX dekrementlsa s ugrs, ha ZF = 0 s CX 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. Rendszervezrl o utastsok


HLT processzor lelltsa, amg megszakts (vagy reset) nem rkezik

6.2.9. Koprocesszor-vezrl o 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. Ez termszetes, hiszen ms (magasabb szint u) programozsi nyelvekben is sokszor el ofordul, hogy valamilyen adatot olvasunk ki vagy tltnk be egy vltozba, avagy valamelyik portra. Kicsit kilgnak ebb ol a sorbl a CBW, CWD, XLAT utastsok, de mondjuk a ag-eket llt CLC, CMC stb. utastsok is kerlhettek volna msik kategriba. Az egsz aritmetiks utastsokat szintn nagyon sokszor hasznljuk programozskor. A CMP utastsnak pl. kulcsszerepe lesz a klnfle elgazsok (feltteles vezrlsi szerkezetek) lekdolsban. A Boole-m uveletekkel mindenfle bitm uveletet (bellts, maszkols, tesztels) el tudunk vgezni, a munkk sorn ppen ezrt nlklzhetetlenek. Shiftel o m uveleteket f oleg a mr emltett, 2 hatvnyval val szorzs gyors megvalstsra alkalmazunk. Ezenkvl nagy precizits, sajt aritmetikai m uveletek fejlesztsekor is fontos szerepet kapnak a rotl utastsokkal egytt. Sztringen (string) itt bjtok vagy szavak vges hossz folytonos sort rtjk. A sztringeken operl utastsok pl. a nagy mennyisg u adatok msolsnl, vizsglatnl segtenek. BCD aritmetikt csak az emberi knyelem miatt tmogat a processzor. Ezek az utastsok kt csoportra oszthatk: pakolatlan (AAA, AAD, AAM, AAS) s pakolt (DAA,DAS) BCD ket, br ez elg szubjektv kijelents. aritmetikra. Kifejezetten ritkn hasznljuk o A vezrlstad utastsok a programok egyik alappillrt alkotjk, helyes hasznlatuk a jl m ukd o algoritmus alapfelttele. Rendszer- s koprocesszor-vezrl o utastsokat csak specilis esetekben, kls o hardverrel val kapcsolatfenntartsra s kommunikcira szoks hasznlni. Klnleges csemege a NOP (No OPeration), ami eredete szerint adatmozgat utasts lenne (mivel az XCHG AX,AX utasts lneve), viszont m ukdst tekintve gyakorlatilag nem

6.2. UTASTSOK

34

csinl semmit. Hasznos lehet, ha a kdba olyan res bjtokat akarunk beszrni, amit ks obb esetleg valami egyb clra hasznlunk majd, de nem akarjuk, hogy a processzor azt valamilyen egyb utastsnak rtelmezve nemkvnatos mellkhats lpjen fel. A NOP kdja egyetlen bjt (90h). Szegmensregiszter-operandust (ami nem egyenl o a szegmensfellbrl prexszel) a fenti utastsok kzl csak a MOV, PUSH s POP kaphat, de ezzel egyel ore ne foglalkozzunk, ks obb mg visszatrnk rjuk.

7. fejezet

Assembly programok ksztse


Az Assembly nyelv u programozs folyamata 3 jl elklnthet o fzisra bonthat: forrs elksztse, fordts, majd szerkeszts. Nzzk meg egyenknt ezeket a lpseket! A programok forrsllomnynak a knnyebb azonosts vgett (s a hagyomnyok betartsa rdekben is) clszer u egy .ASM kiterjeszts u nevet adni. A forrst brmilyen szvegszerkeszt ovel (pl. a DOS-os EDIT, valamilyen commander program szerkeszt oje, Windows NotePad-je stb.) elkszthetjk, csak az a fontos, hogy a kimentett llomny ne tartalmazzon mindenfle formzsi informcit, kpeket stb., pusztn a forrs szvegt. Ha ez megvan, akkor jhet a fordts. A TASM program szintaxisa a kvetkez o: TASM {opcik} forrs{,trgykd}{,lista}{,xref} Az opcik klnfle kapcsolk s paramterek, amik a fordts menett s a generlt fjlok tartalmt 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 keresztreferenciatblzatot (cross reference table, xref). A listban a forrs minden egyes sorhoz generlt gpi kd fel van tntetve, ezenkvl tartalmazza a denilt szegmensek adatai, valamint a hasznlt szimblumokat sszegy ujt o szimblumtblt. A keresztreferencia-tblzat azt tartalmazza, hogy a klnbz o szimblumokat hol deniltk, ill. mely helyeken hivatkoztak rjuk. Ez a fjl binris (teht nem szveges), rtelmes informcit bel ole a TCREF programmal nyerhetnk. Legtbbszr csak a lefordtand forrs nevt adjuk meg a TASM-nak, hacsak nincs valamilyen klnleges ignynk. Nhny fontos kapcsolt azrt felsorolunk: /a, /s A szegmensek szerkesztsi sorrendjt befolysoljk. Az els o bc rend szerint, mg a msodik a denils sorrendje szerinti szegmens-sorrendet r el o. Alaprtelmezs a /s. /l, /la A listzs formtumt befolysoljk: norml (opcio/l) ill. kib ovtett (/la) lista fog kszlni. Alaprtelmezsben nem kszl lista. /m# A fordts # menetes lesz (a # helyre egy szmot kell rni). Alaprtk a 2. /z Hiba esetn a forrs megfelel o sort is kirja. /zi, /zd, /zn A trgykdba bekerl o 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 szmos argumentummal 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 f oprogram trgykdjt kell legels onek megadnunk. A futtathat fjl nevt kvnsgunk szerint megadhatjuk, klnben a legels o trgykd fjl (a f oprogram) nevt fogja kapni. A trkpfjl (map le) az egyes modulokban denilt szegmensek, szimblumok adatait tartalmazza, valamint kln krsre azoknak a programsoroknak a sorszmait, amikhez kd kerlt lefordtsra. A knyvtrakban (library) tbb trgykd llomny lehet sszegy ujtve, a program rsakor teht ezekb ol is hasznlhatunk rutinokat, ha akarunk. Most lssunk nhny megadhat opcit: /x, /m, /l, /s A trkp (map) tartalmt befolysoljk: nincs trkp (/x), publikus szimblumok listja lesz (/m), kdhoz tartoz sorszmok lesznek (/l), szegmensinformci lesz (/s). Alaprtelmezs a /s. /c rzkeny lesz a kisbet ukre s nagybet ukre. /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 ebb ol az llomnybl ll. A fordtst ekkor a TASM PELDA utasts kiadsval intzhetjk el. A fordts sorn valami ilyesmi jelenik meg a kperny on:
Turbo Assembler Assembling file: Error messages: Warning messages: Passes: Remaining memory: Version 4.0 pelda.asm None None 1 355k Copyright (c) 1988, 1993 Borland International

Az Error messages: cmkj u sor a hibk, a Warning messages: cmkj u a gyelmeztetsek, a Passes: cmkj u pedig a menetek szmt mutatja; a None jelenti azt, ha nincs hiba. Sikeres fordts esetn elkszl a PELDA.OBJ llomny (ez a trgykd). Most kvetkezik a szerkeszts. Ehhez a kvetkez o utastst kell kiadni: TLINK PELDA Ennek hatsra (ha nem jelenik meg semmilyen gyelmeztet o- vagy hibazenet) elkszl a futtathat llomny, ami a PELDA.EXE nevet kapja. Ha a szerkesz o a Warning: No stack zenetet jelenti meg, az azt jelenti, hogy nem hoztunk ltre a programban vermet. Ez elg gyakori hiba a tapasztalatlan Assembly-programozknl. Mivel veremre mindenkppen szksge van a programnak, srg osen javtsuk ki mulasztsunkat!

8. fejezet

Vezrlsi szerkezetek megvalstsa


Ennyi elmlet utn ideje, hogy belefogjunk az Assembly programok rsba! El oszr nhny pldn keresztl megnzzk, hogy kdolhat le nhny gyakran hasznlt vezrlsi szerkezet Assemblyben.

8.1. Szekvencilis vezrlsi szerkezet


A processzor mindig szekvencilis utasts-vgrehajtst alkalmaz, hacsak nem hasznlunk valamilyen vezrlstad utastst. Lssuk ht els o Assembly programunkat, ami nem sok hasznos dolgot csinl, de kezdsnek megteszi.
Pelda1.ASM:
MODEL SMALL .STACK ADAT Kar Szo Szam Ered ADAT KOD @Start: MOV MOV MOV MOV XOR ADD SUB MOV CX,ADAT DS,CX BL,[Kar] AX,[Szo] BH,BH AX,BX AL,[Szam] [Ered],AX SEGMENT DB DW DB DW ENDS

a "Ha" 12h ?

SEGMENT ASSUME CS:KOD,DS:ADAT

8.1. SZEKVENCILIS VEZRLSI SZERKEZET

38
AX,4C00h 21h @Start

KOD

MOV INT ENDS END

A programban hrom szegmenst hozunk ltre: egy ADAT nev ut az adatoknak, egy KOD nev ut az utastsoknak, illetve egy vermet. Utbbit a .STACK egyszer ustett szegmensdencis direktva kszti el, a szegmens neve STACK, mrete 0400h (1 Kbjt) lesz. Ezt a direktvt egszti ki a MODEL, itt a memria-modellnek SMALL-t rtunk el o, ami annyit tesz, hogy a kd- s az adatterlet mrete kln-kln max. 64 Kbjt lehet. Szegmensdencit a szegmens nevb ol s a SEGMENT direktvbl ll sorral kezdnk, ezt kveti a szegmens tartalmnak lersa. Lezrsknt a szegmens nevt s az azt kvet o ENDS foglalt szt tartalmaz sort rjuk. Azaz:
Nv dencik Nv SEGMENT {attribtumok} ENDS

A SEGMENT kulcssz utn a szegmens jellemz oit meghatroz klnfle dolgokat rhatunk mg, ezek a szegmens illeszkedst (alignment), kombinlst (combine type), osztlyt (class), operandusmrett (operand size) s hozzfrsi mdjt (access mode) hatrozzk meg. Ezekkel egyel ore mg ne tr odjnk. Az adatszegmensben ngy vltozt hozunk ltre. Ebb ol hromnak (Kar, Szo s Szam) kezdeti rtket is adunk, ezek teht inkbb hasonltanak a Pascal tpusos konstansaihoz. Vltoznak gy foglalhatunk helyet:
Nv Dx Kezdetirtk<,Kezdetirtk>

ahol Dx helyn DB, DW, DD, DF, DQ s DT llhat (jelentsk Dene Byte, Word, Doubleword, Farword, Quadword s Ten byte unit). Ezek sorban 1, 2, 4, 6, 8 ill. 10 bjtnyi terletet foglalnak le a Nv nev u vltoznak. A kezdeti rtk megadsnl rhatunk kznsges szmokat (12h), karakter-konstansokat (a), sztring-konstansokat ("Ha"), ezek valamilyen kifejezst, illetve ha nem akarunk rtket adni neki, akkor egy ?-et is. A krd ojellel denilt vltozkat a legtbb assembler 00h-val tlti fel, de az is megoldhat, hogy ezeket a terleteket ne trolja el a futtathat llomnyban, s indtskor ezek helyn valami vletlenszer u rtk legyen. Vessz ovel elvlasztva tbb rtket is felsorolhatunk, ekkor mindegyik rtkhez egy jabb terlet lesz lefoglalva. gy pl. a kvetkez o plda 10 bjtot foglal le, a terlet elejre pedig a Valami cmke fog mutatni:
Valami DB 1,2,#,"Szveg",6+4

A kdszegmens megnyitsa utn jeleznnk kell az assemblernek, hogy ez valban kdszegmens, illetve meg kell adnunk, hogy melyik szegmens szerint szmolja a memriahivatkozsok oszetcmt. Mindezeket az ASSUME direktvval intzzk el. Az ASSUME direktva szintaxisa:
ASSUME ASSUME SzegReg:SzegNv<,SzegReg:SzegNv> NOTHING

8.1. SZEKVENCILIS VEZRLSI SZERKEZET

39

A SzegReg valamilyen szegmensregisztert jelent, a SzegNev helyre pedig egy denilt szegmens vagy szegmenscsoport nevt, vagy a NOTHING kulcsszt rhatjuk. Utbbi esetben az adott szegmensregisztert egyetlen szegmenshez sem kti hozz, s nem ttelez fel semmit sem az adott regiszterrel kapcsolatban. Az ASSUME NOTHING minden el oz o hozzrendelst megszntet. Rgtn ezutn egy cmke kvetkezik, aminek a @Start nevet adtuk. (A kukac most csak arra utal, hogy ez nem vltoz-, hanem cmkeazonost. Ennek hasznlata csak megszoks krdse, de ebben a jegyzetben az sszes cmke nevt a @ karakterrel fogjuk kezdeni.) Rendeltetse az, hogy a program indulsnak helyt jelezze, erre az informcira ugyanis az assemblernek, linkernek s az opercis rendszernek is szksge van. A cmke nmagban nem lesz elg, az indulsi cm kijellst a ks obb lert END direktva fogja elvgezni. Az els o utastst, ami vgrehajthat gpi kdot generl, a MOV (MOVe data) kpviseli. Ez kt operandussal rendelkezik: az els o a cl, a msodik a forrs (ez persze az sszes ktoperandus utastst jellemzi). M ukdse: egyszer uen veszi a forrs tartalmt, s azt bemsolja (eltrolja) a cl op. terletre. Ekzben a forrs tartalmt, ill. a ag-eket bkn hagyja, csak a cl tartalma mdosul(hat). Operandusknt ltalnos regiszteren s memriahivatkozson kvl konstans rtket (kifejezst) s szegmensregisztert is megadhatunk. Az els o kt sor az adatszegmens-regiszter (DS) tartalmt lltja be, hogy az ltalunk ltrehozott ADAT-ra mutasson. Ezt nem teszi meg helyettnk az assembler annak ellenre sem, hogy az ASSUME direktvban mr szerepel a DS:ADAT el ors. Lthat, hogy az ADAT szegmens cmt el oszr betltjk egy ltalnos regiszterbe (CX), majd ezt bemozgatjuk DS-be. Viszont a MOV DS,ADAT utasts rvnytelen lenne, mert az Intel 8086-os processzor csak memria vagy ltalnos regiszter tartalmt tudja szegmensregiszterbe trakni, s ez a fordtott irnyra is vonatkozik (mellesleg pl. a MOV 1234h,DS utastsnak nem lenne semmi rtelme). Most jegyezznk meg egy fontos dolgot: CS tartalmt ilyen mdon nem tlthetjk fel (azaz a MOV CS, . . . forma rvnytelen), csak a vezrlstad utastsok vltoztathatjk meg CS-t! Olvasni viszont lehet bel ole, gy pl. a MOV SI,CS helyes utasts lesz. A kvetkez o sor a Kar vltoz tartalmt BL-be rakja. Lthat, hogy a memriahivatkozst a szgletes zrjelpr jelzi. Ez egybknt j plda a kzvetlen cmzsre, a sort ugyanis az assembler a MOV BL,[0000h] gpi utastsra fordtja le. Ha jobban megnzzk, 0000h pont a Kar vltoz ADAT szegmensbeli oszetje. Ezrt van teht szksg az ASSUME direktva megadsra, 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 m uvel. Ha visszaemlksznk a KIZR VAGY rtktblzatra, akkor knnyen rjhetnk, hogy ha egy szmot nmagval hozunk KIZR VAGY kapcsolatba, akkor minden esetben nullt kapunk. gy teht ez a sor megfelel a MOV BH,00h utastsnak, de ezt rhattuk volna mg SUB BH,BH-nak is. Teht mr hromflekppen tudunk kinullzni egy regisztert! Hogy vgre szmoljunk is valamit, az ADD AX,BX sszeadja a BX tartalmt az AX tartalmval, majd az eredmnyt az AX-be teszi. Rviden: hozzadja BX-et az AX regiszterhez. A m uvelet elvgzse sorn belltja az OF, SF, ZF, AF, PF s CF ag-eket. Kitallhat, hogy a kvetkez o sorban a Szam vltoz tartalmt vonjuk le az AL regiszterb ol, a SUB (SUBtract) ugyanis a forrs tartalmt vonja ki a clbl. Mind az ADD, mind a SUB utastsra igaz, hogy operandusknt ltalnos regisztert, memriahivatkozst 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 err ol az aktulis opercis 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 rhetjk el a DOS funkciit, ennek 4Ch szm szolgltatsa jelenti a programbl val kilpst (vagy mskppen a program befejezst, terminlst). A szolgltats szmt AH-ban kell megadnunk, AL-be pedig egy visszatrsi rtket, egyfajta hibakdot kell rni (ez lesz az ERRORLEVEL nev u vltoz rtke a DOS-ban). A megszaktst az egyoperandus INT (INTerrupt request) utasts vltja ki, s ezzel a program futsa befejez odik. Az INT operandusa csak egy bjt mret u kzvetlen rtk lehet. A megszaktsok hasznlatt ks obb trgyaljuk, most egyel ore fogadjuk el, hogy gy kell befejezni a programot. (Persze mskppen is lehetne, de most gy csinljuk.) Az aktulis forrsfjlt az END direktvval kell lezrni, klnben az assembler morcos lesz. Ha ez a f o forrsfjl, azaz ez tartalmazza azt a programrszt, aminek el kell indulnia a program betltse utn, akkor az END utn egy cmke nevnek kell szerepelnie. Az itt megadott cmre fog addni a vezrls a futtathat programfjl betltse utn. Vajon mi lett a szmols eredmnye? BL-be az a karaktert raktuk, ennek ASCII kdja 61h. A Szo rtknek megadshoz tudni kell, hogy a sztring-konstansokat is helyirtkes ket. Ezrt a Szo tartalma rendszerben rtelmezi az assembler, 256-os alap szmknt tekintve o 4861h. Az sszeads utn gy 4861h + 61h = 48C2h lesz AX-ben. Ebb ol mg levonjuk a Szam tartalmt (12h), s ezzel kialakul a vgeredmny: 48B0h.

8.2. Szmllsos ismtlses vezrls


Magas szint u 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 megkts a tbbi nyelvvel szemben: ciklusvltoznak csak CX hasznlhat, s nem adhat meg a ciklusvltoz ismtlsi tartomnya, csak a lefutsok szmt rhatjuk el o. A kvetkez o program kt vektor (egydimenzis tmb) tartalmt sszegzi egy harmadik vektorba. Az egyik vektor el ojeles bjtokbl, mg a msik el ojeles szavakbl fog llni.
Pelda2.ASM:
MODEL SMALL .STACK ADAT ElemSzam Vekt1 Vekt2 Eredm ADAT KOD SEGMENT EQU DB DW DW ENDS

5 6,-1,17,100,-8 1000,1999,-32768,4,32767 ElemSzam DUP (?)

SEGMENT ASSUME CS:KOD,DS:ADAT

@Start: MOV MOV AX,ADAT DS,AX

8.2. SZMLLSOS ISMTLSES VEZRLS

41
CX,ElemSzam BX,BX SI,BX AL,[Vekt1+BX] AX,[Vekt2+SI] [Eredm+SI],AX BX SI,[SI+2] @Ciklus AX,4C00h 21h @Start

MOV XOR MOV @Ciklus: MOV CBW ADD MOV INC LEA LOOP MOV INT ENDS END

KOD

Az els o jdonsgot az adatszegmensben szerepl o EQU (dene numeric EQUate) kulcssz kpviseli. Ez a fordtsi direktva numerikus konstanst (pontosabban helyettest o makrt) tud ltrehozni, ezrt leginkbb a C nyelv #dene utastshoz hasonlthat. Hatsra az ElemSzam szimblum minden el ofordulst az EQU jobb oldaln ll kifejezs rtkvel (5) fogja helyettesteni az assembler. Az eredmny vektor nyilvn ugyanolyan hossz lesz, mint a kt kiindul vektor, tpusa szerint szavas lesz. Szmra a helyet a kvetkez okppen 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 dencijhoz is hozz kell nylni, illetve ha nagy az elemek szma, akkor sok felesleges 0-t vagy krd ojelet kell kirnunk. Ezeket a knyelmetlensgeket sznteti meg a duplikl opertor. A DUP (DUPlicate) hatsra az opertor bal oldaln ll szm (ElemSzam), adott tpus (DW) elemekb ol ll terlet lesz lefoglalva, amit az assembler a DUP jobb oldaln zrjelben szerepl o kifejezssel (most ?) inicializl (azaz ez lesz a kezd ortk). Ez a mdszer teht jval leegyszer usti a nagy vltozterletek ltrehozst is. A ciklusvltoz szerept a CX regiszter tlti be, ami nem vletlen, hiszen a regiszter neve is innen szrmazik (Counter). A vektorelemek elrsre most nem hasznlhatunk kzvetlen cmzst, hiszen azzal csak a vektorok legels o elemt tudnnk kivlasztani. Ehelyett kt megolds knlkozik: minden adatterlethez hozzrendelnk egy-egy pointert (mutatt), vagy pedig valamilyen relatv cmzst alkalmazunk. A pointeres megoldsnak akkor van rtelme, ha mondjuk egy olyan eljrst runk, ami a clterletnek csak a cmt s elemszmnak mrett kapja meg. Pointer alatt itt most rvid, szegmensen belli mutatt rtnk, ami egy oszet rtk lesz. Pointereket csak bzis- vagy indexregiszterekben trolhatunk, hiszen csak ezekkel vgezhet o memriahivatkozs. A msik mdszer lehet ov teszi, hogy a vltozinkat tnylegesen tmbnek tekinthessk, s ennek megfelel oen az egyes elemeket indexelssel (tmbelem-hivatkozssal) rhessk el. Ehhez a megoldshoz szksg van a tmbk bzisra (kezd ocmre), illetve az elemkivlasztst megvalst tmbindexre. A tmbk kezd ocmt most konkrtan tudjuk, gy ez konstans numerikus rtk lesz. A tmbindexet tetszsnk szerint trolhatjuk brmely bzis- vagy indexregiszterben. Mivel minden vektorban elemr ol-elemre sorban haladunk, valamint a Vekt2

8.2. SZMLLSOS ISMTLSES VEZRLS

42

s az Eredm vektorok is szavasak, ezrt most csak kett o tmbindexre van szksgnk. BX a Vekt1-et indexeli, s egyesvel kell nvelni. SI-t ezzel szemben Vekt2 s Eredm indexelsre is hasznljuk, nvekmnye 2 bjt lesz. Vigyzzunk, az itt lert tmbelem-hivatkozs csak alakilag hasonlt a magas szint u nyelvek tmbindexelsre! Mg az utbbiaknl a hivatkozott tmbelem sorszmt kell megadni indexknt, addig Assemblyben a tmbelemnek a tmb (vagy ltalban a terlet) elejhez kpesti relatv cmt hasznljuk. Assemblyben a ciklus magja a ciklus kezdett jelz o cmkt ol (most @Cimke) a cikluskpz o utastsig (ez lesz a LOOP) tart. A Vekt1 kvetkez o elemt olvassuk ki el oszr AL-be, bzisrelatv cmzst hasznlva. Azutn ehhez kne hozzadnunk a Vekt2 megfelel o elemt. A kt vektor elemmrete azonban eltr o, egy bjtot pedig nem adhatunk hozz egy szhoz. Ez megoldhat, ha a bjtot tkonvertljuk szv. Az operandus nlkli CBW (Convert Byte to Word) utasts pont ezt teszi, az AL-ben lev o rtket el ojelesen kiterjeszti AX-be. gy mr elvgezhet o az sszeads, ami utn az eredmnyt is a helyre tesszk. Az INC (INCrement) utasts az operandust nveli meg 1-gyel, de termszetesen nem lehet kzvetlen rtk ez az operandus. M ukdse az ADD . . . ,1 utaststl csak annyiban tr el, hogy nem vltoztatja meg a CF rtkt, s ez nha fontos tud lenni. Az INC prja a DEC (DECrement), ami eggyel cskkenti operandust. SI-t tbbflekppen is megnvelhetnnk 2-vel: 1.
INC INC SI SI

2.
ADD SI,2

Mindkt megoldsnak van egy pici szpsghibja: az els o feleslegesen ismtel meg egy utastst, a msodik viszont tl nagy kdot generl (4 bjtot), s a ag-eket is ellltja. Ha kicsi a hozzadand rtk (mondjuk el ojelesen 1 bjtos), akkor rdemesebb a LEA (Load Eective Address) utastst hasznlni. Ez a forrs memriaoperandus tnyleges cmt (eective address) tlti be a cloperandusba, ami csak egy 16 bites ltalnos regiszter lehet. Az sszes ag-et bkn hagyja. Ismtlskppen: tnyleges cm alatt a hasznlt cmzsi md ltal jellt, meghatrozott memriacmet (oszetet) rtjk. gy a LEA SI,[SI+2] utasts a DS:(SI + 2) cm u memriarekesz oszetcmt tlti be SI-be, azaz 2-vel megnveli SI-t. Ez gy csak 3 bjtos utastst eredmnyez. Az utasts jelent osge jobban ltszik, ha bonyolultabb cmzsmdot hasznlunk:
LEA AX,[BX+DI-100]

Itt AX-be egy hromtag sszeg rtke kerl, s mindezt gy hajthatjuk vgre, hogy ms regiszterre nem volt szksgnk, tovbb ez az utasts is csak hrom bjtot foglal el. A tnyleges cikluskpzst a LOOP utasts vgzi. M ukdse: cskkenti CX-et, majd ha az zruss vlik, akkor a LOOP utni utastsra kerl a vezrls, klnben elugrik az operandus ltal mutatott memriacmre. A cskkents sorn egyetlen ag rtke sem vltozik meg. A

8.3. SZELEKCIS VEZRLS

43

LOOP .n. relatv ugrst hasznl, ami azt jelenti, hogy a cl cmet a LOOP utn kvetkez o

utasts elejhez kpest relatvan kell megadni (ez csak a gpi kd szinten szmt, Assemblyben nyugodtan hasznlhatunk cmkket). Ezt a relatv cmet 1 bjton trolja el, gy a 128 +127 bjtnyi tvolsgra lev o cmekre tudunk csak ciklust szervezni. Ha az operandus ltal mutatott cm tl messze lenne, akkor az assembler hibt fog jelezni. Ilyenkor csak azt tehetjk, hogy ms mdon (pl. feltteles s felttel nlkli ugrsok kombincijval) oldjuk meg a problmt. A szablyos ciklusokban egybknt csak visszafel mutat cmet szoktunk megadni a LOOP utn (teht a relatv cm negatv lesz). Fontos mg tudni, hogy a LOOP el oszr cskkenti CXet, s csak ezutn ellen orzi, hogy az nullv vlt-e. gy ha a ciklusba belpskor CX zr volt, akkor nem egyszer (s nem is nullaszor), hanem 65536-szor fog lefutni ciklusunk! A LOOP utastssal megrt ciklus teht legalbb 1-szer mindenkppen lefut. A LOOP utastsnak mg kt vltozata ltezik. A LOOPE, LOOPZ (LOOP while Equal/Zero/ZF = 1) cskkenti CX-et, majd akkor ugrik a megadott cmre, ha CX 0000h s ZF = 1. Ha valamelyik vagy mindkt felttel nem teljesl, a LOOP utni utastsra kerl a vezrls. A kt mnemonik ugyanazt a m uveleti kdot generlja. Hasonlan a LOOPNE, LOOPNZ (LOOP while Not Equal/Not Zero/ZF = 0) utasts CX cskkentse utn akkor ugrik, ha CX 0000h s ZF = 0 is teljesl.

8.3. Egyszeru s tbbszrs szelekcis vezrls


Ez a vezrlsi szerkezet egy vagy tbb felttel teljeslse vagy nem teljeslse szerinti elgazst tesz lehet ov a program menetben. Megfelel az IF . . . THEN . . . ELSE utastsok lncolatnak. A megoldand problma: konvertljunk t egy karaktersorozatot csupa nagybet usre. Az kezetes bet ukkel most nem tr odnk, a szveget pedig az ASCII 00h kd karakter fogja lezrni.
Pelda3.ASM:
MODEL SMALL .STACK ADAT Szoveg ADAT KOD SEGMENT DB "Ez egy PELDA szoveg." DB "Jo proci a 8086-os!",00h ENDS SEGMENT ASSUME CS:KOD,DS:ADAT

@Start: MOV MOV PUSH POP LEA MOV CLD AX,ADAT DS,AX DS ES SI,[Szoveg] DI,SI

8.3. SZELEKCIS VEZRLS

44

@Ciklus: LODSB OR JZ CMP JB CMP JA SUB @Tarol: STOSB JMP @Vege: MOV INT ENDS END AX,4C00h 21h @Start @Ciklus AL,AL @Vege AL,a @Tarol AL,z @Tarol AL,a-A

KOD

A program elejn kt ismer os utastssal is tallkozhatunk, ezek a verem trgyalsnl mr emltett PUSH s POP. Mindkett o egyoperandus, s ez az operandus nemcsak ltalnos regiszter vagy memriahivatkozs, de szegmensregiszter is lehet. 8 bites regisztert viszont nem fogadnak el, mivel a verem szavas szervezs u. A programban szerepl o PUSH-POP pr tulajdonkppen DS tartalmt tlti ES-be, amit rvidebben rhattunk volna MOV ES,AX-nek is, mindssze szemlltetni akarjuk, hogy gy is lehet rtket adni egy szegmensregiszternek. Br nem tartozik szorosan a kit uztt feladathoz, kt problma is felmerl ezzel a kt utastssal kapcsolatban. Az egyik, hogy vajon mit csinl a PUSH SP utasts? Nos, a 8086-os processzor esetn ez SP 2-vel cskkentse utn SP j (cskkentett) rtkt teszi le a verem SS:SP cmre, mg a ks obbi processzorok esetn a rgi rtk kerl eltrolsra. Furcsa egy megolds, az biztos. . . Mindenesetre ezzel nem kell foglalkoznunk, csak egy rdekessg. A msik dolog, amit viszont fontos megjegyezni, az az, hogy a POP CS utastst a MOV CS, . . . -hez hasonlan nem szereti sem az assembler, sem a processzor. Ha belegondolunk hogy ez mit jelentene, lthatjuk, hogy felttel nlkli vezrlstadst valstana meg, de gy, hogy kzben csak CS rtke vltozna, IP- nem! Ez pedig veszlyes s kiszmthatatlan eredmnyekkel jrna. gy a CS nem lehet a POP operandusa. (Igazsg szerint a 8086-os processzor rtelmezni tudja ezt az utastst, aminek gpi kdja 0Fh, viszont a ks obbi processzorokon ennek a kdnak ms a szerepe. Ezrt s az el obb emltettek miatt ne hasznljuk!) A kvetkez o hrom utasts a sztringkezel o utastsokat (LODSB s STOSB) kszti el o. A forrssztring cmt DS:SI fogja tartalmazni, gy a Szoveg oszetjt betltjk SI-be. Megjegyezzk, hogy a TASM ezt az utastst MOV SI,OFFSET [Szoveg]-knt fogja lefordtani, taln azrt, mert ez kicsit gyorsabb lesz, mint az eredeti vltozat. A clsztring az ES:DI cmen fog elhelyezkedni. Most helyben fogunk konvertlni, gy DI-t egyenl ov tesszk SI-vel. Az operandus nlkli CLD (CLear Direction ag) a DF ag-et trli. Ennek szksgessge rgvest kiderl. A LODSB (LOaD String Byte) a DS:SI cmen lev o bjtot betlti AL-be, majd SI-t eggyel nveli, ha DF = 0, ill. cskkenti, ha DF = 1. Msik alakja, a LODSW (LOaD String Word) AX-be tlti be a DS:SI-n lev o szt, s SI-t 2-vel nveli vagy cskkenti DF-t ol fgg oen. Egyetlen ag-et sem vltoztat meg. Az OR AL,AL utasts ismt egy trkkt mutat be. Ha egy szmot nmagval hozunk lo-

8.3. SZELEKCIS VEZRLS

45

gikai VAGY kapcsolatba, akkor maga a szm nem vltozik meg. Cserbe viszont CF, AF s OF trl odik, SF, ZF s PF pedig az operandusnak megfelel oen mdosulnak. Itt most annak tesztelsre hasznltuk, hogy AL zrus-e, azaz elrtk-e a sztringnk vgt. Ezt megtehettk volna a ks obb szerepl o CMP AL,00h utastssal is, csak gy elegnsabb. Elrkeztnk a megolds kulcshoz, a feltteles ugrsokhoz (conditional jumps). Ezek olyan vezrlstad utastsok, amik valamilyen ag (vagy ag-ek) llsa alapjn vagy elugranak az operandus szerinti cmre, vagy a kvetkez o utastsra trnek. sszesen 17 db. van bel olk, de mnemonikbl ennl tbb van, mivel nmelyik egynl tbb elnevezs alatt is elrhet o. A tblzatban egy sorban lev o mnemonikok ugyanazt az utastst kpviselik. Hrom csoportba oszthatk: el ojeles aritmetikai, el ojeltelen aritmetikai s egyb feltteles ugrsok. El oszr jjjenek az el ojeles vltozatok (8.1. tblzat)! 8.1. tblzat. El ojeles aritmetikai feltteles ugrsok

Mnemo.
JL, JNGE JNL, JGE JLE, JNG JNLE, JG

Hats Ugrs, ha kisebb/nem nagyobb vagy egyenl o Ugrs, ha nem kisebb/nagyobb vagy egyenl o Ugrs, ha kisebb vagy egyenl o/nem nagyobb Ugrs, ha nem kisebb vagy egyenl o/nagyobb

A mnemonikokat teht gy kpezzk, hogy a J bet ut (ami a Jump if . . . kifejezst rvidti) egy, kett o vagy hrom bet us rvidts kveti. Nmi angol tudssal knnyebben megjegyezhet ok az egyes vltozatok, ha tudjuk, mit jellnek az egyes rvidtsek: L Less G Greater N Not LE Less or Equal GE Greater or Equal Most nzzk az el ojel nlkli ugrsokat (8.2. tblzat)! 8.2. tblzat. El ojeltelen aritmetikai feltteles ugrsok

Mnemonik
JB, JNAE, JC JNB, JAE, JNC JBE, JNA JNBE, JA

Hats Ugrs, ha kisebb/nem nagyobb vagy egyenl o/CF = 1 Ugrs, ha nem kisebb/nagyobb vagy egyenl o/CF = 0 Ugrs, ha kisebb vagy egyenl o/nem nagyobb Ugrs, ha nem kisebb vagy egyenl o/nagyobb

Az alkalmazott rvidtsek: B Below C Carry A Above

8.3. SZELEKCIS VEZRLS

46

BE Below or Equal AE Above or Equal Mint vrhat volt, a JB s JC ugyanazt jelentik, hiszen mindkett o azt fejezi ki, hogy a legutols m uvelet el ojel nlkli aritmetikai tlcsordulst okozott. Lssuk a megmaradt tovbbi ugrsokat (8.3. tblzat)! 8.3. tblzat. Specilis feltteles ugrsok

Mnemo.
JE, JZ JNE, JNZ JO JNO JS JNS JP, JPE JNP, JPO JCXZ

Hats Ugrs, ha egyenl o/ZF = 1 Ugrs, ha nem egyenl o/ZF = 0 Ugrs, ha OF = 1 Ugrs, ha OF = 0 Ugrs, ha SF = 1 Ugrs, ha SF = 0 Ugrs, ha PF = 1/pros parits Ugrs, ha PF = 0/pratlan parits Ugrs, ha CX = 0000h

A rvidtsek magyarzata pedig: E Equal Z Zero O Overow S Sign P Parity PE Parity Even PO Parity Odd CXZ CX is Zero (vagy CX equals Zero) Mint lthat, a JCXZ kakukktojs a tbbi ugrs kztt, mivel nem egy ag, hanem a CX regiszter llsa szerint cselekszik. Mindegyik feltteles ugr utasts egyetlen operandusa a cl memriacm, de ez is el ojeles relatv cmknt 1 bjtban troldik el, a LOOP utastshoz hasonlan. Pontosan ezen megkts miatt tallhat meg mindegyik felttelnek (a JCXZ-t kivve) a neglt prja is. A kvetkez o pldt ugyanis nem fogja lefordtani az assembler (a TASM-ra ez nem teljesen igaz, a JUMPS s NOJUMPS direktvkkal megadhat, hogy magtl kijavtsa-e az ilyen helyzeteket, avagy utastsa vissza):
XOR JZ ... DB ... AX,AX @Cimke 200 DUP (?)

KamuAdat @Cimke:

8.3. SZELEKCIS VEZRLS

47

A 200 bjtos terletfoglals biztostja, hogy a JZ utastst kvet o bjt messzebb legyen a @Cimke cmkt ol, mint a megengedett +127 bjt. Az ugrst radsul vgre kell hajtani, mivel a XOR AX,AX hatsra ZF = 1 lesz. Ezt a hibs szitucit feloldhatjuk, ha a JZ . . . helyett JNZ-JMP prost hasznlunk (a JMP lersa kicsit lentebb lesz):
XOR JNZ JMP @KamuCimke: KamuAdat @Cimke: ... DB ... 200 DUP (?) AX,AX @KamuCimke @Cimke

A pldaprogramhoz visszatrve, az OR AL,AL s a JZ . . . hatsra megoldhat, hogy az algoritmus lelljon, ha elrtk a sztring vgt. Most jn maga a szelekci: el kell dnteni, hogy az aktulis karaktert (ami AL-ben van) kell-e konvertlni. Konverzit kell vgezni, ha 61h AL 7Ah (a kdja 61h, z kdja 7Ah), klnben vltozatlanul kell hagyni a karaktert. El oszr azt nzzk meg, hogy AL < 61h teljesl-e. Ha igen, akkor nem kell konverzi. Klnben ha AL > 7Ah, akkor ugyancsak nincs konverzi, klnben pedig elvgezzk az talaktst. A lertakat CMP-Jccc utastsprosokkal oldjuk meg. (A ccc egy rvnyes felttelt jell. A Jccc jells ezrt valamilyen feltteles ugrs mnemonikja helyett ll.) A CMP (CoMPare) utasts kiszmtja a cloperandus s a forrsoperandus klnbsgt, belltja a ag-eket, az operandusokat viszont bkn hagyja (s eldobja az eredmnyt is). Operandusknt ltalnos regisztert, memriahivatkozst s konstans rtket adhatunk meg. A konverzit az egyetlen SUB AL,a-A utasts vgzi el. Akr volt konverzi, akr nem, az algoritmus vgrehajtsa a @Tarol cmkt ol folytatdik. Meggyelhetjk, hogy ez a rsz kzs rsz a szelekci mindkt gban (t.i. volt-e konverzi avagy nem), gy felesleges lenne mindkt esetben kln lerni. Ehelyett azt tesszk, hogy ha nem kell konvertlni, akkor elugrunk a @Tarol cmkre, klnben elvgezzk a szksges talaktst, s rcsorgunk erre a cmkre. Az ilyen megoldsok igen gyakoriak az Assembly programokban, hasznlatuk rvidebb, gyorsabb teszi azokat, az algoritmusok pedig ttekinthet obbek lesznek ltaluk. Most jn a krdses karakter eltrolsa. Ezt egy msik sztringkezel o utasts, a STOSB (STOre String Byte) intzi el. M ukdse: AL-t eltrolja az ES:DI cmre, majd DI-t megnveli eggyel, ha DF = 0, illetve cskkenti, ha DF = 1. A STOSW (STOre String Word) utasts, hasonlan a LODSW-hez, AX-szel dolgozik, s DI-t 2-vel nveli vagy cskkenti. Ezutn vissza kell ugranunk a @Ciklus cmkre, mert a tbbi karaktert is fel kell dolgozni a sztringnkben. Erre szolgl a JMP (JuMP) felttel nlkli ugrs (unconditional jump). M ukdse: az operandusknt megadott cmre lltja be IP-t (van egy msik, tvoli formja is, ekkor CS-t is tlltja), s onnan folytatja a vgrehajtst. rdekes, hogy a JMP is relatv cmknt trolja el a cl memriacmt, viszont a feltteles ugrsokkal s a LOOP-pal ellenttben a JMP 16 bites relatv cmet hasznl, gy a 32768 +32767 bjt tvolsgban lev o cmekre tudunk el ore-htra ugrlni. (Ez csak a kzeli, ugyanazon kdszegmensen belli ugrsra vonatkozik, de err ol majd ks obb.) Ha jobban megnzzk, szrevehetjk, hogy az algoritmus elejn szerepl o OR AL,AL // JZ @Vege s az utbbi JMP @Ciklus utastsok egy hurok vezrlsi szerkezetet rnak el o, amiben

8.4. ELJRSVEZRLS

48

az OR-JZ pros alkotja a kilpsi felttelt, a JMP pedig maga a ciklusszervez o utasts (t.i. vgtelen ciklust valst meg). De ha jobban tetszik, ezt tekinthetjk akr el ofeltteles vezrlsi szerkezetnek is (WHILE . . . DO ciklus). A @Vege cmke elrsekor a kiindul sztringnk mr nagybet usen virt a helyn.

8.4. Eljrsvezrls
A program eljrsokra s fggvnyekre (egyszval szubrutinokra) bontsa a strukturlt programozs alapjt kpezi. Nzzk meg, hogyan hasznlhatunk eljrsokat Assemblyben. A feladat: rjunk olyan eljrst, ami az AX-ben tallhat el ojel nlkli szmot kirja a kperny ore decimlis alakban!
Pelda4.ASM:
MODEL SMALL .STACK KOD SEGMENT ASSUME CS:KOD,DS:NOTHING PROC PUSH PUSH PUSH PUSH MOV XOR OR JZ XOR DIV PUSH INC JMP @CiklVege: MOV JCXZ @KiirCikl: POP ADD INT LOOP JMP @NullaVolt: MOV INT @KiirVege: POP DX DL,0 21h DX DL,0 21h @KiirCikl @KiirVege AH,02h @NullaVolt

DecKiir

AX BX CX DX BX,10 CX,CX AX,AX @CiklVege DX,DX BX DX CX @OsztCikl

@OsztCikl:

8.4. ELJRSVEZRLS

49
POP POP POP RET ENDP PROC PUSH PUSH MOV MOV INT MOV INT POP POP RET ENDP CX BX AX

DecKiir UjSor

AX DX AH,02h DL,0Dh 21h DL,0Ah 21h DX AX

UjSor @Start:

KOD

XOR CALL CALL MOV CALL CALL MOV CALL CALL MOV CALL CALL MOV INT ENDS END

AX,AX DecKiir UjSor AX,8086 DecKiir UjSor AX,8000h DecKiir UjSor AX,0FFFFh DecKiir UjSor AX,4C00h 21h @Start

Ez egy kicsit hosszra sikeredett, de ht a problma sem annyira egyszer u. Nzzk el oszr a f oprogramot (azaz a @Start cmke utni rszt)! Itt minden ismer osnek t unik, kivve a CALL utastst. Ez az egyoperandus utasts szolgl az eljrsok vgrehajtsra, ms szval az eljrshvsra (procedure call). M ukdse: a verembe eltrolja az IP aktulis rtkt (teht szimbolikusan vgrehajt egy PUSH IP-t), majd IP-t belltja az operandus ltal mutatott cmre, s onnan folytatja az utastsok vgrehajtst. A clcmet a JMP-hez hasonlan 16 bites el ojeles relatv cmknt trolja. (Ltezik tvoli formja is, ekkor CS-t is lerakja a verembe az IP el ott, illetve belltja a cl kdszegmenst is.) Az operandus helyn most egy eljrs neve ll (ami vgl is egy olyan cmke, ami az eljrs kezdetre mutat). Kt eljrst rtunk, a DecKiir vgzi el AX tartalmnak kirst, az UjSor pedig a kperny o kvetkez o sorra lltja a kurzort. Tesztels cljbl a 0, 8086, 32768 s 65535 rtkeket ratjuk ki. Most trjnk vissza a program elejre, ahol az eljrsokat helyeztk el (egybknt brhol lehetnnek, ez csak megszoks krdse). Eljrst a kvetkez o mdon denilhatunk:

8.4. ELJRSVEZRLS

50
Nv eljrstrzs Nv PROC ENDP {opcik}

Az eljrs trzst (azaz annak m ukdst ler utastsokat) a PROC . . . ENDP direktvk (nem pedig mnemonikok!) fogjk kzre. Van nhny olyan rsz, ami a legtbb eljrs trzsben kzs. Az eljrs elejn szoksos az eljrsban ks obb mdostott regiszterek tartalmt a verembe elmenteni, hogy azokat ks obb visszallthassuk, s a hv program m ukdst ne zavarjuk be azzal, hogy a regiszterekbe zagyvasgokat tesznk. Termszetesen ha egy regiszterben akarunk visszaadni valamilyen rtket, akkor azt nem fogjuk elmenteni. Az eljrsbl a hvhoz visszatrs el ott a verembe berakott regiszterek tartalmt szpen helyrelltjuk, mghozz pontosan a beraks fordtott sorrendjben. A DecKiir eljrsban a 4 ltalnos adatregisztert fogjuk megvltoztatni, ezrt ezeket szpen PUSH-sal berakjuk a verembe az elejn, majd az eljrs vgn fordtott sorrendben POP-pal kivesszk. Binris szmot gy konvertlunk decimlisra, hogy a kiindul szmot elosztjuk maradkosan 10-zel, s a maradkot szpen eltroljuk. Ha a hnyados nulla, akkor kszen vagyunk, klnben a hnyadost tekintve az j szmnak, azon folytatjuk a 10-zel val osztogatst. Ha ez megvolt, akkor nincs ms dolgunk, mint hogy az osztsok sorn kapott maradkokat a megkaps fordtott sorrendjben egyms mell rjuk mint szmjegyeket. gy teht az els o maradk lesz a decimlis szm utols jegye. Az osztt most BX-ben troljuk, CX pedig az eltrolt maradkokat (szmjegyeket) fogja szmolni, ezrt kezdetben kinullzzuk. Az osztsokat egy el ofeltteles ciklusba szervezve vgezzk el. A ciklusnak akkor kell megllnia, ha AX (ami kezdetben a kirand szm, utna pedig a hnyados) nullv vlik. Ha ez teljesl, akkor kiugrunk a ciklusbl, s a @CiklVege cmkre ugrunk. Ha AX 0000h, akkor osztanunk kell. A DIV (unsigned DIVision) utasts szolgl az el ojeltelen osztsra. Egyetlen operandusa van, ami 8 vagy 16 bites regiszter vagy memriahivatkozs lehet. Ha az operandus bjt mret u, akkor AX-et osztja el az adott operandussal, a hnyadost AL-be, a maradkot pedig AH-ba teszi. Ha szavas volt az operandus, akkor DX:AX-et osztja el az operandussal, a hnyados AX-be, a maradk DX-be kerl. A 6 aritmetikai ag rtkt elrontja. Neknk most a msodik esetet kell vlasztanunk, mert el ofordulhat, hogy az els o nhny oszts hnyadosa nem fog elfrni egy bjtban. gy teht BX-szel fogjuk elosztani DX:AX-et. Mivel a kiindul szmunk csak 16 bites volt, a DIV viszont 32 bites szmot kvetel meg, DX-et az oszts elvgzse el ott trlnnk kell. A maradkokat a veremben fogjuk trolni az egyszer ubb kirats kedvrt, ezrt DX-et berakjuk oda, majd a szmllt megnveljk. Vgl visszaugrunk az oszt ciklus elejre. A szmjegyek kirsra a legegyszer ubb mdszert vlasztjuk. Mr emltettk, hogy az INT 21h-n keresztl a DOS szolgltatsait rhetjk el. A 02h szm szolgltats (azaz ha AH = 02h) a DL-ben lev o karaktert kirja a kperny ore az aktulis kurzorpozciba. AH-ba ezrt most berakjuk a szolgltats szmt. Ha az eljrs hvsakor AX nulla volt, akkor az oszt ciklus egyszer sem futott le, hanem rgtn az elejn kiugrott. Ekkor viszont CX = 0, hiszen gy lltottuk be. Ezek hatsra a JCXZ utasts segtsgvel a @NullaVolt cmkn folytatjuk az eljrs vgrehajtst, ahol a 21hs szoftver-megszakts segtsgvel kirjuk azt az egy szmjegyet, majd rcsorgunk a @KiirVege cmkre. Ha nemzr rtkkel hvtuk meg eljrsunkat, akkor itt az ideje, hogy kirjuk a CX db. jegyet a kperny ore. Ezt egy egyszer u szmllsos ismtlses vezrlssel (LOOP ciklussal)

8.4. ELJRSVEZRLS

51

elintzhetjk. Mivel a verem LIFO m ukds u, gy a legutoljra betett maradkot vehetjk ki legel oszr, s ezt is kell els o szmjegyknt kirnunk. Az rvnyes decimlis jeggy konvertlst az ADD DL,0 utasts vgzi el, majd a karaktert megszakts-hvssal kikldjk a monitorra. A kirs vgeztvel szintn a @KiirVege cmkre megynk. Miutn visszalltottuk a mdostott eredeti regiszterek tartalmt, vissza kell trnnk arra a helyre, ahonnan meghvtk az eljrst. Erre szolgl a RET (RETurn) utasts. Kt vltozata van: ha nem runk mell operandust, akkor a veremb ol kiszedi IP-t (amit el oz oleg a CALL rakott oda), s onnan folytatja a vgrehajtst. De rhatunk egy 16-bites kzvetlen rtket (numerikus kifejezst) is operandusknt, ekkor az IP kiszedse utn ezt a szmot hozzadja SP-hez (olyan, mintha Szm/2 db. POP-ot hajtana vgre), majd az j CS:IP cmre adja a vezrlst. Mi most nem akarunk vltoztatni a veremmutatn, gy az egyszer u RET-tel visszatrnk a f oprogramba. Az UjSor eljrs nagyon egyszer u s rvid. A regiszterek elmentsn ill. visszalltsn kvl csak kt megszakts-hvst tartalmaz, amik a 0Dh s 0Ah ASCII kd karaktereket rjk ki a kperny ore. Az els o karakter az .n. kocsivissza (CR Carriage Return), a msik pedig a soremels (LF Line Feed). Ezek alkotjk az j sor (new line) karakterprt. Ha sok regisztert kell elmentennk s/vagy visszalltanunk, akkor fraszt s felesleges minden egyes regiszterhez kln PUSH vagy POP utastst rni. Ezt megknnytend o, a TASM lehet ov teszi, hogy egynl tbb operandust rjunk ezen utastsok utn, az egyes operandusokat egymstl szkzzel elvlasztva. gy a PUSH AX BX CX DX // POP SI DI ES utastsok ekvivalensek a kvetkez o sorozattal:
PUSH PUSH PUSH PUSH POP POP POP AX BX CX DX SI DI ES

9. fejezet

A Turbo Debugger hasznlata


Az eddig megrt programjaink m ukdst nem tudtuk ellen orizni, gy pedig elg knyelmetlen programozni, hogy nem ltjuk, tnyleg azt csinlja-e a program, amit elvrunk t ole. Ha valami rosszul m ukdik, netn a szmtgp semmire sem reagl (ezt gy mondjuk, hogy kiakadt vagy lefagyott), a hiba megkeresse egyszer uen remnytelen feladat segtsg nlkl. Ezt a termszetes ignyt elgtik ki a klnbz o debugger (nyomkvet o, de sz szerint bogrtalant) szoftverek ill. hardverek. (Az elnevezs mg a szmtstechnika h oskorszakbl szrmazik, amikor is az egyik akkori szmtgp m ukdst valamilyen rovar zavarta meg. Azta hvjk a hibavadszatot bogrirtsnak.) A Turbo Assemblert s Linkert kszt o Borland cg is knl egy szoftveres nyomkvet o eszkzt, Turbo Debugger (TD) nven. Most ennek hasznlatval fogunk megismerkedni. A Turbo Debugger f o tulajdonsga, hogy kpes egy futtathat llomnyt (.EXE vagy .COM kiterjesztssel) betlteni, majd annak gpi kd tartalmt Assembly forrsra visszafejteni. Ezt hvjuk disassembllsnak (disassembly) vagy szebb magyar szval a forrs visszafejtsnek. A legszebb a dologban az, hogy a programban szerepl o kd- s memriahivatkozsokat konkrt szmok helyett kpes az eredeti forrsban szerepl o szimblumokkal megjelenteni. Ezenkvl minden utastst egyenknt hajthatunk vgre, ha akarjuk, tbbszr is, s ot megadhatjuk, hogy a program vgrehajtsa egy bizonyos felttel teljeslse esetn szakadjon meg. Figyelhetjk a memria tetsz oleges terletnek tartalmt, a regiszterek s ag-ek rtkeit, s mindezeket meg is vltoztathatjuk. A program futst az eredeti forrsokon is kpes kvetni. Szval csupacsupa hasznos szolgltatssal br, amikkel pont olyan knyelmesen gyelhetjk programunk tevkenysgt, mintha mondjuk a Borland C fejleszt o rendszerben (IDE) dolgoznnk. Ahhoz hogy mindezt a knyelmet lvezhessk, nem kell mst tenni, mint: minden forrst a /zi vagy /zd kapcsolval lefordtani a trgykdokat a /v kapcsolval sszeszerkeszteni Ha ezt a kt m uveletet elvgeztk, akkor a .EXE llomnyunk (remlhet oleg) tartalmazza az sszes szimbolikus informcit, amire a nyomkvets sorn szksg lehet. A dolognak kt htrnya van: egyrszt .COM programokba nem kerlhet nyomkvetsi info, msrszt ez az adathalmaz az .EXE fjl mrett igencsak megnvelheti (el ofordulhat, hogy az eredeti tbbszrse lesz a kimenet mrete). A legels o pldaprogramot (Pelda1.ASM) begpeltk s elmentettk PELDA.ASM nven, majd lefordtottuk s linkeltk, az sszes debug informcit belerakva. A

53 TD PELDA.EXE parancs kiadsa utni llapotot tkrzi a 9.1. kp. A kperny o tetejn ill. aljn a mr megszokott mensor s sttuszsor tallhatk. A kp nagy rszt elfoglal munkaasztalon (desktop) helyezkednek el a klnfle clt szolgl ablakok. A legfels o ablak (CPU ablak) tbb rszre oszthat. A bal fels o sarok az aktulis kd disassembllt vltozatt mutatja, s most ppen gy van belltva, hogy a forrs eredeti sorait is megjelenti. A kvetkez o vgrehajtand sor a bal oldalon egy kis jobbra mutat hromszggel van megjellve (ez most a CS:0009h cm u sor). Emellett az egyes regiszterek s ag-ek tartalma lthat. Az el oz o llapothoz kpest megvltozott dolgokat fehr sznnel jelli meg. A bal als sarok a memria egy adott terletnek tartalmt mutatja hexadecimlis s ASCII alakban (ez az .n. memory dump). Vgl a jobb als sarokban a verem aktulis llapott szemllhetjk meg. A veremmutatt (azaz a verem tetejt) szintn egy jobbra mutat stt hromszg jelzi. A kp kzepn lev o nagyobb ablakban a forrsban kvethetjk nyomon a program futst. Itt mindig azt a fjlt ltjuk, amihez az ppen vgrehajtott kd tartozik. A kvetkez o vgrehajtand sort a bal oldalon kis fehr hromszg mutatja. Az alatta lthat, Stack cmkj u ablak a klnbz o eljrs- s fggvnyhvsok sorn a verembe rakott argumentumokat mutatja. A legals, keskeny ablak a Watches cmkt viseli. Ennek megfelel oen az ltalunk hajtott vltozk, memriaterletek aktulis rtkt kvethetjk itt gyelemmel. A fels o sorban tallhat menrendszeren kvl minden ablakban el ohvhat egy helyi men (local menu) az <ALT>+<F10> billenty ukombincival, ahol az aktulis ablakban (vagy rszablakban) rendelkezsre ll plusz szolgltatsokat rhetjk el. Ilyenek pl. az utasts assembllsa, regiszter tartalmnak megvltoztatsa, ag trlse, meggyelend o vltoz felvtele a Watches listba stb. Az ablakok kztt az <F6> s <Shift>+<F6> billenty ukkel mozoghatunk, mg az aktulis ablakon bell a <Tab> s a <Shift>+<Tab> kombincikkal lpkedhetnk a rszablakok kztt. Most ttekintjk az egyes menk funkciit. A File men a szoksos llomnym uveleteket tartalmazza, de itt kaphatunk informcit a betlttt programrl is. Az Edit men szintn a gyakori msols-beszrs tpus funkcikat rejti. A View men kszlete igen gazdag. Innen nzhetjk meg a vltozkat (Variables), a CPU ablakot, msik programmodult, tetsz oleges llomnyt s mg sok minden mst. A Run menben, mint neve is sejteti, a futtatssal kapcsolatos tevkenysgek vannak sszegy ujtve, de itt llthatk be a program futtatsi (parancssoros) argumentumai is. Szinte az sszes itteni szolgltatshoz tartozik valamilyen gyorsbillenty u (hot key) is. Nhny ezek kzl: futtats <F9>, jraindts <Ctrl>+<F2>, adott sorig vgrehajts <F4>, lpsenknti vgrehajts <F7>, CALL s INT utastsok tugrsa <F8>. A Breakpoints menvel a trspontokat tarthatjuk karban. A trspont egy olyan hely a kdban, ahol a program vgrehajtsnak valamilyen felttel teljeslse esetn (vagy mindenkppen) meg kell szakadnia. Ilyenkor a vezrlst ismt visszakapjuk a TD kperny ojvel egytt, s kedvnk szerint beavatkozhatunk a program menetbe. A Data men az adatok, vltozk manipullst segti. Az Options menben tallhatk a TD belltsai. Ilyenek pl. a forrs nyelve (Language), helye (Path for source), kperny ovel kapcsolatos dolgok (Display options).

54

9.1. bra. A Turbo Debugger kperny oje

55 A Window men az ablakokkal val b uvszkedsre j, a Help men pedig a szoksos sgt tartalmazza. A TD egybknt nemcsak Assembly, de Pascal s C nyelv u programot is kpes nyomon kvetni, s az ezekben a nyelvekben meglev o sszes adattpust is kpes kezelni.

10. fejezet

Szmols el ojeles szmokkal, bitmuveletek


Ebben a fejezetben a gyakorlati problmk megoldsa sorn gyakran el ofordul feladatokkal foglalkozunk. Teljes pldaprogramokat most nem kzlnk, a megolds mdszert egy-egy rvid programrszleten fogjuk bemutatni.

10.1. Matematikai kifejezsek kirtkelse


Az els o problmakrt a klnbz o el ojel u szmokat tartalmaz matematikai kifejezsek kirtkelse alkotja. Pldul tegyk fel, hogy AL-ben van egy el ojeles, mg BX-ben egy el ojel nlkli rtk, s mi ezt a kt szmot szeretnnk sszeadni, majd az eredmnyt a DX:AX regiszterprban trolni. Az ehhez hasonl feladatoknl mindig az a megolds, hogy a kt sszeadandt azonos mret ure kell hozni. Ez egsz pontosan kt dolgot jelent: az el ojeles szmokat el ojelesen, az el ojelteleneket zr-kiterjesztsnek (el ojeltelen-kiterjesztsnek) kell alvetni. Ismtlsknt: zr-kiterjesztsen (zero extension) azt rtjk, amikor az adott rtk fels o, hinyz bitjeit csupa 0-val tltjk fel, ellenttben az el ojeles kiterjesztssel, ahol az el ojelbitet hasznljuk kitlt o rtkknt. Azt is vegyk gyelembe, hogy az eredmny (sszeg) mindig hosszabb lesz 1 bittel mint a kiindul tagok hossznak maximuma. Ha ez megvan, akkor jhet a tnyleges sszeads. Itt gyelnnk kell arra, mit s milyen sorrendben adunk ssze. El oszr az als bjtokon/szavakon vgezzk el a m uveletet. Itt kapunk egy rszeredmnyt, valamint egy esetleges tvitelt, amit a fels o bjtok/szavak sszeadsakor is gyelembe kell venni. Ezek alapjn nzznk egy lehetsges megoldst:
CBW CWD ADD ADC

AX,BX DX,0000h

El oszr tisztzzuk az eredmny mrett. Az el ojeles szm 8 bites, az el ojeltelen 16 bites, ebb ol 17 bit jn ki. Az als 16 bit meghatrozsa nem nagy kunszt, a CBW utasts szpen kiterjeszti el ojelesen AL-t AX-be, amihez aztn hozzadhatjuk BX tartalmt. Az eredmny als 16 bitje ezzel mr megvan. A legfels o bit azonban, mint gondolhatnnk, nem maga az tvitel lesz.

10.1. MATEMATIKAI KIFEJEZSEK KIRTKELSE

57

Lssuk mondjuk, mi lesz, ha AL = 1, BX = 65535. AX-ben el ojeles kiterjeszts utn 0FFFFh lesz, de ugyanezt fogja BX is tartalmazni. A kt szmot sszeadva 0FFFEh-t kapunk, s CF = 1 lesz. Lthat, hogy a helyes eredmny is 0 FFFEh lesz, nem pedig 1 FFFEh. A megolds kulcsa, hogy az eredmnyt 24 vagy 32 bitesnek tekintjk. Most az utbbit vlasztjuk, hiszen DX:AXben vrjuk az sszeget. Innen mr kvetkezik a mdszer: mindkt kiindul szmot 32 bitesnek kpzeljk el, s az sszeadst is eszerint vgezzk el. Az AX-ben lev o el ojeles szmot az CWD (Convert Word to Doubleword) operandus nlkli utasts DX:AX-be el ojelesen kiterjeszti, az sszes ag-et bkn hagyva. A msik, BX-ben lev o tagnak zr-kiterjesztsen kellene tesnie, amit mi most kihagyunk, de az sszeads sorn gyelembe fogunk venni. Miutn AX-ben kpeztk az eredmny als szavt, itt az ideje, hogy a fels o szavakat is sszeadjuk az tvitellel egytt. A ktoperandus ADC (ADd with Carry) utasts annyiban tr el az ADD-t ol, hogy a clhoz CF zr-kiterjesztett rtkt is hozzadja. Az el ojeles tag fels o szava mr DX-ben van, a msik tag fels o szava azonban 0000h. Ezrt az utols utastssal DX-hez hozzadjuk a kzvetlen adatknt szerepl o nullt s CF-et is. Ha mindenkppen zr kiterjesztst akarunk, akkor gy kell mdostani a programot:
CBW CWD XOR ADD ADC

CX,CX AX,BX DX,CX

CX helyett persze hasznlhatunk ms regisztert is a nulla trolsra. A pldt befejezve, DX 0FFFFh-t fog tartalmazni a CWD hatsra, amihez a 0000h-t s az tvitelt hozzadva DX is nullv vlik. DX:AX gy a helyes eredmnyt fogja tartalmazni, ami 0000 FFFEh. A feladatban helyettestsk most az sszeadst kivonssal, teht szeretnnk az AL-ben lev o el ojeles szmbl kivonni a BX-ben lev o el ojel nlkli szmot, az eredmnyt ugyancsak DX:AXben vrjuk. A megolds a kvetkez o lehet:
CBW CWD SUB SBB

AX,BX DX,0000h

Teljesen vilgos, hogy az sszeadsokat a programban is kivonsra kicserlve clhoz rnk. Az ADC prja az SBB (SuBtract with Borrow), ami a SUB-tl csak annyiban tr el, hogy a clbl CF zr-kiterjesztett rtkt is kivonja. Mind a 4 additv utasts az sszes aritmetikai ag-et, teht a CF, PF, AF, ZF, SF s OF ageket mdostja. Operandusknt ltalnos regiszteren s memriahivatkozson kvl konstans rtket is kaphatnak. Trjnk most r a szorzsra s osztsra. A gpi aritmetika trgyalsnl mr emltettk, hogy szorozni s osztani sokkal krlmnyesebb, mint sszeadni s kivonni. A gondot az el ojeles s el ojeltelen szmok csak tovbb bonyoltjk. Azt is emltettk, hogy el ojeles esetben a tagok el ojelt le kell vlasztani a m uveletek elvgzshez, miutn megllaptottuk az eredmny el ojelt. (Ez persze nem a mi dolgunk, a processzor elvgzi helyettnk.) Ezen okbl mind szorzsbl mind osztsbl ltezik el ojeles s el ojel nlkli vltozat is. Mindegyik utastsban kzs, hogy az egyik forrs tag s az eredmny helye is rgztve van, tovbb mindegyik uta-

10.1. MATEMATIKAI KIFEJEZSEK KIRTKELSE

58

sts egyetlen operandust kap, ami csak egy ltalnos regiszter vagy memriahivatkozs lehet. Kzvetlen rtkkel teht nem szorozhatunk, de nem is oszthatunk! Nzzk meg el oszr az el ojel nlkli vltozatokat, ezek az egyszer ubbek. Szorozni a MUL (unsigned MULtiplication) utastssal tudunk. Ennek egyetlen operandusa az egyik szorz tagot (multiplier) tartalmazza. Az operandus mrete hatrozza meg a tovbbiakat: ha 8 bites az operandus, akkor AL-t szorozza meg azzal, az eredmny pedig AX-be kerl. Ha sz mret u volt az operandus, akkor msik tagknt AX-et hasznlja, az eredmny pedig DX:AX-ben keletkezik. Osztsra a DIV (unsigned DIVision) utasts szolgl, ezzel mr korbban tallkoztunk, de azrt feleleventjk hasznlatt. Az egyetlen operandus jelli ki az osztt (divisor). Ha ez bjt mret u, akkor AX lesz az osztand (dividend), s a hnyados (quotient) AL-be, a maradk (remainder) pedig AH-ba fog kerlni. Ha az operandus szavas volt, akkor DX:AX-et osztja el vele, majd a hnyados AX-be, a maradk pedig DX-be kerl. Az el ojeles esetben mindkt utasts ugyanazokat a regisztereket hasznlja a forrs illetve a cl trolsra, mint az el ojel nlkli vltozatok. El ojeles szorzst az IMUL (Integer signed MULtiplication) utastssal hajthatunk vgre. Az eredmny el ojele a szoksos szably szerint lesz meghatrozva, teht a kt forrs el ojelbitjt logikai KIZR VAGY kapcsolatba hozva kapjuk meg. Vgl el ojelesen osztani az IDIV (Integer signed DIVision) utasts alkalmazsval tudunk. A hnyados el ojele ugyangy lesz meghatrozva, mint az IMUL esetn, mg a maradk az osztand el ojelt rkli. Ezek az utastsok elg rendetlenl mdostjk a ag-eket: a szorzsok a CF s OF ag-et vltoztatjk meg, mg a PF, AF, ZF s SF ag-ek rtke meghatrozatlan, az oszt utastsok viszont az sszes el obb emltett ag-et denilatlan llapotban hagyjk (azaz nem lehet tudni, megvltozik-e egy adott ag rtke, s ha igen, mire s mirt). Ha a szorzat nagyobb lenne, mint a forrsok mrete, akkor a MUL s IMUL utastsok mind CF-et, mind OF-et 1-re lltjk. Klnben mindkt ag trl odni fog. Ez egsz pontosan azt jelenti, hogy ha bjtos esetben AH, szavas esetben pedig DX rtkes biteket tartalmaz a szorzs elvgzse utn, akkor lltjk be a kt emltett ag-et a szorz utastsok. Az utastsok hasznlatnak szemlltetsre nzznk meg egy kicsit sszetett pldt! Tegyk fel, hogy a kvetkez o kifejezs rtkt akarjuk meghatrozni: A B+C D (E F ) /G A bet uk ht szmot jellnek, ezek kzl A s B el ojel nlkli bjtok, C s D el ojeles bjtok, E s F el ojel nlkli szavak, s vgl G el ojel nlkli bjt. Feltesszk, hogy E nagyobb vagy egyenl o F-nl. Az eredmny egy el ojeles sz lesz, amit m uveletek elvgzse utn AX-ben kapunk meg. Az osztsoknl a maradkkal nem tr odnk, gy az eredmny csak kzelt o pontossg lesz. Hasonlan nem foglalkozunk az esetleges tlcsordulsokkal sem. Lssuk ht a megoldst:
MOV SUB DIV MOV XOR MOV MUL MOV AX,[E] AX,[F] [G] CL,AL CH,CH AL,[A] [B] BX,AX

10.1. MATEMATIKAI KIFEJEZSEK KIRTKELSE

59

MOV IMUL CWD ADD ADC IDIV

AL,[C] [D] AX,BX DX,0000h CX

rdemes tgondolni, hogy a 6 m uveletet milyen sorrendben clszer u elvgezni. El oszr most az E-F kivonst hajtjuk vgre, amit rgvest elosztunk G-vel, az eredmnyt berakjuk CL-be, s ezt rgtn zr-kiterjesztsnek vetjk al, azaz CH-t kinullzzuk. Ezutn, hogy minl kevesebb regiszter-m uvelet legyen, az el ojeltelen szorzst vgezzk el el obb, az eredmnyt BX-ben troljuk. Most jn a msik, el ojeles szorzat kiszmolsa, aminek az eredmnyt rgtn el ojelesen kiterjesztjk DX:AX-be, hogy az sszeadst vgre tudjuk hajtani. Az sszeg meghatrozsa utn elvgezzk a nagy el ojeles osztst, s ezzel AX-ben kialakul a vgleges eredmny. A teljes korrektsg kedvrt megjegyezzk, hogy ez a plda kt helyen sntt. Nevezetesen az osztsoknl nem biztos, hogy a hnyados el fog frni a szmra kijellt helyen, s ez bizony slyos hibhoz vezethet (a kvncsiaknak elruljuk, hogy ilyen esetben egy osztsi kivtel keletkezik). Ennek ellen orzst ol, kikerlst ol azonban most eltekintnk. Utols esetknt megnzzk, hogyan kpezhetjk egy szm additv inverzt, vagy magyarosabban a 1-szerest. (Szintn helyes, ha azt mondjuk, hogy kpezzk a szm kettes komplemenst.) Erre kln utasts szolgl. Az egyoperandus NEG (NEGate) utasts az operandust kivonja 0-bl, az eredmnyt pedig visszarja az operandusba. Operandusknt ltalnos regisztert vagy memriahivatkozst adhatunk meg. Nem vletlen, hogy kivonst rtunk, ugyanis ha az operandus egyenl o 0-val, akkor CF trl odni fog. Ha az operandus nemzr, CF rtke minden esetben 1 lesz. Az utasts klnben mind a 6 aritmetikai ag-et az eredmnynek megfelel oen megvltoztatja. Els o pldaknt tegyk fel, hogy a AX-ben lev o rtket szeretnnk kivonni a 0-bl. A megolds igen egyszer u:
NEG AX

Kicsit bonyoltsunk a helyzeten. Most a cl a DX:AX regiszterprban lev o szm inverznek meghatrozsa legyen. Els o gondolatunk a kvetkez o:
NEG NEG AX DX

Ez azonban rossz megolds! Mirt? Prbljuk ki mondjuk a 32768-ra. Ennek a szmnak a 0FFFF 8000h felel meg, teht DX = 0FFFFh s AX = 8000h. Tudjuk, hogy az eredmnynek +32768 = 0000 8000h-nak kell lennie. Ha a fenti kt utastst elvgezzk, rossz eredmnyknt 0001 8000h-t kapunk. A hiba abban van, hogy a kiindul szm 32 bites, amit mi kt klnll 16 bites szmknt kezeltnk. Ha visszaemlksznk arra, hogyan is deniltuk a kettes komplemens fogalmt, rlelhetnk egy j megoldsra:
NOT NOT AX DX

10.2. BCD ARITMETIKA

60
ADD ADC AX,0001h DX,0000h

El oszr teht kpezzk a kiindul rtk egyes komplemenst, majd ezt megnveljk eggyel. Ez egsz biztosan helyes eredmnyt szolgltat. Egy msik megoldst is bemutatunk:
NEG ADC NEG AX DX,0000h DX

Ha nem vilgos, mirt is m ukdik ez, akkor gondolkozzunk el rajta, hogyan vgezzk el a kivonst binrisan. A feladatban a kiindul szmot (DX:AX) ki kell vonni 0-bl. Ezt csak kt lpsben tehetjk meg, de arra vigyzni kell, hogy a szm als s fels o szava kzti kapcsolatot fenntartsuk. Ez jelen esetben annyit jelent, hogy az als sz kivonsa (azaz NEG AX elvgzse) utn az esetleges tvitelt le kell vonnunk a fels o szbl. Mi most hozzadtunk, de ez gy helyes, hiszen (DX + CF) = DX CF, teht mgiscsak levontuk az tvitelt.

10.2. BCD aritmetika


Mivel a htkznapokban ltalban a decimlis (10-es alap) szmrendszert hasznljuk, knyelmesebb lenne, ha a szmtgpet is r tudnnk venni, hogy ezt alkalmazza a binris helyett. Nos, a BCD (Binary Coded Decimal) aritmetika pont ezt tmogatja. A kifejezs jelentse egyrtelm u: binrisan kdolt decimlis. Azaz arrl van sz, hogy br a processzor binris regisztereit s utastsait hasznljuk, de az adatokat (szmokat) decimlis alakban adjuk meg. Ennek hasznlathoz kt j adattpus ll rendelkezsre. Lehet osgnk van 8 biten egy vagy kt decimlis jegy trolsra is. Ennek alapjn beszlhetnk pakolt (csomagolt) vagy pakolatlan (csomagolatlan) BCD szmokrl. Pakolt esetben kt decimlis jegyet trolunk egyetlen bjtban, a bjt als feln a kisebb helyirtk u, fels o feln (4 bitjn) pedig a magasabb helyirtk u jegyet. Decimlis jegy alatt egy 0h 9h kztti rtket rtnk, de ez nem azonos a 0 9 karakterekkel! (Ez azrt van, mert az ASCII kdtblzat szerint a 0 karakter kdja 48d, avagy 30h.) Pakolatlan esetben a bjt fels o 4 bitjnek nincs szerepe, ott nem trolunk semmit sem. Fontos, hogy csak nemnegatv rtkeket trolhatunk ilyen mdon! A tnyleges utastsok ismertetse el ott kezdjk egy pldval. Vegynk kt szmot, ezek ket mondjuk az AX s BX relegyenek mondjuk a 28 s a 13. Pakolatlan alakban troljuk el o giszterekben. Ezt annyit jelent az el oz oek alapjn, hogy AX = 0208h s BX = 0103h. Adjuk ssze a kt szmot az ADD AH,BH // ADD AL,BL utastsokkal! Ennek hatsra AX tartalma 030Bh lesz a binris sszeads szablyai miatt. A helyes eredmny a 41 lenne, de nem ezt kaptuk. Nem vletlenl, hiszen az sszeg als bjtja rvnytelen, mivel nem decimlis jegyet tartalmaz. Ennek korriglst vgzi el az AAA (ASCII Adjust after Addition) operandus nlkli utasts. M ukdse rviden: ha volt decimlis tvitel (azaz AF = 1) vagy AL als bitngyese rvnytelen (azaz (AL AND 0Fh) > 9), akkor AL-hez hozzad 6-ot, megnveli AH-t, majd AF-be s CF-be 1-et tlt. Klnben a kt ag rtke 0 lesz. A vgn trli AL fels o 4 bitjt. Esetnkben AL als fele rvnytelen, ezrt hozzad ahhoz 6-ot (0311h), megnveli AH-t (0411h), kitrli AL fels o felt (0401h), AF-et s CF-et pedig 1-re lltja. Kzben AX-ban kialakul az immr helyes vgeredmny.

10.2. BCD ARITMETIKA

61

Ismt vegynk kt szmot, tekintsk mondjuk a 45-t s a 17-et. Szintn pakolatlan alakban ket AX-ben s BX-ben. Most teht AX = 0405h, BX = 0107h. Vonjuk ki a kisebbet troljuk el o a nagyobbl a SUB AH,BH // SUB AL,BL utastssal! Hatsra AX tartalma 03FEh lesz, ami igen furcsa eredmny. Ezt a szintn operandus nlkli AAS (ASCII Adjust after Subtraction) utastssal hozhatjuk helyre. M ukdse: ha AL als ngy bitje rvnytelen jegyet tartalmaz, vagy AF = 1, akkor AL-b ol kivon 6-ot, cskkenti AH-t, AF-et s CF-et pedig 1-re lltja. Klnben a kt ag tartalma 0 lesz. A vgn trli AL fels o 4 bitjt. A pldnknl maradva, itt mindkt felttel teljesl, ezrt kivon AL-b ol 6-ot (03F8h), cskkenti AH-t (02F8h), trli AL fels o felt (0208h), AF-et s CF-et pedig 1-re lltja. AX-ban gy kialakul a helyes eredmny. Krdezhetn valaki, hogy mirt nem a SUB AX,BX utastssal vgeztk el a kivonst. A vlasz egyszer u: azrt, mert akkor eredmnyl 02FEh-t kaptunk volna, amit az AAS 0108h-ra alaktana, s mi nem ezt az eredmnyt vrjuk. A kulcs itt az tvitelben van, amit mi most nem akarunk a szm fels o bjtjba tvinni. Msrszt pedig az als jegyeket kell ks obb kivonni, mivel az AAS m ukdse az AF rtkt ol is fgg. Ha a fels o jegyeket vonnnk ki ks obb, akkor AF tartalma ez utbbi kivons szerint llna be, ami helytelenn tenn a vgs o eredmnyt. Ezt szemlltetend o hajtsuk vgre a SUB AL,BL // SUB AH,BH utastsokat az AX = 0200h, BX = 0009h rtkekre! Hatsukra AX = 02F7h s AF = 0 lesz. Ha erre hajtjuk vgre az AAS utastst, akkor annyit vltozik a helyzet, hogy AX fels o 4 bitje trl odik, 0207h-t eredmnyezve. Ha a kt utastst fordtott sorrendben vgezzk el, akkor AX vltozatlanul 02F7h-t fog tartalmazni, de most AF rtke 1 lesz. Ekkor alkalmazva az AAS-t, az korriglni fogja AX-et, a helyes 0101h eredmnyt el olltva benne. Most legyen AL = 04h, BL = 08h. Szorozzuk ssze a kt szmot a MUL BL utastssal! Ennek eredmnyeknt AX tartalma 0020h lesz, ami a 32 binris alakja. Ezt az rtket szeretnnk pakolatlan BCD alakra hozni. Az operandus nlkli AAM (ASCII Adjust after Multiplication) utasts AL tartalmt maradkosan elosztja 10-zel, a hnyadost AH-ba, a maradkot pedig ALbe tve. (Vigyzat, ez nem elrs, itt az osztsoktl eltr oen tnyleg fordtva helyezkedik el a hnyados s a maradk!) A pldnkra alkalmazva AX tartalma 0302h lesz. Most osztani fogunk. Legyen AX = 0205h, BL = 05h. El akarjuk osztani az els o szmot a msodikkal. Osztani csak binris alakban tudunk, ehhez viszont mindkt tagot erre az alakra kell hozni. Az 5-tel nincs is gond, a 25-t viszont t kell alaktani. Erre knyelmes megolds az ismt csak operandus nlkli AAD (ASCII Adjust before Division) utasts. Hatsra AL tartalma az AH 10 + AL kifejezs rtke lesz, AH pedig kinullzdik. Az AAD utn mr elvgezhetjk az osztst a DIV BL utastssal. Ennek eredmnyeknt AX tartalma 0005h lesz, ez a helyes eredmny. A szorzsra s osztsra itt most nagyon egyszer u pldkat rtunk csak. A bonyolultabb esetekkel nem foglalkozunk, ezt az Olvasra hagyjuk. Nagyszer u lehet osg a gondolkodsra s gyakorlsra egyarnt. Az AAA, AAS s AAM utastsokat mindig az adott m uvelet utni, az AAD utastst pedig a m uvelet el otti korrekcira hasznljuk! Az AAA s AAS csak a CF s AF ag-eket vltoztatja logikusan, a maradk 4 aritmetikai ag rtke meghatrozatlan. Ezzel szemben az AAM s AAD utastsok PF, SF s ZF tartalmt vltoztatjk deniltan, a maradk 3 aritmetikai ag rtke itt is denilatlan lesz a vgrehajts utn. Eddig a pakolatlan BCD szmok hasznlatt mutattuk be. Most lssuk, mit m uvelhetnk a pakolt BCD alakkal! Ismt tekintsk els o pldnkat, azaz a 28-as s 13-as szmokat! Troljuk ket AL-ben s BL-ben, teht legyen AL = 28h, BL = 13h. Az ADD AL,BL utastssal elvgezve o az sszeadst AL tartalma 3Bh lesz, ami persze nem helyes eredmny. Ezt most az operandus nlkli DAA (Decimal Adjust after Addition) utastssal hozhatjuk helyre. Ennek m ukdse

10.3. BITFORGAT UTASTSOK

62

mr kicsit bonyolultabb: ha AL als fele rvnytelen jegyet tartalmaz, vagy AF = 1, akkor ALhez hozzad 6-ot, AF-be pedig 1-et tlt. Klnben AF rtke 0 lesz. Ezutn ha AL fels o 4 bitje rvnytelen jegyet tartalmaz, vagy CF = 1, akkor AL-hez hozzad 60h-t, s CF-et 1-re lltja. Klnben CF rtke 0 lesz. Nem nehz, egyszer uen szksg szerint korriglja mindkt jegyet. Fontos, hogy m ukdse kzben az sszeadsokat gy vgzi el, hogy a ag-ek tartalma nem mdosul. Pldnkhoz visszatrve, itt most CF = AF = 0, s az als jegy rvnytelen. Ezrt a DAA hozzad AL-hez 6-ot (41h), AF-et 1-re lltja, s ksz. A kivonshoz tekintsk a msodik pldt, teht a 45-s s 17-es szmokat. Ehhez legyen AL = 45h, BL = 17h. Vonjuk ki a kisebbet a nagyobbl a SUB AL,BL utastssal. Eredmnyknt AL tartalma 2Eh lesz. Ezt ismt korriglni kell az operandus nlkli DAS (Decimal Adjust after Subtraction) utasts segtsgvel. M ukdse teljesen megfelel a DAA m ukdsnek, annyi eltrssel, hogy 6-ot illetve 60h-t von ki az als s a fels o jegyb ol szksg esetn. A pldban CF = 0 s AF = 1, gy a DAS kivon AL-b ol 6-ot (28h), AF s CF rtke vltozatlan marad. Mindkt utasts mdostja a CF, PF, AF, ZF s SF ag-eket, OF tartalma meghatrozatlan lesz vgrehajtsuk utn. Szorzs s oszts esetre nincs ilyen korrigl utastsa a processzornak, gy ezekkel a m uveletekkel nehezebb dolgunk lesz.

10.3. Bitforgat utastsok


Kvetkez o tmnk a bitforgat utastsokat tekinti t. Ezek alapvet oen kt csoportra oszthatk: shiftel o s rotl utastsokra. Az sszes ilyen utasts kzs jellemz oje, hogy cloperandusuk ltalnos regiszter vagy memriahivatkozs lehet, mg a msodik operandus a lptets/forgats szmt adja meg bitekben. Ez az operandus vagy a kzvetlen 1-es rtk, vagy a CL regiszter lehet. (A TASM megenged 1-nl nagyobb kzvetlen rtket is, ekkor a megfelel o utasts annyiszor lesz lekdolva. gy pl. az SHL AX,3 hatsra 3 db. SHL AX,1 utastst fog az assembler generlni.) CL-nek minden bitjt gyelembe veszi a 8086-os processzor, gy pl. akr 200-szor is lptethetnk. A legutoljra kicsorg bit rtkt minden esetben CF tartalmazza. A shiftels fogalmt mr deniltuk a gpi aritmetika elemzse kzben (3. fejezet), ezrt itt csak annyit emltnk meg, hogy shiftelsb ol megklnbztetnk el ojeles (ez az .n. aritmetikai) s el ojeltelen (ez a logikai) vltozatot, s mindkett ob ol van balra s jobbra irnyul utasts is. Mindegyik shiftel o utasts mdostja a CF, PF, SF, ZF s OF ag-eket, AF rtke meghatrozatlan lesz. Ha a lpsszm 1-nl nagyobb, akkor OF rtke is meghatrozatlan lesz. Balra shiftelni az SHL (SHift logical Left) s az SAL (Shift Arithmetical Left) utastsokkal tudunk, kzlk a msodik szolgl az el ojeles lptetsre. Balra shiftelsnl azonban mindegy, hogy a cloperandus el ojeles vagy el ojeltelen rtk-e, ezrt, br kt mnemonik ltezik, tnylegesen csak 1 utasts van a gpi kd szintjn. Ezrt ne csodlkozzunk, ha mondjuk a Turbo Debugger nem ismeri az SAL mnemonikot (de pldul a JC-t sem ismeri . . . ). Jobbra shiftelsnl mr valban meg kell klnbztetni az el ojeles vltozatot az el ojel nlklit ol. Az SHR (SHift logical Right) el ojel nlkli, mg az SAR (Shift Arithmetical Right) el ojeles lptetst hajt vgre a cloperanduson. Nzznk most egy egyszer u pldt a shiftels hasznlatra. Tegyk fel, hogy AL-ben egy el ojeles bjt van, amit szeretnnk megszorozni 6-tal, az eredmnyt pedig AX-ben vrjuk. Ezt igazn sokfle mdszerrel meg lehet oldani (LEA, IMUL, ADD, SUB stb.), de mi most lptetsek segtsgvel tesszk meg. A megolds majdnem trivilis: a 6-tal val szorzs ugyanazt jelenti, mintha az eredeti szm dupljt s ngyszerest adnnk ssze.

10.3. BITFORGAT UTASTSOK

63
CBW SHL MOV SHL ADD

AX,1 BX,AX AX,1 AX,BX

Ennl szebb megolds is lehetsges, de a lnyeg ezen is ltszik. A program m ukdse remlhet oleg mindenkinek vilgos. Hasonl elgondolssal megoldhat az is, ha mondjuk az el ojeles AL tartalmt meg akarjuk szorozni 3/2-del, az eredmnyt itt is AX-ben vrva.
CBW MOV SAR ADD

BX,AX AX,1 AX,BX

Rotlson (forgatson) azt a, lptetshez igen hasonl m uveletet rtjk, amikor az operandus bitjei szpen egyms utn balra vagy jobbra lpnek, mikzben a kicsorg bit a tloldalon visszalp, krbefordul. Ez a fajta rotls az operandus rtkt meg orzi, legalbbis olyan rtelemben, hogy ha mondjuk egy bjtot 8-szor balra vagy jobbra rotlunk, az eredeti vltozatlan bjtot kapjuk vissza. Rotlni nyilvn csak el ojeltelen rtkeket lehet (teht az el ojelbitnek itt nincs specilis szerepe). Balra a ROL (ROtate Left), jobbra pedig a ROR (ROtate Right) mnemonikokkal lehet forgatni. Brmelyik forgat utasts csak a CF s OF rtkt mdostja. Ha 1-nl tbbszr forgatunk CL-t hasznlva, akkor OF tartalma meghatrozatlan. A forgatsnak van egy msik vltozata is, ami egy igen hasznos tulajdonsggal br. A forgatst ugyanis gy is el lehet vgezni, hogy nem a kilp o bit fog belpni, hanem CF forgats el otti rtke. Szemlletesen ez annyit jelent, mintha a CF bit az operandus egy plusz bitje lenne: balra forgats esetn a legfels o utni, mg jobbra forgatskor a legals bit el otti bit szerept tlti be. Ekkor azt mondjuk, hogy carry-n (CF-en) keresztl forgatunk. Ilyen mdon balra az RCL (Rotate through Carry Left), jobbra az RCR (Rotate through Carry Right) utasts forgat. Forgatst pldul olyankor hasznlunk, ha mondjuk szeretnnk az operandus minden egyes bitjt egyenknt vgigvizsglni. A kvetkez o program pldul a BL-ben lev o rtk binris alakjt rja ki a kperny ore.
MOV MOV @Ciklus: MOV ROL ADC INT LOOP DL,0 BL,1 DL,00h 21h @Ciklus AH,02h CX,8

Az algoritmus m ukdse azon alapul, hogy a ROL a kiforg bitet CF-be is betlti, amit azutn szpen hozzadunk a 0 karakter kdjhoz. A forgatst nyolcszor elvgezve BL-ben jra a kiindul rtk lesz, s kzben mr a kirs is helyesen megtrtnt. Szintn j szolglatot tehet valamelyik norml rotl utasts, ha egy regiszter als s fels o bjtjt, vagy als s fels o bitngyest akarjuk felcserlni. Pldul az

10.4. BITMANIPULL UTASTSOK

64
ROL ROR AL,4 SI,8

utastsok hatsra AL als s fels o fele megcserl odik, majd SI als s fels o bjtjval trtnik meg ugyanez. Ha sajt magunk akarunk megvalstani nagy pontossg aritmetikt, akkor is sokszor nylunk a shiftel o s rotl utastsokhoz. Tegyk fel mondjuk, hogy a shiftelst ki akarjuk terjeszteni duplaszavakra is. A kvetkez o kt sor a DX:AX-ben lev o szmot lpteti egyszer balra:
SHL RCL AX,1 DX,1

Az alapmdszer a kvetkez o: balra lptetsnl az els o utasts az SHL vagy SAL legyen, a tbbi pedig az RCL, s a legals bjttl haladunk a legfels o, legrtkesebb bjt fel. Jobbra lptets esetn a helyzet a fordtottjra vltozik: a legfels o bjttl haladunk lefel, az els o utasts a szm tpustl fgg oen SHR vagy SAR legyen, a tbbi pedig RCR. Egyszerre csak 1 bittel tudjuk ilyen mdon lptetni a szmot, de gy is legfeljebb 7 lptetsre lesz szksg, mivel a LepesSzam db. bittel val lptetst megoldhatjuk, ha a szmot LepesSzam mod 8-szor lptetjk, majd az egsz terletet LepesSzam/8 bjttal magasabb (avagy alacsonyabb) cmre msoljuk. Utols pldnkban az SI-ben lev o szmot el ojelesen kiterjesztjk DI:SI-be. (A regiszterek ilyen vad vlasztsa termszetesen szndkos.) Ezt megtehetnnk a hagyomnyos mdon is, azaz a CWD utastst hasznlva, de ehhez SI-t AX-be kellene mozgatni, az eredmnyt pedig visszarni a helyre. gy radsul AX s DX rtke is elromlana. Trkksebb megolds a kvetkez o:
PUSH MOV MOV SAR POP CX DI,SI CL,15 DI,CL CX

A program m ukdse abban rejlik, hogy az SAR utasts a DI (s gy vgs o soron SI) el ojelbitjvel tlti fel DI-t, s az el ojeles kiterjesztshez pont ez kell. Igaz, gy CL tartalma romlik el, de nyugodtan el lehet hinni, hogy a 8086-osnl jabb processzorokon ez jobban megtrl. Akit rdekel, mirt, elruljuk, hogy a 80186-os processzortl kezdve 1-t ol eltr o kzvetlen rtkkel (azaz konstanssal) is lptethetnk, nemcsak CL-t hasznlva.

10.4. Bitmanipull utastsok


Utols tmakrnk a bitmanipulcik (bellts, trls, negls s tesztels) megvalstsval foglalkozik. Els oknt a logikai utastsok ilyen cl felhasznlst nzzk meg. Ebbe a csoportba 5 olyan utasts tartozik, amik az operandusok kztt ill. az operanduson valamilyen logikai m uveletet hajtanak vgre bitenknt. 3 utasts (AND, OR s XOR) ktoperandus, a m uvelet eredmnye minden esetben a cloperandusba kerl. A cl ltalnos regiszter vagy memriahivatkozs lehet, forrsknt pedig ezeken kvl kzvetlen rtket is rhatunk. A TEST szintn ktoperandus, viszont az eredmnyt nem trolja el. A NOT utasts egyoperandus, ez az operandus egyben

10.4. BITMANIPULL UTASTSOK

65

forrs s cl is, tpusa szerint ltalnos regiszter vagy memriahivatkozs lehet. Az utastsok ket, elnevezse utal az ltaluk vgrehajtott logikai m uveletre is, ezrt b ovebben nem trgyaljuk o a gpi logika lersban megtallhat a szksges informci. Az AND, OR, XOR s TEST utastsok a ag-eket egyformn kezelik: CF-et s OF-et 0-ra lltjk, AF meghatrozatlan lesz, PF, ZF s SF pedig mdosulhatnak. A NOT utasts nem vltoztat egyetlen ag-et sem. A TEST klnleges logikai utasts, mivel a kt operandus kztt bitenknti logikai S m uveletet vgez, a ag-eket ennek megfelel oen belltja, viszont a kt forrst nem bntja, s a m uvelet eredmnyt is eldobja. Egyszer u logikai azonossgok alkalmazsa ltal ezekkel az utastsokkal kpesek vagyunk klnfle bitmanipulcik elvgzsre. Az alapproblma a kvetkez o: adott egy bjt, amiben szeretnnk a 2-es bitet 0-ra lltani, a 4-es bitet 1-be billenteni, a 6-os bit rtkt neglni, illetve kvncsiak vagyunk, hogy az el ojelbit (7-es bit) milyen llapot. A bjtot tartalmazza most mondjuk az AL regiszter. Minden krds egyetlen utastssal megoldhat:
AND OR XOR TEST AL,0FBh AL,10h AL,40h AL,80h

A bit trlshez a logikai S m uvelet kt jl ismert tulajdonsgt hasznljuk fel: Bit AND 1 = Bit, illetve Bit AND 0 = 0. Ezrt ha AL-t olyan rtkkel (bitmaszkkal) hozzuk logikai S kapcsolatba, amiben a trlend o bit(ek) helyn 0, a tbbi helyen pedig csupa 1-es ll, akkor kszen is vagyunk. Bitek belltshoz a logikai VAGY m uveletet s annak kt tulajdonsgt hvjuk segtsgl: Bit OR 0 = Bit, valamint Bit OR 1 = 1. AL-t ezrt olyan maszkkal kell VAGY kapcsolatba hozni, amiben a belltand bit(ek) 1-es, a tbbiek pedig 0-s rtket tartalmaznak. Ha egy bit llapott kell neglni (ms szval invertlni vagy komplementlni), a logikai KIZR VAGY m uvelet jhet szba. Ennek kt tulajdonsgt hasznljuk most ki: Bit XOR 0 = Bit, s Bit XOR 1 = NOT Bit. A hasznlt maszk ezek alapjn ugyangy fog felplni, mint az el obbi esetben. Ha az sszes bitet neglni akarjuk, azt megtehetjk az XOR operandus,11. . . 1b utastssal, de ennl sokkal egyszer ubb a NOT operandus utasts hasznlata, ez radsul a ag-eket sem piszklja meg. (Az 11. . . 1b jells egy csupa 1-esekb ol ll binris szmot jelent.) Ha valamely bit vagy bitek llapott kell megvizsglnunk (ms szval tesztelnnk), a clravezet o megolds az lehet, hogy az adott operandust olyan maszkkal hozzuk S kapcsolatba, ami a tesztelend o bitek helyn 1-es, a tbbi helyen 0-s rtk u. Ha a kapott eredmny nulla (ezt ZF = 1 is jelezni fogja), akkor a krdses bitek biztosan nem voltak belltva. Klnben kt eset lehetsges: ha egy bitet vizsgltunk, akkor az a bit tutira be volt lltva, ha pedig tbb bitre voltunk kvncsiak, akkor a bitek kzl valamennyi (de legalbb egy) darab 1-es rtk u volt az operandusban. Ha ez utbbi dologra vagyunk csak kvncsiak (teht a bitek rtke kln-kln nem rdekel bennnket, csak az a fontos, hogy legalbb egy be legyen lltva), akkor felesleges az AND utastst hasznlni. A TEST nem rontja el egyik operandust sem, s radsul a ag-eket az S m uvelet eredmnynek megfelel oen belltja. A bitmanipulci specilis esett jelenti a Flags regiszter egyes bitjeinek, azaz a ag-eknek a belltsa, trlse stb. Az aritmetikai ag-eket (CF, PF, AF, ZF, SF, OF) elg sok utasts kpes megvltoztatni, ezek eredmnyt rszben mi is irnythatjuk megfelel o operandusok vlasztsval. A CF, DF s IF ag rtkt kln-kln llthatjuk bizonyos utastsokkal: trlsre

10.4. BITMANIPULL UTASTSOK

66

a CLC, CLD s CLI (CLear Carry/Direction/Interrupt ag), mg belltsra az STC, STD s STI (SeT Carry/Direction/Interrupt ag) utastsok szolglnak. Ezenkvl CF-et neglhatjuk a CMC (CoMplement Carry ag) utastssal. Mindegyik emltett utasts operandus nlkli, s ms ag-ek rtkt nem befolysoljk. Ha egy olyan ag rtkt akarjuk belltani, amit egyb mdon nehzkes lenne (pl. AF), vagy egy olyan ag rtkre vagyunk kvncsiak, amit eddig ismert mdon nem tudunk rni/olvasni (pl. TF), akkor ms megoldst kell tallni. Kt lehet osg is van: vagy a PUSHF-POPF, vagy a LAHF-SAHF utastsok valamelyikt hasznljuk. Mindegyik utasts operandus nlkli. A PUSHF (PUSH Flags) utasts a Flags regiszter teljes tartalmt (mind a 16 bitet) letrolja a verembe, egybknt m ukdse a szoksos PUSH m uvelettel egyezik meg. A POPF (POP Flags) ezzel szemben a verem tetejn lev o szt leemeli ugyangy, mint a POP, majd a megfelel o biteken szerepl o rtkeket sorban betlti a ag-ekbe. (Ezt azrt fogalmaztuk gy, mivel a Flags nhny bitje kihasznlatlan, gy azokat nem mdosthatjuk.) A msik kt utasts kicsit mskpp dolgozik. A LAHF (Load AH from Flags) a Flags regiszter als bjtjt az AH regiszterbe msolja, mg a SAHF (Store AH into Flags) AH 0, 2, 4, 6 s 7 szm bitjeit sorban a CF, PF, AF, ZF s SF ag-ekbe tlti be. Ms ag-ek ill. a verem/veremmutat rtkt nem mdostjk. A szemlltets kedvrt most AF-et mind a ktfle mdon negljuk: 1.
PUSHF POP XOR PUSH POPF

AX AL,10h AX

2.
LAHF XOR SAHF

AH,10h

11. fejezet

Az Assembly nyelv kapcsolata magas szintu nyelvekkel, a paramtertads formi


Ebben a fejezetben azt vizsgljuk, hogy egy nll Assembly program esetn egy adott eljrsnak/fggvnynek milyen mdon adhatunk t paramtereket, fggvnyek esetben hogyan kaphatjuk meg a fggvny rtkt, illetve hogyan tudunk loklis vltozkat kezelni, azaz hogyan valsthatjuk meg mindazt, ami a magas szint u nyelvekben biztostva van. Ezutn megnzzk, hogy a Pascal s a C pontosan hogyan vgzi ezt el, de el obb tisztzzunk valamit: Ha a meghvott szubrutinnak (alprogramnak) nincs visszatrsi rtke, akkor eljrsnak (procedure), egybknt pedig fggvnynek (function) nevezzk. Ezt csak emlkeztet ol mondjuk, no meg azrt is, mert Assemblyben formlisan nem tudunk klnbsget tenni eljrs s fggvny kztt, mivel mindkett ot a PROC-ENDP prral deklarljuk, viszont ebben a deklarciban nyoma sincs sem paramtereknek, sem visszatrsi rtknek, ellenttben pl. a Pascallal (PROCEDURE, FUNCTION), vagy C-vel, ahol vglis minden szubrutin fggvny, de ha ket. visszatrsi rtke VOID, akkor eljrsnak min osl, s a fordtk is ekknt kezelik o

11.1. Paramterek tadsa regisztereken keresztl


Ez azt jelenti, hogy az eljrsokat/fggvnyeket (a tovbbiakban csak eljrsoknak nevezzk ket) gy rjuk meg, hogy azok bizonyos regiszterekben krik a paramtereket. Hogy pontosan o mely regiszterekben, azt mi dnthetjk el tetsz olegesen (persze sszer u keretek kztt, hiszen pl. a CS-t nem hasznljuk paramtertadsra), de nem rt gyelembe vennnk azt sem, hogy hogy a legrdemesebb ezek megvlasztsa. A visszatrsi rtkeket (igen, mivel nem egy regiszter van, ezrt tbb dolgot is visszaadhatunk) is ezeken keresztl adhatjuk vissza. Erre rgtn egy plda: van egy egyszer u eljrsunk, amely egy bjtokbl ll vektor elemeit sszegzi. Bemeneti paramterei a vektor cme, hossza. Visszatrsi rtke a vektor elemeinek el ojeles sszege. Az eljrs felttelezi, hogy az sszeg elfr 16 biten.
Pelda5.ASM:
Osszegez PROC

11.1. PARAMTEREK TADSA REGISZTEREKEN KERESZTL

68

PUSH PUSHF CLD XOR @AddKov: LODSB CBW ADD LOOP POPF POP RET ENDP

AX ;SI-nek nvekednie kell ;majd ;Kezdeti sszeg = 0 vektor;Kvetkezo ;komponens AL-be ;elojelesen kiterjesztjk ;szv ;hozzadjuk a meglevo ;sszeghez ;Ismteld, amg CX > 0

BX,BX

BX,AX @AddKov AX

Osszegez


;Plda az eljrs ;meghvsra ;13 bjt hossz a vektor ;cm offszetrsze ;feltesszk,hogy DS az ;adatszegmensre mutat ;Pl. a DX-be tltjk az ;eredmnyt

MOV MOV

CX,13 SI,OFFSET Egyikvektor

CALL MOV

Osszegez DX,BX


;valahol az ;adatszegmensben ;deklarlva vannak ;a vltozk: Hossz Cim Eredmeny Probavektor DW DD DW DB ? ? ? 13 DUP (?)

Ezt az eljrst gy terveztk, hogy a vektor cmt a DS:SI regiszterprban, a vektor hosszt a CX regiszterben kapja meg, ugyanis az eljrs szempontjbl ez a legel onysebb (a LODSB s LOOP utastsokat majdnem minden el okszlet utn hasznlhattuk). Az sszeget az eljrs a BX regiszterben adja vissza. rdemes egy pillantst vetni a PUSHF-POPF prra: az irnyjelz ot trljk, mert nem tud rizzk hatjuk, hogy az eljrs hvsakor mire van lltva, de ppen e miatt fontos, hogy meg is o azt. Ezrt mentettk el a ageket.

11.2. PARAMTEREK TADSA GLOBLISAN

69

Az AX regiszter is csak tmeneti vltoz, jobb ha ennek rtkt sem rontjuk el. A pldban egy olyan vektor komponenseit sszegeztk, amely globlis vltozknt az adatszegmensben helyezkedik el.

11.2. Paramterek tadsa globlis vltozkon keresztl


Ez a mdszer analg az el oz ovel, annyi a klnbsg, hogy ilyenkor a paramtereket bi ket. Magas szint zonyos globlis vltozkba tesznk, s az eljrs majd onnan olvassa ki o u nyelvekben is megtehetjk ezt, azaz nem paramterezzk fel az eljrst, de az felhasznl bizonyos globlis vltozkat bemenetknt (persze ez nem tl szp megolds). Ennek mintjra a visszatrsi rtkeket is tadhatjuk globlis vltozkban. rjuk t az el oz o pldt:
Pelda6.ASM:
Osszegez PROC PUSH PUSH PUSHF CLD XOR MOV LDS @AddKov: LODSB CBW ADD LOOP MOV POPF POP POP RET ENDP AX,BX @AddKov [Eredmeny],BX BX AX vektor;Kvetkezo ;komponens AL-be ;elojelesen kiterjesztjk ;szv ;hozzadjuk a meglevo ;sszeghez ;Ismteld, amg CX > 0

AX BX ;SI-nek nvekednie kell ;majd ;Kezdeti sszeg = 0

BX,BX CX,[Hossz] SI,[Cim]

Osszegez


;Plda az eljrs ;meghvsra ;13 bjt hossz a vektor ;ami az ;adatszegmensben ;van, gy a cm ;szegmensrsze az DS ;cm offszetrsze ;feltesszk,hogy DS az

MOV MOV

[Hossz],13 WORD PTR Cim[2],DS

MOV

WORD PTR [Cim],OFFSET Egyikvektor

11.3. PARAMTEREK TADSA A VERMEN KERESZTL

70
;adatszegmensre mutat ;

CALL MOV

Osszegez DX,[Eredmeny]

;Pl. a DX-be tltjk az ;eredmnyt


;valahol az ;adatszegmensben ;deklarlva vannak ;a vltozk: Hossz Cim Eredmeny Egyikvektor Masikvektor DW DD DW DB DB ? ? ? 13 DUP (?) 34 DUP (?)

A pldhoz nem kvnunk magyarzatot f uzni, taln csak annyit, hogy mivel itt mr a BX is egy tmeneti vltozv lett (mert nem rajta keresztl adjuk vissza az sszeget), ezrt jobb, ha ennek rtkt meg orzi az eljrs. Van egy dolog, amire azonban nagyon vigyzni kell az eajta paramtertadssal. Kpzeljk el, hogy mr bertuk a paramtereket a vltozkba, de mg miel ott meghvnnk az eljrst (a -gal jelzett helyen), bekvetkezik egy megszakts. Tegyk fel, hogy a megszaktsban egy sajt megszaktsi rutinunk hajtdik vgre, ami szintn meghvja az Osszegez eljrst. is berja a paramtereit a Masikvektor komponenseit sszegezteti? O Mi trtnik akkor, ha o ugyanezekbe a globlis vltozkba, meghvja az eljrst, stb., vgetr a megszaktsi rutin, s a program ugyanott folytatdik tovbb, ahol megszakadt. Esetnkben ez azt jelenti, hogy meghvjuk az eljrst, de nem azokkal a paramterekkel, amiket belltottunk, mert a megszaktsi rutin fellrta azokat a sajtjaival. Ez termszetesen a program hibs m ukdst okozza. Az el oz o esetben, ahol regisztereken keresztl adtuk t a cuccokat, ott ez nem fordulhatott volna el o, hiszen egy megszaktsnak ktelessge elmenteni azokat a regisztereket, amelyeket felhasznl. A problma megoldsa teht az, hogy ha megszaktsban hvjuk ezt az eljrst, akkor el kell mentennk, majd vissza kell lltanunk a globlis vltozk rtkeit, mintha azok regiszterek lennnek.

11.3. Paramterek tadsa a vermen keresztl


Ennek lnyege, hogy az eljrs meghvsa el ott a verembe beletesszk az sszes paramtert, ket onnan, de nem a POP m az eljrs pedig kiolvassa o uvelettel. Mivel a paramterek sorrendje rgztett, s a utnuk a verembe csak a visszatrsi cm kerl, gy azok az eljrson bell az SP-hez relatvan elrhet oek. Ezek szerint olyan cmzsmdot kellene hasznlni, amelyben SP kzvetlenl szerepel, pl. MOV AX,[SP+6], csakhogy ilyen nem ltezik. A msik problma az SP-vel az lenne, hogy ha valamit ideiglenesen elmentnk a verembe, akkor a paramterek ket. pp erre talltk ki viszont relatv helye is megvltozik, gy nehzkesebb lenne kezelni o a BP regisztert, emiatt van, hogy a vele hasznlt cmzsmdokban az alaprtelmezett szegmens nem a DS, hanem az SS (de mr a neve is: Base Pointer Bzismutat, a vermen bell). A mdszert ismt az el oz o plda trsval mutatjuk be:

11.3. PARAMTEREK TADSA A VERMEN KERESZTL

71

Pelda7.ASM:
Osszegez PROC PUSH MOV PUSH PUSHF CLD XOR MOV LDS @AddKov: LODSB CBW ADD LOOP POPF POP POP RET ENDP BX,AX @AddKov AX BP 6 vektor;Kvetkezo ;komponens AL-be ;elojelesen kiterjesztjk ;szv ;hozzadjuk a meglevo ;sszeghez ;Ismteld, amg CX > 0

BP BP,SP AX ;SI-nek nvekednie kell ;majd ;Kezdeti sszeg = 0

BX,BX CX,[BP+8] SI,[BP+4]

Osszegez


;Plda az eljrs ;meghvsra MOV PUSH PUSH MOV PUSH CALL MOV AX,13 AX DS AX,OFFSET Egyikvektor AX Osszegez DX,BX ;13 bjt hossz a vektor ;cm offszetrsze

;Pl. a DX-be tltjk az ;eredmnyt


;valahol az ;adatszegmensben ;deklarlva vannak ;a vltozk: Hossz Cim Eredmeny DW DD DW ? ? ?

11.3. PARAMTEREK TADSA A VERMEN KERESZTL

72

Probavektor

DB

13 DUP (?)

Az eljrsban BP rtkt is meg oriztk a biztonsg kedvrt. A RET utastsban szerepl o operandus azt mondja meg a processzornak, hogy olvassa ki a visszatrsi cmet, aztn az operandus rtkt adja hozz SP-hez. Ez azrt kell, hogy az eljrs a paramtereit kitakartsa a veremb ol. Hogy jobban megrtsk a folyamatot, brkkal illusztrljuk a verem alakulst: A BP-t teht rlltjuk az utols paramterre (pontosabban itt most BP elmentett rtkre), ez a bzis, s ehhez kpest +4 bjtra tallhat a vektor teljes cme, amit persze gy helyeztnk a verembe, hogy az alacsonyabb cmen szerepeljen az oszetrsz, aztn a szegmens. BP-hez kpest pedig +8 bjtra tallhat a vektor hossza. Az eljrsbl val visszatrs utn persze minden elt unik a veremb ol, amit el otte belepakoltunk a hvshoz. A visszatrsi rtket most BX-ben adja vissza, err ol mg lesz sz. A magas szint u nyelvek is vermen keresztli paramtertadst valstanak meg. Ennek a mdszernek ktfle vltozata is ltezik, aszerint, hogy a paramterek trlse a veremb ol kinek a feladata: Pascal-fle vltozat: a verem trlse az eljrs dolga, amint azt az el obb is lttuk C-fle vltozat: a verem trlse a hv fl feladata, erre mindjrt nznk pldt A Pascal a paramtereket olyan sorrendben teszi be a verembe, amilyen sorrendben megad ket, teht a legutols paramter kerl bele a verembe utoljra. A C ezzel szemben fordtott tuk o sorrendben teszi ezt, gy a legels o paramter kerl be utoljra. Ennek megvan az az el onye is, hogy knnyen megvalsthat a vltoz szm paramterezs, hiszen ilyenkor az els o paramter relatv helye a bzishoz kpest lland, ugyangy a msodik is, stb., csak azt kell tudnia az eljrsnak, hogy hny paramterrel hvtk meg. Most pedig nzzk meg a pldt, amikor a hv trli a vermet:
Pelda8.ASM:
Osszegez PROC PUSH MOV PUSH PUSHF CLD XOR MOV LDS @AddKov: LODSB CBW ADD LOOP POPF POP POP BX,AX @AddKov AX BP vektor;Kvetkezo ;komponens AL-be ;elojelesen kiterjesztjk ;szv ;hozzadjuk a meglevo ;sszeghez ;Ismteld, amg CX > 0

BP BP,SP AX ;SI-nek nvekednie kell ;majd ;Kezdeti sszeg = 0

BX,BX CX,[BP+8] SI,[BP+4]

11.4. LOKLIS VLTOZK MEGVALSTSA

73

Osszegez

RET ENDP


;Plda az eljrs ;meghvsra MOV PUSH PUSH MOV PUSH CALL ADD MOV AX,13 AX DS AX,OFFSET Egyikvektor AX Osszegez SP,6 DX,BX ;13 bjt hossz a vektor ;cm szegmensrsze ;cm offszetrsze

;Pl. a DX-be tltjk az ;eredmnyt

Lthat, hogy ilyenkor a visszatrsi rtket is t lehetne adni a vermen keresztl gy, hogy pl. az egyik paramter helyre berjuk azt, s a hv fl onnan olvassa ki, miel ott trln a vermet (a Pascal-szer u verzi esetn ez persze nem lehetsges). Ezt azonban nem szoks alkalmazni, a C is mindig regiszterekben adja ezt vissza, ez a knnyebben kezelhet o megolds, mi is tegynk gy.

11.4. Loklis vltozk megvalstsa


A loklis vltozkat ktflekppen valsthatjuk meg: az egyik, hogy elmentjk valamely regisztert, s felhasznljuk azt vltozknt, ugyangy, ahogy idig is tettk az Osszegez eljrsban az AX-szel. A msik megolds, amit a magas szint u nyelvek is alkalmaznak, hogy maga az eljrs kezdetben foglal a veremben a loklis vltozknak helyet, ami annyit tesz, hogy SP rtkt lecskkenti valamennyivel. A vltozkat tovbbra is a bzis-technikval (a BP-n keresztl) ri el. rjuk t ismt az Osszegez-t gy, hogy ezt a mdszert alkalmazza (most a loklis vltozban troljuk ideiglenesen az sszeget):
Pelda9.ASM:
Osszegez PROC PUSH MOV SUB PUSH PUSHF CLD MOV MOV LDS @AddKov:

BP BP,SP SP,2 AX

;Helyet foglalunk a ;loklis vltoznak

WORD PTR [BP-2],0h CX,[BP+8] SI,[BP+4]

;SI-nek nvekednie kell ;majd ;Kezdeti sszeg = 0

11.4. LOKLIS VLTOZK MEGVALSTSA

74
vektor;Kvetkezo ;komponens AL-be ;elojelesen kiterjesztjk ;szv ;hozzadjuk a meglevo ;sszeghez ;Ismteld, amg CX > 0

LODSB CBW ADD LOOP POPF POP MOV ADD POP RET ENDP [BP-2],AX @AddKov AX BX,[BP-2] SP,2 BP

;BX = lok. vltoz ;lok. vlt. helynek ;felszabadtsa

Osszegez


;Plda az eljrs ;meghvsra MOV PUSH PUSH MOV PUSH CALL ADD MOV AX,13 AX DS AX,OFFSET Egyikvektor AX Osszegez SP,6 DX,BX ;13 bjt hossz a vektor ;cm szegmensrsze ;cm offszetrsze

;Pl. a DX-be tltjk az ;eredmnyt

Hogyan is nz ki a verem az eljrs futsakor?

12. fejezet

Muveletek sztringekkel
Sztringen bjtok vagy szavak vges hossz folyamt rtjk. A magas szint u nyelvekben is tallkozhatunk ezzel az adattpussal, de ott ltalban van valamilyen megkts, mint pl. a rgztett maximlis hossz, kttt elhelyezkeds a memriban stb. Assemblyben sztringen nem csak a szegmensekben denilt karakteres sztring-konstansokat rtjk, hanem a memria tetsz oleges cmn kezd od o sszefgg o terletet. Ez azt jelenti, hogy mondjuk egy 10 bjt mret u vltozt tekinthetnk 10 elem u tmbnek (vektornak), de kedvnk szerint akr sztringnek is; vagy pldul a verem tartalmt is kezelhetjk sztringknt. Mivel minden regiszter 16 bites, valamint a memria is szegmentlt szervezs u, ezeknek termszetes kvetkezmnye, hogy a sztringek maximlis hossza egy szegmensnyi, teht 64 Kbjt. Persze ha ennl hosszabb folyamokra van szksg, akkor megfelel o feldarabolssal ez is megoldhat. A 8086-os mikroprocesszor 5 utastst knl a sztringekkel vgzett munka megknnytsre. Ezek kzl kett ovel mr tallkoztunk eddig is. Az utastsok kzs jellemz oje, hogy a forrssztring cmt a DS:SI, mg a cl cmt az ES:DI regiszterprbl olvassk ki. Ezek kzl a DS szegmenst fellbrlhatjuk, minden ms viszont rgztett. Az utastsok csak bjtos vagy szavas elem u sztringekkel tudnak dolgozni. Szintn kzs tulajdonsg, hogy a megfelel o m uvelet elvgzse utn mindegyik utasts a sztring(ek) kvetkez o elemre lltja SI-t s/vagy DI-t. A kvetkez o elemet most ktflekppen rtelmezhetjk: lehet a megszokott, nvekv o irny, illetve lehet fordtott, cskken o irny is. A hasznlni kvnt irnyt a DF ag llsa vlasztja ki: DF = 0 esetn nvekv o, mg DF = 1 esetn cskken o lesz. Ugyancsak jellemz o mindegyik utastsra, hogy az Assembly szintjn tbb mnemonikkal s klnfle operandusszmmal rhet ok el. Pontosabban ez azt takarja, hogy mindegyiknek ltezik 2, operandus nlkli rvid vltozata, illetve egy olyan vltozat, ahol loperandusokat adhatunk meg. loperandus (pseudo operand) alatt most egy olyan operandust rtnk, ami csak szimbolikus, s nem adja meg a tnyleges operandus cmt/helyt, csak annak mrett, szegmenst jelli ki. Ezekre a mr emltett megktsek (DS:SI s ES:DI) miatt van szksg. Az loperandussal rendelkez o mnemonikok a CMPS, LODS, MOVS, SCAS s STOS, mg az egyszer u alakok a CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, SCASB, SCASW, STOSB s STOSW. Minden rgtn vilgosabb lesz, ha nznk rjuk egy pldt:
Pelda10.ASM:
MODEL SMALL

76

.STACK ADAT Szoveg1 Szoveg2 Kozos Hossz Vektor ADAT KOD SEGMENT DB DB DB DW DW ENDS

szveg.",00h "Ez az elso "Ez a msodik szveg.",00h 10 DUP (?) ? 100 DUP (?)

SEGMENT ASSUME CS:KOD,DS:ADAT

@Start: MOV MOV MOV LEA LEA CLD XOR @Ciklus1: CMPSB JNE INC JMP @Vege: LEA LEA ADD DEC STD MOVS LEA MOV XOR CLD SCASB STC SBB MOV PUSH POP XOR LEA MOV LODSB CBW NOT STOSW SI,[SI-2] DI,[Kozos] DI,CX DI ES:[Kozos],DS:[SI] DI,[Szoveg1] CX,100 AL,AL @Vege CX @Ciklus1 AX,ADAT DS,AX ES,AX SI,[Szoveg1] DI,[Szoveg2] CX,CX

REP

REPNE

DI,OFFSET Szoveg1 [Hossz],DI CS DS SI,SI DI,[Vektor] CX,100

@Ciklus2:

AX

77
LOOP MOV INT ENDS END @Ciklus2 AX,4C00h 21h @Start

KOD

A program nem sok rtelmeset csinl, de szemlltetsnek megteszi. El oszr meg akarjuk tudni, hogy a Szoveg1 s a Szoveg2 00h kd karakterrel terminlt sztringek elejn hny darab megegyez o karakter van. Ezt hagyomnyos mdon gy csinlnnk, hogy egy ciklusban kiolvasnnk az egyik sztring kvetkez o karaktert, azt sszehasonltannk a msik sztring megfelel o karaktervel, majd az eredmny fggvnyben dntennk a tovbbiakrl. Szmllshoz CX-et hasznljuk. A ciklus most is marad csakgy, mint a JNEJMP pros. Az sszehasonltst viszont mskpp vgezzk el. Els o sztringkezel o utastsunk mnemonikja igen hasonlt az egsz aritmetiks sszehasonltsra. A CMPS (CoMPare String) mnemonik ktoperandus utasts. Mindkt operandus memriahivatkozst kifejez o loperandus, s rendhagy mdon az els o operandus a forrssztring, mg a msodik a clsztring. Az utasts szintaxisa teht a kvetkez o:
CMPS forrssztring,clsztring

Az utasts a forrssztringet sszehasonltja a clsztringgel, belltja a ag-eket, de az operandusokat nem bntja. Egszen pontosan a clsztring egy elemt vonja ki a forrssztring egy elemb ol, s a ag-eket ennek megfelel oen mdostja. A forrssztring alaprtelmezsben a DS:SI, a clsztring pedig az ES:DI cmen tallhat, mint mr emltettk. Az els o operandus szegmensregisztere brmi lehet, a msodik ktelez oen ES. Ha egyik operandusbl sem derl ki azok mrete (bjt vagy sz), akkor a mretet neknk kell megadni a BYTE PTR vagy a jobb oldaln ll WORD PTR kifejezs valamelyik operandus el rsval. A PTR opertor az o kifejezs tpust a bal oldaln ll tpusra vltoztatja meg, ezt ms nyelvekben hasonl mdon tpusfellbrlsnak (type casting/overloading) hvjk. Ha nem kvnunk az operandusok megadsval bajldni, akkor hasznlhatunk kt msik rvidtst. A CMPSB s CMPSW (CoMPare String Byte/Word) operandus nlkli mnemonikok rendre bjt ill. sz elem u sztringeket rnak el o a DS:SI s ES:DI cmeken, teht formlisan a CMPS BYTE/WORD PTR DS:[SI],ES:[DI] utastsnak felelnek meg. A CMPSB utasts teht a sztringek kvetkez o karaktereit hasonltja ssze, majd SI-t s DI-t is megnveli 1-gyel, hiszen DF = 0 volt. Ha ZF = 0, akkor vge a ciklusnak, klnben nveljk CX-et, s visszaugrunk a ciklus elejre. A @Vege cmkre eljutva mr mindenkppen megtalltuk a kzs rsz hosszt, amit CX tartalmaz. SI s DI a kt legutbb sszehasonltott karaktert kvet o bjtra mutat, gy SI-t kett ovel cskkentve az a kzs rsz utols karakterre fog mutatni. Ezt kvet oen a kzs karakterlncot a Kozos vltoz terletre fogjuk msolni. Mivel SI most a sztring vgre mutat, clszer u, ha a msolst fordtott irnyban vgezzk el. Ennek megfelel oen lltjuk be DI rtkt is. DF-et 1-re lltva kszen llunk a msolsra. Kvetkez o j sztringkezel o utastsunk a MOVS, MOVSB, MOVSW (MOVe String Byte/Word). Az utasts teljes alakja a kvetkez o:
MOVS cl,forrs

Az utasts a forrs sztringet tmsolja a cl helyre, ag-et persze nem mdost. A pldban

78 jl ltszik, hogy a megadott operandusok tnyleg nem valdi cmre hivatkoznak: clknt nem az ES:[Kozos] kifejezs tnyleges cme lesz hasznlva, hanem az ES:DI ltal mutatott rtk, de forrsknt is adhattunk volna meg brmit SI helyett. Ezek az operandusok csak a program dokumentlst, megrtst segtik, bel olk az assembler csak a forrs szegmenst (DS) s a sztring elemmrett (ami most a Kozos elemmrete, teht bjt) hasznlja fel, a tbbit gyelmen kvl hagyja. A MOVSB, MOVSW mnemonikok a CMPS-hez hasonlan formlisan a MOVS BYTE/WORD PTR ES:[DI],DS:[SI] utastst rvidtik. Ha egy adott sztring minden elemre akarunk egy konkrt sztringm uveletet vgrehajtani, akkor nem kell azt felttlenl ciklusba rejtennk. A sztringutastst ismtl o prexek minden sztringkezel o utasts mnemonikja el ott megadhatk. Hrom fajtjuk van: REP; REPE, REPZ s REPNE, REPNZ (REPeat, REPeat while Equal/Zero/ZF = 1, REPeat while Not Equal/Not Zero/ZF = 0). A REP prex m ukdse a kvetkez o: 1. ha CX = 0000h, akkor kilps, az utasts vgrehajtsa befejez odik 2. a prexet kvet o sztringutasts egyszeri vgrehajtsa 3. CX cskkentse 1-gyel, a ag-ek nem vltoznak 4. menjnk az (1)-re Ha teht kezdetben CX = 0000h, akkor nem trtnik egyetlen m uvelet sem, hatst tekintve gyakorlatilag egy NOP-nak fog megfelelni az utasts. Klnben a sztringkezel o utasts 1-szer vgrehajtdik, CX cskken, s ez mindaddig folytatdik, amg CX zrus nem lesz. Ez vgl is azt eredmnyezi, hogy a megadott utasts pontosan annyiszor kerl vgrehajtsra, amennyit CX kezdetben tartalmazott. REP prexet a LODS, MOVS s STOS utastsokkal hasznlhatunk. A REPE, REPZ prex a kvetkez o mdon m ukdik: 1. ha CX = 0000h, akkor kilps, az utasts vgrehajtsa befejez odik 2. a prexet kvet o sztringutasts egyszeri vgrehajtsa 3. CX cskkentse 1-gyel, a ag-ek nem vltoznak 4. ha ZF = 0, akkor kilps, az utasts vgrehajtsa befejez odik 5. menjnk az (1)-re A REPE, REPZ teht mindaddig ismtli a megadott utastst, amg CX 0000h s ZF = 1 is fennllnak. Ha valamelyik vagy mindkt felttel hamis, az utasts vgrehajtsa befejez odik. A REPNE, REPNZ prex hasonl mdon akkor fejezi be az utasts ismtelt vgrehajtst, ha a CX = 0000h, ZF = 1 felttelek kzl legalbb az egyik teljesl (teht a fenti pszeudokdnak a (4) lpse vltozik meg). A REPE, REPZ s REPNE, REPNZ prexeket a CMPS s a SCAS utastsoknl illik hasznlni (hiszen ez a kt utasts lltja a ag-eket is), br a msik hrom utasts esetben m ukdsk a REP-nek felel meg. Mg egyszer hangslyozzuk, hogy ezek a prexek kizrlag egyetlen utasts ismtelt vgrehajtsra hasznlhatak, s az az utasts csak egy sztringkezel o mnemonik lehet. Gpi kd szinten csak kt prex ltezik: REP, REPE, REPZ s REPNE, REPNZ, az els o t kvet prex teht klnbz o mdon m ukdik az o o utaststl fgg oen.

79 A programhoz visszatrve, a REP MOVS . . . utasts hatsra megtrtnik a kzs karakterlnc tmsolsa. Mivel a REP prex CX-t ol fgg, nem volt vletlen, hogy mi is ebben troltuk a msoland rsz hosszt. Ezt a sort persze rhattuk volna az egyszer ubb REP MOVSB alakban is, de be akartuk mutatni az loperandusokat is. Ha ez megvolt, akkor meg fogjuk mrni a Szoveg1 sztring hosszt, ami ekvivalens a 00h kd karaktert megel oz o bjtok szmnak meghatrozsval. Pontosan ezt fogjuk tenni mi is: megkeressk, hol van a lezr karakter, annak oszetjb ol mr meghatrozhat a sztring hossza. A SCAS, SCASB, SCASW (SCAn String Byte/Word) utasts teljes alakja a kvetkez o:
SCAS clsztring

Az utasts AL illetve AX tartalmt hasonltja ssze a cl ES:[DI] bjttal/szval, belltja a ageket, de egyik operandust sem bntja. Az sszehasonltst gy kell rteni, hogy a clsztring elemt kivonja AL-b ol vagy AX-b ol, s az eredmny alapjn mdostja a szksges ag-eket. A SCASB, SCASW mnemonikok a SCAS BYTE/WORD PTR ES:[DI] utastst rvidtik. Esetnkben egszen addig akarjuk tvizsglni a Szoveg1 bjtjait, amg meg nem talljuk a 00h kd karaktert. Mivel nem tudjuk, mennyi a sztring hossza, gy azt sem tudjuk, hnyszor fog lezajlani a ciklus. CX-et teht olyan rtkre kell belltani, ami biztosan nagyobb vagy egyenl o a sztring hossznl. Most feltesszk, hogy a sztring rvidebb 100 bjtnl. DF-et trlni kell, mivel a sztring elejt ol nvekv o sorrendben vizsgldunk. A REPNE prex hatsra egszen mindaddig ismtl odik a SCAS, amg ZF = 1 lesz, ami pedig azt jelenti, hogy a legutols vizsglt karakter a keresett bjt volt. Ha az utasts vgzett, DI a 00h-s karakter utni bjtra fog mutatni, ezrt DI-t 1-gyel cskkentjk, majd levonjuk bel ole a Szoveg1 kezd ooszetjt. Ezzel DI-ben kialakult a hossz, amit rgvest el is trolunk. A kivonst kicsit cselesen oldjuk meg. Az STC utasts CF-et lltja 1-re, amit a clbl a forrssal egytt kivonunk az SBB-vel. Az OFFSET opertor nevb ol addan a t ole jobbra ll szimblum oszetcmt adja vissza. A maradk programrsz az el oz oekhez kpest semmi hasznosat nem csinl. A 100 db. szbl ll Vektor terletet fogjuk feltlteni a kvetkez o mdon: brmelyik szt gy kapjuk meg, hogy a kdszegmens egy adott bjtjt el ojelesen kiterjesztjk szv, majd ennek vesszk az egyes komplemenst. Semmi rtelme, de azrt j. :) Mivel a kdszegmens lesz a forrs, CS-t berakjuk DS-be, SI-t a szegmens elejre lltjuk. A ciklusban majdnem minden ismer os. A LODS, LODSB, LODSW s STOS, STOSB, STOSW utastsokkal mr tallkoztunk korbban, de azrt ismtlskppen felidzzk m ukdsket. Teljes alakjuk a kvetkez o:
LODS STOS forrs cl

Forrs a szokott mdon DS:SI, ebb ol DS fellbrlhat, a cl pedig ES:DI, ami rgztett. Az utastsok AL-t vagy AX-et hasznljk msik operandusknt, a ag-eket nem mdostjk. A LODS a forrst tlti be AL-be/AX-be, a STOS pedig AL-t/AX-et rja a cl terletre. A LODSnl a forrs, mg a STOS-nl AL/AX marad vltozatlan. SI-t ill. DI-t a szokott mdon frisstik. A LODSB, LODSW, valamint a STOSB, STOSW utastsok formlisan sorban a LODS BYTE/WORD PTR DS:[SI], ill. a STOS BYTE/WORD PTR ES:[DI] utastsokat rvidtik. Az AL-be beolvasott bjtot a CBW terjeszti ki el ojelesen AX-be, majd ezt az egyoperandus NOT utasts bitenknt logikailag neglja (azaz kpezi az egyes komplemenst), vgl a STOS

utasts a helyre teszi a ksz szt. A ciklus lefutsa utn a program futsa befejez odik.

80 Az utastsok teljes alakjnak hasznlatt csak a forrs szegmens megvltoztatsa indokolhatn, minden ms esetben a rvid alakok clravezet obbek s jobban tlthatak. Azonban az egyszer ubb vltozatok esetn is lehet osgnk van a forrs szegmens kivlasztsra, mgpedig ktfle mdon. Az egyik, hogy az utasts el ott alkalmazzuk valamelyik SEGxx prexet, a msik, hogy az utasts el otti sorban kzzel berakjuk az adott prex gpi kdjt. Az els o mdszer MASM esetn nem m ukdik (esetleg ms assemblernl sem), a msodikban meg annyi a nehzsg, hogy tudni kell a kvnt prex gpi kdjt. Ezek alapjn a LODS SS:[SI] utastst az albbi kt mdon helyettesthetjk: 1.
SEGSS LODSB

2.
DB LODSB 36h

Az SS: prex gpi kdja 36h, a LODSB- 0ACh, gy mindkett o megolds a 36h 0ACh bjtsorozatot generlja.

13. fejezet

Az .EXE s a .COM programok kztti klnbsgek, a PSP


Az, hogy a futtathat llomnyoknak milyen a formtumuk, az adott opercis rendszert ol kpes ezeket fgg. A .COM s .EXE fjlok a DOS opercis rendszer llomnyai, csak o futtatni.

13.1. A DOS memriakezelse


Hamarosan megnzzk, hogy hogyan trtnik ltalban egy program elindtsa, de hogy vilgosan lssunk, tudnunk kell egyet s mst a DOS-rl, azon bell is annak memriakezelsr ol. Ugyebr 1 Mbjt memrit tudunk megcmezni (gy a DOS is), viszont ennyit mgsem tudunk kihasznlni, ugyanis az 1 Mbjt memria fels o terletn (azaz a magas cmtartomnyban) helyezkedik el pl. a BIOS programkdja (radsul az ROM memria) s a kperny omemria, teht pl. ezeket nem tudjuk ltalnos trolsra hasznlni. A memribl mindenesetre sszesen 384 Kbjtot tartanak fenn, gy az 1024 Kbjtbl csak 640 Kbjtot tud a DOS tnylegesen hasznlni (ez a 640 ismer os szm kell, hogy legyen). Ezen a(z als) 640 Kbjton bell a DOS memriablokkokat (memriaszeleteket) kezel, amelyeknek ngy f o jellemz ojk van: memriablokk helye (kezd ocme) memriablokk mrete memriablokk llapota (foglalt/szabad) memriablokk (tulajdonosnak) neve Ezekr ol az adatokrl a DOS nem vezet kln adminisztrcit egy sajt, opercis rendszeri ket (amihez termszetesen senkinek memriaterleten, ahol pl. klnbz o listkban troln o ket. Ezek az adatok semmi kze), hanem egyszer uen az adott memriablokk elejn helyezi el o szintn egy blokkot alkotnak, amelynek mrete 16 bjt, neve pedig memriavezrl o blokk (MCB Memory Control Block). Ezzel megengedi a felhasznli programoknak is azt, hogy elrhessk ezeket az informcikat, ami a DOS szemszgb ol elg nagy hiba, ugyanis brki turklhat bennk, ami miatt tnkremehet a memria nyilvntartsa. Ezalatt azt rtjk, hogy adott esetben egy program a memriablokkokra vonatkoz m uveleteket nem a DOS szabvnyos

13.2. LTALBAN EGY PROGRAMRL

82

eljrsain keresztl vgzi, hanem sajt maga, mgpedig gy, hogy egyszer uen trja az MCB-t, s/vagy j(ak)at hoz ltre, ha jabb memriablokk(ok) keletkeztek. Egybknt hrom m uveletet rtelmez a DOS a memriablokkjain, mindegyik eljrsnak vannak hibakdjaik (visszatrsi rtkeik): Adott mretu memriablokk lefoglalsa (memria foglalsa): Ha sikerlt lefoglalni a kvnt mret u memrit, akkor visszakapjuk a lefoglalt terlet cmt. Hibakdok: nincs elg memria, ekkor visszakapjuk a legnagyobb szabad blokk mrett is. Adott kezd ocmu blokk felszabadtsa: Hibakdok: a kezd ocm nem egy blokk kezdetre mutat. Adott kezd ocmu foglalt blokk mretnek megvltoztatsa: Hibakdok: nincs elg memria (ha nvelni akarjuk), rvnytelen blokkcm. Ha memrit foglalunk le, akkor a DOS ltrehoz egy j blokkot a kvnt mrettel, a blokk legelejn az MCB-vel, s a blokk tnyleges kezd ocmnl egy 16 bjttal nagyobb cmet ad vissza mint a lefoglalt memria kezdett. A felhasznli program (aki a memrit krte) szempontjbl az MCB teht nem tartozik a blokkhoz, gondoljunk csak a magas szint u programozsi nyelvekre: ott is hasznlunk ilyen fggvnyeket, s bennnket egyltaln nem rdekel, hogy a lefoglalt memrit ki s milyen mdon tartja nyilvn. A DOS teht eleve egy 16 bjttal nagyobb blokkot foglal le, hogy az MCB-t is el tudja helyezni benne. Lnyeges, hogy soha egyetlen memriablokk MCB-je se srljn meg, mindig helyes adatokat tartalmazzon, klnben az emltett memriakezel o eljrsok a kvetkez o hibakddal trnek vissza: az MCB-k tnkrementek. Ilyenkor termszetesen az adott m uvelet sem hajtdik vgre. Erre plda: ha az adott blokk kezd ocmhez hozzadjuk annak mrett, akkor megkapjuk a kvetkez o blokk kezd ocmt (pontosabban annak MCB-jnek kezd ocmt), s gy tovbb, azt kell kapnunk, hogy a legutols blokk utni terlet kezd ocme a 640 Kbjt. Ha pl. ez nem teljesl, az azt jelenti, hogy valamelyik (de lehet, hogy tbb) MCB tnkrement, s attl kezdve taln mr olyan terleteket vizsgltunk MCB-knt, amik valjban nem is azok. Mindesetre ilyenkor hasznlhatatlann vlik a nyilvntarts. A DOS is az emltett (sajt) eljrsokat hasznlja. Ha az el obbi hibval tallkozik, akkor azt gy kezeli le, hogy a Memory Allocation Error memriakiosztsi hiba zenettel szpen meghal. Bootolskor a DOS lefoglal magnak egy blokkot (a memria elejn), oda rakja adott esetben a sajt programkdjt, a tbbi memrit pedig bejelli egyetlen nagy szabad blokknak, amelyet aztn a programok szabadon hasznlhatnak.

13.2. ltalban egy programrl


Tekintsk t elmleti szempontbl, hogy ltalban hogyan pl fel egy program, mire van szksge a futshoz s futs kzben, aztn megnzzk, hogy mindezeket hogyan biztostottk DOS alatt. Egy program hrom f o rszb ol tev odik ssze: Kd: Ez alatt magt az alacsony szint u programkdot rtjk, a fordtprogramok feladata, hogy a magas szint u nyelven lert algoritmust a processzor szmra feldolgozhat kdra alaktsk t.

13.2. LTALBAN EGY PROGRAMRL

83

Adat: Ebben a rszben helyezkednek el a program globlis vltozi, azaz a statikusan lefoglalt memria. Verem: Magas szint u nyelvekben nem ismeretes ez a fogalom (gy rtve, hogy nem a nyelv rsze), viszont nlklzhetetlen az alacsony (gpi) szinten. A fordtk pl. ennek segtsgvel valstjk meg a loklis vltozkat (amir ol mr sz volt). A gyakorlatban legtbbszr a programkdot nem egyetlen sszefgg o egysgknt kezeljk (s ez az adatokra is vonatkozik), hanem csoportostjuk a program rszeit, s ennek alapjn k ket. Pontosan ezt csinljuk akkor, ln szegmensekbe (logikailag klnll rszekbe) pakoljuk o amikor az assemblernek szegmenseket denilunk (ez teht az a msfajta szegmensfogalom, amikor a szegmenseket logikailag klnvlaszthat programrszeknek tekintjk). Meg lehet pl. a unitokat tekinti klnll programrszeknek, gy minden unit mg emlteni a Pascalt is: o programkdja kln kdszegmensbe kerl. Adatszegmens viszont csak egy globlis van. Nzzk meg, hogy mely rszeket kell eltrolnunk a programllomnyban! A programkdot mindenkppen, hiszen azt nem tudjuk a semmib ol el olltani. A vermet viszont semmikppen nem kell, hiszen a program indulsakor a verem res (ezrt mit is trolnnk el?), ezrt ezzel csak annyit kell csinlni, hogy a memriban kijellnk egy bizonyos nagysg terletet a verem szmra, a veremmutatt a veremterlet vgre lltjuk (ott lesz a verem teteje). Szndkosan hagytuk a vgre az adatokat, mert ennek elg csak valamely rszt eltrolni. Elg csak azokat a globlis vltozkat eltrolnunk, amelyeknek van valami kezdeti rtke a program indulsakor. Ezt gy szoks megoldani, hogy a kezd ortkkel nem rendelkez o vltozkat egy kln adatszegmensbe rakjuk, s el orjuk (ezt meg lehet mondani az assemblernek), hogy ez a szegmens ne kerljn be az llomnyba (azaz a linker ne szerkessze be), viszont a program indtsakor az opercis rendszer tudjon eme szegmensr ol, s biztostson neki memrit, azaz hozza ltre azt. E megolds azrt knyelmetlen, mert ilyenkor kt adatszegmensnk is van, de azt mi egyben szeretnnk ltni, ezrt a programnak futs kzben vltogatnia kellene a 2 kztt. Knyelmesebb megolds, ha egyetlen adatszegmenst deklarlunk, az egyik felben a kezd ortkkel rendelkez o vltozkat, a msik felben pedig az azzal nem rendelkez o vltozkat helyezzk el, s azt rjuk el o, hogy a szegmens msik fele ne kerljn be az llomnyba (ez is megoldhat, hiszen a szegmenseket szakaszokban is megadhatjuk, gy megmondhatjuk azt is az assemblernek, hogy a szegmens adott darabja ne foglaljon feleslegesen helyet az llomnyban. Ez persze csak akkor teljeslhet, ha abban a szegmensben tnylegesen gy deklarljuk a vltozkat, hogy ne legyen kezd ortke (pl. Nev DB ?), ha ez a kvetelmny valahol nem teljesl, akkor mindenkppen bekerl az egsz szegmensdarab az llomnyba). Egy program indtsakor a programllomnybl teht meg kell tudnia az opercis rendszer indtja a programokat), hogy hol tallhat(ak) az llomnyban a kdot tartalmaz nek (mivel o rszek. Ha ez megvan, lefoglalja nekik a megfelel o mennyisg u memri(ka)t (ott lesznek elhelyezve a program kdszegmensei), majd oda betlti a programkdot. Ezutn kvetkezik az adat. Hasonlan jr el a program adataszegmenseivel (az llomnyban le nem trolt szegmenseket is belertve, ezen memriabeli szegmensekbe nyilvn nem tlt be semmit az llomnybl, gy az itt tallhat vltozknak meghatrozatlan lesz a kezd ortke), az adott szegmensek tartalmt szintn bemsolja. A memriban meglesznek teht a program adatszegmensei is. Azutn foglal memrit a veremnek is (veremszegmens). A veremmutatt rlltja a veremszegmens vgre, az adatszegmens-regisztert pedig valamely adatszegmens elejre (ezzel a program el o van ksztve a futsra), majd tadja a vezrlst (rugrik) a program els o utastsra valamelyik kdszegmensben.

13.3. AHOGY A DOS INDTJA A PROGRAMOKAT

84

Mindez, amit lertunk, csak elmleti dolog, azaz hogyan vgzi el egy opercis rendszer ltalban egy program elindtst. Azonban, mint azt ltni fogjuk, a DOS ilyen nagy fok szabadsgot nem enged meg szmunkra.

13.3. Ahogy a DOS indtja a programokat


A DOS-nak ktfle futtathat llomnya van (h uha!), a .COM s a .EXE formtum. Amit ebben a fejezetben ltalnossgban lerunk, az mind a kett ore vonatkozik. A kett o kzti rszletes klnbsget ezutn trgyaljuk. Mint az lthat, az, hogy a program mely szegmense tulajdonkppen mit tartalmaz, azaz hogy az kd- vagy adatszegmens-e, az teljesen lnyegtelen. A DOS viszont ennl is tovbbmegy: a programllomnyaiban letrolt szegmensekr ol semmit sem tud! Nem tudja, hogy hny szegmensr ol van sz, gy pl. azt sem, hogy melyik hol kezd odik, mekkora, stb., egyetlen egy valamit tud rluk, mgpedig azt, hogy azok sszmrete mennyi. ppen ezrt nem is foglal mindegyiknek kln-kln memrit, hanem megnzi, hogy ezek mindsszesen mekkora memrit ignyelnek, s egy ekkora mret u memriablokkot foglal le, ezen bell kap majd helyet minden szegmens. Annak, hogy a szksges memrit egyben foglalja le, annyi htrnya van, hogy ha nincs ekkora mret u szabad memriablokk, akkor a programot nem tudja futtatni (ekkor kikpi a Program too big to t in memory a program tl nagy ahhoz, hogy a memriba frjen hibazenetet), holott lehet, hogy a szksges memria darabokban rendelkezsre llna. Igazbl azonban a gyakorlatban ez a problma szinte egyltaln nem jelentkezik, mivel ez csak a memria felaprzdsa esetn jelenhet meg, azaz akkor, ha egyszerre tbb program is fut, aztn valamely(ek) vgetr(nek), az ltaluk lefoglalt memriablokk(ok) szabadd vlik/vlnak, gy a vgn egy lyukacsos memriakp keletkezik. Mivel a DOS csak egytaszkos oprendszer, azaz egyszerre csak egy program kpes futni, mgpedig amelyiket a legutoljra indtottak, gy t indt program nem tud azel nyilvn az o ott befejez odni, miel ott ez befejez odne. Ebb ol az kvetkezik, hogy a szabad memria mindig egy blokkot alkot, a teljes memria foglalt rsznek mrete pedig a veremelv szerint vltozik: amennyit hozzvettnk a foglalt memria vghez, azt fogjuk legel oszr felszabadtani. Persze azrt a DOS esetben is felaprzdhat a memria, ha egy program dinamikusan allokl magnak memrit, aztn bizonyos lefoglalt terleteket tetsz oleges sorrendben (s nem a lefoglals fordtott sorrendjben) szabadt fel. Ha ez a program ebben az llapotban sajt maga kri az DOS-t egy jabb program indtsra, akkor mr fennll(hat) az el obbi problma. Elkalandoztunk egy kicsit, ez mr inkbb az opercis rendszerek trgy rsze, csak elmlkedsnek szntuk. A DOS teht egyetlenegy memriablokkot foglal le minden szegmens szmra, ezt az egsz memriablokkot nevezik programszegmensnek (Program Segment) (mr megint egy jabb szegmensfogalom, de ez abbl addik, hogy a szegmens sz darabot, szeletet jelent, s ezt ugyebr sok mindenre lehet rteni). Fontos, hogy ezekkel a fogalmakkal tisztban legynk. Mint arrl mr sz volt, a programszegmens akkora mret u, amekkora a szegmensek ltal sszesen ignyelt memria. Nos, ez nem teljesen igaz, ugyanis a programszegmens legalbb ekkora (+256 bjt, ld. ks obb), ugyanis ha a programindtskor a DOS egy olyan szabad memriablokkot tall, ami mg nagyobb is a szksgesnl, akkor is odaadja az egszet a programnak. Hogy ez mire j, azt nem tudjuk, mindenesetre gy van. Ebb ol az a kellemetlensg addik, hogy pl. ha a program a futs sorn dinamikusan szeretne memrit alloklni, akkor azt a hibazenetet kaphatja, hogy nincs szabad memria. Valban nincs, mert az sszes szabad memria a programszegmenshez tartozhat, a programszegmens meg ugyebr nem ms, mint egy foglalt memriablokk, s a DOS memriafoglalskor nem tall ms szabad blokkot. Ezrt ilyenkor a

13.4. .COM LLOMNYOK

85

programnak indulskor le kell cskkentenie a programszegmensnek mrett a minimlisra a mr emltett funkcival! Mg egy fontos dolog, amit a DOS minden program indtsakor elvgez: a programszegmens elejn ltrehozza a programszegmens-prexet (Program Segment Prex PSP), ami egy 256 bjtbl ll informcis tmb. A +256 bjt teht a PSP miatt kell. Mire kell a PSP s mit tartalmaz? Sok mindent. Ezen 256 bjtos terlet msodik fele pl. azt a sztringet tartalmazza, amit a promptnl a program neve utn runk paramternek. Azt, hogy az els o 128 bjt miket trol, azt nagyon hossz lenne itt felsorolni (inkbb nzzk meg egy knyvben), szmunkra nem is igazn fontos, csak egy-kt rdekesebb dolog: az els o kt bjt az INT 20h kdja (0CDh 20h), vagy pl. a krnyezeti sztringek (amelyeket a DOS SET parancsval llthatunk be) szmra is le van foglalva egy memriablokk, ennek a szegmenscme (ami azt jelenti, hogy a cm oszetrsze nulla, gy azt nem kell letrolni, csak a cm szegmensrszt, de ez igaz minden ms memriablokk cmre is) benne van a PSP-ben. gy a program kiolvashatja ezt, s hozzfrhet a krnyezeti sztringekhez, mdosthatja azokat, stb. A DOS sajt maga szmra is trolgat informcit: pl. megtallhat az adott programot elindt program PSP-jnek szegmenscme is (visszalncols backlink), ami ltalban a parancsrtelmez o (COMMAND.COM), hiszen legtbbszr onnan indtjuk a programokat. Mire kell ez? Arra, hogy ha a program befejez odik, akkor a DOS tudja, hogy kinek kell visszaadnia a vezrlst, s ez nyilvn a programot betlt o program. Ezek utn nzzk meg a klnbsget .COM s .EXE kztt.

13.4. .COM llomnyok


Ezek a fjlok voltak a DOS els o futtathat llomnyai, nagyon egyszer u felpts uek, ugyanis olyan programok szmra terveztk, amelyek egyetlen szegmensb ol llnak. Err ol ugyan nem volt sz, de egy szegmensnek termszetesen lehet vegyes jellege is, tartalmazhat kdot is s adatot is egyszerre. Nos, .COM-ok esetben mg a veremterlet is ebben a szegmensben kell, hogy elhelyezkedjen. Egy programnak illene minimum 3 szegmensnek lennie a hrom programrsz szmra, de itt sz sincs err ol. Mint tudjuk, egy szegmens max. 64 Kbjt lehet, gy egy .COM program is. Rtesznk azonban mg egy lapttal: a PSP is a szegmens rsze, indtskor a DOS a PSP mg msolja be a .COM programot! (Ezrt van az, hogy .COM programok rsakor a szegmens elejre be kell raknunk azt a bizonyos ORG 100h direktvt, ezzel jelezve az assemblernek, hogy minden szegmensbeli oszetcmhez adjon hozz 100h-t, azaz az oszeteket tolja el 256 bjttal, mivel a PSP nyilvn nem troldik el a programllomnyban, de mindig oda kell kpzelnnk a szegmens elejre). Indulskor a DOS a verembe berak egy 0000h-t, ami a PSPben lev o INT 20h utasts oszetcme. A kilps teht megoldhat egy RET utastssal is, mivel a DOS a programot egy kzeli eljrsnak tekinti. (Ez csak .COM-ok esetn alkalmazhat, mert ehhez a CS-nek a PSP-re kell mutatnia). Ezutn programszegmensen a programszegmens csak azon rszt rtjk, amelyet a program tnylegesen hasznl, nem vesszk bele teht a felesleges rszt, mivel annak semmi szerepe. A .COM programok programszegmense mindig 64 Kbjt, eltekintve attl az (egybknt nagyon ritka) esett ol, amikor mr 64 Kbjt szabad memria sincs a program szmra, de ezzel most nem foglalkozunk. Mirt van az, hogy a szegmens mindig kib ovl 64 Kbjtra? Azrt, hogy minl tbb hely legyen a verem szmra. Ugyanis a .COM fjlokban a programrl semmi ksr oinformci nem tallhat, a fjl csak magt az egyetlen szegmenst trolja le, gy nem tudjuk megadni a DOS-nak, hogy a szegmensen bell hol a veremterlet, azaz hogy mi legyen

13.5. RELOKCI

86

az SP kezdeti rtke. Emiatt a DOS gy gondolkodik, hogy automatikusan maximlis vermet biztost, ezrt nveli meg a szegmensmretet 64 Kbjtra, s annak vgre lltja a veremmutatt. Ebb ol az is kvetkezik, hogy a program rsakor neknk sem kell tr odnnk a veremmel. Ezek szerint azt sem tudjuk megadni, hogy a szegmensben hol tallhat az els o vgrehajtand utasts. gy van, ennek mindig a .COM fjl elejn kell lennie, azaz a memriabeli szegmens 256. bjtjn. Indtskor a DOS teht a fenti bra szerint lltja be a regisztereket.

13.5. Relokci
Ha egy program tbb szegmenst is tartalmaz, akkor ahhoz, hogy el tudja rni azokat, meg kell hatroznia minden egyes szegmens tnyleges szegmenscmt. Azrt nevezik ezt a folyamatot relokcinak (thelyezsnek), mert a szegmenseknek csak a program elejhez kpesti relatv elhelyezkedst ismerhetjk (vehetjk gy is, hogy a program legeleje a 0-n, azaz az 1 Mbjtos memria elejn kezd odik, ekkor a szegmensek relatv cmei egyben abszolt cmek is, a program futkpes lenne), azonban a program a memria szinte tetsz oleges rszre betlt odhet, s hogy pontosan hova, az csak indtskor derl ki. A program csak akkor lesz futkpes, ha a relatv szegmenscmeket trjuk, azaz azokhoz hozzadjuk a program elejnek szegmenscmt. Ezzel a programot mintegy thelyeztk az adott memriaterletre. Lssuk ezt egy pldn keresztl:
Kod SEGMENT PARA ASSUME CS:Kod,DS:Adat ;paragrafushatron kez ;dodjn a szegmens ;mondjuk meg az assem;blernek, hogy mely szeg;mensregiszter mely ;szegmensre mutat, eszerint generlja ;o ;majd az ;offszetcmeket ;Az Adat szegmens ;szegmenscme ;A felttelezsnek ;tegynk is eleget, ;ne vgjuk t szegny ;assembler bcsit

MOV MOV

AX,Adat DS,AX


MOV INT ENDS AX,4C00h 21h

Kod Adat Valami Akarmi Adat

SEGMENT PARA DB DB ENDS 2 14

;paragrafushatron kez ;dodjn a szegmens

13.5. RELOKCI

87
END

Ez egy szokvnyos program, de a lnyeg most azon van, hogy amikor az elejn a DS-t rlltjuk az Adat szegmensre, akkor a MOV AX,Adat utastssal mit kezd az assembler, hiszen az Adat rtke (ami egy szegmenscm) attl fgg, hogy a program a memriba hov tlt odik majd be. A vlasz az, hogy az Adat egy relatv rtk, a program els o szegmenshez kpest. Hogy melyik lesz az els o szegmens, az csak a linkelsnl vlik el, amikor a linker az egyes szegmensdarabokat sszef uzi egyetlen szegmenss, valamint a szegmenseket egyetlen programm, dnt. Az de hogy a szegmensek milyen sorrendben kvessk egymst a programban, arrl o assembler teht csak bejelli az .OBJ fjlban, hogy ezen a helyen egy relatv szegmenscm kelletik, ezt a linker szreveszi, s berja oda azt. A fenti programnak csak kt szegmense van, tegyk fel, hogy a Kod lesz az els o, s hogy a Kod szegmens mrete pl. 36 bjt (mivel ez nem lenne 16-tal oszthat, ezrt a mret linkelskor 16-tal oszthatra n o, hogy az utna kvetkez o szegmens paragrafushatrra essen, gy most 48 bjt lesz). Ekkor a lefordtott program a kvetkez o lesz:
MOV MOV AX,0003h DS,AX ;48/16=3


MOV INT AX,4C00h 21h

;Ezutn szksg szerint ;szemt kvetkezik, ;hogy a DB 2 ;a program ;elejhez kpest 16-tal ;oszthat cmre essen, ; hiszen azt a szegmenst ;paragrafushatron ;kezdtk

DB DB

2 14

Most a program egy relatv szegmenscmet tartalmaz (0003), de mg miel ott elindthatnnk, azt t kell javtani a tnyleges cmre. Ha pl. a Kod szegmens a memria 5678h:0000h terletre kerl majd, akkor a 0003h-hoz hozz kell adni az 5678h-t, hogy helyes rtket kapjunk. ezt Mivel ezt a program indtsakor kell elvgezni, gy ez a feladat a DOS-ra hrul, de o csak az .EXE fjlok esetben kpes elvgezni, mivel ott el van trolva a relokcihoz szksges informci. Ebb ol vilgos, hogy egy .COM program nem tartalmazhat ilyen mdon relatv szegmenscmeket, igy pl. a fenti programot sem lehet .COM-m fordtani, a linker is idegeskedik, ha ilyennel tallkozik. A msik megolds az, ha a program maga vgzi el indulskor a szksges relokcit. Ezzel elrhetjk azt is, hogy egy .COM program tbb szegmenst is tartalmazzon (amelyek sszmrete nem haladhatja meg persze a 64K-t), csak a relokcit el kell vgeznnk. A fenti pldt trva:

13.6. .EXE LLOMNYOK

88

DOSSEG Kod SEGMENT PARA ASSUME CS:Kod,DS:Adat ORG 100h

;PSP helye

@Start: MOV AX,Kod:Adat_eleje ;a Kod szegmens elej;hez kpest az ;Adat_eleje cmke, ;azaz az adat szegmens ;eleje hny bjtra helyez;kedik el o ;osztva 16-tal (az eloz ;pldban kzvetlenl ez ;az rtk volt benne az ;utastsban) ;DS ekkor mg a PSP ;elejre, azaz a Kod ;szegmens elejre ;mutat ;rlltjuk az adatszeg;mensre ;innen DS mr az adat ;szegmensre mutat

MOV SHR

CL,4h AX,CL

MOV

BX,DS

ADD MOV

AX,BX DS,AX


MOV INT ENDS AX,4C00h 21h

Kod Adat

SEGMENT PARA ORG 0h LABEL DB DB ENDS END 2 14 @Start

;Ezen a szegmensen bell ;nincs eltols

Adat_eleje Valami Akarmi Adat

A program elejn lev o DOSSEG direktvval biztostjuk azt, hogy a szegmensek a deklarls sorrendjben kvessk egymst az sszeszerkesztett programban is, hiszen itt fontos, hogy a Kod legyen az els o szegmens.

13.6. .EXE llomnyok


Az .EXE llomnyokat a bonyolultabb programok szmra talltk ki, amelyek tetsz oleges szm szegmensb ol llnak. Magban az llomnyban ezek egymst kvet oen, folyamatosan ket. Fontos azonban megjegyezni, hogy vannak eltrolva, ahogyan a linker egyms utn f uzte o

13.6. .EXE LLOMNYOK

89

nem biztos, hogy az egsz llomny magt a programot trolja, mivel az llomnyban a program utn mg tetsz oleges hosszsgban trolhatunk pl. adatokat, mint egy kznsges adatfjlban. Ezek az adatok nem tartoznak a programhoz, mg egyszer kihangslyozzuk. Az .EXE fjlok elejn mindig tallhat egy fejlc (header), azaz egy informcis tmb, amely a DOS szmra nlklzhetetlen a program elindtshoz. A betltsi folyamat hasonl a .COM-okhoz: a fejlcb ol a DOS megnzi, hogy a fejlc utn eltrolt program milyen hossz, azaz hol a hatr a program s az el obb emltett adatok kztt. Itt persze mr nem l az a megkts, hogy a program (azaz a szegmensek sszmrete) nem haladhatja meg a 64 Kbjtot. Ezutn szintn a fejlcb ol megnzi, hogy a programnak mennyi tbbletmemrira van szksge (ez a bejegyzs a minimlisan szksges tbbletmemria). Ez biztositja a programban el nem trolt szegmensek ltrehozst a memriban, amir ol mr beszltnk. A programszegmens gy legalbb az sszmret + tbbletmemria mret u lesz. Van azonban egy maximlisan szksges tbbletmemria-bejegyzs is, elmletileg ennl nagyobb soha nem lehet nagyobb a programszegmens, ezzel teht el lehetne kerlni, hogy az feleslegesen nagy legyen, de a gyakorlatban egyltaln nem lnek ezzel a lehet osggel, szinte mindig k hozzk ltre a futtathat llomnyokat). A DOS maximumra llitjk (a linkerek, merthogy o teht lefoglalja a programszegmenst, bemsolja az .EXE-b ol a programot, s elvgzi a program relokcijt. Hogy a programban mely helyeken kell trni a relatv szegmenscmeket, azt a relokcis tblbl (relocation table) (ami szintn a fejlc rsze) tudja az oprendszer. Mivel programunk tbb szegmensb ol ll, kijellhetjk, hogy melyik a veremszegmens (szintn relatvan), indtskor a DOS az SS:SP-t ennek megfelel oen lltja be. Ugyangy relatvan adhatjuk meg, hogy hol van a program belpsi pontja (entry point), azaz mi lesz a CS:IP kezdeti rtke. Fontos megjegyezni, hogy .EXE-k esetben a PSP nem tartozik semelyik szegmenshez sem, ezrt nincs szksg ilyen programok rsakor sehol sem az ORG 100h direktva megadsra. Kezdeti adatszegmenst nem tudunk kijellni a program szmra, a DOS gy van vele, hogy ha egy programnak tbb szegmense is van, akkor azok kztt valszn uleg egynl tbb adatszegmens is van, gy a programnak futs kzben gyis lltgatnia kell a DS-t, akkor mirt ne tegye ezt meg pl. mr rgtn indulskor, ahogy az els o pldban mr lttuk? Ez amgy sem okoz a programnak gondot, a relokcit elvgzik helyette, nem neki kell vele szenvednie. ppen ezrt kezdetben a DS, ES a PSP elejre mutat.

14. fejezet

Szoftver-megszaktsok
Mint emltettk, szoftver-megszaktsnak egy program ltal kivltott megszaktst neveznk. Hogy mirt van erre szksg? Nos, nhny szoftver-megszakts jcskn megknnyti a klnfle hardvereszkzk elrst, mg msok az opercis rendszer egyes funkciival teremtenek kapcsolatot, de szmos egyb felhasznlsuk is lehetsges. sszesen 256 db. szoftver-megszaktst kezel a 8086-os mikroprocesszor. Ebb ol 8 (vagy 16) db. az IRQ-k kezelsre van fenntartva, nhny pedig specilis clt szolgl, de a tbbi mind szabadon rendelkezsnkre ll. Azt azrt tudni kell, hogy a gp bekapcsolsa, ill. az opercis rendszer felllsa utn nhny megszakts mr foglalt lesz, azokon keresztl hasznlhatjuk a munknkat segt o szolgltatsokat. Megszaktst az egyoperandus INT utastssal kezdemnyezhetnk. Az operandus kizrlag egy bjt mret u kzvetlen adat lehet, ami a krt szoftver-megszaktst azonostja. Az utasts pontos m ukdsvel a kvetkez o fejezetben foglalkozunk majd. rdemes megemlteni mg egy utastst. Az INTO (INTerrupt on Overow) egy 04h-s megszaktst kr, ha OF = 1, klnben pedig m ukdse megfelel egy NOP-nak (azaz nem csinl semmit sem, csak IP-t nveli). Ennek akkor vehetjk hasznt, ha mondjuk az el ojeles szmokkal vgzett m uveletek sorn keletkez o tlcsorduls szmunkra nemkvnatos, s annak bekvetkeztekor szeretnnk lekezelni a szitucit. Egy adott szm megszakts sokszor sok-sok szolgltats kapujt jelenti. A kvnt szolgltatst s annak paramtereit ilyenkor klnbz o regiszterekben kell kzlni, s a visszatr o rtkeket is ltalban valamilyen regiszterben kapjuk meg. Hogy melyik megszakts mely szolgltatsa hnyas szm s az milyen regiszterekben vrja az adatokat, lehetetlen fejben tartani. Ezeknek sok szakknyvben is utnanzhetnk. Ha viszont a knyv nincs a kzelben, akkor sem kell csggedni. Szmos ingyenes segdprogramot kifejezetten az ilyen gondok megoldsra ksztettek el. A legismertebbek: HelpPC, Tech Help!, Norton Guide, Ralf Browns Interrupt List. A programok mindegyike hozzfrhet o, s tudtunkkal magnclra ingyenesen hasznlhat. Mindegyik tulajdonkppen egy hatalmas adatbzison alapul, amiben hardveres s szoftveres tmkat is tallhatunk kedvnk szerint. A 14.1. tblzatban felsorolunk nhny gyakoribb, fontos megszaktst a teljessg ignye nlkl. A kvetkez okben nhny pldn keresztl bemutatjuk a fontosabb szolgltatsok hasznlatt.

14.1. SZVEGKIRATS, BILLENTYUZET-KEZELS

91

14.1. tblzat. Gyakran hasznlt szoftver-megszaktsok 10h 13h 14h 16h 1Ch 20h 21h 25h 26h 27h 2Fh 33h Kperny ovel kapcsolatos szolgltatsok (Video services) Lemezm uveletek (Disk operation) Soros ki-/bemenet (Serial I/O) Billenty uzet (Keyboard) Id ozt o (Timer tick) Program befejezs (Program terminate DOS) DOS szolgltatsok (DOS services) Kzvetlen lemezolvass (Absolute disk read DOS) Kzvetlen lemezrs (Absolute disk write DOS) Rezidenss ttel (Terminate and stay resident DOS) Vegyes szolgltatsok (Multiplex) Egr tmogats (Mouse support)

14.1. Szvegkirats, billentyuzet-kezels


Legyen a feladat a kvetkez o: a program rja ki a kperny ore a Tetszik az Assembly? szveget, majd vrjon egy billenty u lenyomsra. Ha az i vagy I gombot nyomjk le, akkor rja ki az Igen. vlaszt, n s N hatsra pedig a Nem. szveget. Mindkt esetben ezutn fejezze be m ukdst. Egyb billenty ure ne reagljon, hanem vrakozzon valamelyik helyes vlaszra. Lssuk a programot:
Pelda11.ASM:
MODEL SMALL .STACK ADAT Kerdes Igen Nem ADAT KOD SEGMENT DB "Tetszik az Assembly? $" DB "Igen.",0Dh,0Ah,$ DB "Nem.",0Dh,0Ah,$ ENDS SEGMENT ASSUME CS:KOD,DS:ADAT

@Start: MOV MOV MOV LEA INT @Ciklus: XOR INT CMP JE CMP AH,AH 16h AL,i @Igen AL,I AX,ADAT DS,AX AH,09h DX,[Kerdes] 21h

KEZELSE 14.2. SZVEGES KPERNYO

92
@Igen AL,n @Nem AL,N @Ciklus DX,[Nem] @Vege DX,[Igen] AH,09h 21h AX,4C00h 21h @Start

JE CMP JE CMP JNE @Nem: LEA JMP @Igen: LEA @Vege: MOV INT MOV INT ENDS END

KOD

A program elg rvid, s kevs jdonsgot tartalmaz, gy megrtse nem lesz nehz. Szveget sokflekppen ki lehet rni a kperny ore. Mi most az egyik DOS-funkcit fogjuk hasznlni erre. Mr lttuk, hogy a DOS-t az INT 21h-n keresztl lehet segtsgl hvni, a krt szolgltats szmt AH-ban kell megadnunk. A 4Ch sorszm funkcit mr eddig is hasznltuk a programbl val kilpsre. A 09h szolgltats egy dollrjellel ($) lezrt sztringet r ki az aktulis kurzorpozciba. A szveg oszetcmt DX-ben kell megadni, szegmensknt DS-t hasznlja. A billenty uzet kezelst az INT 16h-n keresztl tehetjk meg. A szolgltats szmt itt is AH-ba kell rakni. Ennek 00h-s funkcija egszen addig vrakozik, mg le nem nyomunk egy gombot a billenty uzeten, majd a gomb ASCII-kdjt visszaadja AL-ben. Htrnya, hogy nhny billenty u lenyomst nem tudjuk gy meggyelni (pl. Ctrl, Shift), mg ms billenty uk AL-ben 00h-t adnak vissza, s kzben AH tartalmazza a billenty ut azonost szmot (ez az .n. scan code). Most neknk csak a kicsi s nagy I ill. N bet ukre kell gyelnnk, gy nincs ms dolgunk, mint a megszaktsbl visszatrs utn AL-t megvizsglnunk. Ha AL-ben i vagy I van, akkor a @Igen cmkre megynk. Ha AL = n vagy AL = N, akkor a @Nem cmkt vlasztjuk clknt. Klnben visszamegynk a @Ciklus cmkre, s vrjuk a kvetkez o lenyomand billenty ut. Figyeljk meg, hogy a szelekci utols felttelben akkor megynk vissza a ciklusba, ha AL N, msklnben rcsorgunk a @Nem cmkre, ahov amgy is mennnk kne. Ezzel a mdszerrel megsproltunk egy JMP-t. Akr a @Igen, akr a @Nem cmkt vlasztottuk, a szveg oszetjnek DX-be betltse utn a @Vege cmknl ktnk ki, ahol kirjuk a vlaszt, majd kilpnk a programbl.

14.2. Szveges kperny o kezelse, szmok hexadecimlis alakban kirsa


Kvetkez o problmnk mr ranltabb: a program indtskor trlje le a kperny ot, majd a bal fels o sarokba folyamatosan rja ki egy sz mret u vltoz tartalmt hexadecimlisan, mikzben gyeli, volt-e lenyomva billenty u. A vltoz rtkt minden kirst kvet oen eggyel nvelje meg, kezdetben pedig a 0000h-rl induljon. Ha volt lenyomva billenty u, akkor annak

KEZELSE 14.2. SZVEGES KPERNYO

93

ASCII kdja szerinti karaktert rja ki a msodik sorba. A szkz (space) megnyomsra lpjen ki.
Pelda12.ASM:
MODEL SMALL .STACK ADAT Szamlalo HexaJegy ADAT KOD SEGMENT DW 0000h DB "0123456789ABCDEF" ENDS SEGMENT ASSUME CS:KOD,DS:ADAT PROC PUSH LEA MOV MOV SHR XLAT XCHG AND XLAT MOV PUSH XCHG MOV SHR XLAT XCHG AND XLAT MOV MOV INT MOV INT POP INT MOV INT POP RET ENDP PROC PUSH MOV

HexKiir

AX BX CX DX BX,[HexaJegy] CL,4 DL,AL AL,CL AL,DL AL,0Fh DH,AL DX AL,AH DL,AL AL,CL AL,DL AL,0Fh DH,AL AH,02h 21h DL,DH 21h DX 21h DL,DH 21h DX CX BX AX

HexKiir Torol

AX BX CX DX AX,0600h

KEZELSE 14.2. SZVEGES KPERNYO

94
BH,07h CX,CX DX,184Fh 10h DX CX BX AX

Torol GotoXY

MOV XOR MOV INT POP RET ENDP PROC PUSH MOV XOR INT POP RET ENDP

AX BX AH,02h BH,BH 10h BX AX

GotoXY @Start:

MOV MOV CALL @Ciklus: XOR CALL MOV CALL INC MOV MOV INT JZ CMP JE INC CALL MOV MOV INT XOR INT JMP @Vege: XOR INT MOV INT ENDS END

AX,ADAT DS,AX Torol DX,DX GotoXY AX,[Szamlalo] HexKiir AX [Szamlalo],AX AH,01h 16h @Ciklus AL,20h @Vege DH GotoXY AH,02h DL,AL 21h AH,AH 16h @Ciklus AH,AH 16h AX,4C00h 21h @Start

KOD

Az adatszegmensben nincs semmi ismeretlen, br a HexaJegy tartalma kicsit furcsnak t unhet. A homlyt rvidesen el fogja oszlatni, ha megnzzk, hogyan rjuk ki a szmot. A HexKiir az AX-ben lev o el ojeltelen szmot rja ki ngy karakteres hexadecimlis alakban

KEZELSE 14.2. SZVEGES KPERNYO

95

(teht a vezet o nullkkal egytt). Az eljrsban a sz kirst visszavezetjk kt bjt hexadecimlis kirsra, azt pedig az als s fels o bitngyesek szmjeggy alaktsra. Mivel a kperny ore el oszr a fels o bjt rtkt kell kirni, az als bjtot dolgozzuk fel, amit aztn berakunk a verembe, majd a fels o bjt hasonl talaktsai utn azt kirjuk a kperny ore, vgl a veremb ol kivve az als bjt hexadecimlis alakja is megjelenik a helyn. DX-ben fogjuk trolni a mr elkszlt szmjegyeket. BX s CL szerepre hamarosan fny derl. El oszr a fels o bitngyest kell szmjeggy alaktanunk. Ezrt AL-t elrakjuk DL-be, majd AL felveszi a fels o bitngyes rtkt (ami 00h s 0Fh kztt lesz). Ezt az SHR AL,CL utastssal rjk el. Most CL = 4 (erre lltottuk be), s gy AL fels o ngy bitje lekerl az als ngy helyre, mikzben a fels o bitngyes kinullzdik (ez a shiftels tulajdonsga). Ez pedig azt fogja jelenteni, hogy AL-ben ugyanakkora szm lesz, mint amekkora eredetileg a fels o bitngyesben volt. Az operandus nlkli XLAT (transLATe byte; X trans) utasts az AL-ben lev o bjtot kicserli a DS:BX cm u fordttblzat AL-edik elemre (nulltl szmozva az elemeket), teht szimbolikusan megfelel a MOV AL,[BX+AL] utastsnak (ami ugyebr gy illeglis), de AL-t el ojeltelenl rtelmezi. Egyetlen ag tartalmt sem mdostja. Az alaprtelmezett DS szegmens fellbrlhat prexszel. Esetnkben ez most azt jelenti, hogy az AL-ben lev o szmot az azt szimbolizl hexadecimlis szmjegyre cserli le, hiszen BX a HexaJegy oszetcmt tartalmazza. gy mr vilgos a HexaJegy dencija. Az XLAT utasts egybknt kaphat egy loperandust is, ennek szerepe hasonl a sztringkezel o utastsok operandusaihoz. rdekessg, hogy az XLAT utasts az XLATB mnemonik alatt is elrhet o, teht mindkett o ugyanazt jelenti a gpi kd szintjn. Hogy mirt kell egy ilyen egyrtelm u dolgot vgz o utastsnak 2 mnemonik, azon lehetne lozoflni. Az SHL-SAL prosra mg r lehet fogni, hogy segtik a program dokumentlst (t.i. az operandus tpust jelzi a mnemonik), viszont a mostani esetben rthetetlen a dupla mnemonik ltezse. Most, hogy megvan az els o jegy, AL eredeti als bitngyest is t kell alaktani szmjeggy. AL-t DL-ben troltuk el, s az elejn azt mondtuk, hogy a ksz szmjegyeket DX-ben fogjuk gy ujteni. Most teht clszer u lenne, ha AL s DL tartalmt fel tudnnk cserlni. Erre j a ktoperandus XCHG (eXCHanGe) utasts, ami a kt operandust felcserli. Az operandusok vagy 8, vagy 16 bites regiszterek, vagy egy regiszter s egy memriahivatkozs lehetnek. A ag-eket persze nem bntja. Specilis esetnek szmt, ha AX-et cserljk fel valamelyik msik 16 bites ltalnos regiszterrel, ez ugyanis csak 1 bjtos m uveleti kdot eredmnyez. Az XCHG AX,AX utasts a NOP (No OPeration) operandus nlkli mnemonikkal is elrhet o. AL teht ismt az eredeti rtkt tartalmazza. Most a fels o bitngyest kellene valahogy levlasztani, trlni AL-ben, hogy ismt alkalmazhassuk az XLAT-ot. Ezt most az AND utasts vgzi el, ami ugyebr a cloperandust a forrsoperandussal logikai S kapcsolatba hozza, majd az eredmnyt a cl helyn trolja. Most AL-t a 0Fh rtkkel hozza S kapcsolatba, ami annyit fog jelenteni, hogy a fels o bitngyes trl odik (hiszen Valami AND 00. . . 0b = 0h), az als pedig vltozatlan marad (mivel Valami AND 11. . . 1b = Valami). AL-t most mr talakthatjuk szmjeggy (XLAT), majd miutn DH-ban eltroltuk, DX-et t is feldolgozni. berakjuk a verembe. AH mg mindig az eredeti rtkt tartalmazza, ideje ht o Az XCHG AL,AH utn (ami most MOV AL,AH is lehetne, hiszen a szm als felre tbb mr nincs szksgnk) az el oz okhz hasonlan el olltjuk a kt szmjegyet DX-ben. Ha ez is megvan, akkor nincs ms htra, mint a ngy szmjegyet kirni. Ezt a mr jl ismert 02h szm INT 21h szolgltatssal tesszk meg. A 14.1. tblzatban lthat, hogy az INT 10h felel os a megjelentssel kapcsolatos szolgltatsokrt. gy logikus, hogy ehhez a megszaktshoz fordulunk segtsgrt a kperny o letrlshez. A Torol eljrs nagyon rvid, ami azrt van, mert a trlst egyetlen INT 10h hvssal

14.3. MUNKA LLOMNYOKKAL

96

elintzhetjk. A 06h-s szolgltats egy szveges kperny oablak felfel grgetsre (scrolling) szolgl, s gy m ukdik, hogy az AL-ben megadott szm sorral felfel cssztatja a kperny o tartalmt, az alul megresed o sorokat pedig a BH-ban megadott szn u (attribtum) szkzkkel tlti fel. Ha AL = 0, akkor az egsz kperny ot felgrgeti, ami vglis a kp trlshez vezet. Az ablak bal fels o sarknak koordintit CX, mg a jobb als sarokt DX tartalmazza. A fels o bjtok (CH s DH) a sort, az alsk (CL s DL) az oszlopot jelentik, a szmozs 0-tl kezd odik. Most gy tekintjk, hogy a kperny o 80 oszlopos s 25 soros kpet jelent meg, ezrt DH-ba 24-et (18h), DL-be pedig 79-et (4Fh) tltnk. A trls utn a kurzor a kperny o legals sornak elejre kerl. A GotoXY eljrs a kurzor pozcionlst teszi meg. A 02h szm video-szolgltats a DHadik sor DL-edik oszlopba rakja a kurzort, a szmozs itt is 0 bzis. BH-ba 0-t rakunk, de ezzel most ne tr odjnk. (Akit rdekel, BH-ban a hasznlt kperny olap sorszmt kell megadni.) A f oprogram nagyon egyszer ure sikeredett, hiszen a legtbb dolgot eljrshvssal intzi el. A kperny o letrlse (CALL Torol) utn belpnk a @Ciklus kezdet u hurokba. Itt a kurzort felrakjuk a bal fels o sarokba, ahov kirjuk a szmll aktulis rtkt, majd megnveljk a vltozt. Most jn az, hogy meg kell nzni, nyomtak-e le billenty ut. Erre a nemrg ltott 00h-s INT 16 szolgltats nem j, hiszen az nekill vrakozni, ha nincs lenyomva egyetlen gomb sem. Ehelyett a 01h funkcit hasznljuk fel, ami a ZF-ben jelzi, volt-e billenty u lenyomva: ha ZF = 1, akkor nem, klnben AX tartalma megfelel a 00h-s szolgltats ltal visszaadottnak (teht ALben az ASCII kd, AH-ban a scan kd). gy ha ZF = 1, akkor visszamegynk a ciklus elejre. Msklnben megnzzk, hogy a szkzt nyomtk-e meg, ennek ASCII kdja 32 (20h), s ha igen, akkor vge a bulinak, a @Vege cmkn t befejezzk a tnykedst. Egybknt a kurzort a kvetkez o (msodik) sorba lltjuk (erre azrt j most az INC DH, mert DX vgig nulla marad a @Ciklus utni sortl kezdve), majd a megszokott INT 21h 02h szm szolgltatssal kirakjuk a lenyomott billenty u ASCII kdjnak megfelel o karaktert, ami AL-ben van. Az utna kvetkez o kt sor (XOR AH,AH // INT 16h) feleslegesnek t unhet, de enlkl a kvetkez o lenyomott karaktert nem fogja rzkelni a program. (Kicsit preczebben: Az INT 16h egy puerb ol olvassa ki a kvetkez o lenyomott gomb kdjait. A 01h-s szolgltats a puer mutatjt nem lltja t, gy a kvetkez o hvs ismt ezt a billenty ut jelezn lenyomottnak, ami nem lenne oks. A 00h hvsa viszont mdostja a mutatt, s ezzel minden rendben lesz.) Dolgunk vgeztvel visszatrnk a ciklusba.

14.3. Munka llomnyokkal


Az llomny-kezels nem tartozik a knny u dolgok kz, de egyszer rdemes vele foglalkozni, sokszor ugyanis egyszer ubben clhoz rhetnk Assemblyben, mint valamelyik magas szint u nyelvben. A feladat nem tl bonyolult: hozzunk ltre egy llomnyt, majd gyeljk a billenty uzetet. Minden bert karaktert rjon ki a program a kperny ore s az llomnyba is folyamatosan s azonnal. Az Esc megnyomsra zrja le az llomnyt s lpjen ki a programbl. Az Esc-hez tartoz karaktert mr nem kell az llomnyba rni. Az llomny nevt a programban konstans mdon troljuk, legyen mondjuk TESZT.OUT. Ha nem sikerlt ltrehozni az llomnyt, akkor rjon ki egy hibazenetet, majd azonnal fejezze be a m ukdst.
Pelda13.ASM:
MODEL SMALL

14.3. MUNKA LLOMNYOKKAL

97

.STACK ADAT FNev Hiba Karakter ADAT KOD SEGMENT DB DB DB DB ENDS

"TESZT.OUT",00h "Hiba a fjl " "ltrehozsakor!$" ?

SEGMENT ASSUME CS:KOD,DS:ADAT

@Start: MOV MOV MOV XOR LEA INT JC MOV MOV @Ciklus: XOR INT CMP JE MOV MOV MOV INT MOV LEA INT JMP @Lezar: MOV INT JMP @Hiba: MOV LEA INT @Vege: MOV INT ENDS END AX,4C00h 21h @Start AH,09h DX,[Hiba] 21h AH,3Eh 21h @Vege AH,AH 16h AL,1Bh @Lezar [Karakter],AL AH,02h DL,AL 21h AH,40h DX,[Karakter] 21h @Ciklus AX,ADAT DS,AX AH,3Ch CX,CX DX,[FNev] 21h @Hiba BX,AX CX,0001h

KOD

Ha llomnyokkal, knyvtrakkal vagy lemezekkel kell dolgoznunk, azt mindenkppen a DOS szolgltatsain keresztl rdemes tenni, hacsak valami egyb indok (pl. a sebessg kriti-

14.3. MUNKA LLOMNYOKKAL

98

kus) nem indokol mst. A DOS az sszes megszokott tevkenysg vgrehajtst lehet ov teszi az INT 21h megszakts szolgltatsain keresztl, amint ezt a 14.2. tblzat mutatja. 14.2. tblzat. llomny- s lemezkezel o DOS-szolgltatsok 39h 3Ah 3Bh 3Ch 3Dh 3Eh 3Fh 40h 41h 42h 43h Knyvtr ltrehozs (MKDIR) Knyvtr trls (RMDIR) Knyvtrvlts (CHDIR) llomny ltrehozs/csonkts (Create) llomny megnyits (Open) llomny lezrs (Close) Olvass megnyitott llomnybl (Read) rs megnyitott llomnyba (Write) Lezrt llomny trlse (Delete/Unlink) Fjlmutat pozcionlsa (Seek) Attribtumok belltsa/olvassa (CHMOD)

Ezeknek az llomnykezel o fggvnyeknek kzs tulajdonsga, hogy az llomnyra a megnyits s/vagy ltrehozs utn nem az llomny nevvel, hanem egy specilis, egyedi azonostszmmal, az .n. le handle-lel hivatkoznak. Ez egy 16 bites rtk. A szabvnyos ki-/bemeneti eszkzk (standard input s output) a 0000h 0004h rtkeken rhet ok el, ezekre is ugyangy rhatunk, ill. olvashatunk rluk, mintha kznsges fjlok lennnek. A 14.3. tblzat mutatja az ilyen eszkzk handle szmt. 14.3. tblzat. Standard I/O eszkzk handle rtke 0 1 2 3 4 Standard input (STDIN) Standard output (STDOUT) Standard hiba (STDERR) Standard soros porti eszkz (STDAUX) Standard nyomtat (STDPRN)

j llomny ltrehozsra a 3Ch szm szolgltats val. Hvsakor CX-ben kell megadni a leend o llomny attribtumait a kvetkez o mdon: az als hrom bit egyes bitjei kapcsolknak felelnek meg, 1 jelenti a csak rhat (Read Only) hozzfrst, 2 a rejtett fjlt (Hidden), 4 pedig a rendszerfjlt (System). Ezek klnbz o kombincija hatrozza meg a vgleges attribtumot. Most neknk egy norml attribtum fjlra van szksgnk, gy CX nulla lesz. DS:DX tartalmazza az llomny nevnek cmt, amely nv egy ASCIIZ sztring, azaz a 00h kd karakterrel kell lezrni. A szolgltats visszatrskor CF-ben jelzi, hogy volt-e hiba. Ha CF = 1, akkor volt, ilyenkor AX tartalmazza a hiba jellegt ler hibakdot, klnben pedig AX-ben a le handle tallhat. Hiba esetn kirjuk a hibazenetet a 09h-s szolgltatssal, majd befejezzk a programot. llomny ltrehozsnl gyelni kell arra, hogy ha az adott nev u llomny mr ltezik, akkor a DOS nem tr vissza hibval, hanem az llomny mrett 0-ra lltja, majd megnyitja azt. Ha a ltrehozs sikerlt, akkor a handle-t trakjuk BX-be, mivel a tovbbi szolgltatsok mr ott fogjk keresni. A billenty uzetr ol val olvassra a mr emltett 00h-s funkcit hasznljuk. Az Esc billenty u a 17 (1Bh) kd karaktert generlja, gy ha ezt kaptuk meg AL-ben, akkor elugrunk a @Lezar cmkre. Megnyitott (ez fontos!) llomny lezrsra a 3Eh szolgltatst kell hasznlni, ami

14.4. GRAFIKUS FUNKCIK HASZNLATA

99

BX-ben vrja a handle-t, visszatrskor pedig CF ill. AX mutatja az esetleges hibt s annak

okt. Ha nem az Esc-et nyomtk le, akkor AL-t berakjuk a Karakter nev u vltozba, majd kiratjuk a kperny ore a mr jl ismert 02h DOS-funkcival. Ezutn a 40h szm szolgltatst vesszk ignybe a fjlba rshoz. A handle-t itt is BX-ben kell kzlni, CX tartalmazza a kirand bjtok szmt (ez most 1 lesz), DS:DX pedig annak a memriaterletnek a cme, ahonnan a kirst krjk. Visszatrskor AX a tnylegesen kirt bjtok szmt mutatja, ill. a hibakdot, ha CF = 1. Ezek utn visszatrnk a @Ciklus cmkre.

14.4. Grakus funkcik hasznlata


Most ismt egy kicsit nehezebb feladatot oldunk meg, de a fradozs meg fogja rni. A program el oszr tvlt a 640 480 felbonts grakus videomdba, majd egy pattog fehr pontot jelent meg. A pont mindegyik falon (a kperny o szlein) rendesen vissza fog pattanni. Billenty u lenyomsra pedig vissza fogja lltani a kperny omdot szvegesre, majd ki fog lpni.
Pelda14.ASM:
MODEL SMALL .STACK KOD SEGMENT ASSUME CS:KOD,DS:NOTHING

@Start: MOV INT XOR MOV MOV MOV XOR @Ciklus: MOV INT ADD JNS NEG ADD @V1: CMP JB NEG ADD @V2: ADD JNS NEG DX,DI @F1 DI CX,640 @V2 SI CX,SI AX,0C00h 10h CX,SI @V1 SI CX,SI AX,0012h 10h CX,CX DX,CX SI,3 DI,2 BH,BH

14.4. GRAFIKUS FUNKCIK HASZNLATA

100

ADD @F1: CMP JB NEG ADD @F2: MOV INT PUSH MOV @Var1: XOR @Var2: LOOP DEC JNZ POP MOV INT JZ XOR INT MOV INT MOV INT ENDS END

DX,DI DX,480 @F2 DI DX,DI AL,0Fh 10h ;Vrakozs . . . CX DX DL,10 CX,CX @Var2 DL @Var1 DX CX ; AH,01h 16h @Ciklus AH,AH 16h AX,0003h 10h AX,4C00h 21h @Start

KOD

Adatszegmensre most nincs szksgnk, gyhogy rgtn a videomd belltsval kezdnk. Az INT 10h 00h-s szolgltatsval llthat be a kperny on hasznlt videomd, az ignyelt md szmt AL-ben kell kzlnnk. Sok szabvnyos videomdnak van el ore rgztett szma, de neknk most csak a 80 25 felbonts sznes szveges (ez a 03h szm md), ill. a 640 480 felbonts grakus (12h a szma) VGA-mdokra lesz szksgnk. A VGA (Video Graphics Array) a videovezrl o tpusra utal, azaz ennl rgebbi tpus (EGA, CGA, HGC stb.) videokrtyval nem tudjuk kiprblni a programot, de ez manapsg mr nem tl nagy akadly. A pattog pont koordintit a DX s CX regiszter trolja majd, DX mutatja a sort, CX pedig az oszlopot. Mindkett o 0 bzis, az orig teht a (0,0). BH a hasznlt kperny olap sorszmt tartalmazza, de ez most lnyegtelen. SI lesz a vzszintes, DI pedig a fgg oleges lpskz, azaz ennyi kpponttal fog arrbb ugrani a pont. A f o ciklusban el oszr trlni kell a pont el oz o kpt, majd ki kell szmolni az j koordintkat, ki kell rakni az j helyre a pontot, vgl ellen orizni kell a billenty uzetet. A pont trlse annyit jelent, hogy a legutbbi (CX,DX) koordintkra fekete sznnel kirakunk egy pontot. Pont rajzolsra a 0Ch szolgltats lesz j. AL-ben a rajzolt pont sznt kell megadni, ehhez tekintsk a 14.4. tblzatot. Ltjuk, hogy a fekete kdja a 00h. BH-ban a mr emltett kperny olap-sorszm van, a kirakand pont koordintit pedig ppen a CX, DX regiszterekben vrja. Miutn trltk a pont el oz o pldnyt, ideje, hogy az j hely koordintit meghatrozzuk.

14.4. GRAFIKUS FUNKCIK HASZNLATA

101

14.4. tblzat. Sznkdok 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh Fekete Kk Zld Cinkk Vrs Bborlila Barna Vilgosszrke Sttszrke Vilgoskk Vilgoszld Vilgoscin Vilgospiros Vilgosbbor Srga Fehr

A vzszintes s fgg oleges koordintkat hasonlan dolgozzuk fel, ezrt csak az egyiket nzzk most meg. Tekintsk mondjuk az abszcissza kiszmtst. El oszr termszetesen a lpskzt (SI) adjuk hozz CX-hez. Ha a kapott rtk negatv, akkor SF be fog llni. Eszerint vgrehajtjuk a szksges korrekcit s rtrnk a @V1 cmkre, vagy pedig rgtn erre a cmkre jvnk. A korrekci abban ll, hogy a lpskz el ojelt megfordtjuk (teht negljuk a lpskzt), majd ezt az j lpskzt ismt hozzadjuk CX-hez. Ha ezen az ellen orzsen tljutottunk, akkor mg meg kell nzni, hogy a kperny o jobb oldaln nem mentnk-e tl. Ha igen (azaz CX > 639), akkor ugyangy jrunk el, mint az el obb, teht negljuk a lpskzt s hozzadjuk CX-hez. DX mdostsa teljesen hasonl mdon trtnik. Most mr kirakhatjuk a pontot j helyre. Mivel fehr pontot szeretnnk, AL-be 0Fh-t rakunk. Az ez utn kvetkez o nhny sor nem tartozik az eredeti clkit uzshez, de a m ukds ellen orzshez elengedhetetlen. A kt pontosvessz ovel kzrefogott sorok csak a ciklus lasstst szolgljk, s nem csinlnak mst, mint 655360-szor vgrehajtjk az res ciklusmagot. Erre a mostani szmtgpek gyorsasga miatt van szksg, klnben a pont nemhogy pattogna, de valsggal szguldana a kperny on. Miutn letelt a ksleltets, a 01h-s INT 16h szolgltats hvsval megnzzk, hogy nyomtake le billenty ut, s ha nem, akkor irny vissza a ciklus elejre. Kilps el ott mg egyszer kiolvassuk a billenty uzetet, majd visszalltjuk a videomdot szvegesre.

15. fejezet

Megszakts-tdenils, hardver-megszaktsok, rezidens program, kapcsolat a perifrikkal, hardver-programozs


Ideje, hogy kicsit mlyebben elmerljnk a megszaktsok vilgban. Nzzk meg el oszr, hogy is hajtja vgre a processzor az INT utastst. A 0000h szegmens els o 1024 bjtjn (a 0000h s a 03FFh oszetek kzti terleten) tallhat a megszakts-vektor tbla. Ez nem ms, mint egy ugrtbla, mivel mindegyik bejegyzse egy 4 bjtos tvoli pointer (azaz szegmens:oszet alak memriacm), nevk megszakts-vektor (interrupt vector). Kicsit utnaszmolva lthatjuk, hogy 256 4 = 1024. Ebben a tblban tallhat teht mind a 256 db. szoftver- (rszben hardver- is) megszakts vgrehajt programjnak kezd ocme. Ezeket a programokat megszakts-kezel onek (interrupt handler) nevezzk. Minden megszaktsnak pontosan egy kezel oprogramja van, de ugyanaz a kezel o tbb megszaktshoz is tartozhat. Ha a programban az INT utasts kdjval tallkozik a processzor (ami 0CDh), akkor kiolvassa az utna lev o bjtot is, ez a krt megszakts szma. Felismerve, hogy megszakts kvetkezik, a verembe berakja sorban a Flags, CS s IP regiszterek aktulis rtkt (CS:IP az INT utastst kvet o utasts cmt tartalmazza), majd az IF s TF ag-eket trli, ezzel biztostva, hogy a megszakts lefolyst nem fogja semmi megakadlyozni. (Szimbolikusan: PUSHF // PUSH CS // PUSH IP) Jellje a krt megszakts szmt N. Ezek utn a processzor betlti a CS:IP regiszterprba a memria 0000h:(N 4) cmn lev o duplaszt, azaz CS-be a 0000h:(N 4 + 2) cmen lev o, mg IP-be a 0000h:(N 4) cmen tallhat sz kerl betltsre (emlkezznk vissza, a processzor little-endian trolsmdot hasznl). Ennek hatsra az N-edik megszakts-vektor ltal mutatott cmen folytatdik a vgrehajts. t hv Ha a kezel o elvgezte dolgt, akkor egy klnleges utasts segtsgvel visszatr az o programhoz. Erre az IRET (Interrupt RETurn) operandus nlkli utasts szolgl. Az IRET kiadsakor a processzor a visszatrsi cmet betlti a CS:IP-be (azaz leemeli el oszr az IPt, majd CS-t a veremb ol), a Flags regiszter tartalmt szintn visszalltja a veremb ol, majd a vgrehajtst az j cmen folytatja. (Szimbolikusan: POP IP // POP CS // POPF) Nzznk egy pldt! Tegyk fel, hogy az INT 21h utastst adjuk ki, s legyen Flags =

15.1. SZOFTVER-MEGSZAKTS TIRNYTSA

103

0F283h (azaz IF = SF = CF = 1, a tbbi ag mind 0), CS = 7000h, IP = 1000h, SS lnyegtelen, SP = 0400h. Az INT 21h megszakts vektora a 0000h:0084h cmen tallhat, ennek rtke most legyen mondjuk 2000h:3000h. Az INT 21h utasts vgrehajtsnak hatsra a kvetkez ok trtnnek: CS:IP rtke 2000h:3000h lesz, Flags-ben trl odik az IF ag, gy az a 0F083h rtket fogja tartalmazni, valamint a verem a kvetkez o kpet fogja mutatni:
SS:0400h : ?? SS:03FEh : 0F283h (Flags) SS:03FCh : 7000h (CS) SS:03FAh : 1000h (IP) SS:03F8h : ??

SP

Mivel tudjuk, hogy hol tallhatk az egyes megszaktsok belpsi pontjai, megtehetjk, hogy brmelyik vektort kedvnkre trjuk. Ezzel a lehet osggel rengeteg program l is, elg, ha a DOS-t, BIOS-t, vagy mondjuk az egeret kezel o programot (eszkzmeghajtt) emltjk. s mivel a hardver-megszaktsok is bizonyos szoftver-megszaktsokon keresztl lesznek lekezelve, akr ezeket is tirnythatjuk sajt programunkra. Mindkt esetre mutatunk most pldkat.

15.1. Szoftver-megszakts tirnytsa


Els o programunk a kvetkez ot fogja tenni: indtskor t fogja venni az INT 21h kezelst. Az j kezel o a rgit fogja meghvni, de ha az ignyelt funkci a 09h-s lesz (az a bizonyos sztringkir rutin), akkor DS:DX-et egy el ore rgztett szveg cmre fogja belltani, s arra fogja meghvni az eredeti szvegkir funkcit. A program billenty u lenyomsa utn vissza fogja lltani az eredeti megszakts-kezel ot, majd be fog fejez odni.
Pelda15.ASM:
MODEL SMALL .STACK ADAT Helyes Teszt ADAT KOD SEGMENT DB "Ha ezt ltod, akkor" DB " mukdik a dolog.$" DB "Ez nem fog megjelenni!$" ENDS SEGMENT ASSUME CS:KOD,DS:ADAT DW PROC PUSHF CMP JNE POPF PUSH PUSH ?,?

RegiCim UjKezelo

AH,09h @Nem09h DS DX

15.1. SZOFTVER-MEGSZAKTS TIRNYTSA

104

MOV MOV LEA PUSHF CALL POP POP IRET @Nem09h: POPF JMP ENDP

DX,ADAT DS,DX DX,[Helyes] DWORD PTR CS:[RegiCim] DX DS

DWORD PTR CS:[RegiCim]

UjKezelo @Start:

KOD

MOV MOV XOR MOV CLI LEA XCHG MOV MOV XCHG MOV STI MOV LEA INT MOV MOV INT MOV INT XOR INT CLI MOV MOV MOV MOV STI MOV INT ENDS END

AX,ADAT DS,AX AX,AX ES,AX AX,[UjKezelo] AX,ES:[21h*4] CS:[RegiCim],AX AX,CS AX,ES:[21h*4+2] CS:[RegiCim+2],AX AH,09h DX,[Teszt] 21h AH,02h DL,0Dh 21h DL,0Ah 21h AH,AH 16h AX,CS:[RegiCim] ES:[21h*4],AX AX,CS:[RegiCim+2] ES:[21h*4+2],AX AX,4C00h 21h @Start

Az els o szembet un o dolog az, hogy a kdszegmensben van denilva a RegiCim nev u vltoz, ami majd az eredeti INT 21h kiszolgl cmt fogja trolni. Ennek magyarzata a megszakts-kezel o rutin m ukdsben rejlik. Azt mr emltettk, hogy minden eljrs elejn rdemes s illend o elmenteni a hasznlt regisztereket a verembe, hogy azokat az eljrs vgn gond nlkl visszallthassuk eredeti

15.1. SZOFTVER-MEGSZAKTS TIRNYTSA

105

rtkkre. Ez a szably a megszakts-kezel o rutinokra ktelez ore vltozik. A regiszterekbe a szegmensregisztereket s a Flags regisztert is bele kell rteni. Ismtlsknt, az operandus nlkli PUSHF utasts a verembe berakja a Flags regisztert, mg a POPF a verem tetejn lev o szt a Flags-be tlti be. A sajt kezel o rutinunk m ukdse kt gra fog szakadni aszerint, hogy AH egyenl o-e 09h-val avagy nem. A felttel tesztelst a hagyomnyos CMP-JNE prossal oldjuk meg, de mivel ez az utasts megvltoztat(hat) nhny ag-et, ezrt a tesztels el ott PUSHF ll, valamint mindkt g a POPF-fel indul. Ez garantlja, hogy az sszes ag rintetlenl marad. Erre krdezhetn va rizzk meg a ag-ek rtkt, ha a Flags gyis el van mentve a veremben. Nos, laki, hogy mirt o mr lttuk, hogy nhny szolgltats pl. a CF-ben jelzi, hogy volt-e hiba. Ezek a szolgltatsok visszatrs sorn a veremben lev o Flags regiszter-pldnyt egyszer uen eldobjk (ks obb ltni fogjuk, hogyan), gy mdostsunk a hv programra is visszahatna, ami kellemetlen lehetne. Ha AH 09h, akkor a @Nem09h talnyos nev u cmkn folytatdik a megszakts kiszolglsa. Azt mondtuk, hogy minden egyb esetben a rgi funkcit fogjuk vgrehajtatni. Ennek megfelel oen cselekszik a programban szerepl o JMP utasts. Ezt a mnemonikot mr ismerjk s hasznltuk is. Itt viszont kt jdonsgot is lthatunk: az els o, hogy az operandus nem egy eljrs neve vagy cmkje mint eddig, hanem egy memriahivatkozs (szegmensprexszel egytt). Az ugrs eme formjt kzvetett avagy indirekt ugrsnak (indirect jump) nevezzk, mg a rgebbi alakot kzvetlen vagy direkt ugrsnak (direct jump). Az elnevezs arra utal, hogy a cl cmt nem az operandus, hanem az operandus ltal mutatott memriacmen lev o vltozban lev o pointer hatrozza meg. Magyarn: a JMP-t gy hajtja vgre a processzor, hogy kiszmtja az operandus (esetnkben a CS:RegiCim vltoz) tnyleges cmt, majd az azon a cmen lev o pointert tlti be a megfelel o regiszterekbe (IP-be vagy a CS:IP prba). A msik jdonsgot a DWORD PTR kpviseli, ennek hatsra az operandus tpusa most DWORD lesz, ami duplaszt jelent ugyebr. Ha helyette WORD PTR llna, akkor a JMP a szoksos szegmensen belli avagy kzeli ugrst (intrasegment vagy near jump) tenn meg, azaz csak IP-t vltoztatn meg. Neknk viszont CS:IP-t kell j rtkekkel feltltennk, s ez mr szegmenskzi avagy tvoli ugrst jelent (intersegment vagy far jump). A DWORD helyett llhatna mg a FAR is, az ugyancsak tvoli pointert rna el o. Az utasts most teht CS-be a CS:(RegiCim + 2) cmen lev o, mg IP-be a CS:RegiCim cmen lev o szt tlti be, majd onnan folytatja a vgrehajtst. A szemflesebbek rgtn keresni kezdik az emltett IRET-et. Erre most neknk nincs szksgnk, hiszen SP a rgi (hvskori) llapotban van, a Flags is rintetlen, s az eredeti kiszolglbl val visszatrs utn nem akarunk mr semmit sem csinlni. Ezrt a legegyszer ubb mdszert vlasztjuk: a felttlen vezrlstadst a rgi rutinra. Ha az a rutin befejezte tnykedst, a veremben az eredeti Flags, CS s IP rtkeket fogja tallni, s gy kzvetlenl a hv programba (nem az UjKezelo eljrsba) fog visszatrni. Ha AH = 09h, akkor el kell vgeznnk DS:DX mdostst tervnknek megfelel oen. Mivel nem szp dolog, ha a vltozs visszahat a hvra, mindkt regisztert elmentjk a verembe. Ez a m uvelet azonban meggtol bennnket abban, hogy a msik esethez hasonlan rugorjunk a rgi kezel o cmre. Ha ugyanis a JMP DWORD PTR CS:[RegiCim] utastst alkalmaznnk itt is, akkor a hv programba visszatrs nem igazn sikerlne, mondhatni cs odt mondana. Hogy mirt? A kulcs a verem. A legutols kt veremm uvelettel a verem tetejn a DS s DX regiszterek hvskori rtke lesz, amit a rgi kezel orutin a CS:IP regiszterekbe fog betlteni, s ez valszn uleg katasztroflis lesz (nem beszlve arrl, hogy SP is meg fog vltozni a hvskori helyzethez kpest). Ezrt most ugrs helyett hvst kell alkalmaznunk. Ez a hvs is kicsit ms, mint az eddig megismert. A CALL utasts ilyen alakjt a fenti pldhoz hasonlan tvoli indirekt eljrshvsnak nevezzk. (A CALL-nak is ltezik kzeli s tvoli alakja, s mindkett ob ol van direkt s indirekt vltozat is.) A CALL hatsra CS s IP bekerl a verembe, a Flags

15.1. SZOFTVER-MEGSZAKTS TIRNYTSA

106

viszont nem, mikzben a rgi kiszolglrutin arra szmt, hogy az SS:(SP + 4) cmen (ez nem szablyos cmzsmd!) a Flags tkrkpe van. Ezrt a CALL el ott mg kiadunk egy PUSHF-et. Aki kicsit jobban elgondolkodik, annak felt unhet, hogy ez az utastspros tulajdonkppen egy INT utastst szimull. gy ha a rgi kiszolgl vgez, akkor visszatr a sajt kezel onkbe, ahol mi kitakartjuk a veremb ol a DS s DX rtkeit, majd visszatrnk a hv programba. Ezt most IRET-tel tesszk meg annak ellenre, hogy emltettk, nmelyik szolgltats esetleg valamelyik ag-ben adhatna vissza eredmnyt. Mi most viszont csak a 09h szm szolgltats m ukdsbe avatkozunk be, ami nem mdostja egyik ag-et sem. Ha egszen korrekt megoldst akarunk, akkor az IRET utastst a RETF 0002h utastssal kell helyettesteni. A RETF (Far RETurn) az eddig hasznlt RET utaststl abban tr el, hogy visszatrskor nemcsak IP-t, de CS-t is visszalltja a veremb ol (teht m ukdse szimbolikusan POP IP // POP CS). Az opcionlis sz mret u kzvetlen operandus azt az rtket jelli, amit azutn (t.i. IP s CS POP-olsa utn) SP-hez hozz kell adnia. A visszatrs eme formja annyiban tr el az IRET-t ol, hogy a Flags eredeti rtkt nem lltja vissza a veremb ol, a megadott 0002h rtk hatsra viszont SP-t gy mdostja, mintha egy POPF-et is vgrehajtottunk volna. Az eredmny: a hvhoz gond nlkl visszatrhetnk a megszaktsbl gy, hogy esetleg valamelyik ag eredmnyt tartalmaz. Nem vlaszoltuk mg meg, hogy mirt a kdszegmensben deniltuk a RegiCim vltozt. A vlasz sejthet o: ha az adatszegmensben lenne, akkor annak elrshez el oszr be kellene lltanunk DS-t. Ez viszont ellentmond annak a kvetelmnynek, hogy DS rtkt nem (sem) szabad megvltoztatnunk abban az esetben, ha AH 09h. Ezt csak valamilyen csellel tudnnk biztostani, pl. gy:
PUSH MOV MOV PUSH PUSH POP RETF DS DX DX,ADAT DS,DX WORD PTR DS:[RegiCim+2] WORD PTR DS:[RegiCim] DX DS

Hangslyozzuk, ezt csak akkor kellene gy csinlni, ha az ADAT nev u szegmensben deniltuk volna a RegiCim vltozt. Mivel azonban a kdszegmensbe raktuk a dencit, a kezel o rutin kzvetlenl el tudja rni a vltozt. (Ehhez azrt az is kell, hogy az INT 21h kiadsa utn a sajt kezel o rutinunk CS szegmense megegyezzen a RegiCim szegmensvel, de ez most fennll.) ES-t eddig mg nem sokszor hasznltuk, most viszont kapra jn a megszakts-vektor tblzat szegmensnek trolsnl. Miel ott nekifognnk trni az INT 21h vektort, a CLI utastssal letiltjuk a hardver-megszaktsokat (IF = 0 lesz). Erre azrt van szksg, mert ha az trs kzepn bejnne egy megszakts, akkor azt a processzor minden tovbbi nlkl kiszolgln. Ha annak kezel ojben szerepelne egy INT 21h utasts, akkor a rossz belpsi cm miatt nem a megfelel o rutin hvdna meg, s ez valszn uleg lomba klden a gpet. A vektor mdostsa utn ismt engedlyezzk a bejv o megszaktsokat az IF 1-be lltsval, amit az STI utasts vgez el. A vektor mdostsnl az XCHG egy csapsra megoldja mind a rgi rtk kiolvasst, mind az j rtk berst. Miutn sikeresen magunkra irnytottuk ezt a megszaktst, rgtn ki is prbljuk. A helyes m ukds abban ll, hogy nem a Teszt cmkj u szveg fog megjelenni, hanem a Helyes. Annak ellen orzsre, hogy a tbbi szolgltatst nem bntottuk, a 02h funkcival egy j sor karakterprt

(TIMER) PROGRAMOZSA 15.2. AZ IDOZT O

107

runk ki. Vgl gombnyoms utn visszalltjuk az eredeti kezel ot, s kilpnk a programbl.

15.2. Az id ozt o (timer) programozsa


A kvetkez o program mr a hardver-programozs trgykrbe tartozik. A feladat az, hogy rjunk egy olyan eljrst, ami ezredmsodperc (millisecundum) pontossggal kpes meghatrozott ideig vrakozni. Ezzel pldul stoppert is megvalsthatunk. Ez a rsz kicsit magasabb szint u a szoksosnl, gy ha valaki esetleg nem rten, akkor nyugodtan ugorja t. :)
Pelda16.ASM:
MODEL SMALL .STACK KOD SEGMENT ASSUME CS:KOD,DS:NOTHING DW DW DW DW PROC PUSH INC MOV ADD JC MOV OUT POP IRET POP JMP ENDP ? ? ? ?,?

Orajel Oszto MSec RegiCim UjKezelo

AX CS:[MSec] AX,CS:[Oszto] CS:[Orajel],AX @Regi AL,20h 20h,AL AX

@Regi: AX DWORD PTR CS:[RegiCim]

UjKezelo @Start:

XOR MOV CLI LEA XCHG MOV MOV XCHG MOV MOV MOV

AX,AX DS,AX AX,[UjKezelo] AX,DS:[08h*4] CS:[RegiCim],AX AX,CS AX,DS:[08h*4+2] CS:[RegiCim+2],AX DX,0012h AX,34DCh

(TIMER) PROGRAMOZSA 15.2. AZ IDOZT O

108
BX,1000 BX CS:[Oszto],AX CS:[Orajel],0000h BL,AL AL,36h 43h,AL $+2 AL,BL DX,0040h DX,AL $+2 AL,AH DX,AL $+2 AH,02h DL,1 CX,9 BX,1000 21h DL CS:[MSec],0000h CS:[MSec],BX @Var @Ciklus DL,0Dh 21h DL,0Ah 21h AX,CS:[RegiCim] DS:[08h*4],AX AX,CS:[RegiCim+2] DS:[08h*4+2],AX AL,36h 43h,AL $+2 AL,AL 40h,AL $+2 40h,AL $+2 AX,4C00h 21h @Start

MOV DIV MOV MOV MOV MOV OUT JMP MOV MOV OUT JMP MOV OUT JMP STI MOV MOV MOV MOV @Ciklus: INT INC MOV @Var: CMP JB LOOP MOV INT MOV INT CLI MOV MOV MOV MOV MOV OUT JMP XOR OUT JMP OUT JMP STI MOV INT ENDS END

KOD

Adatszegmensre nem lesz szksgnk, a vltozkat a knnyebb elrhet osg miatt a kd-

(TIMER) PROGRAMOZSA 15.2. AZ IDOZT O

109

szegmensben deniljuk. A PC hardvernek ttekintsekor mr megemltettk az id ozt ot (timer). Ez az egysg hrom fggetlen szmllval (counter) rendelkezik (szemlletesen hrom stopperrel), s mindegyik egy id ozt o-csatornhoz tartozik. Ebb ol egyik a mr szintn emltett memria-frisstshez kell, egy pedig a bels o hangszrra van rktve. A harmadik felel os a bels o rendszerra karbantartsrt, valamint a oppy meghajt motorjnak kikapcsolsrt. Br els ore nem ltszik, a megoldst ez utbbi fogja jelenteni. Ha ez a szmll lejr, az id ozt o egy megszaktst kr, ez a megszakts-vezrl o IRQ0-s vonaln keresztl valsul meg. Vgl a hardver-megszaktst a processzor rzkeli, s ha lehet, kiszolglja. Nos, ha az eredeti kiszolglt mi lecserljk a sajt rutinunkra, ami a specilis feladatok elvgzse utn meghvja a rgi kiszolglt, akkor nyert gynk van. Az id ozt o egy kvarckristlyon keresztl lland frekvencival kapja az ramimpulzusokat. Ez a frekvencia az 12 34DCh Hz (1193180 Hz). Az id ozt o mindhrom szmlljhoz tartozik egy 16 bites osztrtk. A dolog gy m ukdik, hogy az adott szmll msodpercenknt 12 34DCh/Oszt-szor jr le. A rendszerrhoz tartoz szmll (ez a 0-s csatorna) osztja 65536, mg a memria-frisstsrt felel os (ez az 1-es csatorna) szmll 18 alapllapotban. Ha elvgezzk az osztsokat, azt ltjuk, hogy a memrit msodpercenknt kb. 66288-szor frisstik, mg a rendszerrt msodpercenknt kb. 18.2-szer lltja t a kiszolglrutin. Tervnket gy fogjuk megvalstani, hogy az id ozt o 0-s csatornjnak osztjt olyan rtkre lltjuk be, hogy msodpercenknt 1000-szer generljon megszaktst. A megszaktst az IRQ0 vonalrl a megszakts-vezrl o tirnytja az INT 08h szoftver-megszaktsra, de ett ol ez mg hardver-megszakts marad, aminek fontossgt ks obb ltjuk majd. Ha IF = 1, a processzor rzkeli a megszaktst, majd meghvja az INT 08h kezel ojt, ami elvgzi a teend oket. Ezt a kezel ot cserljk le egy sajt rutinra, ennek neve UjKezelo lesz. Nzzk meg el oszr a vltozk szerept. Az eredeti kezel o cmt ismt a RegiCim trolja. Oszto tartalmazza a szmllhoz tartoz kiszmolt osztrtket. MSec tartalma minden megszakts-krskor eggyel fog n oni, ezt hasznljuk fel majd a pontos vrakozs megvalstsra. Az Orajel vltoz szerepnek megrtshez szksges egy dolgot tisztzni. Mikor is kell meghvni a rgi kiszolglt? Ha minden megszakts esetn meghvnnk, akkor az ra az eredetinl sokkal gyorsabban jrna, s ezt nem szeretnnk. Pontosan gy kell m ukdnie, mint el otte. Ehhez neknk is zemeltetnnk kell egy szmllt. Ha ez lejr, akkor kell meghvni a rgi kiszolglt. Szmll helyett most osztt fogunk bevezetni, ennek mikntje mindjrt kiderl. Az UjKezelo eljrsban csak az AX regisztert hasznljuk fel, ezt teht rendesen elmentjk a verembe. Ezt kvet oen megnveljk eggyel az MSec rtkt clunk elrse rdekben. Most kvetkezik annak eldntse, meg kell-e hvni a rgi kiszolglt. Ehhez az osztrtket (Oszto tartalmt) hozzadjuk az Orajel vltozhoz. Ha tvitel keletkezik, az azt jelenti, hogy Orajel rtke nagyobb vagy egyenl o lett volna 65536-nl. Mivel azt mondtuk, hogy Orajel egy oszt szerept jtssza, innen kvetkezik, hogy a rgi kezel orutint pontosan akkor kell meghvni, amikor CF = 1 lesz. Gyakorlatilag az id ozt o m ukdst utnozzuk: ha az osztrtkek sszege elri vagy meghaladja a 65536-ot, s ekkor hvjuk meg a rgi rutint, ez pontosan azt csinlja, mint amikor az id ozt o az eredeti 65536-os oszt szerinti id okznknt vlt ki megszaktst. Nmi szmolssal s gondolkozssal ezt magunk is belthatjuk. Ha CF = 1, akkor szpen rugrunk a rgi kiszolgl cmre, s az majd dolga vgeztvel visszatr a megszaktsbl. Ha viszont CF = 0, akkor neknk magunknak kell kiadni a parancsot a visszatrshez. El otte azonban meg kell tenni egy fontos dolgot, s itt lesz szerepe annak a tnynek, hogy ez a rutin mgiscsak hardver-megszakts miatt hajtdik vgre. Dolgunk vgeztvel jelezni kell a megszakts-vezrl onek, hogy minden ok, lekezeltk az adott hardver-megszaktst. Ha ezt

(TIMER) PROGRAMOZSA 15.2. AZ IDOZT O

110

a nyugtzsnak (acknowledgement) nevezett m uveletet elfelejtjk megtenni, akkor az esetlegesen berkez o tbbi megszaktst nem fogja tovbbtani a processzor fel a vezrl o. A megszakts-vezrl ot a 0020h s 0021h szm portokon keresztl rhetjk el (AT-k esetben a msodik vezrl o a 00A0h s 00A1h portokon cscsl). Az OUT (OUTput to port) utasts a cloperandus ltal megadott portra kirja a forrsoperandus tartalmt. A port szmt vagy 8 bites kzvetlen adatknt (0000h 00FFh portok esetn), vagy a DX regiszterben kell kzlni, mg a forrs csak AL vagy AX lehet. Ha a forrs 16 bites, akkor az als bjt a megadott portra, mg a fels o bjt a megadott utn kvetkez o portra lesz kirva. A nyugtzs csak annyit jelent, hogy a 0020h szm portra ki kell rni a 20h rtket (knny u megjegyezni:). Ezutn IRET-tel befejezzk tnykedsnket. Megjegyezzk, hogy az OUT prja az IN (INput from port) utasts. M ukdse: a forrsoperandus ltal megadott portrl beolvasott adatot a cloperandusba rja. A portszmot szintn vagy bjt mret u kzvetlen adatknt, vagy a DX regiszterrel kell megadni, clknt pedig ismt AL-t vagy AX-et rhatunk. Ha a cl 16 bites, az als bjt a megadott portrl, a fels o bjt pedig az utna kvetkez o, eggyel nagyobb szmrl lesz beolvasva. Mivel nincs adatszegmens, most DS-t hasznljuk fel a megszakts-vektorok szegmensnek trolsra. A megszaktsok letiltsa utn a mr szokott mdon eltroljuk a rgi INT 08h kezel o cmt, ill. belltjuk a sajt eljrsunkat. Ezt kvet oen kiszmoljuk az Oszto rtkt. Mint emltettk, az id ozt o alapfrekvencija 12 34DCh, s minden ezredmsodpercben akarunk majd megszaktst, gy az el oz o rtket 1000-rel elosztva a hnyados a kvnt rtket fogja adni. Aki nem rten, ez mirt van gy, annak egy kis emlkeztet o: 12 34DCh/oszt = frekvencia Ezt az egyenletet trendezve mr kvetkezik a mdszer helyessge. Az Orajel vltozt kinullzzuk a megfelel o m ukdshez. Ezutn az osztt mg az id ozt ovel is kzlni kell, a hrom OUT utasts erre szolgl. Ezekkel most nem foglalkozunk, akit rdekel, az nyugodtan nzzen utna valamelyik emltett adatbzisban. A JMP utastsok csak arra szolglnak, hogy kicsit ksleltessk a tovbbi bjtok kikldst a portokra, a perifrik ugyanis lassabban reaglnak, mint a processzor. Meggyelhetjk a JMP operandusban a cl megjellsekor a $ szimblum hasznlatt. Emlkeztet ol: a $ szimblum az adott szegmensben az aktulis sor oszetjt tartalmazza. Ez a sor egyb rdekessget is tartogat, a hasznlt ugrs ugyanis sem nem kzeli (near), sem nem tvoli (far). Ezt az ugrsfajtt rvid ugrsnak (short jump) nevezzk, s ismertet ojele, hogy a relatv cm a feltteles ugrsokhoz s a LOOP-hoz hasonlan csak 8 bites. A 2-es szm onnan jn, hogy a rvid ugrs utastshossza 2 bjt (egy bjt a m uveleti kd, egy pedig a relatv cm). A rvid ugrst mg ktflekppen is kiknyszerthetjk: az egyik, hogy a cloperandus el odarjuk a SHORT opertort, a msik, hogy JMP helyett a JMPS (JuMP Short) mnemonikot hasznljuk. A megszakts m ukdsnek tesztelsre egy rvid ciklus szolgl, ami annyit tesz, hogy kirja a decimlis szmjegyeket 1-t ol 9-ig, mindegyik jegy utn pontosan 1 msodpercet vrakozva. A vrakozst az MSec vltoz gyelsvel tesszk annak nullzsa utn. MSec-et a megszaktsok bekvetkeztekor nveli egyesvel az UjKezelo eljrs, ez pedig ezredmsodpercenknt trtnik meg. Ha teht MSec = 1000, akkor a nullzs ta pontosan egy msodperc telt el. A ciklus lejrta utn egy j sor karakterprt runk mg ki, majd vgezetl visszalltjuk az eredeti INT 08h kezel ot, valamint az id ozt o eredeti osztjt. Ezutn befejezzk a program m ukdst. Az id ozt ovel kapcsolatban mg annyit, hogy a 0000h rtk jelli a 65536-os osztt. A program trtnethez hozztartozik, hogy az els o verziban az UjKezelo eljrs legutols sorban a DWORD helyn FAR llt. A TASM 4.0-s verzija azonban furcsa mdon nem jl

15.3. REZIDENS PROGRAM KSZTSE

111

fordtja le ezt az utastst ebben a formban, csak akkor, ha DWORD-t runk tpusknt. Erre ks obbi programjainkban nem rt odagyelni, ugyanis lehet, hogy a forrs szemantikailag j, csak az assembler hibja (tvedse) miatt nem megfelel o kd szerepel a futtathat llomnyban. Err ol ltalban a debugger segtsgvel gy oz odnk meg.

15.3. Rezidens program (TSR) ksztse, a szveges kperny o kzvetlen elrse


Rezidens programon (resident program) egy olyan alkalmazst rtnk, amihez tartoz memriaterletet vagy annak egy rszt a DOS nem szabadtja fel a program befejez odsekor. A program kdja ilyenkor a memriban bentmarad. Az inaktv programot sokszor egy megszakts vagy valamilyen hardveresemny leszti fel. A programok msik gyakran hasznlt elnevezse a TSR (Terminate and Stay Resident). Nhny jl ismert segdprogram is valjban egy TSR, mint pl. a DOS CD-meghajtkat kezel o interfsze (MSCDEX.EXE), egrmeghajtk (MOUSE.COM, GMOUSE.COM stb.), klnfle kperny olopk, commanderek (Norton Commander, Volkov Commander, DOS Navigator) stb. TSR-t .COM programknt egyszer ubb rni, gy most mi is ezt tesszk. A feladat az, hogy a program rezidensen maradjon a memriban az indts utn, s a kperny o bal fels o sarkban lev o karakter kdjt s annak szninformciit folyamatosan nvelje eggyel. (Csak szveges mdban!) Nem tl hasznos, de legalbb ltvnyos.
Pelda17.ASM:
MODEL TINY KOD SEGMENT ASSUME CS:KOD,DS:KOD ORG 0100h

@Start1: JMP RegiCim UjKezelo DW PROC PUSHF CALL PUSH MOV MOV XOR INC INC INC POP IRET ENDP @Start ?,?

DWORD PTR CS:[RegiCim] DI ES DI,0B800h ES,DI DI,DI BYTE PTR ES:[DI] DI BYTE PTR ES:[DI] ES DI

UjKezelo @Start:

15.3. REZIDENS PROGRAM KSZTSE

112
AX,AX ES,AX SI,ES:[1Ch*4] CS:[RegiCim],SI CS:[RegiCim+2],DS AX,[UjKezelo] ES:[1Ch*4],AX ES:[1Ch*4+2],CS DX,@Start 27h @Start1

KOD

XOR MOV CLI LDS MOV MOV LEA MOV MOV STI LEA INT ENDS END

A feladat megoldshoz egy olyan megszaktsra kell rakaszkodni, ami elg sokszor hvdik meg. Ez lehetne az eddig megismertek kzl INT 08h, INT 16h, esetleg az INT 21h. Az id ozt o ltal kivltott INT 08h eredeti kezel oje dolga vgeztvel egy INT 1Ch utastst ad ki, aminek a kezel oje alapesetben csak egy IRET-b ol ll. Ezt a megszaktst brki szabadon tirnythatja sajt magra, feltve, hogy meghvja az eredeti (pontosabban a megszakts-vektor szerinti) kezel ot, illetve hogy a megszaktsban nem tlt el tl sok id ot. Az id okorlt betartsa azrt fontos, mert az INT 08h ugyebr egy hardver-megszakts, s ha a megszakts-vezrl ot csak az INT 1Ch lefutsa utn nyugtzza a kezel o, akkor az eltelt id otartam hossza kritikuss vlhat. Adatszegmensnk most sem lesz, az egy szem RegiCim vltozt a kdszegmens elejn deniljuk, s mellesleg a rezidens rszben foglal helyet. Az UjKezelo eljrs elejn hvjuk meg az el oz o kezel ot, s ez utn vgezzk el a kperny on a mdostsokat. A kperny ore nem csak a DOS (INT 21h) vagy a video BIOS (INT 10h) segtsgvel lehet rni. A megjelentend o kperny otartalmat a videovezrl o krtyn lev o videomemriban troljk el, majd annak tartalmt kiolvasva kszl el a vgleges kp a monitoron. Ennek a memrinak egy rsze a zikai memria egy rgztett cmtartomnyban elrhet o. Magyarra fordtva ez azt jelenti, hogy grakus mdok esetn a 000A 0000h, mg szveges mdoknl a 000B 0000h (fekete-fehr) vagy a 000B 8000h (sznes) zikai cmeken kezd od o terlet a videokrtyn lev o memria aktulis llapott tkrzi, s oda berva valamit az igazi videomemria is mdosulni fog. Grakus mdoknl a 0A000h szegmens teljes terjedelmben felhasznlhat, mg szveges md esetn a 0B000h s 0B800h szegmenseknek csak az els o fele (teht a 0000h 7FFFh oszetek kztti terlet). Bennnket most csak a szveges mdok rdekelnek, azokon bell is a sznes kperny ok esetn hasznlatosak. Fekete-fehr (monokrm) kpet el ollt videokrtya esetben a 0B000h szegmenset kell hasznlni, egyb vltoztatsra nincs szksg. A videomemriban a kperny on lthat karakterek sorfolytonosan helyezkednek el, s minden karaktert egy jabb bjt kvet, ami a szninformcit (attribtumot) tartalmazza. Ez pontosan azt jelenti, hogy a karakterek a pros, mg az attribtum-bjtok a pratlan oszetcmeken tallhatk. Az attribtumot a kvetkez o mdon kdoljk: a 0 3 bitek adjk az el otrsznt, a 4 6 bitek a htteret, mg a 7-es bit villogst r el o, de gy is bellthat a videokrtya, hogy a httrszn 4. bitjt jelentse. A sznkdok megegyeznek a mr korbban (14.4. tblzat) lertakkal. Az UjKezelo rutinhoz visszatrve, a bal fels o sarokban lev o karakter a 0B800h:0000h cmen helyezkedik el, amit az attribtum kvet. Miutn mindkt bjtot kln-kln inkrementltuk,

15.3. REZIDENS PROGRAM KSZTSE

113

IRET-tel visszatrnk a hvhoz.

A f oprogram szokatlanul rvidre sikerlt, hiszen nincs sok feladata. Mindssze a rgi megszakts-vektort menti el, majd belltja az jat. Az egyetlen jdonsgot az LDS (Load full pointer into DS and a general purpose register) utasts kpviseli, ami a DS:cloperandus regiszterprba a forrsoperandus ltal mutatott memriaterleten lev o tvoli mutatt (azaz szegmenst s oszetet) tlti be. Ez a mostani pldban azt jelenti, hogy SI-be az ES:(1Ch 4), mg DS-be az ES:(1Ch 4 + 2) cmeken lev o szavakat tlti be. Hasonl m uveletet vgez az LES utasts, ami DS helyett ES-t hasznlja. A cloperandus csak egy 16 bites ltalnos cl regiszter, a forrs pedig csak memriahivatkozs lehet mindkt utastsnl. Ezek utn a f oprogram be is fejezi m ukdst, de nem a hagyomnyos mdon. Az INT 27h egy olyan DOS-megszakts, ami a program m ukdst gy fejezi be, hogy annak egy rsze a memriban marad (azaz TSR-r vlik). A rezidens rsz a CS:DX cmig tart, kezdete pedig a PSP szegmense. A PSP-re s a .COM programok szerkezetre a 13. fejezet vilgt r. Mi most csak a RegiCim vltozt s az UjKezelo eljrst hagyjuk a memriban (meg a PSP-t, de ez most nem lnyeges). Az INT 27h-val legfeljebb 64 Kbjtnyi terlet tehet o rezidenss, s kilpskor nem adhatunk vissza hibakdot (exit code), amit az INT 21h 4Ch funkcijnl AL-ben kzlhettnk. Ezeket a knyelmetlensgeket kszbli ki az INT 21h 31h szm szolgltatsa. Ennek AL-ben megadhatjuk a szoksos visszatrsi hibakdot, DX-ben pedig a rezidenss teend o terlet mrett kell megadnunk paragrafusokban (azaz 16 bjtos egysgekben), a PSP szegmenst ol szmtva. Megszakts-vektorok belltsra s olvassra a DOS is knl lehet osget. Az INT 21h 25h szm szolgltatsa az AL-ben megadott szm megszakts vektort a DS:DX ltal lert cmre lltja be, mg a 35h szolgltats az AL szm megszakts-vektor rtkt ES:BX-ben adja vissza.

16. fejezet

Kivtelek
A kivtel (exception) egy olyan megszakts, amit a processzor vlt ki, ha egy olyan hibt szlel, ami lehetetlenn teszi a kvetkez o utasts vgrehajtst, vagy egy olyan esemny trtnt, amir ol a programoknak s a felhasznlnak is rteslnik kell. Minden kivtelt egy decimlis sorszmmal s egy nvvel azonostanak, ezenkvl minden kivtelhez tartozik egy kett oskeresztb ol (#) s kt bet ub ol ll rvidts, amit szintn mnemoniknak hvnak (ez viszont nem egy utastsra utal). A 8086-os mikroprocesszor sszesen 4 fle kivtelt kpes generlni. A kivtel kivltshoz szksges felttelek teljeslse esetn a processzor a verembe berakja a Flags, CS s IP regiszterek tartalmt (szimbolikusan PUSHF // PUSH CS // PUSH IP), majd trli az IF s TF ageket. Ezutn sor kerl a kivtelt lekezel o programrsz (exception handler) vgrehajtsra. Az Intel az INT 00h INT 1Fh szoftver-megszaktsokat a kivtel-kezel o programok szmra tartja fenn. Egy adott N sorszm kivtel esetn az INT N megszakts kezel oje lesz vgrehajtva. A teend ok elvgzse utn a kezel o IRET utastssal visszatrhet abba a programba, amely a kivtelt okozta. Br a ks obbi processzorokon megjelentek olyan, nagyon slyos rendszerhibt jelz o kivtelek, amik utn a kivtelt okoz program mr nem indthat jra (vagy nem folytathat), a 8086-os processzoron mindegyik kivtel megfelel o lekezelse utn a hibz program futsa folytathat. A kivtelek 3 tpusba sorolhatk: vannak hibk (fault) s csapdk (trap). (A 80286-os processzoron egy harmadik kategria is megjelent, ezek az .n. abort-ok.) A kt fajta kivtel kztt az a klnbsg, hogy mg a fault-ok bekvetkeztekor a verembe mentett CS:IP rtk a hibz utastsra mutat, addig a trap-ek esetn a hibt kivlt utastst kvet o utasts cmt tartalmazza CS:IP veremben lev o msolata. (Az abort kivtelek esetn a CS:IP-msolat rtke ltalban meghatrozatlan.) Ezenkvl a trap-ek (mint nevk is mutatja) a program hibamentestst, debuggolst tmogatjk, mg a fault s abort tpus kivtelek a kritikus hibkat jelzik, s azonnali cselekvsre szltanak fel. Most pedig lssuk, milyen kivtelek is vannak, s ezek mely felttelek hatsra jnnek ltre (16.1. tblzat)! A 0-s kivtel az osztskor megtrtn o hibk sorn keletkezik. A DIV s az IDIV utastsok vlthatjk ki, s alapvet oen kt oka van: az egyik, hogy nullval prbltunk meg osztani, ez az eset ltalban a hibs algoritmusokban fordul el o. A msik ok viszont gyakoribb: akkor is ezt a kivtelt kapjuk, ha az oszts hnyadosa nem fr el a clban. Pldul ha AX = 0100h, BL = 01h, s kiadjuk a DIV BL / IDIV BL utastsok valamelyikt, akkor a hnyados is 0100h lenne, ez viszont nem fr el AL-ben (hiszen a hnyadost ott kapnnk meg, a maradkot pedig AH-ban).

115 16.1. tblzat. A 8086-os processzoron ltez o kivtelek

Szm 0 1 3 4

Mnemo #DE #DB #BP #OF

Nv Divide Error Debug Breakpoint Overow

Tpus Trap Trap Trap Trap

Kivlt felttelek
DIV s IDIV utastsok INT 01h utasts/TF = 1 INT 3 utasts INTO utasts, ha OF = 1

Ennek eredmnye a 0-s kivtel lesz. Ezt a kivtelt alapesetben a DOS kezeli le, egy hibazenet kirsa utn egyszer uen terminlja az ppen fut programot, majd visszaadja a vezrlst a szl o alkalmazsnak (COMMAND.COM, valamilyen shell program, commander stb.). Megjegyezzk, hogy a 0-s kivtelt a 80286-os processzortl kezd od oen hibaknt (fault) kezelik. Az 1-es kivtel keletkezsnek kt oka lehet: vagy kiadtunk egy INT 01h utastst (kdja 0CDh 01h), vagy bekapcsoltuk a TF ag-et. 3-ast kivtelt az INT 3 utasts tud okozni. Az INT utastsnak erre a megszakts-szmra kt alakja is van: az egyik a megszokott ktbjtos forma (0CDh 03h), a msik pedig csak egy bjtot foglal el (0CCh). A kt kdols nem teljesen azonos m ukdst vlt ki, ez azonban csak a 80386-os vagy annl jabb processzorokon ltez o virtulis-8086 zemmdban nyilvnul meg. 4-es kivtel akkor keletkezik, ha OF = 1, s kiadunk egy INTO utastst. Br nem kivtel, emltst rdemel egy korbban mg be nem mutatott megszakts. Az NMI (NonMaskable Interrupt) olyan hardver-megszakts, ami a megszakts-vezrl ot kikerlve kzvetlenl a processzor egyik lbn (rintkez ojn) keresztl jut el a kzponti egysghez, s amint neve is mutatja, nem tilthat le. A CPU az IF ag llstl fggetlenl mindig ki fogja szolglni ezt a megszaktst, mgpedig az INT 02h kezel ot meghvva. Mivel NMI csak valamilyen hardverhiba folytn keletkezik (pl. memria-paritshiba, nem megfelel o tpfeszltsg stb.), lekezelse utn a szmtgp nincs biztonsgos llapotban a folytatshoz, ezrt az NMI-kezel oben ltalban hibazenet kirsa (esetleg hangjelzs adsa) utn lelltjk a m ukdst. Ez utbbit pl. gy rik el, hogy kiadnak egy CLI utastst, majd egy vgtelen ciklusba engedik a processzort (ez a legegyszer ubben egy nmagra mutat JMP utastst jelent). Msik megolds a CLI utn a HLT (HaLT) operandus nlkli utasts kiadsa lehet, aminek hatsra lomba szenderl a processzor, s onnan csak egy hardver-megszakts, az NMI vagy a reset breszti fel. A dologban az a vicces, hogy az NMI keletkezst le lehet tiltani az alaplap egy bizonyos portjra rva. (XT-k s PC esetn a 00A0h porton a legfels o bit 0-s rtke, mg AT-knl a 0070h port ugyanazon bitjnek 1-es rtke tiltja le az NMI-t.) Ez elg kockzatos dolog, hiszen ha egyszer NMI-t szlel az alaplap, s nem kpes azt a CPU tudtra hozni, akkor a felhasznl mit sem sejtve folytatja munkjt, kzben pedig lehet, hogy tbb adatot veszt el gy, mintha az NMI-t ltva reseteln vagy kikapcsoln a gpet. Megjegyezzk, hogy a matematikai koprocesszor (FPU) is generlhat NMI-t. Ebben az esetben az NMI keletkezse nem hardverhibt, hanem a szmtsok kzben el ofordul numerikus hibkat (kivteleket) jelzi. Az NMI-kezel onek a dolga, hogy eldntse, le kell-e lltani a szmtgpet avagy nem.

A. Fggelk

tvlts klnfle szmrendszerek kztt


A 0 255 rtkek binris, oktlis, decimlis s hexadecimlis szmrendszerek kztti tvltst knnyti meg az A.1. tblzat. A.1. tblzat. tvlts a 2-es, 8-as, 10-es s 16-os szmrendszerek kztt

Dec 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 Dec

Bin 0000 0000b 0000 0010b 0000 0100b 0000 0110b 0000 1000b 0000 1010b 0000 1100b 0000 1110b 0001 0000b 0001 0010b 0001 0100b 0001 0110b 0001 1000b 0001 1010b 0001 1100b 0001 1110b 0010 0000b 0010 0010b 0010 0100b 0010 0110b 0010 1000b 0010 1010b 0010 1100b Bin

Oct 000o 002o 004o 006o 010o 012o 014o 016o 020o 022o 024o 026o 030o 032o 034o 036o 040o 042o 044o 046o 050o 052o 054o Oct

Hex 00h 02h 04h 06h 08h 0Ah 0Ch 0Eh 10h 12h 14h 16h 18h 1Ah 1Ch 1Eh 20h 22h 24h 26h 28h 2Ah 2Ch Hex

Dec 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 Dec

Bin 0000 0001b 0000 0011b 0000 0101b 0000 0111b 0000 1001b 0000 1011b 0000 1101b 0000 1111b 0001 0001b 0001 0011b 0001 0101b 0001 0111b 0001 1001b 0001 1011b 0001 1101b 0001 1111b 0010 0001b 0010 0011b 0010 0101b 0010 0111b 0010 1001b 0010 1011b 0010 1101b Bin

Oct 001o 003o 005o 007o 011o 013o 015o 017o 021o 023o 025o 027o 031o 033o 035o 037o 041o 043o 045o 047o 051o 053o 055o Oct

Hex 01h 03h 05h 07h 09h 0Bh 0Dh 0Fh 11h 13h 15h 17h 19h 1Bh 1Dh 1Fh 21h 23h 25h 27h 29h 2Bh 2Dh Hex

117 A.1. tblzat. (folytats)

Dec 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130 132 Dec

Bin 0010 1110b 0011 0000b 0011 0010b 0011 0100b 0011 0110b 0011 1000b 0011 1010b 0011 1100b 0011 1110b 0100 0000b 0100 0010b 0100 0100b 0100 0110b 0100 1000b 0100 1010b 0100 1100b 0100 1110b 0101 0000b 0101 0010b 0101 0100b 0101 0110b 0101 1000b 0101 1010b 0101 1100b 0101 1110b 0110 0000b 0110 0010b 0110 0100b 0110 0110b 0110 1000b 0110 1010b 0110 1100b 0110 1110b 0111 0000b 0111 0010b 0111 0100b 0111 0110b 0111 1000b 0111 1010b 0111 1100b 0111 1110b 1000 0000b 1000 0010b 1000 0100b Bin

Oct 056o 060o 062o 064o 066o 070o 072o 074o 076o 100o 102o 104o 106o 110o 112o 114o 116o 120o 122o 124o 126o 130o 132o 134o 136o 140o 142o 144o 146o 150o 152o 154o 156o 160o 162o 164o 166o 170o 172o 174o 176o 200o 202o 204o Oct

Hex 2Eh 30h 32h 34h 36h 38h 3Ah 3Ch 3Eh 40h 42h 44h 46h 48h 4Ah 4Ch 4Eh 50h 52h 54h 56h 58h 5Ah 5Ch 5Eh 60h 62h 64h 66h 68h 6Ah 6Ch 6Eh 70h 72h 74h 76h 78h 7Ah 7Ch 7Eh 80h 82h 84h Hex

Dec 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 Dec

Bin 0010 1111b 0011 0001b 0011 0011b 0011 0101b 0011 0111b 0011 1001b 0011 1011b 0011 1101b 0011 1111b 0100 0001b 0100 0011b 0100 0101b 0100 0111b 0100 1001b 0100 1011b 0100 1101b 0100 1111b 0101 0001b 0101 0011b 0101 0101b 0101 0111b 0101 1001b 0101 1011b 0101 1101b 0101 1111b 0110 0001b 0110 0011b 0110 0101b 0110 0111b 0110 1001b 0110 1011b 0110 1101b 0110 1111b 0111 0001b 0111 0011b 0111 0101b 0111 0111b 0111 1001b 0111 1011b 0111 1101b 0111 1111b 1000 0001b 1000 0011b 1000 0101b Bin

Oct 057o 061o 063o 065o 067o 071o 073o 075o 077o 101o 103o 105o 107o 111o 113o 115o 117o 121o 123o 125o 127o 131o 133o 135o 137o 141o 143o 145o 147o 151o 153o 155o 157o 161o 163o 165o 167o 171o 173o 175o 177o 201o 203o 205o Oct

Hex 2Fh 31h 33h 35h 37h 39h 3Bh 3Dh 3Fh 41h 43h 45h 47h 49h 4Bh 4Dh 4Fh 51h 53h 55h 57h 59h 5Bh 5Dh 5Fh 61h 63h 65h 67h 69h 6Bh 6Dh 6Fh 71h 73h 75h 77h 79h 7Bh 7Dh 7Fh 81h 83h 85h Hex

118 A.1. tblzat. (folytats)

Dec 134 136 138 140 142 144 146 148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190 192 194 196 198 200 202 204 206 208 210 212 214 216 218 220 Dec

Bin 1000 0110b 1000 1000b 1000 1010b 1000 1100b 1000 1110b 1001 0000b 1001 0010b 1001 0100b 1001 0110b 1001 1000b 1001 1010b 1001 1100b 1001 1110b 1010 0000b 1010 0010b 1010 0100b 1010 0110b 1010 1000b 1010 1010b 1010 1100b 1010 1110b 1011 0000b 1011 0010b 1011 0100b 1011 0110b 1011 1000b 1011 1010b 1011 1100b 1011 1110b 1100 0000b 1100 0010b 1100 0100b 1100 0110b 1100 1000b 1100 1010b 1100 1100b 1100 1110b 1101 0000b 1101 0010b 1101 0100b 1101 0110b 1101 1000b 1101 1010b 1101 1100b Bin

Oct 206o 210o 212o 214o 216o 220o 222o 224o 226o 230o 232o 234o 236o 240o 242o 244o 246o 250o 252o 254o 256o 260o 262o 264o 266o 270o 272o 274o 276o 300o 302o 304o 306o 310o 312o 314o 316o 320o 322o 324o 326o 330o 332o 334o Oct

Hex 86h 88h 8Ah 8Ch 8Eh 90h 92h 94h 96h 98h 9Ah 9Ch 9Eh 0A0h 0A2h 0A4h 0A6h 0A8h 0AAh 0ACh 0AEh 0B0h 0B2h 0B4h 0B6h 0B8h 0BAh 0BCh 0BEh 0C0h 0C2h 0C4h 0C6h 0C8h 0CAh 0CCh 0CEh 0D0h 0D2h 0D4h 0D6h 0D8h 0DAh 0DCh Hex

Dec 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 201 203 205 207 209 211 213 215 217 219 221 Dec

Bin 1000 0111b 1000 1001b 1000 1011b 1000 1101b 1000 1111b 1001 0001b 1001 0011b 1001 0101b 1001 0111b 1001 1001b 1001 1011b 1001 1101b 1001 1111b 1010 0001b 1010 0011b 1010 0101b 1010 0111b 1010 1001b 1010 1011b 1010 1101b 1010 1111b 1011 0001b 1011 0011b 1011 0101b 1011 0111b 1011 1001b 1011 1011b 1011 1101b 1011 1111b 1100 0001b 1100 0011b 1100 0101b 1100 0111b 1100 1001b 1100 1011b 1100 1101b 1100 1111b 1101 0001b 1101 0011b 1101 0101b 1101 0111b 1101 1001b 1101 1011b 1101 1101b Bin

Oct 207o 211o 213o 215o 217o 221o 223o 225o 227o 231o 233o 235o 237o 241o 243o 245o 247o 251o 253o 255o 257o 261o 263o 265o 267o 271o 273o 275o 277o 301o 303o 305o 307o 311o 313o 315o 317o 321o 323o 325o 327o 331o 333o 335o Oct

Hex 87h 89h 8Bh 8Dh 8Fh 91h 93h 95h 97h 99h 9Bh 9Dh 9Fh 0A1h 0A3h 0A5h 0A7h 0A9h 0ABh 0ADh 0AFh 0B1h 0B3h 0B5h 0B7h 0B9h 0BBh 0BDh 0BFh 0C1h 0C3h 0C5h 0C7h 0C9h 0CBh 0CDh 0CFh 0D1h 0D3h 0D5h 0D7h 0D9h 0DBh 0DDh Hex

119 A.1. tblzat. (folytats)

Dec 222 224 226 228 230 232 234 236 238 240 242 244 246 248 250 252 254 Dec

Bin 1101 1110b 1110 0000b 1110 0010b 1110 0100b 1110 0110b 1110 1000b 1110 1010b 1110 1100b 1110 1110b 1111 0000b 1111 0010b 1111 0100b 1111 0110b 1111 1000b 1111 1010b 1111 1100b 1111 1110b Bin

Oct 336o 340o 342o 344o 346o 350o 352o 354o 356o 360o 362o 364o 366o 370o 372o 374o 376o Oct

Hex 0DEh 0E0h 0E2h 0E4h 0E6h 0E8h 0EAh 0ECh 0EEh 0F0h 0F2h 0F4h 0F6h 0F8h 0FAh 0FCh 0FEh Hex

Dec 223 225 227 229 231 233 235 237 239 241 243 245 247 249 251 253 255 Dec

Bin 1101 1111b 1110 0001b 1110 0011b 1110 0101b 1110 0111b 1110 1001b 1110 1011b 1110 1101b 1110 1111b 1111 0001b 1111 0011b 1111 0101b 1111 0111b 1111 1001b 1111 1011b 1111 1101b 1111 1111b Bin

Oct 337o 341o 343o 345o 347o 351o 353o 355o 357o 361o 363o 365o 367o 371o 373o 375o 377o Oct

Hex 0DFh 0E1h 0E3h 0E5h 0E7h 0E9h 0EBh 0EDh 0EFh 0F1h 0F3h 0F5h 0F7h 0F9h 0FBh 0FDh 0FFh Hex

B. Fggelk

Karakter kdtblzatok
A karakterek kdolsra kt szabvny terjedt el. Ezek az ASCII (American Standard Code for Information Interchange) s az EBCDIC (Extended Binary-Coded Decimal Interchange Code) nevet kaptk. Az ASCII eredetileg 7 bites volt (teht csak 128 karaktert tartalmazott), ks obb b ovtettk csak ki 8 bitesre. A fels o 128 pozciban ltalban klnfle nyelvek bet uit s specilis jeleket trolnak. Mi itt az .n. Latin-2 (ms nven ISO 8859-2, 1250-es kdlap) kiosztst mutatjuk be, ez tartalmazza ugyanis az sszes kzp eurpai nyelv (kztk a magyar) bet uit is. Mindkt szabvny esetn nhny karakternek klnleges funkcija van. Ezeket szmos perifria (pl. modem, nyomtat, terminl) vezrlsi clokra hasznlja. Az ilyen karaktereknek ltalban nincs nyomtathat (megjelenthet o) kpe. Ehelyett egy nhny bet us nv utal szerepkre. Az ismert rvidtsek jelentst mutatja a B.1. tblzat. B.1. tblzat. ASCII s EBCDIC vezrl okdok

Nv ACK BEL BS CAN CR DC1 DC2 DC3 DC4 DEL DLE EM ENQ EOT ESC ETB ETX FS FF

Jelents ACKnowledge BELl BackSpace CANcel Carriage Return Device Control 1 (X-ON) Device Control 2 Device Control 3 (X-OFF) Device Control 4 DELete Data Line Escape End of Medium ENQuiry End Of Transmission ESCape End of Transmission Block End of TeXt File Separator Form Feed

121 B.1. tblzat. (folytats)

Nv GS HT LF NAK NUL RS SI SO SOH SP STX SUB SYN US VT

Jelents Group Separator Horizontal Tabulator Line Feed Negative AcKnowledge NULl (end of string) Record Separator Shift In Shift Out Start Of Heading SPace Start of TeXt SUBstitute SYNchronous idle Unit Separator Vertical Tabulator

A B.2. tblzat tartalmazza az emltett kt szabvny beosztst. Az resen hagyott helyek funkcija ismeretlen. B.2. tblzat. ASCII s EBCDIC karakterkdok

Kd 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 Kd
1 Lthat

ASCII NUL STX EOT ACK BS LF FF SO DLE DC2 DC4 SYN CAN SUB FS RS SP 1 " $ & ASCII

EBCDIC NUL STX PF LC


SMM FF SO DLE DC2 RES BS CAN CC IFS IRS DS FS BYP ETB EBCDIC

Kd 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Kd

ASCII SOH ETX ENQ BEL HT VT CR SI DC1 DC3 NAK ETB EM ESC GS US ! # % ASCII

EBCDIC SOH ETX HT DEL


VT CR SI DC1 TM NL IL EM CU1 IGS IUS SOS LF ESC EBCDIC

szkz.

122 B.2. tblzat. (folytats)

Kd 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 Kd

ASCII ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ b d f h j l n p r t v x z ASCII

EBCDIC
SM ACK SYN PN UC

DC4 SP

< + &

! * ;

% >

: @ = EBCDIC

Kd 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 Kd

ASCII ) + / 1 3 5 7 9 ; = ? A C E G I K M O Q S U W Y [ ] _ a c e g i k m o q s u w y { } DEL ASCII

EBCDIC
CU2 ENQ BEL

RS EOT CU3 NAK SUB

. {

$ ) /

, _ ?

# " EBCDIC

123 B.2. tblzat. (folytats)

Kd 128 130 132 134 136 138 140 142 144 146 148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 Kd
2 Pontnlkli 3 Grave

ASCII

EBCDIC
b d f h

2 5 6 8
10 12

k m o q

13 S 14 S Z 16
17

s u w y

18 s ASCII

EBCDIC

Kd 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 Kd

ASCII

EBCDIC a c e g i

`3 4 7

j l n p r

9 11 A L T
15

t v x z

Z a l 19 ASCII

EBCDIC

i. kezet. 4 Circumex vagy hat kezet. 5 Tilde kezet. 6 Breve kezet. 7 Dot kezet. 8 Ring kezet. 9 Double acute vagy hungarian umlaut kezet. 10 Ogonek kezet. 11 Ha cek vagy caron kezet. 12 Nemtrhet o szkz. 13 Breve kezet. 14 Dieresis vagy umlaut kezet. 15 Feltteles kt ojel (soft hyphen). 16 Fokjel. 17 Ogonek kezet. 18 Acute kezet. 19 Ha cek vagy caron kezet.

124 B.2. tblzat. (folytats)

Kd 184 186 188 190 192 194 196 198 200 202 204 206 208 210 212 214 216 218 220 222 224 226 228 230 232 234 236 238 240 242 244 246 248 250 252 254 Kd

ASCII 20 s z R C C E E N R T r c c e e d n r t ASCII

EBCDIC

B D F H

K M O Q

S U W Y

0 2 4 6 8

EBCDIC

Kd 185 187 189 191 193 195 197 199 201 203 205 207 209 211 213 215 217 219 221 223 225 227 229 231 233 235 237 239 241 243 245 247 249 251 253 255 Kd

ASCII t 21 z A L D N O U U a l d n o u u 22 ASCII

EBCDIC

A C E G I

J L N P R

T V X Z

1 3 5 7 9

EBCDIC

20 Cedilla 21

kezet. Double acute vagy hungarian umlaut kezet. 22 Dot kezet.

Trgymutat
A, abort-class exception . . . . . . . . . . . . . . . . 114 acknowledgement . . . . . . . . . lsd nyugtzs adatmozgat utastsok . . . . . . . . . . . . . . . 30 address space . . . . . . . . . . . . . lsd cmterlet wrap-around . . . . . . . . . . . . . . . . . . . lsd cmterlet-krbeforduls addressing mode . . . . . . . lsd cmzsi md alaplap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 loperandus . . . . . . . . . . . . . . . . . . . . . . . . . 75 ltalnos cl adatregiszter . . . . . . . . . . . . 14 ltalnos cl regiszterek . . . . . . . . . . . . . .17 antivalencia . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 aritmetikai ag . . . . . . . . . . . . . . . . . . . . . . . 17 aritmetikai shiftels . . . . . . . . . . . . . . . . . . 62 ASCII kdtbla . . . . . . . . . . . . . . . . . . . . . 120 ASCIIZ sztring . . . . . . . . . . . . . . . . . . . . . . 98 assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 tvitel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 borrow . . . . . . . . . . . . . . . . . . . . . . . . . 12 carry . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 B backlink . . . . . . . . . . . . . lsd visszalncols bjt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 BCD aritmetikai utastsok . . . . . . . . . . . . 32 BCD szm . . . . . . 17, lsd binrisan kdolt decimlis egsz szmok pakolatlan . . . . . . . . . . . . . . . . . . . . . . 17 pakolt . . . . . . . . . . . . . . . . . . . . . . . . . . 17 belpsi pont . . . . . . . . . . . . . . . . . . . . . . . . 89 big-endian trolsmd . . . . . . . . . . . . . . . . . 8 binris m uvelet . . . . . . . . . . . . . . . . . . . . . . . . . . 7 szmjegy . . . . . . . . . . . . . . . . . . . lsd bit szmrendszer . . . . . . . . . . . . . . . . . . . . . 7 binrisan kdolt decimlis egsz szmok17 BIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 belltsa . . . . . . . . . . . . . . . . . . . . . . . 65 invertlsa . . . . . . . . . . . . . . . . . . . . . . 65 tesztelse . . . . . . . . . . . . . . . . . . . . . . . 65 trlse . . . . . . . . . . . . . . . . . . . . . . . . . . 65 bitlptet o utastsok . . . . . . . . . . . . . . . . . . 32 bitmaszk . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 borrow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 busz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 buszlezr prex . . . . . . . . . . . . . . . . . . . . . 30 byte . . . . . . . . . . . . . . . . . . . . . . . . . . . lsd bjt C carry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 cloperandus . . . . . . . . . . . . . . . . . . . . . . . . 26 cmke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 cmterlet . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 -krbeforduls . . . . . . . . . . . . . . . . . . .14 cmzs bzis . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 bzis+index . . . . . . . . . . . . . . . . . . . . . 18 bzis+index+relatv . . . . . . . . . . . . . .18 bzis+relatv, bzisrelatv . . . . . . . . .18 index . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 index+relatv, indexrelatv . . . . . . . . 18 kzvetlen . . . . . . . . . . . . . . . . . . . . . . . 18 cmzsi md . . . . . . . . . . . . . . . . . . . . . . . . . 18 CPU . . . . . . . . . . . . 5, lsd mikroprocesszor D decimlis szmrendszer . . . . . . . . . . . . . . . . 7 direkt ugrs . . . . . . . . . . . . . . . . . . . . . . . . .105 direktva . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 .STACK . . . . . . . . . . . . . . . . . . . . . . . . 38 ASSUME . . . . . . . . . . . . . . . . . . . . . . . 38 DB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 DD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 DF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 DOSSEG . . . . . . . . . . . . . . . . . . . . . . . 88 DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

TRGYMUTAT

126 fejlc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 feltteles ugrs . . . . . . . . . . . . . . . . . . . . . . . 45 le handle . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 zikai memriacm . . . . . . . . . . . . . . . . . . . 14 ag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 aritmetikai . . . . . . . . . . . . . . . . . . . . . . 17 Flags regiszter . . . . . . . . . . . . . . . . . . . . . . . 14 forgats . . . . . . . . . . . . . . . . . . . . . lsd rotls forrsoperandus . . . . . . . . . . . . . . . . . . . . . . 26 frissts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 function . . . . . . . . . . . . . . . . . . lsd fggvny fggvny . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 G gpi kd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 giga- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 H hardver-megszakts . . . . . . . . . . . . . . . . . . 23 header . . . . . . . . . . . . . . . . . . . . . . . lsd fejlc hexadecimlis szmrendszer . . . . . . . . . . . . 7 I, id ozt o ............................... 6 indexregiszter . . . . . . . . . . . . . . . . . . . . . . . . 14 indirekt ugrs . . . . . . . . . . . . . . . . . . . . . . . 105 init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 instruction . . . . . . . . . . . . . . . . . . lsd utasts interrupt . . . . . . . . . . . . . . . lsd megszakts K karakteres konstans . . . . . . . . . . . . . . . . . . . 25 kettes komplemens alak . . . . . . . . . . . . . . . . 9 kilo- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 kivtel . . . . . . . . . . . . . . . . . . . . . . . . . . 23, 114 konjunkci . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 koprocesszor-vezrl o utastsok . . . . . . . 33 kzeli ugrs . . . . . . . . . . . . . . . . . . . . . . . . 105 kzvetlen memria-hozzfrs . lsd DMA kvadrasz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 L lefel b ovl o verem . . . . . . . . . . . . . . . . . . 20 lptets . . . . . . . . . . . . . . . . . . . . lsd shiftels LIFO elv . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 lineris memriacm . . . . . . . . . . . . . . . . . . 13 lineris memria-modell . . . . . . . . . . . . . . 13 linker . . . . . . . . . . . . . . . . . . . . lsd szerkeszt o little-endian trolsmd . . . . . . . . . . . . . . . . 8

DT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 DW . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 END . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 ENDP . . . . . . . . . . . . . . . . . . . . . . . . . . 50 ENDS . . . . . . . . . . . . . . . . . . . . . . . . . . 38 EQU . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 JUMPS . . . . . . . . . . . . . . . . . . . . . . . . . 46 LABEL . . . . . . . . . . . . . . . . . . . . . . . . . 88 MODEL . . . . . . . . . . . . . . . . . . . . . . . . 38 NOJUMPS . . . . . . . . . . . . . . . . . . . . . 46 ORG . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 PROC . . . . . . . . . . . . . . . . . . . . . . . . . . 50 SEGMENT . . . . . . . . . . . . . . . . . . . . . 38

disassemblls . . . . . . . . . . . . . . . . . . . . . . . 52 displacement . . . . . . . . . . . . . . . . lsd eltols diszjunkci . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 -vezrl o.. . . . . . . . . . . . . . . . . . . . . . . . .6 dollrjel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 doubleword . . . . . . . . . . . . . . . lsd duplasz duplasz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 E, EBCDIC kdtbla . . . . . . . . . . . . . . . . . . . 120 eektv cm . . . . . . . . . . . lsd tnyleges cm egsz aritmetikai utastsok . . . . . . . . . . . 31 egyes komplemens alak . . . . . . . . . . . . . . . . 9 egyszer ustett szegmensdenci . . . . . . . 27 eljrs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67 eljrshvs . . . . . . . . . . . . . . . . . . . . . . . . . . 49 el ojel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 -bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 el ojeles kiterjeszts . . . . . . . . . . . . . . . . . . . 12 el ojeles szmok . . . . . . . . . . . . . . . . . . . . . . . 9 el ojeltelen kiterjeszts . . . . . . . . . . . . . . . . 12 el ojeltelen szmok . . . . . . . . . . . . . . . . . . . . . 8 eltols. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 endianizmus . . . . . . . . . . . . . . . . . . . . . . . . . . 8 big-endian trolsmd . . . . . . . . . . . . . 8 little-endian trolsmd . . . . . . . . . . . 8 entry point . . . . . . . . . . . . lsd belpsi pont exception . . . . . . . . . . . . . . . . . . . lsd kivtel abort . . . . . . . . . . . . . . . . . . . . . . . . . . 114 fault . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 trap . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 F fault-class exception . . . . . . . . . . . . . . . . . 114

TRGYMUTAT

127 negci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 nibble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 NMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 normlt memriacm . . . . . . . . . . . . . . . . . 14 numerikus konstans . . . . . . . . . . . . . . . . . . 25 Ny nyugtzs . . . . . . . . . . . . . . . . . . . . . . . . . . 110 O, object code . . . . . . . . . . . . . . . . lsd trgykd oszetcm . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 oktlis szmrendszer . . . . . . . . . . . . . . . . . . . 7 opcode . . . . . . . . . . . . . . . . lsd m uveleti kd operandus . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 opertor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 DUP . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 OFFSET . . . . . . . . . . . . . . . . . . . . . . . 79 PTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 SHORT . . . . . . . . . . . . . . . . . . . . . . . 110 rajel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 -genertor . . . . . . . . . . . . . . . . . . . . . . . . 6 P paragrafus . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 paragrafus-hatr . . . . . . . . . . . . . . . . . . . . . .13 perifria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pointer . . . . . . . . . . . . . . . . . . . . . . lsd mutat far, long, full . . . lsd tvoli-, hossz-, teljes mutat near, short . lsd kzeli-, rvid mutat port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pozci-szmll . . . . . . . . . . . lsd dollrjel prex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 buszlezr . . . . . . . . . . . . . . . . . . . . . . 30 CS: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 DS: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 ES: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 LOCK . . . . . . . . . . . . . . . . . . . . . . . . . . 30 REP, REPE, REPZ . . . . . . . . . . 30, 78 REPNE, REPNZ . . . . . . . . . . . . . 30, 78 SEGCS . . . . . . . . . . . . . . . . . . . . . . . . 29 SEGDS . . . . . . . . . . . . . . . . . . . . . . . . 29 SEGES . . . . . . . . . . . . . . . . . . . . . . . . 29 SEGSS . . . . . . . . . . . . . . . . . . . . . . . . 29 SS: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 szegmensfellbrl . . . . . . . . . . 19, 29 sztringutastst ismtl o . . . . . . . . . . . 30 procedure . . . . . . . . . . . . . . . . . . . lsd eljrs

logikai memriacm . . . . . . . . . . . . . . . . . . 13 logikai m uvelet . . . . . . . . . . . . . . . . . . . . . . . 7 S . . . . . . . . . . . . . . . . . lsd konjunkci KIZR VAGY . . . . lsd antivalencia VAGY . . . . . . . . . lsd MEGENGEDO diszjunkci tagads . . . . . . . . . . . . . . . . lsd negci logikai shiftels . . . . . . . . . . . . . . . . . . . . . . 62 logikai utastsok . . . . . . . . . . . . . . . . . . . . 31 M machine code . . . . . . . . . . . . . . . . . . . . . . . . . 2 MASM . . lsd Microsoft Macro Assembler MCB . . . . . . . . . lsd memriavezrl o blokk mega- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 megjegyzs . . . . . . . . . . . . . . . . . . . . . . . . . . 26 megszakts . . . . lsd megszakts-krelem hardver- . . . . . . . . . . . . . . . . . . . . . . . . 23 -krelem . . . . . . . . . . . . . . . . . . . . . . . . . 5 -kezel o . . . . . . . . . . . . . . . . . . . . . 23, 102 -maszkols . . . . . . . . . . . . . . . . . . . . . . 23 -rendszer . . . . . . . . . . . . . . . . . . . . . . . . . 5 szoftver- . . . . . . . . . . . . . . . . . . . . . . . . 23 -vektor . . . . . . . . . . . . . . . . . . . . . . . . 102 -vezrl o.. . . . . . . . . . . . . . . . . . . . . . . . .5 -vonal . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 memria. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 memriacm zikai . . . . . . . . . . . . . . . . . . . . . . . . . . 14 lineris . . . . . . . . . . . . . . . . . . . . . . . . . 13 logikai . . . . . . . . . . . . . . . . . . . . . . . . . . 13 normlt . . . . . . . . . . . . . . . . . . . . . . . . . 14 memria-modell . . . . . . . . . . . . . . . . . . 13, 27 lineris . . . . . . . . . . . . . . . . . . . . . . . . . 13 szegmentlt . . . . . . . . . . . . . . . . . . . . . 13 memria-szervezs . . lsd memria-modell memriavezrl o blokk . . . . . . . . . . . . . . . . 81 Microsoft Macro Assembler . . . . . . . . . . . 28 mikroprocesszor . . . . . . . . . . . . . . . . . . . . . . 4 mnemonik . . . . . . . . . . . . . . . . . . . . . . . . 2, 25 mutat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 kzeli-, rvid- . . . . . . . . . . . . . . . . . . . 17 tvoli-, hossz-, teljes- . . . . . . . . . . . 17 mutatregiszter . . . . . . . . . . . . . . . . . . . . . . 14 m uveleti kd . . . . . . . . . . . . . . . . . . . . . . . . . 25 N

TRGYMUTAT

128 el ojeltelen . . . . . . . . . . . . . . . . . . . . . . . . 8 pakolatlan BCD . . . . . . . . . . . . . . . . . 17 pakolt BCD . . . . . . . . . . . . . . . . . . . . . 17 szmrendszer binris . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 decimlis . . . . . . . . . . . . . . . . . . . . . . . . 7 hexadecimlis . . . . . . . . . . . . . . . . . . . . 7 oktlis . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 szegmens . . . . . . . . . . . . . . . . . . . . . . . . 13, 26 szegmens bziscm . . . . . . . . . . . . . . . . . . . 13 szegmenscm . . . . . lsd szegmens bziscm szegmensen belli ugrs . lsd kzeli ugrs szegmensfellbrl prex . . . . . . . . . 19, 29 szegmenskzi ugrs . . . . . lsd tvoli ugrs szegmensregiszter . . . . . . . . . . . . . . . . . . . . 15 szegmentlt memria-modell . . . . . . . . . . 13 szerkeszt o . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 szimblum . . . . . . . . . . . . . . . . . . . . . . . . . . 25 sz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 szoftver-megszakts . . . . . . . . . . . . . . . . . 23 sztring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 sztringkezel o utastsok . . . . . . . . . . . . . . . 32 sztringutastst ismtl o prexek . . . . . . . .30 T trgykd . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 TASM . . . . . . . . . . . . lsd Turbo Assembler tvoli ugrs . . . . . . . . . . . . . . . . . . . . . . . . . 105 TD . . . . . . . . . . . . . . . . lsd Turbo Debugger tnyleges cm . . . . . . . . . . . . . . . . . . . . . . . . 20 TLINK . . . . . . . . . . . . . . . lsd Turbo Linker trspont . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 trap-class exception . . . . . . . . . . . . . . . . . 114 TSR . . . . . . . . . . . . . . lsd rezidens program tlcsorduls . . . . . . . . . . . . . . . . . . . . . . . . . 12 Turbo Assembler . . . . . . . . . . . . . . . . . . . . . 28 Turbo Debugger . . . . . . . . . . . . . . . . . . . . . .52 Turbo Linker . . . . . . . . . . . . . . . . . . . . . . . . 28 U, ugrs kzeli . . . . . . . . . . . . . . . . . . . . . . . . . 105 rvid . . . . . . . . . . . . . . . . . . . . . . . . . . 110 tvoli . . . . . . . . . . . . . . . . . . . . . . . . . . 105 ugrtbla . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 j sor karakterpr . . . . . . . . . . . . . . . . . . . . 51 unris m uvelet . . . . . . . . . . . . . . . . . . . . . . . . 7 utasts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

programming language . . . . . . . . . . . . . . . . 1 high-level . . . . . . . . . . . . . . . . . . . . . . . . 1 low-level . . . . . . . . . . . . . . . . . . . . . . . . . 1 programozsi nyelv . . . . . . . . . . . . . . . . . . . . 1 alacsony szint u ................... 1 magas szint u ..................... 1 programszegmens . . . . . . . . . . . . . . . . . . . . 84 programszegmens-prex . . . . . . . . . . . . . . 85 PSP . . . . . . . . lsd programszegmens-prex Q quadword . . . . . . . . . . . . . . . . lsd kvadrasz R RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 regiszter . . . . . . . . . . . . . . . . . . . . . . . . . . 5, 14 ltalnos cl . . . . . . . . . . . . . . . . 14, 17 Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 index- . . . . . . . . . . . . . . . . . . . . . . . . . . 14 mutat- . . . . . . . . . . . . . . . . . . . . . . . . . 14 sttusz- . . . . . . . . . . . . . . . . . . . . . . . . . 14 szegmens- . . . . . . . . . . . . . . . . . . . . . . 15 regiszterpr . . . . . . . . . . . . . . . . . . . . . . . . . . 17 relokci . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 relokcis tbla . . . . . . . . . . . . . . . . . . . . . . 89 rendszervezrl o utastsok . . . . . . . . . . . . 33 reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 rezidens program . . . . . . . . . . . . . . . . . . . 111 ROM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 rotls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 rvid ugrs . . . . . . . . . . . . . . . . . . . . . . . . . 110 S scan code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 shiftels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 aritmetikai . 62, lsd el ojeles shiftels el ojeles . . . . . . . . . . . . . . . . . . . . . . . . . 12 el ojeltelen . . . . . . . . . . . . . . . . . . . . . . 12 logikai . . 62, lsd el ojeltelen shiftels sign . . . . . . . . . . . . . . . . . . . . . . . . . lsd el ojel sign extension . . . . lsd el ojeles kiterjeszts specilis utastsok . . . . . . . . . . . . . . . . . . . 33 stack . . . . . . . . . . . . . . . . . . . . . . . . lsd verem sttuszregiszter . . . . . . . . . . . . . . . . . . . . . . 14 Sz szm binrisan kdolt decimlis egsz . . 17 el ojeles . . . . . . . . . . . . . . . . . . . . . . . . . . 9

TRGYMUTAT

129
NOT . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 OR . . . . . . . . . . . . . . . . . . . . . . . . . 44, 65 OUT . . . . . . . . . . . . . . . . . . . . . . . . . . 110 POP . . . . . . . . . . . . . . . . . . . . . . . . 20, 44 POPF . . . . . . . . . . . . . . . . . . . . . . . . . . 66 PUSH . . . . . . . . . . . . . . . . . . . . . . .20, 44 PUSHF . . . . . . . . . . . . . . . . . . . . . . . . . 66 RCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 RCR . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

AAA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 AAD . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 AAM . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 AAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

adatmozgat . . . . . . . . . . . . . . . . . . . . 30 ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 ADD . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 AND . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 BCD aritmetikai . . . . . . . . . . . . . . . . . 32 bitlptet o . . . . . . . . . . . . . . . . . . . . . . . 32 CALL . . . . . . . . . . . . . . . . . . . . . . 49, 105 CBW . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 CLC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 CLD . . . . . . . . . . . . . . . . . . . . . . . . 44, 66 CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 CMC . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 CMP . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 CMPS, CMPSB, CMPSW . . . . . . . 77 CWD . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 DAA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 DAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 DEC . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 DIV . . . . . . . . . . . . . . . . . . . . . . . . . 50, 58 egsz aritmetikai . . . . . . . . . . . . . . . . 31 HLT . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 IDIV . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 IMUL . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 IN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Jccc (feltteles ugrsok) . . . . . . . . . . 45 JMP . . . . . . . . . . . . . . . . . . . . . . . 47, 105 JMPS . . . . . . . . . . . . . . . . . . . . . . . . . 110 koprocesszor-vezrl o . . . . . . . . . . . . . 33 LAHF . . . . . . . . . . . . . . . . . . . . . . . . . . 66 LDS . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 LEA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 LES . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 LODS, LODSB, LODSW . . . . . 44, 79 logikai . . . . . . . . . . . . . . . . . . . . . . . . . . 31 LOOP . . . . . . . . . . . . . . . . . . . . . . . . . . 42 LOOPE, LOOPZ . . . . . . . . . . . . . . . . 43 LOOPNE, LOOPNZ . . . . . . . . . . . . . 43 MOV . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 MOVS, MOVSB, MOVSW . . . . . . . 77 MUL . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 NEG . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 NOP . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

rendszervezrl o . . . . . . . . . . . . . . . . . .33 RET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 ROL . . . . . . . . . . . . . . . . . . . . . . . . . . . .63 ROR . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 SAHF . . . . . . . . . . . . . . . . . . . . . . . . . . 66 SAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 SAR . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 SBB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 SCAS, SCASB, SCASW . . . . . . . . .79 SHL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 SHR . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 specilis . . . . . . . . . . . . . . . . . . . . . . . . 33 STC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 STD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 STI . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66 STOS, STOSB, STOSW . . . . . 47, 79 SUB . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 sztringkezel o . . . . . . . . . . . . . . . . . . . . 32 TEST . . . . . . . . . . . . . . . . . . . . . . . . . . 65 vezrlstad . . . . . . . . . . . . . . . . . . . .32 XCHG . . . . . . . . . . . . . . . . . . . . . . . . . . 95 XLAT, XLATB . . . . . . . . . . . . . . . . . . . 95 XOR . . . . . . . . . . . . . . . . . . . . . . . . 39, 65 V verem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 vezrlstad utastsok . . . . . . . . . . . . . . 32 visszalncols . . . . . . . . . . . . . . . . . . . . . . . 85 W word . . . . . . . . . . . . . . . . . . . . . . . . . . . lsd sz Z zero extension . . . . . . lsd zr-kiterjeszts zr-kiterjeszts . . . . . . . . . . lsd el ojeltelen kiterjeszts

Irodalomjegyzk
[1] Dr. Kovcs Magda, 32 Bites Mikroprocesszorok 80386/80486 I./II., LSI, Budapest, [knyv] [2] Abonyi Zsolt, PC Hardver Kziknyv, [knyv] [3] Dan Rollins, Tech Help! v4.0, Copyright Flambeaux Software, Inc., 1985, 1990, [program] [4] David Jurgens, HelpPC v2.10, Copyright 1991, [program] [5] Expert Help Hypertext System v1.09, Copyright SofSolutions, 1990, 1992, [program] [6] Ralf Brown, Ralf Browns Interrupt List Release 61, Copyright 1989, 2000, [program, txt] [7] Nobody, The Interrupts and Ports database v1.01, Copyright 1988, [ng] [8] Morten Elling, Borlands Turbo Assembler v4.0 Ideal mode syntax, Copyright 1995, [ng] [9] The Assembly Language Database, Copyright Peter Norton Computing, Inc., 1987, [ng] [10] P. H. Rankin Hansen (Ping), The Programmers Reference v0.02b, [ng] [11] Intel iAPx86 Instruction Set, 1996, [ng] [12] http://www.pobox.com/ralf/, Ralf Browns Homepage, [www] Ebben a gy ujtemnyben mind nyomtatott, mind elektronikus formj m uvek, illetve segdprogramok megtallhatk. A bejegyzsek utols tagja utal a forrs tpusra: [knyv] Nyomtatsban megjelent knyv [program] Segdprogram [ng] Norton Guide formtum (.ng kiterjeszts u) adatbzis [txt] Tisztn szveges formtum dokumentum [www] World Wide Web (Internet) honlap cme

You might also like