Vous êtes sur la page 1sur 452

ASSEMBLY PROGRAMOZS

AJNLOTT IRODALOM
1)Peth dm: Assembly alapismeretek 1. ktet, Szmalk, Budapest, 1992 2)Peter Norton-John Socha: Az IBM PC Assembly nyelv programozsa, Novotrade, Budapest, 1991 3)Peter Norton: Az IBM PC programozsa, Mszaki 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

TARTALOM
1 AZ ASSEMBLY NYELV TULAJDONSGAI, JELENTSGE. 9 2 A PC-K HARDVERNEK FELPTSE.................................13 3 SZMRENDSZEREK, GPI ADATBRZOLS, ARITMETIKA S LOGIKA.......................................................... 16 4 A 8086-OS PROCESSZOR JELLEMZI, SZOLGLTATSAI. 24 4.1 Memriakezels.........................................................................25 4.2 Regiszterek................................................................................ 26 4.3 Adattpusok................................................................................30 4.4 Memriahivatkozsok, cmzsi mdok..................................... 31
4.4.1 Kzvetlen cmzs................................................................................................ 31 4.4.2 Bziscmzs.........................................................................................................31 4.4.3 Indexcmzs.........................................................................................................32 4.4.4 Bzis+relatv cmzs........................................................................................... 32 4.4.5 Index+relatv cmzs........................................................................................... 32 4.4.6 Bzis+index cmzs.............................................................................................32 4.4.7 Bzis+index+relatv cmzs................................................................................ 33

4.5 Veremkezels.............................................................................34 4.6 I/O, megszakts-rendszer......................................................... 38 5 AZ ASSEMBLY NYELV SZERKEZETE, SZINTAXISA......... 39 6 A 8086-OS PROCESSZOR UTASTSKSZLETE.................46 6.1 Prefixek......................................................................................47
6.1.1 Szegmensfellbrl prefixek............................................................................. 47 6.1.2 Buszlezr prefix................................................................................................ 47 6.1.3 Sztringutastst ismtl prefixek.........................................................................47

6.2 Utastsok.................................................................................. 48
6.2.1 Adatmozgat utastsok...................................................................................... 48 6.2.2 Egsz szmos aritmetika..................................................................................... 49 6.2.3 Bitenknti logikai utastsok (Boole-mveletek)............................................... 49 6.2.4 Bitlptet utastsok............................................................................................49 6.2.5 Sztringkezel utastsok..................................................................................... 50 2

6.2.6 Binrisan kdolt decimlis (BCD) aritmetika.................................................... 50 6.2.7 Vezrlstad utastsok.....................................................................................50 6.2.8 Rendszervezrl utastsok.................................................................................51 6.2.9 Koprocesszor-vezrl utastsok........................................................................ 51 6.2.10 Specilis utastsok........................................................................................... 51

7 VEZRLSI SZERKEZETEK MEGVALSTSA................ 53 7.1 Szekvencilis vezrlsi szerkezet.............................................. 55 7.2 Szmllsos ismtlses vezrls................................................ 60 7.3 Egyszer s tbbszrs szelekcis vezrls.............................. 65 7.4 Eljrsvezrls........................................................................... 73 8 A TURBO DEBUGGER HASZNLATA.................................. 79 9 SZMOLS ELJELES SZMOKKAL, BITMVELETEK. 84 9.1 Matematikai kifejezsek kirtkelse........................................84 9.2 Bitforgat utastsok..................................................................89 9.3 Bitmanipull utastsok........................................................... 93 10 AZ ASSEMBLY NYELV KAPCSOLATA MAGAS SZINT NYELVEKKEL, PARAMTERTADS FORMI....................97 10.1 Paramterek tadsa regisztereken keresztl...........................97 10.2 Paramterek tadsa globlis vltozkon keresztl................ 99 10.3 Paramterek tadsa a vermen keresztl............................... 102 10.4 Loklis vltozk megvalstsa.............................................107 11 MVELETEK SZTRINGEKKEL.......................................... 109 12 AZ .EXE S A .COM PROGRAMOK KZTTI KLNBSGEK, A PSP.............................................................118 12.1 A DOS memriakezelse.......................................................118 12.2 ltalban egy programrl......................................................121 12.3 Ahogy a DOS indtja a programokat..................................... 124 12.4 .COM llomnyok................................................................. 127 12.5 Relokci............................................................................... 129 12.6 .EXE llomnyok...................................................................133 13 SZOFTVER-MEGSZAKTSOK...........................................135 13.1 Szvegkirats, billentyzet-kezels......................................137
3

13.2 Szveges kperny kezelse, szmok hexadecimlis alakban kirsa.............................................................................................140 13.3 Munka llomnyokkal........................................................... 146 13.4 Grafikus funkcik hasznlata................................................ 150 14 MEGSZAKTS-TDEFINILS, HARDVERMEGSZAKTSOK, REZIDENS PROGRAM, KAPCSOLAT A PERIFRIKKAL, HARDVER-PROGRAMOZS.................. 154 14.1 Szoftver-megszakts tirnytsa......................................... 156 14.2 Az idzt (timer) programozsa........................................... 163 14.3 Rezidens program (TSR) ksztse, a szveges kperny kzvetlen elrse............................................................................170 15 KIVTELEK............................................................................174 16 OPTIMALIZLS MDJAI................................................. 178 16.1 Sebessgre optimalizls....................................................... 178 16.2 Mretre optimalizls............................................................ 184 17 JABB ARCHITEKTRK.................................................. 188 17.1 Dokumentlatlan lehetsgek................................................204 17.2 A numerikus koprocesszor szolgltatsai..............................218
17.2.1 Adatmozgat utastsok.................................................................................. 233 17.2.2 Alap aritmetikai utastsok............................................................................. 235 17.2.3 sszehasonlt utastsok............................................................................... 239 17.2.4 Transzcendentlis utastsok.......................................................................... 242 17.2.5 Konstansbetlt utastsok............................................................................. 245 17.2.6 Koprocesszor-vezrl utastsok.................................................................... 245

17.3 Az Intel 80186-os processzor jdonsgai..............................253


17.3.1 Vltozsok az utastskszletben....................................................................253 17.3.2 j utastsok....................................................................................................255 17.3.3 j kivtelek..................................................................................................... 258

17.4 Az Intel 80286-os processzoron megjelent j szolgltatsok...... 259


17.4.1 Vltozsok az utastskszletben....................................................................259 17.4.2 j prefixek...................................................................................................... 260 17.4.3 j utastsok....................................................................................................261 17.4.4 j zemmdok................................................................................................ 264 17.4.5 Vltozsok a kivtel-kezelsben.....................................................................266 17.4.6 j kivtelek..................................................................................................... 267 4

17.4.7 Vltozsok a regiszterkszletben....................................................................273 17.4.8 j regiszterek.................................................................................................. 274

17.5 Az Intel 80386-os processzor jtsai....................................276


17.5.1 Vltozsok az utastsok rtelmezsben....................................................... 276 17.5.2 Vltozsok az utastskszletben....................................................................277 17.5.3 j prefixek...................................................................................................... 286 17.5.4 j utastsok....................................................................................................287 17.5.5 Vltozsok az architektrban........................................................................ 296 17.5.6 j zemmdok................................................................................................ 301 17.5.7 j cmzsi mdok........................................................................................... 302 17.5.7.1 Kzvetlen cmzs...................................................................................... 302 17.5.7.2 Bziscmzs...............................................................................................303 17.5.7.3 Bzis+relatv cmzs................................................................................. 303 17.5.7.4 Bzis+index cmzs...................................................................................303 17.5.7.5 Bzis+index+relatv cmzs...................................................................... 303 17.5.7.6 Bzis+index*skla cmzs........................................................................ 303 17.5.7.7 Bzis+index*skla+relatv cmzs............................................................304 17.5.7.8 Index*skla+relatv cmzs.......................................................................304 17.5.8 Vltozsok a kivtel-kezelsben.....................................................................305 17.5.9 j kivtelek..................................................................................................... 307 17.5.10 Vltozsok a regiszterkszletben..................................................................308 17.5.11 j regiszterek................................................................................................ 308

17.6 Az Intel 80486-os processzoron bevezetett jdonsgok....... 320


17.6.1 Vltozsok az utastskszletben....................................................................320 17.6.2 j utastsok....................................................................................................320 17.6.3 Vltozsok az architektrban........................................................................ 322 17.6.4 Vltozsok a kivtel-kezelsben.....................................................................323 17.6.5 j kivtelek..................................................................................................... 323 17.6.6 Vltozsok a regiszterkszletben....................................................................324 17.6.7 j regiszterek.................................................................................................. 327

17.7 Az Intel Pentium bvtsei.................................................... 327


17.7.1 Vltozsok az utastskszletben....................................................................327 17.7.2 j utastsok....................................................................................................328 17.7.3 Vltozsok az architektrban........................................................................ 331 17.7.4 j zemmdok................................................................................................ 339 17.7.5 Vltozsok a kivtel-kezelsben.....................................................................342 17.7.6 j kivtelek..................................................................................................... 343 17.7.7 Vltozsok a regiszterkszletben....................................................................344 17.7.8 j regiszterek.................................................................................................. 346

17.8 Az Intel MMX technolgija.................................................347


17.8.1 Adatmozgat utastsok.................................................................................. 350 17.8.2 Konverzis utastsok..................................................................................... 351 17.8.3 Pakolt aritmetikai utastsok...........................................................................352 5

17.8.4 sszehasonlt utastsok............................................................................... 354 17.8.5 Logikai utastsok........................................................................................... 355 17.8.6 Shiftel utastsok...........................................................................................356 17.8.7 llapot-kezel utastsok................................................................................356

17.9 Az Intel Pentium Pro friss tudsa.......................................... 357


17.9.1 j utastsok....................................................................................................357 17.9.2 Vltozsok az architektrban........................................................................ 359 17.9.3 Vltozsok a kivtel-kezelsben.....................................................................366 17.9.4 Vltozsok a regiszterkszletben....................................................................366

17.10 Az Intel Pentium II-n megjelent jdonsgok.......................367


17.10.1 j utastsok..................................................................................................368 17.10.2 Vltozsok a regiszterkszletben..................................................................371

17.11 Az AMD K6-2 jtsai.........................................................371


17.11.1 j prefixek.................................................................................................... 372 17.11.2 j utastsok..................................................................................................372 17.11.3 Vltozsok a kivtel-kezelsben...................................................................375 17.11.4 Vltozsok a regiszterkszletben..................................................................375 17.11.5 j regiszterek................................................................................................ 376

17.12 Az AMD 3DNow! technolgija.........................................377


17.12.1 Teljestmny-nvel utastsok ................................................................... 380 17.12.2 Egsz aritmetikai utastsok..........................................................................381 17.12.3 Lebegpontos aritmetikai utastsok............................................................ 382 17.12.4 sszehasonlt utastsok............................................................................. 385 17.12.5 Konverzis utastsok................................................................................... 385

17.13 Az Intel Pentium III-n megjelent jdonsgok..................... 387


17.13.1 j prefixek.................................................................................................... 387 17.13.2 j utastsok..................................................................................................388 17.13.3 Vltozsok a kivtel-kezelsben...................................................................388 17.13.4 j kivtelek................................................................................................... 390 17.13.5 Vltozsok a regiszterkszletben..................................................................390 17.13.6 j regiszterek................................................................................................ 391

17.14 Az Intel SSE technolgija..................................................391


17.14.1 Adatmozgat utastsok................................................................................397 17.14.2 Konverzis utastsok................................................................................... 399 17.14.3 Lebegpontos aritmetikai utastsok............................................................ 401 17.14.4 sszehasonlt utastsok............................................................................. 404 17.14.5 Logikai utastsok......................................................................................... 407 17.14.6 Kever utastsok (Data shuffle instructions).............................................. 407 17.14.7 Tovbbi MMX utastsok............................................................................. 408 17.14.8 Cache-selst vezrl utastsok (Cacheability control instructions)............ 411 17.14.9 llapot-kezel utastsok (State management instructions).........................413

17.15 sszefoglals....................................................................... 416


6

17.15.1 ltalnos cl regiszterek (General purpose registers)................................ 416 17.15.2 Szegmensregiszterek (Segment selector registers).......................................417 17.15.3 Utastsmutat regiszter (Instruction pointer register)................................. 418 17.15.4 FPU utastsmutat s operandusmutat regiszterek (FPU instruction pointer and operand pointer registers)....................................................................................418 17.15.5 FPU mveleti kd regiszter (FPU opcode register)......................................418 17.15.6 FPU adatregiszterek (FPU data registers).....................................................419 17.15.7 MMX regiszterek (MMX registers)..............................................................419 17.15.8 3DNow! regiszterek (3DNow! registers)......................................................420 17.15.9 SIMD lebegpontos regiszterek (SIMD floating-point registers)................420 17.15.10 Sttuszregiszter (Status register).................................................................420 17.15.11 FPU sttuszregiszter (FPU status word/register)........................................421 17.15.12 FPU tag-regiszter (FPU tag word/register).................................................422 17.15.13 FPU vezrlregiszter (FPU control word/register).....................................423 17.15.14 SIMD vezrl-/sttuszregiszter (SIMD floating-point control/status register) ....................................................................................................................................424 17.15.15 Vezrlregiszterek (Control registers)........................................................425 17.15.16 Nyomkvet regiszterek (Debug registers)................................................ 427 17.15.17 Memria-kezel regiszterek (Memory-management registers)..................429 17.15.18 Modell-specifikus regiszterek (Model-specific registersMSRs)..............429 17.15.19 Regiszterek kezdeti rtke (Initial value of registers)................................ 431 17.15.20 Kivtelek (Exceptions)............................................................................... 433 17.15.21 FPU kivtelek (FPU exceptions)................................................................ 435 17.15.22 SIMD lebegpontos kivtelek (SIMD floating-point exceptions)............. 436 17.15.23 Prefixek (Prefixes)...................................................................................... 437

18 UTASTSOK KDOLSA................................................... 438 18.1 A gpi kd alak felptse................................................... 438 18.2 Prefixek..................................................................................440 18.3 Mveleti kd..........................................................................444 19 PROCESSZOROK DETEKTLSA..................................... 448 20 VDETT MD ASSEMBLY............................................... 449 21 FELHASZNLT IRODALOM...............................................449 21.1 Nyomtatott segdeszkzk.................................................... 449
21.1.1 Knyvek.......................................................................................................... 449 21.1.2 Folyiratok...................................................................................................... 449

21.2 Elektronikus forrsok.............................................................450


21.2.1 Segdprogramok............................................................................................. 450 21.2.2 Norton Guide adatbzisok.............................................................................. 450 21.2.3 Szveges formtum dokumentumok.............................................................451 7

21.2.4 PDF (Adobe Portable Document Format) kziknyvek.................................451

1 AZ ASSEMBLY NYELV TULAJDONSGAI, JELENTSGE


A szmtgpes problmamegolds sorn a kitztt 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 szint (low-level) s magas szint programozsi nyelveket (high-level programming language). Az elbbire j pldk az Assembly s rszben a C, az utbbira pedig a Pascal ill. a BASIC nyelvek. Ha a nyelvek szolgltatsait tekintjk, akkor szembetl, hogy ahogy egyre fentebb haladunk az alacsony szint nyelvektl a magas szintek fel, gy egyre nagyobb szabadsggal, egyre ltalnosabb megoldsokkal tallkozunk. Az Assembly teht egy alacsony szint programozsi nyelv, mghozz nagyon alacsony szint, ebbl kvetkezen pedig sokkal kzelebb ll a hardverhez, mint brmely ms nyelv. Fbb jellemzi: nagyon egyszer, elemi mveletek tpustalansg rgztett utastskszlet vilgos, egyszer 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 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 grafikus 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 egy olyan krrajzolt, ami semmi mst nem csinl, csak ami a feladata: helyesen kirajzolja a krt a kpernyre, de nem foglalkozik pl. hibaellenrzssel, a kperny szln kvlre kerl pontok kiszrsvel 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 nyelvekben a legtbb problma gyorsabban lerhat, a forrs rvidebb, strukturltabb, s ezltal ttekinthetbb lesz, knnyebb lesz a ksbbiekben a program karbantartsa, s ez nem csak a program szerzjre vonatkozik. Mgsem mellzhetjk az Assemblyt, sok dolgot ugyanis vagy nagyon nehz, vagy egyszeren 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 hibalehetsgek ugyanis sokkal gyakoribbak itt, s egy-egy ilyen baki megkeresse sokszor van olyan nehz, mint egy msik program megrsa.

10

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 fejbl tudnia kellett az sszes utasts sszes lehetsges vltozatt, ismernie kellett a rendszert teljes mrtkben. Ha egy kvlll rtekintett egy gpi kd programra, akkor annak mkdsbl, jelentsbl 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 rnzsre. ppen ezrt kidolgoztak egy olyan jellsrendszert, nyelvet, amiben emberileg emszthet 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 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 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 elbbi memriarekeszbe
11

a pontosvessz utni rsz csak megjegyzs az els oszlop tartalmazza a mnemonikot a memriahivatkozsokat szgletes zrjelek ( [ s ] ) kz rjuk Teht a fenti hrom sor egy vltoz tartalmt megszorozza az 1234h szmmal, s az eredmnyt visszarakja az elbbi vltozba. Mik az Assembly elnyei? korltlan hozzfrsnk van a teljes hardverhez, belertve az sszes perifrit (billentyzet, nyomtat stb.) pontosan ellenrizhetjk, hogy a gp tnyleg azt teszi-e, amit elvrunk tle 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 szerznek is a kdols nagy figyelmet, trelmet, s fleg idt ignyel sok a hibalehetsg a hardver alapos ismerete elengedhetetlen a forrs nem hordozhat (nem portolhat), azaz ms alapokra pl szmtgpre trs nlkl nem vihet t (ez persze igaz a gpi kdra is) Br gy tnhet, tbb htrnya van mint elnye, mgis rdemes alkalmazni az Assemblyt ott, ahol ms eszkz nem segt. A befektetett erfesztsek pedig meg fognak trlni.

12

2 A PC-K HARDVERNEK FELPTSE


Az IBM PC-k felptst szemllteti a kvetkez bra elgg leegyszerstve:

Az els IBM PC az Intel 8086-os mikroprocesszorval jelent meg, s hamarosan kvette az IBM PC XT, ami mr Intel 8088-os maggal ketyegett. Ksbb beksznttt az AT-k idszaka, 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, hogy (elvileg) 100%-osan kompatibilis az Intel gyrtmnyokkal, azaz ami fut Intel-en, az ugyangy elfut a msik procin is, s viszont. Az sszes ksbbi processzor alapja tulajdonkppen a 8086-os volt, ppen ezrt mondjk azt, hogy a processzorok ezen csaldja az Intel 80x86os (rviden x86-os) architektrjra pl.
13

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 adatbusszal rendelkezik.) A fenti brn a CPU jelli a processzort (Central Processing Unit=kzponti feldolgoz egysg). Mint neve is mutatja, a gp agya, de persze gondolkodni nem tud, csak vgrehajtja, amit parancsba adtak neki. A CPU-n tbbek kztt tallhat nhny klnleges, kzvetlenl elrhet trolhely. Ezeket regisztereknek (register) nevezzk. A processzor mkds kzbeni jraindtst reset-nek hvjuk. Reset esetn a processzor egy jl meghatrozott llapotba kerl. A memria adja a szmtgp "emlkezett". Hasonlan az emberi memrihoz, van neki felejt (az informcit csak bizonyos ideig megrz) s emlkez vltozata. Az elbbi neve RAM (Random Access Memory=vletlen hozzfrs memria), mg az utbbi ROM (Read Only Memory=csak olvashat memria). A ROM fontos rszt kpezi az .n. BIOS (Basic Input/Output System=alapvet ki-/bemeneti rendszer). A gp bekapcsolsa (s reset) utn a BIOS-ban lev egyik fontos program indul el elszr (pontosabban minden processzort gy terveznek, hogy a BIOS-t kezdje el vgrehajtani ilyenkor). Ez leellenrzi a hardverelemeket, teszteli a memrit, megkeresi a jelenlev perifrikat, majd elindtja az opercis rendszert, ha lehet. A BIOS ezenkvl sok hasznos rutint tartalmaz, amikkel vezrelhetjk pldul a billentyzetet, 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-, cm- ill. vezrlbuszt (data bus, address bus, control bus). A cmbusz szlessge (amit bitekben ill. a "vezetkek" szmban

14

mrnk) hatrozza meg a megcmezhet memria maximlis nagysgt. A CPU a perifrikkal (pl. hangkrtya, videovezrl, DMA-vezrl, nyomtat stb.) az .n. portokon keresztl kommunikl. Ezeket egy szm azonostja, de ne gy kpzeljk el, hogy annyi vezetk van bektve, ahny port van. Egyszeren, 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 megkezddik. 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 (IRQInterrupt ReQuest), akkor abbahagyja az ppen aktulis munkjt, s kiszolglja az adott eszkzt. A megszaktsok elszr a megszakts-vezrlhz (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 lehetsge 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, buszok stb.) s mg sok minden ms egyetlen ramkri egysgen, az .n. alaplapon (motherboard) tallhat. Van mg hrom fontos eszkz, amikrl rdemes szt ejteni. Ezek az rajel-genertor, az idzt s a DMA-vezrl. A CPU mkdst szablyos idkznknt megjelen elektromos impulzusok vezrlik. Ezeket nevezik rajelnek (clock, clocktick), msodpercenknti darabszmuk mrtkegysge a Hertz (Hz). gy egy 4.77 MHz-es rajel msodpercenknt 4770000 impulzust jelent. Az rajelet egy

15

kvarckristlyon alapul rajel-genertor (clock generator) lltja el. A RAM memrik minden egyes memriarekeszt folyamatosan ki kell olvasni s vissza kell rni msodpercenknt tbbszr is, klnben tnyleg "felejtv" vlna. Erre a frisstsnek (memory refresh) nevezett mveletre felptsk miatt van szksg. A mveletet pontos idkznknt kell vgrehajtani, ezt pedig egy klnleges egysg, az idzt (timer) intzi el. Ennek egyik dolga az, hogy kb. 15.09 ms-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 idre a processzor nem tud mssal foglalkozni. E clbl bevezettk a kzvetlen memria-hozzfrs (DMA Direct Memory Access) mdszert. Ez gy mkdik, hogy ha egy perifrinak szksge van valamilyen adatra a memribl, vagy szeretne valamit berni oda, akkor nem a CPU-nak szl, hanem a DMA-vezrlnek (DMA controller), s az a processzort kikerlve elintzi a krst.

3 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 hardversszetevt, pl. a memrit is) feleslegesen tlbonyoltan, ha neki is ezekkel a szmokkal kellene dolgoznia. Ennl jval egyszerbb s
16

kzenfekv 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 hatvnyai, teht 1, 2, 4, 8, 16, 32 stb. Ha sokszor dolgozunk binris szmokkal, akkor nem rt, ha a hatvnyokat fejbl 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 a szmokat sokszor rjuk tizenhatos alap (hexadecimlis hexadecimal) szmrendszerben. Itt a szmjegyek a megszokott 10 arab szmjegy, plusz az angol bc els hat betje (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 elz 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" bett. 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" bett runk. Most eleventsk fel a legegyszerbb, kzismert logikai mveleteket. Ezek ugyanis fontos szerepet jtszanak mind a programozs, mind a processzor szempontjbl. A kt logikai igazsgrtket itt most binris szmjegyek fogjk jellni. A negci (tagads negation) egyvltozs (unris) mvelet, eredmnye a bemeneti igazsgrtk ellentettje. A mveletet jellje NOT az angol tagads mintjra.

17

A konjunkci ("S") mr ktvltozs (binris) mvelet. Jele AND (az "s" angolul), eredmnyt a kvetkez tblzat szemllteti:

A diszjunkci ("VAGY") szintn binris mvelet. Jele OR (a "vagy" angolul), s a kt vltozn MEGENGED VAGY mveletet hajt vgre:

Utols mveletnk az antivalencia ("KIZR VAGY"). Jele a XOR (eXclusive OR), hatsa az albbi brn kvethet:

A legtbb processzor kizrlag egsz szmokkal tud szmolni, esetleg megenged racionlis 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. bitbl 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
18

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). 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) elttszavak a megszokott 1000 s 1000000 helyett 1024-et (=210) ill. 1048576-ot (=220) jelentenek. A giga- (G) hasonlan 230-t jelent. Fontos szlni egy fogalomrl, az .n. endianizmusrl (endianism). Ez azt a problmt jelenti, hogy nincs egyrtelmen rgztve a tbb bjt hossz adatok brzolsa sorn az egyes bjtok memriabeli sorrendje. Kt logikus verzi ltezik: a legkevsb rtkes bjttal kezdnk, s sorban haladunk a legrtkesebb bjt fel (little-endian trols), ill. ennek a fordtottja, teht a legrtkesebbtl haladunk a legkevsb rtkes bjt fel (big-endian trols). Mindkt megoldsra tallhatunk pldkat a klnbz hardvereken. Nzzk meg, hogy brzoljuk az egsz szmokat. Elszr ttelezzk fel, hogy csak nemnegatv (eljeltelen 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. Ha negatv szmokat is szeretnnk hasznlni, akkor kt lehetsg 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 eljel (sign) ltal. Mivel ennek kt rtke lehet (ha a nullt pozitvnak
19

tekintjk), trolsra elg egyetlen bit. Ez a kitntetett bit az eljelbit (sign bit), s megegyezs szerint az adat legrtkesebb (most significant), azaz legfels bitjn helyezkedik el. Ha rtke 0, akkor a tekintett eljeles (signed) szm pozitv (vagy nulla), 1 esetn pedig negatv. A fennmarad biteken (esetnkben az als 7 bit) pedig troljuk magt a szmot eljele nlkl. Megtehetnnk, hogy azonos mdon kezeljk a pozitv s negatv szmokat is, de knyelmi szempontok s a matematikai mveleti tulajdonsgok fenntartsa vgett a negatv szmok ms alakban kerlnek lersra. Ez az alak az .n. kettes komplemens (2's complement). Ennek kiszmtsa gy trtnik, hogy az brzolhat legnagyobb eljeltelen szmnl eggyel nagyobb szmhoz (ez most 256) hozzadjuk a krdses szmot, s az eredmnyt modulo 256 vesszk. Mg egyszerbb megrteni, ha bevezetjk az egyes komplemens (1's complement) fogalmt is. Ezt gy kpezzk brmilyen rtk bjt (sz stb.) esetn, hogy annak minden egyes bitjt negljuk. Ha vesszk egy tetszleges szm egyes komplemenst, majd ahhoz hozzadunk 1-et (az sszeadst az albbiak szerint elvgezve), akkor pont a szm kettes komplemenst kapjuk meg. Egy szm kettes komplemensnek kettes komplemense a kiindul szmot adja vissza. 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 (eljeltelen vagy eljeles pozitv) = 00000000b 1 (eljeltelen vagy eljeles pozitv) = 00000001b 2 (eljeltelen vagy eljeles pozitv) = 00000010b 127 (eljeltelen vagy eljeles pozitv) = 01111111b 128 (eljeltelen) = 10000000b 255 (eljeltelen) = 11111111b -1 (eljeles negatv) = 11111111b -2 (eljeles negatv) = 11111110b -127 (eljeles negatv) = 10000001b -128 (eljeles negatv) = 10000000b
20

Lthatjuk, hogy az eljeltelen s eljeles 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 tfed rsz itt is van (32768..65535 ill. -1..-32768). Vgl megnzzk, hogy vgezhetk el a legegyszerbb matematikai mveletek. A mveletek kzs tulajdonsga, hogy az eredmny mindig hosszabb 1 bittel, mint a kt szm kzs hossza (gy tekintjk, hogy mindkett tag azonos bitszlessg). 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 jegy, innen haladunk balra 2)az tvitel kezdetben 0

21

3)az aktulis pozciban lev kt szmjegyet sszeadjuk, majd ehhez hozzadjuk az tvitelt (az eredmny kt jegy binris szm lesz) 4)az eredmny als jegyt lerjuk az sszeghez, az tvitel pedig felveszi a fels 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 kvetkezek: 0+0 = 00, tvitel=0 0+1 = 01, tvitel=0 1+0 = 01, tvitel=0 1+1 = 10, tvitel=1 10+01 = 11, tvitel=1 Ezek alapjn ellenrizhetjk, hogy a fent definilt kettes komplemens alak valban teljesti azt az alapvet algebrai tulajdonsgot, hogy egy szmnak s additv inverznek (teht -1-szeresnek) sszege 0 kell legyen. s valban: 1d+(-1d)=00000001b+11111111b=1 00000000b Az eredmny szintn egy bjt lesz (ami tnyleg nulla), valamint keletkezik egy tvitel is. Az egyes komplemens is rendelkezik egy rdekes tulajdonsggal. Nevezetesen, ha sszeadunk egy szmot s annak egyes komplemenst, akkor egy csupa egyesekbl ll szmot, azaz -1-et (avagy a legnagyobb eljeltelen szmot) fogunk kapni! Kivonskor hasonlan jrunk el, csak ms szablyokat alkalmazunk: 0-0 = 00, tvitel=0 0-1 = 11, tvitel=1 1-0 = 01, tvitel=0 1-1 = 00, tvitel=0 11-01 = 10, tvitel=1
22

tovbb a fenti algoritmusban a 3) lpsben az tvitelt le kell vonni a kt szmjegy klnbsgbl. Ezek alapjn ugyancsak teljesl, hogy 1d-1d=00000001b-00000001b=0 00000000b azaz egy szmot nmagbl kivonva 0-t kapunk. Viszont lnyeges eltrs az elz esettl (amikor a kettes komplemens alakot adtuk hozz a szmhoz), hogy itt sose keletkezik tvitel a mvelet elvgzse utn. A szorzs s az oszts mr macersabbak. Mindkt mvelet elvgzse eltt meghatrozzuk az eredmny (szorzat ill. hnyados) eljelt, majd az eljeleket levlasztjuk a tagokrl. Mindkt mveletet 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. A maradk eljele az osztandval egyezik meg, tovbb teljesl, hogy a maradk abszolt rtkben kisebb mint az oszt. A mveletek 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 legegyszerbben, 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 2nek valamely hatvnyval szorozzuk meg. Ez a mdszer minden szmra alkalmazhat, legyen az akr negatv, akr pozitv. Hasonlan definilhat a jobbra shiftels is, csak itt a legfels megresed bitpozcit tltjk fel 0-val. Itt azonban felmerl egy bkken, nevezetesen negatv szmokra nem fogunk helyes eredmnyt kapni. A problma az eljelbitben
23

keresend, mivel az ppen a legfels bit, amit pedig az elbb 0val helyettestettnk. A gond megszntethet, ha bevezetnk egy eljeles s egy eljel nlkli jobbra shiftelst. Az eljeltelen vltozat hasonlan mkdik a balra shiftelshez, az eljelesnl pedig annyi a vltozs, hogy a legfels bitet vltozatlanul hagyjuk (vagy ami ugyanaz, az eredeti eljelbittel tltjk fel). Megjegyezzk, hogy az angol terminolgia megklnbzteti az sszeadskor keletkez tvitelt a kivonsnl keletkeztl. Az elbbit carry-nek, mg az utbbit borrow-nak nevezik. Tlcsordulsrl (overflow) beszlnk, ha a mvelet eredmnye mr nem trolhat a kijellt helyen. Ez az aritmetikai mveleteknl, pl. shiftelskor, osztskor fordulhat el. Egy eljeles bjt eljeles kiterjesztsn (sign extension) azt a mveletet rtjk, mikor a bjtot sz mret szmm alaktjuk t gy, hogy mindkett ugyanazt az rtket kpviselje. Ezt gy vgezzk el, hogy a cl sz fels bjtjnak minden bitjt a kiindul bjt eljelbitjvel tltjk fel. Teht pl. a -3d=11111101b szm eljeles 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.

4 A 8086-OS PROCESSZOR JELLEMZI, SZOLGLTATSAI


Ismerkedjnk most meg az Intel 8086-os mikroprocesszorral kzelebbrl.

24

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 memriamodellnek nevezzk. Tbb elterjedt modell ltezik, kzlk a legfontosabbak a lineris s a szegmentlt modellek. Lineris modellen (linear model) azt rtjk, ha a memria teljes terletnek valamely bjtja egyetlen szmmal megcmezhet (kivlaszthat). Ezt az rtket ekkor lineris memriacmnek (linear address) nevezzk. Szegmensen (segment) a memria egy sszefgg, rgztett nagysg darabjt rtjk most (ltezik egy kicsit msfle szegmens-fogalom is), ennek kezdcme (teht a szegmens legels bjtjnak memriacme) a szegmens bziscm avagy szegmenscm (segment base address). A szegmensen belli bjtok elrsre szksg van azok szegmenscmhez kpesti relatv tvolsgra, ez az offszetcm (offset address). Szegmentlt modell (segmented model) esetn a logikai memriacm (logical address) teht kt rszbl tevdik ssze: a szegmenscmbl s az offszetcmbl. E kett rtk mr elegend a memria lefedshez. Jells: SZEGMENSCM:OFFSZETCM teht elszr lerjuk a szegmenscmet, azutn egy kettspontot, majd az offszet jn. A 8086-os processzor 20 bites cmbusszal rendelkezik, teht a memriacmek 20 bitesek lehetnek. Ez 1 Mbjt (=1024*1024 bjt) mret memria megcmzshez elegend. A processzor csak a szegmentlt cmzst ismeri. A szegmensek mrett 64 Kbjtban szabtk meg, mivel gy az offszet 16 bites lesz, ez pedig belefr brmelyik regiszterbe (ezt majd ksbb
25

ltni fogjuk). A szegmensek kezdcmre is tettek azonban kiktst, mgpedig azt, hogy minden szegmens csak 16-tal oszthat memriacmen kezddhet (ezek a cmek az .n. paragrafus-hatrok). Ez annyit tesz, hogy minden szegmenscm als 4 bitje 0 lesz, ezeket teht felesleges lenne eltrolni. gy marad pont 16 bit a szegmenscmbl, azaz mind a szegmens-, mind az offszetcm 16 bites lett. Nzznk egy pldt: 1234h:5678h A szegmenscm fels 16 bitje 1234h, ezrt ezt balra shifteljk 4szer, gy kapjuk az 12340h-t. Ehhez hozz kell adni az 5678h szmot. A vgeredmny 1 79B8h. szrevehetjk, hogy ugyanazt a memriarekeszt tbbflekppen is megcmezhetjk, gy pl. a 179Bh:0008h, 15AFh: 1EC8h, 130Dh:48E8h cmek mind az elz 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 offszetcm, a fels 16 bit pedig a szegmenscmet alkotja. Ezrt az ilyen cmeket nevezhetjk bizonyos szempontbl "normltnak" (normalized address), hiszen az offszet itt mindig 0000h s 000Fh kztt lesz.

4.2 Regiszterek
A 8086-os proci 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 szegmensregiszter (CS, DS, ES, SS) Most nzzk rszletesebben:

26

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 jelentsggel br SI (Source Index) sztringkezel 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 vgrehajtand utasts memriabeli cmt tartalmazza; kzvetlenl nem elrhet, de tartalma rhat s olvashat is a vezrlstad utastsokkal SR avagy Flags (Status Register) a processzor aktulis llapott, az elz mvelet eredmnyt mutat, ill. a proci mkdst befolysol biteket, .n. flag-eket (jelzket) tartalmaz; szintn nem rhet 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, elsdleges adatterlet szegmensnek cme ES (Extra Segment) msodlagos adatszegmens cme SS (Stack Segment) a verem szegmensnek cme

27

A ngy ltalnos cl regiszter (AX, BC, CX s DX) als s fels nyolc bitje (azaz als s fels bjtja) kln neveken rhet el: az als bjtokat az AL, BL, CL, DL, mg a fels bjtokat az AH, BH, CH, DH regiszterek jellik (a rvidtsekben L=Low, H=High). ppen ezrt a kvetkez (Pascal-szer) mveletek:
AX:=1234h AL:=78h AH:=56h

vgrehajtsa utn AX tartalma 5678h lesz, AH 56h-t, AL pedig 78h-t fog tartalmazni.

A Flags regiszter a kvetkez mezket tartalmazza:

Az egyes bitek a kvetkez informcit szolgltatjk: C (Carry) 1, ha volt aritmetikai tvitel az eredmny legfels bitjnl (eljeltelen 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. s 4. bitje kztt Z (Zero) rtke 1, ha az eredmny zrus lett S (Sign) rtke az eredmny legfels bitjnek, az eljelbitnek a tkrkpe
28

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 (Overflow) ha 1, akkor eljeles aritmetikai tlcsorduls trtnt Ha hivatkozunk valamelyik flag-re, akkor a fenti betjelekhez mg hozzrjuk az "F" bett is. A CF, IF s DF flag-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 rgztett, s nem is mdosthatjuk ket. Aritmetikai flag-ek alatt, ha kln nem mondjuk, a CF, PF, AF, ZF, SF s OF flag-eket rtjk. Ha azt akarjuk kifejezni, hogy kt vagy tbb regiszter tartalmt egyms utn fzve akarunk megadni egy rtket, akkor az egyes regisztereket egymstl kettsponttal elvlasztva soroljuk fel. Teht pl. a DX:AX jells azt jelenti, hogy a 32 bites duplasznak az als szava AX-ben, fels 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 mst jelent, mint a memriacmek brzolsra hasznlt SZEGMENS:OFFSZET felrsok! Ha ltalnos (cl) regiszterekrl 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.

29

A kvetkez vgrehajtsra kerl utasts 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 nem csak az eredeti funkcijnak megfelel tartalommal tlthetjk fel ket. Ennek ellenre az 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 eljeles s eljeltelen aritmetikt is. A tbb bjt hossz adatokat little-endian mdon trolja, ezrt pl. a fenti 1234 5678h szm a kvetkez mdon lesz eltrolva: a legalacsonyabb memriacmre kerl a 78h bjt, ezt kveti az 56h, majd a 34h, vgl pedig a 12h. Logikai, lebegpontos racionlis tpusokat nem tmogat a proci! Az egszek rszhalmazt alkotjk a binrisan kdolt decimlis egsz szmok (Binary Coded Decimal numbersBCD numbers). Ezek kt csoportba sorolhatk: vannak pakolt (packed) s pakolatlan (unpacked) BCD szmok. (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 jegyt, mg a 0..3 bitek az alacsonyabb helyirtk jegyet tartalmazzk. A szmjegyeket a 0h..9h rtkek valamelyike jelli. Pakolatlan esetben a bjtnak a fels fele kihasznlatlan, gy csak 1 jegyet tudunk 1 bjtban trolni.

30

A sztring (string) adattpus bjtok vagy szavak vges hossz folytonos sort jelenti. Ezzel a tpussal bvebben egy ksbbi fejezetben foglalkozunk. Specilis egsz tpus a mutat (pointer). Mutatnak hvunk egy rtket, ha az egy memriacmet tartalmaz, vagy azt a memria elrsnl felhasznljuk. Kt tpusa van: a kzeli vagy rvid mutat (near/short pointer) egy offszetcmet jelent, mg tvoli, hossz vagy teljes mutatn (far/long/full pointer) egy teljes logikai memriacmet, teht szegmens:offszet alak cmet rtnk. A kzeli mutat hossza 16 bit, a tvoli pedig 32 bit. Fontos, hogy mutatknt brmilyen rtket felhasznlhatunk.

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 offszetet (rvid mutatt) jell. 4.4.2 Bziscmzs
31

A cmzs egy bzisregisztert hasznl az offszet megadsra. A lehetsges alakok: [BX], [BP]. A cl bjt offszetcmt a hasznlt bzisregiszterbl fogja venni a processzor. 4.4.3 Indexcmzs Hasonl a bziscmzshez, mkdst 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 eljeles sz, rel8 pedig egy eljeles bjt, amit a processzor eljelesen kiterjeszt szv. Ezek az .n. eltolsok (displacement). Brmelyik vltozatnl a megcmzett bjt offszetjt a bzisregiszter tartalmnak s az eljeles 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 formkat ltheti: [BX+SI], [BX+DI], [BP+SI] s [BP+DI]. A regiszterek sorrendje termszetesen kzmbs, gy [BP+SI] s

32

[SI+BP] ugyanazt jelenti. A cl bjt offszetjt a kt regiszter rtknek sszegeknt kapjuk meg. 4.4.7 Bzis+index+relatv cmzs Ez adja a legkombinltabb cmzsi lehetsgeket. ltalnos alakjuk [bzis+index+rel8] s [bzis+index+rel16] lehet, ahol bzis BX vagy BP, index SI vagy DI, rel8 s rel16 pedig eljeles bjt ill. sz lehet. A bzis+relatv s index+relatv cmzsi mdok msik elnevezse a bzisrelatv ill. indexrelatv cmzs. Minden cmzsi mdhoz tartozik egy alaprtelmezett (default) szegmensregiszter-elrs. Ez a kvetkezket 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 elrhatjuk, hogy melyik szegmensregisztert hasznlja a cm meghatrozshoz a proci. Ezt a szegmensfellbrl prefixekkel tehetjk meg. A prefixek alakja a kvetkez: CS:, DS:, ES:, SS:, teht a szegmensregiszter neve plusz egy kettspont. Ezeket a prefixeket 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 jellsek viszont hibsak:
33

[AX] [CX+1234h] [123456789ABCh] [SP+BP] [IP]

A hasznlt cmzsmd ltal hivatkozott memriacmet tnyleges cmnek (effective address) nevezzk.

4.5 Veremkezels
Vermen (stack) a kvetkez tulajdonsgokkal rendelkez adatszerkezetet rtjk: rtelmezve van rajta egy Push mvelet, ami egy rtket rak be a verem tetejre egy msik mvelet, a Pop a verem tetejn lev adatot olvassa ki s trli a verembl mkdse a LIFO (Last In First Out) elvet kveti, azaz a legutoljra betett adatot vehetjk ki elszr a verembl verem mretn azt a szmot rtjk, ami meghatrozza, hogy maximlisan mennyi adatot kpes eltrolni verem magassga a benne lev 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 verembl 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
34

regiszter trolja, mg a verem tetejre az SP mutat. Ez a verem lefel bvl (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 mveletek hatsra. SP-nek mindig pros rtket kell tartalmaznia, s a verembe betenni ill. onnan kiolvasni szintn csak pros szm bjtot lehet. A Push s Pop mveleteknek megfelel utastsok mnemonikja szintn PUSH ill. POP, gy megjegyzsk nem tl nehz. A PUSH elszr cskkenti SP-t a betenni kvnt adat mretnek megfelel szm bjttal, majd az SS:SP ltal mutatott memriacmre berakja a krdses rtket. A POP ezzel ellenttes mkds, azaz elszr kiolvas az SS:SP cmrl valahny szm bjtot, majd SP-hez hozzadja a kiolvasott bjtok szmt. Nzznk egy pldt a verem mkdsnek szemlltetsre! Legyen AX tartalma 1212h, BX tartalma 3434h, CX pedig legyen egyenl 5656h-val. Tekintsk a kvetkez Assembly programrszletet:
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 brk az egyes utastsok vgrehajtsa utn: Kezdetben: SS:0102h : ?? SP=> SS:0100h : ??
35

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


36

SS:00FAh : ?? AX=3434h, BX=3434h, CX=5656h


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. 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

37

A veremregisztereknek (SS s SP) mindig rvnyes rtkeket kell tartalmazniuk a program futsakor, mivel azt a processzor s ms programok (pl. a hardver-megszaktsokat lekezel rutinok) is hasznljk.

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 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-vezrln keresztl rzkeli a processzor. A vezrl 8 klnbz megszakts vonalat tart fent (AT-k esetn kt vezrlt ktttek sorba, gy lett a 8-bl 16 vonal). Ezen megszaktsokat az IRQ0, IRQ1, , IRQ7 (tovbb IRQ8, , IRQ15) szimblumokkal jelljk. Fontos jellemzjk, 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
38

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 utasts vltja ki ket), s nem maszkolhatk, nem tilthatk le. Az IF flag llstl fggetlenl mindig rzkeli ket a CPU. 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 (interrupt handler). Az opercis rendszer felllsa utn sok hardver- s szoftver-megszaktsnak mr van kezelje (pl. a BIOS is jpr ilyen megszaktst zemeltet), de lehetsg van arra is, hogy brmelyik ilyen rutint lecserljk egy sajt programunkra. A hardver-megszaktsok a szoftveresek egy adott tartomnyra kpzdnek 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 kezeljt 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 sszefoglalan kivtelnek (exception) nevezzk. Kivtelt okoz pl. ha nullval prblunk osztani, vagy ha a verem tlvagy alulcsordul.

5 AZ ASSEMBLY NYELV SZERKEZETE, SZINTAXISA


39

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 (linker) elvgzi rajta az talaktsokat. Vgl az egy vagy tbb trgykd sszefzse 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 nagybetkre, gy teht a PUSH, Push, push, PusH szavak ugyanazt a jelentst kpviselik. Ez elg nagy szabadsgot ad a klnbz azonostk elnevezsre, s a forrst is ttekinthetbb teszi. Az Assembly forrs sorai a kvetkez elemeket tartalmazhatjk: assembler utastsok (fleg ezek alkotjk a tnyleges program kdjt) pszeudo utastsok (pl. makrk, helyettest 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:
{Cmke:} <Prefix> {Utasts {Operandus<,Operandus>}} {;Megjegyzs}

40

A kapcsos zrjelek ({ s }) az opcionlis (nem ktelez) rszeket jelzik, mg a cscsos zrjelek (< s >) 0 vagy tbb elfordulsra utalnak. A cmke (label) deklarcija az azonostjbl s az azt kvet kettspontbl ll. rtke az aktulis sor memriacme (helyesebben offszetje). 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 feladata lesz. A prefix olyan utastselem, amely csak az t kvet gpi kd utastsra (avagy Assembly mnemonikra) hat, annak mkdst vltoztatja meg ill. egszti ki. Ezeket kveti az utasts (instruction), ami egy assembler direktva, egy pszeudo utasts vagy egy Assembly mnemonik lehet. Emlkeztetl, a mnemonik (mnemonic) azonos mveletet vgz klnbz gpi kd utastsok csoportjt jell szimblum (sz). Az Intel mnemonikok legalbb ktbetsek, s nmelyik mg szmot is tartalmaz. A mnemonikok gpi kd alakjt mveleti kdnak (operation code, opcode) nevezzk. Az mnemonik ltal meghatrozott utasts valamilyen "dolgokon" hajtja vgre a feladatt. Ezeket a dolgokat mutatjk az operandusok (operand), amelyeket (ha tbb van) vesszvel elvlasztva sorolunk fel. Operandusok ptkvei a kvetkezk lehetnek: regiszterek numerikus (szm) konstansok karakteres (sztring) konstansok szimblumok opertorok (mveletek)

41

Regiszterekre a kvetkez szavakkal utalhatunk: AL, AH, AX, BL, BH, BX, CL, CH, CX, DL, DH, DX, SI, DI, SP, BP, CS, DS, ES s SS. Numerikus konstansnak szmjeggyel kell kezddnie, azutn tartalmazhatja a tz szmjegyet ill. az A..F betket, 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 ll Fontos, hogy a betvel kezdd hexadecimlis szmok el tegynk legalbb egy 0-t, mert klnben szimblumnak prbln rtelmezni a szmunkat az assembler. Karakteres konstansokat aposztrfok vagy idzjelek 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 azonostjnak mindig betvel kell kezddnie, azutn tartalmazhat szmjegyet, betket (csak az angol bc betit), alhzsjelet ( _ ), dollrjelet ($) s "kukacot" (@). Specilis szimblum az egymagban ll dollrjel, ennek neve pozci-szmll (location counter). rtke az aktulis sor szegmensbeli (avagy szegmenscsoportbeli) offszetje. Opertorbl rengeteg van, a legfontosabbak taln a kvetkezk: kerek zrjelek szoksos aritmetikai mveleti jelek (+, -, *, /, MOD) mezkivlaszt opertor (.) szegmens-elrs/-fellbrls (:) memriahivatkozs ([]) bitenknti logikai mveletek (AND, OR, XOR, NOT) tpusfellbrls (PTR)
42

adattpus megads (BYTE, WORD, DWORD) duplikl opertor (DUP) relcis opertorok (EQ, NE, GT, GE, LT, LE) pointer tpusok (NEAR, FAR) szegmens/offszet lekrdezs (SEG, OFFSET) lptet opertorok (SHL, SHR) mretlekrdez opertorok (LENGTH, SIZE, TYPE, WIDTH)

Az operandusok ezek alapjn hrom csoportba sorolhatk: regiszter-, memria- s konstans (kzvetlen rtk) operandusok. A klnbz opcode-ok lehetnek nulla-, egy-, kett-, hrom- vagy ngyoperandusak. Fontos megjegyezni, hogy a ktoperandus mnemonikok els 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 a forrs, a msodik pedig a cl operandus. Az elnevezsek arra utalnak, hogy a mvelet 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 utn. Ezeket a karaktereket az assembler egyszeren tugorja, gy teht brmilyen szveget tartalmazhat (mg kezetes betket is). Most tisztznunk kell mg nhny fogalmat. Korbban mr emltettk, hogy a processzor szegmentlt memriamodellt hasznl. Hogy teljes legyen a kavarods, az assemblernek is el kell rnunk a memria-modellt, s szegmenseket is ltre kell hoznunk. A kt szegmens- s memria-modell fogalmak azonban egy picit klnbznek.
43

Az assemblerben ltrehozott szegmenseknek van nevk (azonostjuk, ami teht egy szimblum), mretk legfeljebb 64 Kbjt lehet, s nem felttlenl kell sszefggnek lennie egy szegmens defincijnak. Ez utbbi tulajdonsg tbb szabadsgot enged a programoznak, mivel megteheti, hogy elkezd egy szegmenst, majd definil egy msikat, azutn megint visszatr az els szegmensbe. Az azonos nven megkezdett szegmensdefincikat az assembler s a szerkeszt szpen sszefzi 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), akkor a fennmarad bjtokkal az assembler nem foglalkozik, a program futsakor ezek valami "szemetet" fognak tartalmazni. A memria-modell elrsa akkor fontos, ha nem akarunk foglalkozni klnbz szegmensek (adat-, kd-, verem- stb.) ltrehozsval, s ezt a folyamatot az assemblerre akarjuk hagyni. Ehhez viszont jeleznnk kell az assemblernek, hogy elrelthatlag mekkora lesz a programunk memriaignye, hny s milyen tpus szegmensekre van szksgnk. Ezt a tpus szegmensmegadst egyszerstett szegmensdefincinak (simplified segment definition) nevezzk. A kt mdszert keverve is hasznlhatjuk kedvnk s ignyeink szerint, nem fogjk egymst zavarni (mi is ezt fogjuk tenni). Ha magas szint nyelvhez runk kls Assembly rutinokat, akkor az egyszerstett szegmensmegads sokszor egyszerbb megoldst szolgltat. Most pedig lssunk nhny fontos direktvt: modul/forrsfjl lezrsa (END) szegmens definilsa (SEGMENTENDS) szegmenscsoport definilsa (GROUP)

44

szegmens hozzrendelse egy szegmensregiszterhez (ASSUME) rtkads a $ szimblumnak (ORG) memria-modell megadsa (MODEL) egyszerstett szegmensdefincik (CODESEG, CONST, DATASEG, FARDATA, STACK, UDATASEG, UFARDATA, .CODE, .DATA, .STACK) helyfoglals (vltoz ltrehozsa) (DB, DW, DD, DF, DQ, DT) konstans/helyettest szimblum ltrehozsa (=, EQU) eljrs definilsa (PROCENDP) kls szimblum definilsa (EXTRN) szimblum lthatv ttele a klvilg szmra (PUBLIC) feltteles fordts elrsa (IF, IFccc, ELSE, ELSEIF, ENDIF) kls forrsfjl beszrsa az aktulis pozciba (INCLUDE) felhasznli tpus definilsa (TYPEDEF) struktra, uni, rekord definilsa (STRUCENDS, UNIONENDS, RECORD) a szmrendszer alapjnak tlltsa (RADIX) makrdefinci (MACROENDM) makrmveletek (EXITM, IRP, IRPC, PURGE, REPT, WHILE) utastskszlet meghatrozsa (P8086, P186, P286, P386 stb.; .8086, .186, .286, .386 stb.) A direktvk hasznlatra ksbb mg visszatrnk. Assemblerbl tbb is ltezik PC-re, ilyenek pl. a Microsoft Macro Assembler (MASM), Turbo Assembler (TASM), Netwide Assembler (NASM), Optimizing Assembler
45

(OPTASM). Ebben a jegyzetben a programokat a TASM jellsmdban rjuk le, de tbb-kevesebb trssal msik assembler al is tvihetk a forrsok. A TASM specialitsait nem fogjuk kihasznlni, ahol nem muszj. A TASM sajt linkert hasznl, ennek neve Turbo Linker (TLINK).

6 A 8086-OS PROCESSZOR UTASTSKSZLETE


Itt az ideje, hogy megismerkedjnk a kivlasztott processzorunk ltal ismert utastsokkal. Az utastsok kzs tulajdonsga, hogy az operandusoknak teljestenik kell a kvetkez feltteleket: Ha egyetlen operandusunk van, akkor az ltalban csak az ltalnos regiszterek kzl kerlhet ki, vagy pedig memriahivatkozs lehet (nhny esetben azonban lehet konstans 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 errl majd ksbb.) A kt operandus mretnek majdnem mindig meg kell egyeznie, ez all csak nhny specilis eset kivtel.

46

6.1 Prefixek
Elszr lssuk a prefixeket, a gpi kdjukkal egytt: 6.1.1 Szegmensfellbrl prefixek 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 kivtelvel brmely ms utasts eltt megadva ket az alaprtelmezs szerinti szegmensregiszter helyett hasznland regisztert adjk meg. Termszetesen ez csak a valamilyen memriaoperandust hasznl utastsokra vonatkozik.

6.1.2 Buszlezr prefix 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 mvelet lefolysig. Csak a kvetkez utastsok esetn hasznlhat: ADD, ADC, SUB, SBB, AND, OR, XOR, NOT, NEG, INC, DEC, XCHG, ms esetekben hatsa definilatlan. 6.1.3 Sztringutastst ismtl prefixek Lehetsges alakjaik: REP/REPE/REPZ (0F3h), REPNE/REPNZ (0F2h). Csak a sztringkezel utastsok eltt hasznlhatk, ms esetben kvetkezmnyk kiszmthatatlan. Mkdskrl s hasznlatukrl ksbb szlunk.
47

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 verembl POPF Flags regiszter kivtele a verembl IN adat olvassa portrl OUT adat kirsa portra LEA tnyleges memriacm betltse LDS, LES teljes pointer betltse szegmensregiszter: ltalnos regiszter regiszterprba CBW AL eljeles kiterjesztse AX-be CWD AX eljeles kiterjesztse DX:AX-be XLAT/XLATB AL lefordtsa a DS:BX cm fordt tblzattal LAHF Flags als bjtjnak betltse AH-ba SAHF AH betltse Flags als bjtjba CLC CF flag trlse CMC CF flag komplementlsa (invertlsa) STC CF flag belltsa CLD DF flag trlse STD DF flag belltsa CLI IF flag trlse STI IF flag belltsa
48

6.2.2 Egsz szmos aritmetika ADD sszeads ADC sszeads tvitellel (CF) egytt SUB kivons SBB kivons tvitellel (CF) egytt CMP sszehasonlts (flag-ek belltsa a cl s a forrs klnbsgnek megfelelen) INC inkrementls (nvels 1-gyel), CF nem vltozik DEC dekrementls (cskkents 1-gyel), CF nem vltozik NEG kettes komplemens kpzs (szorzs -1-gyel) MUL eljeltelen szorzs IMUL eljeles szorzs DIV eljeltelen maradkos oszts IDIV eljeles maradkos oszts

6.2.3 Bitenknti logikai utastsok (Boole-mveletek) AND logikai AND OR logikai OR XOR logikai XOR NOT logikai NOT (egyes komplemens kpzs) TEST logikai bit tesztels (flag-ek belltsa a kt op. logikai AND-jnek megfelelen)

6.2.4 Bitlptet utastsok SHL eljeltelen lptets (shiftels) balra SAL eljeles lptets balra (ugyanaz, mint SHL) SHR eljeltelen lptets jobbra SAR eljeles (aritmetikai) lptets jobbra ROL balra forgats (rotls) RCL balra forgats CF-en t
49

ROR jobbra forgats RCR jobbra forgats CF-en t

6.2.5 Sztringkezel utastsok MOVS, MOVSB, MOVSW sztring mozgatsa CMPS, CMPSB, CMPSW sztringek sszehasonltsa SCAS, SCASB, SCASW keress sztringben LODS, LODSB, LODSW betlts sztringbl 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 eltt DAA BCD rendezs sszeads utn DAS BCD rendezs kivons utn

6.2.7 Vezrlstad utastsok


JMP felttel nlkli ugrs JCXZ ugrs, ha CX=0000h Jccc feltteles ugrs ("ccc" egy felttelt r le) LOOP CX dekrementlsa s ugrs, ha CX 0000h LOOPE, LOOPZ CX dekrementlsa s ugrs, ha ZF=1 s CX 0000h LOOPNE, LOOPNZ CX dekrementlsa s ugrs, ha ZF=0 s CX 0000h CALL eljrs (szubrutin) hvsa RET, RETF visszatrs szubrutinbl INT szoftver-megszakts krse
50

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

6.2.8 Rendszervezrl utastsok HLT processzor lelltsa amg megszakts (vagy reset) nem rkezik

6.2.9 Koprocesszor-vezrl utastsok WAIT adatszinkronizls a koprocesszorral ESC utasts kldse a koprocesszornak

6.2.10 Specilis utastsok NOP res utasts (igazbl XCHG AX, AX), kdja 90h

Az adatmozgat utastsok a leggyakrabban hasznlt utastsok kategrijt alkotjk. Ez termszetes, hiszen ms (magasabb szint) programozsi nyelvekben is sokszor elfordul, hogy valamilyen adatot olvasunk ki vagy tltnk be egy vltozba, avagy valamelyik portra. Kicsit kilgnak ebbl a sorbl a CBW, CWD, XLAT utastsok, de mondjuk a flag-eket llt CLC, CMC stb. utastsok is kerlhettek volna msik kategriba. Az egsz aritmetiks utastsokat szintn nagyon sokszor hasznljuk programozskor. A CMP utastsnak pl. kulcsszerepe lesz a klnfle elgazsok (feltteles vezrlsi szerkezetek) lekdolsban.

51

A Boole-mveletekkel mindenfle bitmveletet (bellts, maszkols, tesztels) el tudunk vgezni, a munkk sorn ppen ezrt nlklzhetetlenek. Shiftel mveleteket fleg a mr emltett, 2 hatvnyval val szorzs gyors megvalstsra alkalmazunk. Ezenkvl nagy precizits, sajt aritmetikai mveletek 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 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 aritmetikra. Kifejezetten ritkn hasznljuk ket, br ez elg szubjektv kijelents. A vezrlstad utastsok a programok egyik alappillrt alkotjk, helyes hasznlatuk a jl mkd algoritmus alapfelttele. Rendszer- s koprocesszor-vezrl utastsokat csak specilis esetekben, kls 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 mkdst tekintve gyakorlatilag nem csinl semmit. Hasznos lehet, ha a kdba olyan res bjtokat akarunk beszrni, amit ksbb esetleg valami egyb clra hasznlunk majd, de nem akarjuk, hogy a processzor azt valamilyen utastsnak rtelmezve nemkvnatos mellkhats lpjen fel. A NOP kdja egyetlen bjt (90h). Szegmensregiszter-operandust (ami nem egyenl a szegmensfellbrl prefixszel) a fenti utastsok kzl csak a MOV, PUSH s POP kaphat, de ezzel egyelre ne foglalkozzunk, ksbb mg visszatrnk rjuk.
52

7 VEZRLSI SZERKEZETEK MEGVALSTSA


Most megnzzk, hogy kdolhat le nhny gyakran hasznlt vezrlsi szerkezet Assemblyben. Eltte azonban ejtnk nhny szt a programrs-fordts-szerkeszts menetrl. A programok forrsllomnynak a knnyebb azonosts vgett (s a hagyomnyok betartsa rdekben is) clszer egy . ASM kiterjeszts nevet adni. A forrst brmilyen szvegszerkesztvel (pl. a DOS-os EDIT, valamilyen commander program szerkesztje, 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:
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 definilt szegmensek adatai, valamint a hasznlt szimblumokat sszegyjt szimblumtblt. A keresztreferencia-tblzat tartalmazza, hogy a klnbz
53

szimblumokat hol definiltk, ill. mely helyeken hivatkoztak rjuk. Ez a fjl binris (teht nem szveges), rtelmes informcit belle 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 bc rend szerint, mg a msodik a definils sorrendje szerinti szegmens-sorrendet r el. Alaprtelmezs a /s. /l, /la A listzs formtumt befolysoljk: norml (/l) ill. kibvtett (/la) lista fog kszlni. Alaprtelmezs a /l. /m# A fordts # menetes lesz. Alaprtk a 2. /z Hiba esetn a forrs megfelel sort is kirja. /zi, /zd, /zn A trgykdba bekerl nyomkvetsi informcit befolysoljk: teljes (/zi), csak a programsorok cmei (/zd) vagy semmi (/zn). Alaprtelmezs a /zn. 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 fprogram trgykdjt kell legelsnek megadnunk. A futtathat fjl nevt kvnsgunk szerint megadhatjuk, klnben a legels trgykd fjl (a fprogram) nevt fogja kapni. A trkpfjl (map file) az egyes modulokban definilt szegmensek, szimblumok adatait tartalmazza, valamint kln krsre azoknak a programsoroknak a sorszmait, amikhez kd kerlt lefordtsra. A knyvtrakban (library) tbb trgykd llomny lehet sszegyjtve, a
54

program rsakor teht ezekbl 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). /c rzkeny lesz a kisbetkre s nagybetkre. /v Engedlyezi a nyomkvetsi informcik beptst a futtathat fjlba. /t .EXE helyett .COM tpus futtathat fjlt kszt.

7.1 Szekvencilis vezrlsi szerkezet


A processzor mindig szekvencilis utasts-vgrehajtst alkalmaz, hacsak nem hasznlunk valamilyen vezrlstad utastst. Lssuk ht els Assembly programunkat, ami nem sok hasznos dolgot csinl, de kezdsnek megteszi.
Pelda1.ASM: MODEL SMALL .STACK ADAT Kar Szo Szam Ered ADAT KOD SEGMENT DB a DW Ha DB 12h DW ? ENDS SEGMENT ASSUME CS:KOD,DS:ADAT
55

@Start:

KOD

MOV MOV MOV MOV XOR ADD SUB MOV MOV INT ENDS END

CX,ADAT DS,CX BL,[Kar] AX,[Szo] BH,BH AX,BX AL,[Szam] [Ered],AX AX,4C00h 21h @Start

A programban hrom szegmenst hozunk ltre: egy ADAT nevt az adatoknak, egy KOD nevt az utastsoknak, illetve egy vermet. Utbbit a .STACK egyszerstett szegmensdefincis 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, ami annyit tesz, hogy a kd- s az adatterlet mrete kln-kln max. 64 Kbjt lehet. Szegmensdefincit a szegmens nevbl s a SEGMENT direktvbl ll sorral kezdnk, ezt kveti a szegmens tartalmnak lersa. Lezrsknt a szegmens nevt s az azt kvet ENDS foglalt szt tartalmaz sort rjuk. Azaz:
Nv SEGMENT {attribtumok} defincik Nv ENDS

A SEGMENT kulcssz utn a szegmens jellemzit 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 egyelre mg ne trdjnk.
56

Az adatszegmensben ngy vltozt hozunk ltre. Ebbl 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 Define 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 vltoznak. A kezdeti rtk megadsnl rhatunk kznsges szmokat (12h), karakterkonstansokat ('a'), sztring-konstansokat ("Ha"), ezek valamilyen kifejezst, illetve ha nem akarunk rtket adni neki, akkor egy ?-et is. A krdjellel definilt 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 rtk legyen. Vesszvel elvlasztva tbb rtket is felsorolhatunk, ekkor mindegyik rtkhez egy jabb terlet lesz lefoglalva. gy pl. a kvetkez 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 offszetcmt. Mindezeket az ASSUME direktvval intzzk el. Az ASSUME direktva szintaxisa:
ASSUME SzegReg:SzegNv<,SzegReg:SzegNv> ASSUME NOTHING

57

A SzegReg valamilyen szegmensregisztert jelent, a SzegNev helyre pedig egy definilt 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 elz hozzrendelst megszntet. Rgtn ezutn egy cmke kvetkezik, aminek a @Start nevet adtuk (a "kukac" most csak arra utal, hogy ez nem vltoz-, hanem cmkeazonost). Rendeltetse az, hogy a program indulsnak helyt jelezze, erre az informcira ugyanis az assemblernek, linkernek s az opercis rendszernek is szksge van. Az els utastst, ami vgrehajthat gpi kdot generl, a MOV (MOVe data) kpviseli. Ez kt operandussal rendelkezik: az els a cl, a msodik a forrs (ez persze az sszes ktoperandus utastst jellemzi). Mkdse: egyszeren veszi a forrs tartalmt, s azt bemsolja (eltrolja) a cl op. terletre. Ekzben a forrs tartalmt, ill. a flag-eket bkn hagyja, csak a cl tartalma mdosul(hat). Az els 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 elrs. Lthat, hogy az ADAT szegmens cmt elszr betltjk egy ltalnos regiszterbe (CX), majd ezt bemozgatjuk DS-be. Viszont a MOV DS,ADAT utasts rvnytelen lenne, mert az Intel 8086-os proci 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 r58

vnytelen), csak a vezrlstad utastsok vltoztathatjk meg CS-t. Olvasni viszont lehet belle, gy pl. a MOV SI,CS helyes utasts lesz. A kvetkez 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 offszetje. 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 mvel. 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 mvelet elvgzse sorn belltja az OF, SF, ZF, AF , PF s CF flag-eket. Kitallhat, hogy a kvetkez sorban a Szam vltoz tartalmt vonjuk le az AL regiszterbl, a SUB (SUBtract) ugyanis a forrs tartalmt vonja ki a clbl. Szmolsunk eredmnyt el is kell tenni, ezt vgzi el a MOV [Ered],AX sor. Ha befejeztk dolgunkat, s "ki akarunk lpni a programbl", akkor errl az aktulis opercis rendszert (ez most a DOS) kell rtesteni, s az majd cselekedni fog. Ezt vgzi el programunk utols kt sora. Magyarzatkppen csak annyit, hogy a 21h szoftver-megszakts alatt rhetjk el a DOS
59

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 vltoz rtke a DOS-ban). A megszaktst az egyoperandus INT (INTerrupt request) utasts vltja ki, s ezzel a program futsa befejezdik. Az INT operandusa csak egy bjt mret kzvetlen rtk lehet. A megszaktsok hasznlatt ksbb trgyaljuk, most egyelre 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 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 rendszerben rtelmezi az assembler, 256-os alap szmknt tekintve ket. Ezrt a Szo tartalma 4861h. Az sszeads utn gy 4861h+61h=48C2h lesz AX-ben. Ebbl mg levonjuk a Szam tartalmt (12h), s ezzel kialakul a vgeredmny: 48B0h.

7.2 Szmllsos ismtlses vezrls


Magas szint nyelvekben igen gyakran alkalmaznak olyan ciklusokat, ahol a ciklusvltoz egy bizonyos tartomnyt fut be,
60

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 az ismtls tartomnya, csak a lefutsok szmt rhatjuk el. A kvetkez program kt vektor (egydimenzis tmb) tartalmt sszegzi egy harmadik vektorba. Az egyik vektor eljeles bjtokbl, mg a msik eljeles szavakbl fog llni.
Pelda2.ASM: MODEL SMALL .STACK ADAT ElemSzam Vekt1 Vekt2 Eredm ADAT KOD @Start: SEGMENT EQU 5 DB 6,-1,17,100,-8 DW 1000,1999,-32768,4,32767 DW ElemSzam DUP (?) ENDS SEGMENT ASSUME CS:KOD,DS:ADAT MOV MOV MOV XOR MOV MOV CBW ADD MOV AX,ADAT DS,AX CX,ElemSzam BX,BX SI,BX AL,[Vekt1+BX] AX,[Vekt2+SI] [Eredm+SI],AX
61

@Ciklus:

KOD

INC LEA LOOP MOV INT ENDS END

BX SI,[SI+2] @Ciklus AX,4C00h 21h @Start

Az els jdonsgot az adatszegmensben szerepl EQU (define numeric EQUate) kulcssz kpviseli. Ez a fordtsi direktva numerikus konstanst (pontosabban helyettest makrt) tud ltrehozni, ezrt leginkbb a C nyelv #define utastshoz hasonlthat. Hatsra az ElemSzam szimblum minden elfordulst 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 kvetkezkppen is lefoglalhattuk volna:
Eredm DW 0,0,0,0,0

Ez a megolds azonban nem tl rugalmas. Ha ugyanis megvltoztatjuk az ElemSzam rtkt, akkor az Eredm defincijhoz is hozz kell nylni, illetve ha nagy az elemek szma, akkor sok felesleges 0-t vagy krdjelet kell kirnunk. Ezeket a knyelmetlensgeket sznteti meg a duplikl opertor. A DUP (DUPlicate) hatsra az opertor bal oldaln ll szm (ElemSzam), adott tpus (DW) elemekbl ll terlet lesz lefoglalva, amit az assembler a DUP jobb oldaln zrjelben szerepl kifejezssel (most ?) inicializl (azaz ez lesz a kezdrtk). Ez a mdszer teht jval leegyszersti a nagy vltozterletek ltrehozst is. A ciklusvltoz szerept a CX regiszter tlti be, ami nem vletlen, hiszen a regiszter neve is innen szrmazik (Counter).

62

A vektorelemek elrsre most nem hasznlhatunk kzvetlen cmzst, hiszen azzal csak a vektorok legels 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 offszet rtk lesz. Pointereket csak bzis- vagy indexregiszterekben trolhatunk, hiszen csak ezekkel vgezhet memriahivatkozs. A msik mdszer lehetv teszi, hogy a vltozinkat tnylegesen tmbnek tekinthessk, s ennek megfelelen az egyes elemeket indexelssel (tmbelem-hivatkozssal) rhessk el. Ehhez a megoldshoz szksg van a tmbk bzisra (kezdcmre), illetve az elemkivlasztst megvalst tmbindexre. A tmbk kezdcmt most konkrtan tudjuk, gy ez konstans numerikus rtk lesz. A tmbindexet tetszsnk szerint trolhatjuk brmely bzis- vagy indexregiszterben. Mivel minden vektorban elemrl-elemre sorban haladunk, valamint a Vekt2 s az Eredm vektorok is szavasak, ezrt most csak kett 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. Assemblyben a ciklus magja a ciklus kezdett jelz cmktl (most @Cimke) a cikluskpz utastsig (ez lesz a LOOP) tart. A Vekt1 kvetkez elemt olvassuk ki elszr AL-be, bzisrelatv cmzst hasznlva. Azutn ehhez kne hozzadnunk a Vekt2 megfelel elemt. A kt vektor elemmrete azonban eltr, egy bjtot pedig nem adhatunk hozz egy szhoz. Ez megoldhat, ha a bjtot tkonvertljuk szv. A CBW (Convert Byte to Word) utasts pont ezt teszi, az AL-ben lev rtket

63

eljelesen kiterjeszti AX-be. gy mr elvgezhet 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. Mkdse 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 ADD SI SI

2)

SI,2

Mindkt megoldsnak van egy pici szpsghibja: az els feleslegesen ismtel meg egy utastst, a msodik viszont tl nagy kdot generl (4 bjtot), s a flag-eket is ellltja. Ha kicsi a hozzadand rtk (mondjuk eljelesen 1 bjtos), akkor rdemesebb a LEA (Load Effective Address) utastst hasznlni. Ez a forrs memriaoperandus tnyleges cmt (effective address) tlti be a cloperandusba, ami csak egy 16 bites ltalnos regiszter lehet. Az sszes flag-et bkn hagyja. Tnyleges cm alatt a hasznlt cmzsi md ltal jellt, meghatrozott memriacmet (offszetet) rtjk. gy a LEA SI, [SI+2] utasts a DS:(SI+2) cm memriarekesz offszetcmt tlti be SI-be, azaz 2-vel megnveli SI-t. Ez gy csak 3 bjtos utastst eredmnyez. Az utasts jelentsge 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.
64

A tnyleges cikluskpzst a LOOP utasts vgzi. Mkdse: cskkenti CX-et, ha az zr, akkor a LOOP utni utastsra kerl a vezrls, klnben elugrik az operandus ltal mutatott memriacmre. A cskkents sorn egyetlen flag rtke sem vltozik meg. A LOOP .n. relatv ugrst hasznl, ami azt jelenti, hogy a cl cmet a LOOP utn kvetkez 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 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 elszr cskkenti CX-et, s csak ezutn ellenrzi, hogy az nullv vlt-e. gy ha a ciklusba belpskor CX zr volt, akkor nem egyszer, hanem 65536-szor fog lefutni ciklusunk! A LOOP utastssal megrt ciklus teht legalbb 1szer 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 mveleti 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.

7.3 Egyszer s tbbszrs szelekcis vezrls


65

Ez a vezrlsi szerkezet egy vagy tbb felttel teljeslse vagy nem teljeslse szerinti elgazst tesz lehetv a program menetben. Megfelel az IFTHENELSE utastsok lncolatnak. A megoldand problma: konvertljunk t egy karaktersorozatot csupa nagybetsre. Az kezetes betkkel most nem trdnk, a szveget pedig az ASCII 00h kd karakter fogja lezrni.
Pelda3.ASM: MODEL SMALL .STACK ADAT Szoveg ADAT KOD @Start: SEGMENT DB Ez egy PELDA szoveg. DB Jo proci a 8086-os!,00h ENDS SEGMENT ASSUME CS:KOD,DS:ADAT MOV MOV PUSH POP LEA MOV CLD LODSB OR JZ CMP JB AX,ADAT DS,AX DS ES SI,[Szoveg] DI,SI

@Ciklus:

AL,AL @Vege AL,a @Tarol


66

@Tarol: @Vege: KOD

CMP JA SUB STOSB JMP MOV INT ENDS END

AL,z @Tarol AL,a-A @Ciklus AX,4C00h 21h @Start

A program elejn kt ismers utastssal is tallkozhatunk, ezek a verem trgyalsnl mr emltett PUSH s POP. Mindkett 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. A programban szerepl PUSH-POP pr tulajdonkppen DS tartalmt tlti ESbe, 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 kitztt 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 ksbbi 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, csakhogy gy, hogy kzben csak CS rtke vltozna, IP- nem! Ez pedig veszlyes s
67

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 ksbbi processzorokon ennek a kdnak ms a szerepe. Ezrt s az elbb emltettek miatt NE hasznljuk!) A kvetkez hrom utasts a sztringkezel utastsokat (LODSB s STOSB) kszti el. A forrssztring cmt DS:SI fogja tartalmazni, gy a Szoveg offszetjt 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 egyenlv tesszk SI-vel. A CLD (CLear Direction flag) a DF flag-et trli. Ennek szksgessge rgvest kiderl. A LODSB (LOaD String Byte) a DS:SI cmen lev 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 szt, s SI-t 2-vel nveli vagy cskkenti DF-tl fggen. Egyetlen flag-et sem vltoztat meg. Az OR AL,AL utasts ismt egy trkkt mutat be. Ha egy szmot nmagval hozunk logikai VAGY kapcsolatba, akkor maga a szm nem vltozik meg. Cserbe viszont CF, AF s OF trldik, SF, ZF s PF pedig az operandusnak megfelelen mdosulnak. Itt most annak tesztelsre hasznltuk, hogy AL zrus-e, azaz elrtk-e a sztringnk vgt. Ezt megtehettk volna a ksbb szerepl CMP AL,00h utastssal is, csak gy elegnsabb. Elrkeztnk a megolds kulcshoz, a feltteles ugrsokhoz (conditional jumps). Ezek olyan vezrlstad utastsok, amik valamilyen flag (vagy flag-ek) llsa alapjn vagy elugranak az operandus szerinti cmre, vagy a kvetkez utastsra trnek. sszesen 17 db van bellk, de mnemonikbl ennl tbb van,
68

mivel nmelyik egynl tbb elnevezs alatt is elrhet. Hrom csoportba oszthatk: eljeles aritmetikai, eljeltelen aritmetikai s egyb feltteles ugrsok. Elszr jjjenek az eljeles vltozatok: Mnemo. JL, JNGE JNL, JGE JLE, JNG JNLE, JG Hats Ugrs, ha kisebb/nem nagyobb vagy egyenl Ugrs, ha nem kisebb/nagyobb vagy egyenl Ugrs, ha kisebb vagy egyenl/nem nagyobb Ugrs, ha nem kisebb vagy egyenl/nagyobb

A mnemonikokat teht gy kpezzk, hogy a J bett (ami a Jump if kifejezst rvidti) egy, kett vagy hrom bets rvidts kveti. Nmi angol tudssal knnyebben megjegyezhetk 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 eljel nlkli ugrsokat: Mnemonik JB, JNAE, JC Hats Ugrs, ha kisebb/nem nagyobb vagy egyenl/CF=1 JNB, JAE, JNC Ugrs, ha nem kisebb/nagyobb vagy egyenl/CF=0 JBE, JNA Ugrs, ha kisebb vagy egyenl/nem nagyobb JNBE, JA Ugrs, ha nem kisebb vagy egyenl/nagyobb Az alkalmazott rvidtsek:
69

B=Below C=Carry A=Above BE=Below or Equal AE=Above or Equal

Mint vrhat volt, a JB s JC ugyanazt jelentik, hiszen mindkett azt fejezi ki, hogy a legutols mvelet eljel nlkli aritmetikai tlcsordulst okozott. Lssuk a megmaradt tovbbi ugrsokat: Mnemo. JE, JZ JNE, JNZ JO JNO JS JNS JP, JPE JNP, JPO JCXZ Hats Ugrs, ha egyenl/ZF=1 Ugrs, ha nem egyenl/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=Overflow S=Sign P=Parity PE=Parity Even PO=Parity Odd CXZ=CX is Zero (vagy CX equals Zero)

70

Mint lthat, a JCXZ kakukktojs a tbbi ugrs kztt, mivel nem egy flag, hanem a CX regiszter llsa szerint cselekszik. Mindegyik feltteles ugr utasts egyetlen operandusa a cl memriacm, de ez is eljeles 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 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:

A 200 bjtos terletfoglals biztostja, hogy a JZ utastst kvet bjt messzebb legyen a @Cimke cmktl, 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 DB @Cimke: AX,AX @KamuCimke @Cimke 200 DUP (?)

A pldaprogramhoz visszatrve, az OR AL,AL s a JZ hatsra megoldhat, hogy az algoritmus lelljon, ha elrtk a sztring vgt.
71

Most jn maga a szelekci: el kell dnteni, hogy az aktulis karaktert (ami AL-ben van) kell-e konvertlni. Konverzit kell vgezni, ha 61hAL7Ah ('a' kdja 61h, 'z' kdja 7Ah), klnben vltozatlanul kell hagyni a karaktert. Elszr 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 CMP (CoMPare) utasts kiszmtja a cloperandus s a forrsoperandus klnbsgt, belltja a flag-eket, az operandusokat viszont bkn hagyja (s eldobja az eredmnyt is). A konverzit az egyetlen SUB AL,'a'-'A' utasts vgzi el. Akr volt konverzi, akr nem, az algoritmus vgrehajtsa a @Tarol cmktl folytatdik. Megfigyelhetjk, 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 ttekinthetbbek lesznek ltaluk. Most jn a krdses karakter eltrolsa. Ezt egy msik sztringkezel utasts, a STOSB (STOre String Byte) intzi el. Mkdse: 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). Mkdse: az operandusknt megadott cmre lltja be IP-t (van egy msik, tvoli formja is, ekkor CS-t is tlltja), s
72

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 cmekre tudunk elre-htra ugrlni. (Ez csak a kzeli, ugyanazon kdszegmensen belli ugrsra vonatkozik, de errl majd ksbb.) Ha jobban megnzzk, szrevehetjk, hogy az algoritmus elejn szerepl OR AL,AL // JZ @Vege s az utbbi JMP @Ciklus utastsok egy hurok vezrlsi szerkezetet rnak el, amiben az OR-JZ pros alkotja a kilpsi felttelt, a JMP pedig maga a ciklusszervez utasts (t.i. vgtelen ciklust valst meg). De ha jobban tetszik, ezt tekinthetjk akr elfeltteles vezrlsi szerkezetnek is (WHILEDO ciklus). A @Vege cmke elrsekor a kiindul sztringnk mr nagybetsen virt a helyn.

7.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 eljel nlkli szmot kirja a kpernyre decimlis alakban!
Pelda4.ASM: MODEL SMALL .STACK KOD SEGMENT
73

ASSUME CS:KOD,DS:NOTHING DecKiir PROC PUSH PUSH PUSH PUSH MOV XOR OR JZ XOR DIV PUSH INC JMP MOV JCXZ AX BX CX DX BX,10 CX,CX AX,AX @CiklVege DX,DX BX DX CX @OsztCikl AH,02h @NullaVolt DX DL,0 21h @KiirCikl @KiirVege DL,0 21h DX CX BX AX

@OsztCikl:

@CiklVege: @KiirCikl:

POP ADD INT LOOP JMP @NullaVolt: MOV INT @KiirVege: POP POP POP POP RET DecKiir ENDP UjSor PROC PUSH

AX
74

UjSor @Start:

PUSH MOV MOV INT MOV INT POP POP RET ENDP XOR CALL CALL MOV CALL CALL MOV CALL CALL MOV CALL CALL MOV INT ENDS END

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

KOD

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. Nzzk elszr a fprogramot (azaz a @Start cmke utni rszt)! Itt minden ismersnek tnik, kivve a CALL utastst. Ez az egyoperandus utasts szolgl az eljrsok vgrehajtsra, ms szval az eljrshvsra (procedure call). Mkdse: 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 eljeles
75

relatv cmknt trolja. (Ltezik tvoli formja is, ekkor CS-t is lerakja a verembe az IP eltt, 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 kvetkez 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 mdon definilhatunk:
Nv PROC {opcik} eljrstrzs Nv ENDP

Az eljrs trzst (azaz annak mkdst ler utastsokat) a PROCENDP direktvk (nem pedig mnemonikok!) fogjk kzre. Van nhny olyan rsz, ami a legtbb eljrs trzsben kzs. Az eljrs elejn szoksos az eljrsban ksbb mdostott regiszterek tartalmt a verembe elmenteni, hogy azokat ksbb visszallthassuk, s a hv program mkdst 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 eltt 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
76

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 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 elfeltteles 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 eljeltelen osztsra. Egyetlen operandusa van, ami 8 vagy 16 bites regiszter vagy memriahivatkozs lehet. Ha az operandus bjt mret, 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 flag rtkt elrontja. Neknk most a msodik esetet kell vlasztanunk, mert elfordulhat, hogy az els 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 eltt trlnnk kell. A maradkokat a veremben fogjuk trolni az egyszerbb kirats kedvrt, ezrt DX-et berakjuk oda, majd a szmllt megnveljk. Vgl visszaugrunk az oszt ciklus elejre. A szmjegyek kirsra a legegyszerbb 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 karaktert kirja a kpernyre az
77

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 21h-s 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 kpernyre. Ezt egy egyszer szmllsos ismtlses vezrlssel (LOOP ciklussal) elintzhetjk. Mivel a verem LIFO mkds, gy a legutoljra betett maradkot vehetjk ki legelszr, s ezt is kell els 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 verembl kiszedi IP-t (amit elzleg a CALL rakott oda), s onnan folytatja a vgrehajtst. De rhatunk egy 16-bites kzvetlen rtket (numerikus konstanst) 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 RET-tel visszatrnk a fprogramba. Az UjSor eljrs nagyon egyszer s rvid. A regiszterek elmentsn-visszalltsn kvl csak kt megszakts-hvst tartalmaz, amik a 0Dh s 0Ah ASCII kd karaktereket rjk ki a kpernyre. Az els karakter az .n. kocsivissza (CR

78

Carriage Return), a msik pedig a soremels (LFLine 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, a TASM lehetv 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 sorozattal:
PUSH PUSH PUSH PUSH POP POP POP AX BX CX DX SI DI ES

8 A TURBO DEBUGGER HASZNLATA


Az eddig megrt programjaink mkdst nem tudtuk ellenrizni, gy pedig elg knyelmetlen programozni, hogy nem ltjuk, tnyleg azt csinlja-e a program, amit elvrunk tle. Ha valami rosszul mkdik, netn a szmtgp semmire sem reagl (ezt gy mondjuk, hogy "kiakadt" vagy "lefagyott"), a hiba megkeresse egyszeren remnytelen feladat segtsg nlkl. Ezt a termszetes ignyt elgtik ki a klnbz debugger (nyomkvet, de sz szerint "bogrtalant") szoftverek ill. hardverek. (Az elnevezs mg a szmtstechnika hskorszakbl szrmazik, amikor is az egyik akkori
79

szmtgp mkdst valamilyen rovar zavarta meg. Azta hvjk a hibavadszatot "bogrirtsnak".) A Turbo Assemblert s Linkert kszt Borland cg is knl egy szoftveres nyomkvet eszkzt, Turbo Debugger (TD) nven. Most ennek hasznlatval fogunk megismerkedni. A Turbo Debugger f tulajdonsga, hogy kpes egy futtathat llomnyt (.EXE vagy .COM kiterjesztssel) betlteni, majd annak gpi kd tartalmt Assembly forrsra visszafejteni. Ezt hvjuk disassembllsnak (disassembly). A legszebb a dologban az, hogy a programban szerepl kd- s memriahivatkozsokat konkrt szmok helyett kpes az eredeti forrsban szerepl szimblumokkal megjelenteni. Ezenkvl minden utastst egyenknt hajthatunk vgre, ha akarjuk, tbbszr is, st megadhatjuk, hogy a program vgrehajtsa egy bizonyos felttel teljeslse esetn szakadjon meg. Figyelhetjk a memria tetszleges terletnek tartalmt, a regiszterek s flag-ek rtkeit, s mindezeket meg is vltoztathatjuk. A program futst az eredeti forrsokon is kpes kvetni. Szval csupa-csupa hasznos szolgltatssal br, amikkel pont olyan knyelmesen figyelhetjk programunk tevkenysgt, mintha mondjuk a Borland C fejleszt 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 mveletet elvgeztk, akkor a .EXE llomnyunk (remlhetleg) tartalmazza az sszes szimbolikus informcit, amire a nyomkvets sorn szksg lehet.

80

A dolognak kt htrnya van: egyrszt .COM programokba nem kerlhet nyomkvetsi info, msrszt ez az adathalmaz az .EXE fjl mrett igencsak megnvelheti (elfordulhat, hogy az eredeti tbbszrse lesz a kimenet mrete). A legels pldaprogramot (Pelda1.ASM) begpeltk s elmentettk PELDA.ASM nven, majd lefordtottuk s linkeltk, az sszes debug informcit belerakva. A TD PELDA.EXE parancs kiadsa utni llapotot tkrzi a fenti kp. A kperny 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 ablak (CPU ablak) tbb rszre oszthat. A bal fels sarok az aktulis kd disassembllt vltozatt mutatja, s most ppen gy van belltva, hogy a forrs eredeti sorait is
81

megjelenti. A kvetkez vgrehajtand sor a bal oldalon egy kis jobbra mutat hromszggel van megjellve (ez most a CS:0009h cm sor). Emellett az egyes regiszterek s flag-ek tartalma lthat. Az elz llapothoz kpest megvltozott dolgokat fehr sznnel jelli meg. A jobb 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 nagyobb ablakban a forrsban kvethetjk nyomon a program futst. Itt mindig azt a fjlt ltjuk, amihez az ppen vgrehajtott kd tartozik. A kvetkez vgrehajtand sort a bal oldalon kis fehr hromszg mutatja. Az alatta lthat, Stack cmkj ablak a klnbz eljrs- s fggvnyhvsok sorn a verembe rakott argumentumokat mutatja. A legals, keskeny ablak a Watches cmkt viseli. Ennek megfelelen az ltalunk hajtott vltozk, memriaterletek aktulis rtkt kvethetjk itt figyelemmel. A fels sorban tallhat menrendszeren kvl minden ablakban elhvhat egy helyi men (local menu) az <ALT>+<F10> billentykombincival, ahol az aktulis ablakban (vagy rszablakban) rendelkezsre ll plusz szolgltatsokat rhetjk el. Ilyenek pl. az utasts assembllsa, regiszter tartalmnak megvltoztatsa, flag trlse, megfigyelend vltoz felvtele a Watches listba stb. Az ablakok kztt az <F6> s <Shift>+<F6> billentykkel mozoghatunk, mg az aktulis ablakon bell a <Tab> s a <Shift>+<Tab> kombincikkal lpkedhetnk a rszablakok kztt.

82

Most ttekintjk az egyes menk funkciit. A File men a szoksos llomnymveleteket 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, tetszleges llomnyt s mg sok minden mst. A Run menben, mint neve is sejteti, a futtatssal kapcsolatos tevkenysgek vannak sszegyjtve, de itt llthatk be a program futtatsi (parancssoros) argumentumai is. Szinte az sszes itteni szolgltatshoz tartozik valamilyen gyorsbillenty (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 kpernyjvel 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), kpernyvel kapcsolatos dolgok (Display options). A Window men az ablakokkal val bvszkedsre j, a Help men pedig a szoksos sgt tartalmazza. A TD egybknt nemcsak Assembly, de Pascal s C nyelv programot is kpes nyomon kvetni, s az ezekben a nyelvekben meglev sszes adattpust is kpes kezelni.

83

9 SZMOLS ELJELES SZMOKKAL, BITMVELETEK


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

9.1 Matematikai kifejezsek kirtkelse


Az els problmakrt a klnbz eljel szmokat tartalmaz matematikai kifejezsek kirtkelse alkotja. Pldul tegyk fel, hogy AL-ben van egy eljeles, mg BX-ben egy eljel 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 mretre kell hozni. Ez egsz pontosan kt dolgot jelent: az eljeles szmokat eljelesen, az eljelteleneket zr-kiterjesztsnek kell alvetni. Zrkiterjesztsen (zero extension) azt rtjk, amikor az adott rtk fels, hinyz bitjeit csupa 0-val tltjk fel, ellenttben az eljeles kiterjesztssel, ahol az eljelbitet hasznljuk kitlt rtkknt. Azt is vegyk figyelembe, hogy az eredmny mindig hosszabb lesz 1 bittel mint a kiindul tagok hossznak maximuma. Ha ez megvan, akkor jhet a tnyleges sszeads. Itt figyelnnk kell arra, mit s milyen sorrendben adunk ssze. Elszr az als bjtokon/ szavakon vgezzk el a mveletet. Itt kapunk egy rszeredmnyt, valamint egy esetleges tvitelt, amit a fels bjtok/szavak sszeadsakor is figyelembe kell venni. Ezek alapjn nzznk egy lehetsges megoldst:
84

CBW CWD ADD ADC

AX,BX DX,0000h

Elszr tisztzzuk az eredmny mrett. Az eljeles szm 8 bites, az eljeltelen 16 bites, ebbl 17 bit jn ki. Az als 16 bit meghatrozsa nem nagy kunszt, a CBW utasts szpen kiterjeszti eljelesen AL-t AX-be, amihez aztn hozzadhatjuk BX tartalmt. Az eredmny als 16 bitje ezzel mr megvan. A legfels bit azonban, mint gondolhatnnk, nem maga az tvitel lesz. Lssuk mondjuk, mi lesz, ha AL=-1, BX=65535. AX-ben eljeles 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 0FFFEh lesz, nem pedig 1FFFEh. A megolds kulcsa, hogy az eredmnyt 24 vagy 32 bitesnek tekintjk. Most az utbbit vlasztjuk, hiszen DX:AX-ben 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 eljeles szmot az CWD (Convert Word to Doubleword) operandus nlkli utasts DX:AX-be eljelesen kiterjeszti. A msik, BXben lev tagnak zr-kiterjesztsen kellene tesnie, amit mi most kihagyunk, de az sszeads sorn figyelembe fogunk venni. Miutn AX-ben kpeztk az eredmny als szavt, itt az ideje, hogy a fels szavakat is sszeadjuk az tvitellel egytt. A ktoperandus ADC (ADd with Carry) utasts annyiban tr el az ADD-tl, hogy a clhoz CF zr-kiterjesztett rtkt is hozzadja. Az eljeles tag fels szava mr DX-ben van, a msik tag fels szava azonban 0000h. Ezrt az utols utastssal DXhez hozzadjuk a kzvetlen adatknt szerepl nullt s CF-et is. Ha mindenkppen zr kiterjesztst akarunk, akkor gy kell mdostani a programot:
CBW
85

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, amihez a 0000h-t s az tvitelt hozzadva DX is nullv vlik. DX:AX gy a helyes eredmnyt fogja tartalmazni, ami 0000FFFEh. A feladatban helyettestsk most az sszeadst kivonssal, teht szeretnnk az AL-ben lev eljeles szmbl kivonni a BXben lev eljel nlkli szmot, az eredmnyt ugyancsak DX:AXben vrjuk. A megolds a kvetkez 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. Az sszes additv utasts az sszes aritmetikai flag-et, teht a CF, PF, AF, ZF, SF s OF flag-eket mdostja. 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 eljeles s eljeltelen szmok csak tovbb bonyoltjk. Azt is emltettk, hogy eljeles esetben a tagok eljelt le kell vlasztani a mveletek elvgzshez miutn megllaptottuk az eredmny eljelt. Ezen okbl mind szorzsbl mind osztsbl ltezik
86

eljeles s eljel nlkli vltozat is. Mindegyik utastsban kzs, hogy az egyik forrs tag s az eredmny helye is rgztve van, tovbb mindegyik utasts egyetlen operandust kap, ami csak egy ltalnos regiszter vagy memriahivatkozs lehet. Kzvetlen rtkkel teht nem szorozhatunk, de nem is oszthatunk. Nzzk meg elszr az eljel nlkli vltozatokat, ezek az egyszerbbek. 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 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, 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 eljeles esetben mindkt utasts ugyanazokat a regisztereket hasznlja a forrs illetve a cl trolsra, mint az eljel nlkli vltozatok. Eljeles szorzst az IMUL (Integer signed MULtiplication) utastssal hajthatunk vgre. Az eredmny eljele a szoksos szably szerint lesz meghatrozva, teht a kt forrs eljelbitjt logikai KIZR VAGY kapcsolatba hozva kapjuk meg. Vgl eljelesen osztani az IDIV (Integer signed DIVision) utasts alkalmazsval tudunk. A hnyados eljele ugyangy lesz meghatrozva, mint az IMUL esetn, mg a maradk az osztand eljelt rkli.
87

Ezek az utastsok elg "rendetlenl" mdostjk a flageket: a szorzsok a CF s OF flag-et vltoztatjk meg, mg a PF, AF, ZF s SF flag-ek rtke meghatrozatlan, az oszt utastsok viszont az sszes elbb emltett flag-et definilatlan llapotban hagyjk (azaz nem lehet tudni, megvltozik-e egy adott flag rtke, s ha igen, mire s mirt). Az utastsok hasznlatnak szemlltetsre nzznk meg egy kicsit sszetett pldt! Tegyk fel, hogy a kvetkez kifejezs rtkt akarjuk meghatrozni:
A B C D E F G

A betk ht szmot jellnek, ezek kzl A s B eljel nlkli bjtok, C s D eljeles bjtok, E s F eljel nlkli szavak, s vgl G eljel nlkli bjt. Feltesszk, hogy E nagyobb vagy egyenl F-nl. Az eredmny egy eljeles sz lesz, amit mveletek elvgzse utn AX-ben kapunk meg. Az osztsoknl a maradkkal nem trdnk, gy az eredmny csak kzelt pontossg lesz. Hasonlan nem foglalkozunk az esetleges tlcsordulsokkal sem. Lssuk ht a megoldst:
MOV SUB DIV MOV XOR MOV MUL MOV MOV IMUL CWD ADD ADC IDIV AX,[E] AX,[F] [G] CL,AL CH,CH AL,[A] [B] BX,AX AL,[C] [D] AX,BX DX,0000h CX
88

rdemes tgondolni, hogy a 6 mveletet milyen sorrendben clszer elvgezni. Elszr 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 mvelet legyen, az eljeltelen szorzst vgezzk el elbb, az eredmnyt BX-ben troljuk. Most jn a msik, eljeles szorzat kiszmolsa, aminek az eredmnyt rgtn eljelesen kiterjesztjk DX:AX-be, hogy az sszeadst vgre tudjuk hajtani. Az sszeg meghatrozsa utn elvgezzk a nagy eljeles osztst, s ezzel AX-ben kialakul a vgleges eredmny.

9.2 Bitforgat utastsok


Kvetkez tmnk a bitforgat utastsokat tekinti t. Ezek alapveten kt csoportra oszthatk: shiftel s rotl utastsokra. Az sszes ilyen utasts kzs jellemzje, 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 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 figyelembe veszi a 8086-os proci, gy pl. akr 200-szor is lptethetnk. A legutoljra kicsorg bit rtkt minden esetben CF tartalmazza. A shiftels fogalmt mr definiltuk a gpi aritmetika elemzse kzben, ezrt itt csak annyit emltnk meg, hogy shiftelsbl megklnbztetnk eljeles (ez az .n. aritmetikai)
89

s eljeltelen (ez a logikai) vltozatot, s mindkettbl van balra s jobbra irnyul utasts is. Mindegyik shiftel utasts mdostja a CF, PF, SF, ZF s OF flag-eket, AF rtke meghatrozatlan lesz. Balra shiftelni az SHL (SHift logical Left) s az SAL (Shift Arithmetical Left) utastsokkal tudunk, kzlk a msodik szolgl az eljeles lptetsre. Balra shiftelsnl azonban mindegy, hogy a cloperandus eljeles vagy eljeltelen 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 eljeles vltozatot az eljel nlklitl. Az SHR (SHift logical Right) eljel nlkli, mg az SAR (Shift Arithmetical Right) eljeles lptetst hajt vgre a cloperanduson. Nzznk most egy egyszer pldt a shiftels hasznlatra. Tegyk fel, hogy AL-ben egy eljeles 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.
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 mkdse remlhetleg mindenkinek vilgos.

90

Hasonl elgondolssal megoldhat az is, ha mondjuk az eljeles 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 mveletet rtjk, amikor az operandus bitjei szpen egyms utn balra vagy jobbra lpnek, mikzben a kicsorg bit a tloldalon visszalp. Ez a fajta rotls az operandus rtkt "megrzi", legalbbis olyan rtelemben, hogy ha mondjuk egy bjtot 8-szor balra vagy jobbra rotlunk, az eredeti vltozatlan bjtot kapjuk vissza. Rotlni nyilvn csak eljeltelen rtkeket lehet (teht az eljelbitnek 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. 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 bit fog belpni, hanem CF forgats eltti rtke. Szemlletesen ez annyit jelent, mintha a CF bit az operandus egy plusz bitje lenne: balra forgats esetn a legfels utni, mg jobbra forgatskor a legals bit eltti bit szerept tlti be. 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 program pldul a BL-ben lev rtk binris alakjt rja ki a kpernyre.
91

MOV MOV @Ciklus: MOV ROL ADC INT LOOP

AH,02h CX,8 DL,'0' BL,1 DL,00h 21h @Ciklus

Az algoritmus mkdse 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 bjtjt, vagy als s fels bitngyest akarjuk felcserlni. Pldul az
ROL ROR AL,4 SI,8

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

Az alapmdszer a kvetkez: balra lptetsnl az els utasts az SHL/SAL legyen, a tbbi pedig az RCL, s a legals bjttl haladunk a legfels, legrtkesebb bjt fel. Jobbra lptets esetn a helyzet a fordtottjra vltozik: a legfels bjttl
92

haladunk lefel, az els utasts a szm tpustl fggen 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 cmre msoljuk.

9.3 Bitmanipull utastsok


Utols tmakrnk a bitmanipulcik (bellts, trls, negls s tesztels) megvalstsval foglalkozik. Elsknt a logikai utastsok ilyen cl felhasznlst nzzk meg. Ebbe a csoportba 5 olyan utasts tartozik, amik az operandusok kztt ill. az operanduson valamilyen logikai mveletet hajtanak vgre bitenknt. 3 utasts (AND, OR s XOR) ktoperandus, a mvelet 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 forrs s cl is, tpusa szerint ltalnos regiszter vagy memriahivatkozs lehet. Az utastsok elnevezse utal az ltaluk vgrehajtott logikai mveletre is, ezrt bvebben nem trgyaljuk ket, a gpi logika lersban megtallhat a szksges informci. Az AND, OR, XOR s TEST utastsok a flag-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 flag-et sem.
93

A TEST klnleges logikai utasts, mivel a kt operandus kztt bitenknti logikai S mveletet vgez, a flag-eket ennek megfelelen belltja, viszont a kt forrst nem bntja, s a mvelet eredmnyt is eldobja. Egyszer logikai azonossgok alkalmazsa ltal ezekkel az utastsokkal kpesek vagyunk klnfle bitmanipulcik elvgzsre. Az alapproblma a kvetkez: 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 eljelbit (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 mvelet 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 bit(ek) helyn 0, a tbbi helyen pedig csupa 1-es ll, akkor kszen is vagyunk. Bitek belltshoz a logikai VAGY mveletet 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 mvelet 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 elbbi esetben. Ha az sszes bitet neglni akarjuk, azt megtehetjk az XOR operandus,111b utastssal, de ennl sokkal egyszerbb
94

a NOT operandus utasts hasznlata, ez radsul a flag-eket sem piszklja meg. (Az 111b jells egy csupa 1-esekbl ll binris szmot jelent.) Ha valamely bit vagy bitek llapott kell megvizsglnunk (ms szval tesztelnnk), a clravezet megolds az lehet, hogy az adott operandust olyan maszkkal hozzuk S kapcsolatba, ami a tesztelend bitek helyn 1-es, a tbbi helyen 0-s rtk. 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 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 1 be legyen lltva), akkor felesleges az AND utastst hasznlni. A TEST nem rontja el egyik operandust sem, s radsul a flag-eket az S mvelet eredmnynek megfelelen belltja. A bitmanipulci specilis esett jelenti a Flags regiszter egyes bitjeinek, azaz a flag-eknek a belltsa, trlse stb. Az aritmetikai flag-eket (CF, PF, AF, ZF, SF, OF) elg sok utasts kpes megvltoztatni, ezek eredmnyt rszben mi is irnythatjuk megfelel operandusok vlasztsval. A CF, DF s IF flag rtkt kln-kln llthatjuk bizonyos utastsokkal: trlsre a CLC, CLD s CLI (CLear Carry/Direction/Interrupt flag), mg belltsra az STC, STD s STI (SeT Carry/Direction/ Interrupt flag) utastsok szolglnak. Ezenkvl CF-et neglhatjuk a CMC (CoMplement Carry flag) utastssal. Mindegyik emltett utasts operandus nlkli, s ms flag-ek rtkt nem befolysoljk. Ha egy olyan flag rtkt akarjuk belltani, amit egyb mdon nehzkes lenne (pl. AF), vagy egy olyan flag rtkre vagyunk kvncsiak, amit eddig ismert mdon nem tudunk rni/
95

olvasni (pl. TF), akkor ms megoldst kell tallni. Kt lehetsg 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 mkdse a szoksos PUSH mvelettel egyezik meg. A POPF (POP Flags) ezzel szemben a verem tetejn lev szt leemeli ugyangy, mint a POP, majd a megfelel biteken szerepl rtkeket sorban betlti a flag-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 flag-ekbe tlti be. Ms flag-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 LAHF XOR SAHF AX AL,10h AX

2)

AH,10h

96

10 AZ ASSEMBLY NYELV KAPCSOLATA MAGAS SZINT NYELVEKKEL, 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 nyelvekben biztostva van. Ezutn megnzzk, hogy a Pascal s a C pontosan hogyan vgzi ezt el, de elbb tisztzzunk valamit: Ha a meghvott szubrutinnak (alprogramnak) nincs visszatrsi rtke, akkor eljrsnak (procedure), egybknt pedig fggvnynek (function) nevezzk. Ezt csak emlkeztetl mondjuk, no meg azrt is, mert Assemblyben formlisan nem tudunk klnbsget tenni eljrs s fggvny kztt, mivel mindkettt 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 vgl is minden fggvny, de ha visszatrsi rtke VOID, akkor eljrsnak minsl, s a fordtk is ekknt kezelik ket.

10.1 Paramterek tadsa regisztereken keresztl


Ez azt jelenti, hogy az eljrsokat/fggvnyeket (a tovbbiakban csak eljrsoknak nevezzk ket) gy rjuk meg,
97

hogy azok bizonyos regiszterekben krik a paramtereket. Hogy pontosan mely regiszterekben, azt mi dnthetjk el tetszlegesen (persze sszer keretek kztt, hiszen pl. a CS-t nem hasznljuk paramtertadsra), de nem rt figyelembe 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 eljrsunk, amely egy bjtokbl ll vektor elemeit sszegzi. Bemeneti paramterei a vektor cme, hossza. Visszatrsi rtke a vektor elemeinek eljeles sszege. Az eljrs felttelezi, hogy az sszeg elfr 16 biten.
Pelda5.ASM: Osszegez PUSH PUSHF CLD XOR @AddKov: LODSB CBW ADD
sszeghez

PROC AX BX,BX
;SI-nek nvekednie kell majd ;Kezdeti sszeg = 0 ;Kvetkez vektorkomponens AL-be ;eljelesen kiterjesztjk szv ;hozzadjuk a meglev

BX,AX

LOOP @AddKov ;Ismteld, amig CX > 0 POPF POP AX RET Osszegez ENDP . . . ;Plda eljrs meghvsra MOV CX,13 ;13 bjt hossz a
vektor 98

MOV

SI,OFFSET Egyikvektor
;cm offszetrsze ;feltesszk,hogy DS az ;adatszegmensre mutat

CALL MOV . . .

Osszegez DX,BX

;Pl. a DX-be tltjk az ;eredmnyt

;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 legelnysebb (a LODSB s LOOP utastsokat majdnem minden elkszlet utn hasznlhattuk). Az sszeget az eljrs a BX regiszterben adja vissza. rdemes egy pillantst vetni a PUSHF/POPF prra: az irnyjelzt trljk, mert nem tudhatjuk, hogy az eljrs hivsakor mire van lltva, de ppen e miatt fontos, hogy meg is rizzk azt. Ezrt mentettk el a flageket. 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.

10.2 Paramterek tadsa globlis vltozkon keresztl


99

Ez a mdszer analg az elzvel, annyi a klnbsg, hogy ilyenkor a paramtereket bizonyos globlis vltozkba tesznk, s az eljrs majd onnan olvassa ki ket. Magas szint 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 elz pldt:
Pelda6.ASM: Osszegez PUSH PUSH PUSHF CLD XOR MOV LDS @AddKov: LODSB CBW ADD
sszeghez

PROC AX BX BX,BX CX,Hossz SI,Cim


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

;Kvetkez vektorkomponens AL-be ;eljelesen kiterjesztjk szv

AX,BX

;hozzadjuk a meglev

LOOP @AddKov ;Ismteld, amig CX > 0 MOV Eredmeny,BX POPF POP BX POP AX RET Osszegez ENDP . . . ;Plda az eljrs meghivsra
100

MOV MOV

Hossz,13 ;13 bjt hossz a vektor WORD PTR Cim[2],DS


;ami az adatszegmensben ;van, gy a cm szegmens;rsze az DS WORD PTR Cim,OFFSET Egyikvektor ;* ;offszetrsze ;cm offszetrsze ;feltesszk,hogy DS az ;adatszegmensre mutat

MOV

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 fzni, 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 megrzi az eljrs. Van egy dolog, amire azonban nagyon vigyzni kell az effajta paramtertadssal. Kpzeljk el, hogy mr bertuk a paramtereket a vltozkba, de mg mieltt 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. Mi trtnik akkor, ha a Masikvektor komponenseit sszegezteti? is berja a paramtereit ugyanezekbe a globlis
101

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 mkdst okozza. Az elz esetben, ahol regisztereken keresztl adtuk t a cuccokat, ott ez nem fordulhatott volna el, hiszen egy megszaktsnak ktelessge elmenteni azokat a regisztereket, amelyeket felhasznl. A problma megoldsa teht az, hogy ha megszaktsban hvjuk ezt az eljrst, akkor meg kell el kell mentennk, majd vissza kell lltanunk a globlis vltozk rtkeit, mintha azok regiszterek lennnek.

10.3 Paramterek tadsa a vermen keresztl


Ennek lnyege, hogy az eljrs meghvsa eltt a verembe beletesszk az sszes paramtert, az eljrs pedig kiolvassa ket onnan, de nem a POP mvelettel. Mivel a paramterek sorrendje rgztett, s a utnuk a verembe csak a visszatrsi cm kerl, gy azok az eljrson bell az SP-hez relatvan elrhetek. 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 valamit ideiglenesen elmentnk a verembe, akkor a paramterek relatv helye is megvltozik, gy nehzkesebb lenne kezelni ket. pp erre talltk ki viszont 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 elz plda trsval mutatjuk be:

102

Pelda7.ASM: Osszegez PUSH MOV PUSH PUSHF CLD XOR MOV LDS @AddKov: LODSB CBW ADD
sszeghez

PROC BP BP,SP AX BX,BX CX,[BP+8] SI,[BP+4]


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

BX,AX @AddKov AX BP
6

;Kvetkez vektorkomponens AL-be ;eljelesen kiterjesztjk szv ;hozzadjuk a meglev ;Ismteld, amig CX > 0

LOOP POPF POP POP


RET

Osszegez

ENDP

. . . ;Plda eljrs meghivsra

MOV PUSH PUSH MOV PUSH CALL MOV

AX,13 AX ;13 bjt hossz a vektor DS AX,OFFSET Egyikvektor AX Osszegez DX,BX ;Pl. a DX-be tltjk az
;eredmnyt ;cm offszetrsze

. . . 103

;valahol az adatszegmensben deklarlva vannak a vltozk:

Hossz Cim Eredmeny Probavektor

DW DD DW DB

? ? ? 13 DUP (?)

Az eljrsban BP rtkt is megriztk a biztonsg kedvrt. A RET utasitsban szerepl 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 kitakaritsa a verembl. 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
104

az offszetrsz, aztn a szegmens. BP-hez kpest pedig +8 bjtra tallhat a vektor hossza. Az eljrsbl val visszatrs utn persze minden eltnik a verembl, amit eltte belepakoltunk a hvshoz. A visszatrsi rtket most BX-ben adja vissza, errl mg lesz sz. A magas szint nyelvek is vermen keresztli paramtertadst valstanak meg. Ennek a mdszernek ktfle vltozata is ltezik, aszerint, hogy a paramterek trlse a verembl kinek a feladata: Pascal-fle vltozat: a verem trlse az eljrs dolga, amint azt az elbb 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 megadtuk ket, teht a legutols paramter kerl bele a verembe utoljra. A C ezzel szemben fordtott sorrendben teszi ezt, gy a legels paramter kerl be utoljra. Ennek megvan az az elnye is, hogy knnyen megvalsthat a vltoz szm paramterezs, hiszen ilyenkor az els 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 PUSH MOV PUSH PUSHF PROC BP BP,SP AX

105

CLD XOR MOV LDS @AddKov: LODSB CBW ADD


sszeghez

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

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

BX,AX @AddKov AX BP ENDP

;Kvetkez vektorkomponens AL-be ;eljelesen kiterjesztjk szv ;hozzadjuk a meglev ;Ismteld, amig CX > 0

LOOP POPF POP POP RET

Osszegez .

. . ;Plda eljrs meghivsra

MOV PUSH PUSH MOV PUSH CALL ADD MOV

AX,13 AX ;13 bjt hossz a vektor DS AX,OFFSET Egyikvektor


;cm offszetrsze

AX Osszegez SP,6 DX,BX

;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, mieltt trln a vermet (a Pascal-szer verzi esetn ez persze nem lehetsges). Ezt azonban nem szoks alkalmazni, a C is mindig regiszterekben adja ezt vissza, ez a knnyebben kezelhet megolds, mi is tegynk gy.
106

10.4 Loklis vltozk megvalstsa


A loklis vltozkat ktflekppen valsthatjuk meg: elmentjk valamely regisztert, s felhasznljuk azt vltozknt, ugyangy, ahogy idig is tettk az Osszegez eljrsban az AXszel. A msik megolds, amit a magas szint 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 bzistechnikval (a BP-n keresztl) ri el. rjuk t ismt az Osszegezt gy, hogy ezt a mdszert alkalmazza (most a loklis vltozban troljuk ideiglenesen az sszeget):
Pelda9.ASM: Osszegez PUSH MOV SUB PUSH PUSHF CLD MOV MOV LDS AddKov: LODSB CBW
ADD

PROC BP BP,SP SP,2 AX

;Helyet foglalunk a loklis ;vltoznak

;SI-nek nvekednie kell majd

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


;Kezdeti sszeg = 0

LOOP POPF POP

;Kvetkez vektorkomponens AL-be ;eljelesen kiterjesztjk szv [BP-2],AX;hozzadjuk a meglev sszeghez AddKov ;Ismteld, amig CX > 0

AX
107

MOV ADD POP RET Osszegez

BX,[BP-2] SP,2 BP ENDP

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

. . . ;Plda eljrs meghvsra

MOV PUSH PUSH MOV PUSH CALL ADD MOV

AX,13 AX ;13 bjt hossz a vektor DS AX,OFFSET Egyikvektor


;cm offszetrsze

AX Osszegez SP,6 DX,BX

;Pl. a DX-be tltjk az ;eredmnyt

Hogyan is nz ki a verem az eljrs futsakor?

108

11 MVELETEK SZTRINGEKKEL
Sztringen bjtok vagy szavak vges hossz folyamt rtjk. A magas szint 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 definilt karakteres sztring-konstansokat rtjk, hanem a memria tetszleges cmn kezdd sszefgg terletet. Ez azt jelenti, hogy mondjuk egy 10 bjt mret vltozt tekinthetnk 10 elem 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, ezeknek termszetes kvetkezmnye, hogy a sztringek maximlis hossza egy szegmensnyi, teht 64 Kbjt. Persze ha ennl hosszabb folyamokra van szksg, akkor megfelel feldarabolssal ez is megoldhat. A 8086-os mikroprocesszor 5 utastst knl a sztringekkel vgzett munka megknnytsre. Ezek kzl kettvel mr tallkoztunk eddig is. Az utastsok kzs jellemzje, 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 sztringekkel tudnak dolgozni. Szintn kzs tulajdonsg, hogy a megfelel mvelet elvgzse utn mindegyik utasts a sztring(ek) kvetkez elemre lltja SI-t s/vagy DI-t. A kvetkez elemet most ktflekppen rtelmezhetjk: lehet a megszokott, nvekv irny, illetve lehet fordtott, cskken irny is. A hasznlni kvnt irnyt a DF flag llsa vlasztja ki: DF=0 esetn nvekv, mg DF=1 esetn cskken lesz.

109

Ugyancsak jellemz mindegyik utastsra, hogy az Assembly szintjn tbb mnemonikkal s klnfle operandusszmmal rhetk 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 mnemonikok a CMPS, LODS, MOVS, SCAS s STOS, mg az egyszer alakok a CMPSB/CMPSW, LODSB/LODSW, MOVSB/MOVSW, SCASB/SCASW s STOSB/STOSW. Minden rgtn vilgosabb lesz, ha nznk rjuk egy pldt:
Pelda10.ASM: MODEL SMALL .STACK ADAT Szoveg1 Szoveg2 Kozos Hossz Vektor ADAT KOD @Start: SEGMENT DB "Ez az els szveg.",00h DB "Ez a msodik szveg.",00h DB 10 DUP (?) DW ? DW 100 DUP (?) ENDS SEGMENT ASSUME CS:KOD,DS:ADAT MOV MOV MOV AX,ADAT DS,AX ES,AX
110

@Ciklus1:

LEA LEA CLD XOR CMPSB JNE INC JMP

SI,[Szoveg1] DI,[Szoveg2] CX,CX @Vege CX @Ciklus1 SI,[SI-2] DI,[Kozos] DI,CX DI ES:[Kozos],DS:[SI] DI,[Szoveg1] CX,100 AL,AL

@Vege:

LEA LEA ADD DEC STD REP MOVS LEA MOV XOR CLD REPNE SCASB STC SBB MOV PUSH POP XOR LEA MOV @Ciklus2: LODSB CBW NOT STOSW LOOP MOV INT KOD ENDS END

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

AX @Ciklus2 AX,4C00h 21h @Start


111

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

Az utasts a forrst sszehasonltja a cllal, belltja a flageket, de az operandusokat nem bntja. A forrs alaprtelmezsben a DS:SI, a cl pedig az ES:DI cmen tallhat, mint mr emltettk. Az els operandus szegmensregisztere brmi lehet, a msodik ktelezen ES. Ha egyik operandusbl sem derl ki azok mrete (bjt vagy sz), akkor a mretet neknk kell megadni a BYTE PTR vagy a WORD PTR kifejezs valamelyik operandus el rsval. A PTR opertor az jobb oldaln ll 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
112

rendre bjt ill. sz elem sztringeket rnak el 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 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 bjtra mutat, gy SI-t kettvel cskkentve az a kzs rsz utols karakterre fog mutatni. Ezt kveten a kzs karakterlncot a Kozos vltoz terletre fogjuk msolni. Mivel SI most a sztring vgre mutat, clszer, ha a msolst fordtott irnyban vgezzk el. Ennek megfelelen lltjuk be DI rtkt is. DF-et 1-re lltva kszen llunk a msolsra. Kvetkez j sztringkezel utastsunk a MOVS/MOVSB/ MOVSW (MOVe String Byte/Word). Az utasts teljes alakja a kvetkez:
MOVS cl,forrs

Az utasts a forrs sztringet tmsolja a cl helyre, flag-et persze nem mdost. A pldban 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, bellk az assembler csak a forrs szegmenst (DS) s a sztring elemmrett (ami most a Kozos elemmrete, teht bjt) hasznlja fel, a tbbit figyelmen kvl hagyja. A MOVSB/MOVSW mnemonikok a CMPS-hez hasonlan formlisan a MOVS BYTE/WORD PTR ES:[DI],DS:[SI] utastst rvidtik.
113

Ha egy adott sztring minden elemre akarunk egy konkrt sztringmveletet vgrehajtani, akkor nem kell azt felttlenl ciklusba rejtennk. A sztringutastst ismtl prefixek minden sztringkezel utasts mnemonikja eltt 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 prefix mkdse a kvetkez: 1)ha CX=0000h, akkor kilps, az utasts vgrehajtsa befejezdik 2)a prefixet kvet sztringutasts egyszeri vgrehajtsa 3)CX cskkentse 1-gyel, a flag-ek nem vltoznak 4)menjnk 1)-re Ha teht kezdetben CX=0000h, akkor nem trtnik egyetlen mvelet sem, hatst tekintve gyakorlatilag egy NOP-nak fog megfelelni az utasts. Klnben a sztringkezel 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 prefixet a LODS, MOVS s STOS utastsokkal hasznlhatunk. A REPE/REPZ prefix a kvetkez mdon mkdik: 1)ha CX=0000h, akkor kilps, az utasts vgrehajtsa befejezdik 2)a prefixet kvet sztringutasts egyszeri vgrehajtsa 3)CX cskkentse 1-gyel, a flag-ek nem vltoznak 4)ha ZF=0, akkor kilps, az utasts vgrehajtsa befejezdik 5)menjnk 1)-re

114

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 befejezdik. A REPNE/REPNZ prefix 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-es lpse vltozik meg). A REPE/REPZ s REPNE/REPNZ prefixeket a CMPS s a SCAS utastsoknl illik hasznlni (hiszen ez a kt utasts lltja a flag-eket is), br a msik hrom utasts esetben mkdsk a REP-nek felel meg. Mg egyszer hangslyozzuk, hogy ezek a prefixek kizrlag egyetlen utasts ismtelt vgrehajtsra hasznlhatak, s az az utasts csak egy sztringkezel mnemonik lehet. Gpi kd szinten csak kt prefix ltezik: REP/REPE/ REPZ s REPNE/REPNZ, az els prefix teht klnbz mdon mkdik az t kvet utaststl fggen. A programhoz visszatrve, a REP MOVS utasts hatsra megtrtnik a kzs karakterlnc tmsolsa. Mivel a REP prefix CX-tl fgg, nem volt vletlen, hogy mi is ebben troltuk a msoland rsz hosszt. Ezt a sort persze rhattuk volna az egyszerbb 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 megelz bjtok szmnak meghatrozsval. Pontosan ezt fogjuk tenni mi is: megkeressk, hol van a lezr karakter, annak offszetjbl mr meghatrozhat a sztring hossza. A SCAS/SCASB/SCASW (SCAn String Byte/Word) utasts teljes alakja a kvetkez:
SCAS cl

115

Az utasts AL illetve AX tartalmt hasonltja ssze a cl ES: [DI] bjttal/szval, belltja a flag-eket, de egyik operandust sem bntja. Az sszehasonltst gy kell rteni, hogy AL-t/AXet kivonja a cl tartalmbl, s az eredmny alapjn mdostja a szksges flag-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 a sztring hossznl. Most feltesszk, hogy a sztring rvidebb 100 bjtnl. DF-et trlni kell, mivel a sztring elejtl nvekv sorrendben vizsgldunk. A REPNE prefix hatsra egszen mindaddig ismtldik 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 belle a Szoveg1 kezdoffszetjt. 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 nevbl addan a tle jobbra ll szimblum offszetcmt adja vissza. A maradk programrsz az elzekhez kpest semmi hasznosat nem csinl. A 100 db. szbl ll Vektor terletet fogjuk feltlteni a kvetkez mdon: brmelyik szt gy kapjuk meg, hogy a kdszegmens egy adott bjtjt eljelesen 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 ismers. A LODS/LODSB/ LODSW s STOS/STOSB/STOSW utastsokkal mr tallkoz-

116

tunk korbban, de azrt ismtlskppen mkdsket. Teljes alakjuk a kvetkez:


LODS forrs STOS cl

felidzzk

Forrs a szokott mdon DS:SI, ebbl DS fellbrlhat, a cl pedig ES:DI, ami rgztett. Az utastsok AL-t vagy AX-et hasznljk msik operandusknt, a flag-eket nem mdostjk. A LODS a forrst tlti be AL-be/AX-be, a STOS pedig AL-t/AXet rja a cl terletre. A LODS-nl 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 eljelesen 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 befejezdik. Az utastsok teljes alakjnak hasznlatt csak a forrs szegmens megvltoztatsa indokolhatn, minden ms esetben a rvid alakok clravezetbbek s jobban tlthatak. Azonban az egyszerbb vltozatok esetn is lehetsgnk van a forrs szegmens kivlasztsra, mgpedig ktfle mdon. Az egyik, hogy az utasts eltt alkalmazzuk valamelyik SEGxx prefixet, a msik, hogy az utasts eltti sorban kzzel berakjuk az adott prefix gpi kdjt. Az els mdszer MASM esetn nem mkdik (esetleg ms assemblernl sem), a msodikban meg annyi a nehzsg, hogy tudni kell a kvnt prefix kdjt. Ezek alapjn a LODS SS:[SI] utastst az albbi kt mdon helyettesthetjk: 1)
SEGSS LODSB

2)
117

DB LODSB

36h

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

12 AZ .EXE S A .COM PROGRAMOK KZTTI KLNBSGEK, A PSP


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

12.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 memriakezelsrl. Ugyebr 1 Mbjt memrit tudunk megcmezni (gy a DOS is), viszont ennyit mgsem tudunk kihasznlni, ugyanis az 1 Mbjt memria fels terletn (azaz a magas cmtartomnyban) helyezkedik el pl. a BIOS programkdja (radsul az ROM memria) s a kpernymemria, 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 ismers szm kell, hogy legyen). Ezen a(z als) 640 Kbjton bell a DOS memriablokkokat (memriaszeleteket) kezel, amelyeknek ngy f jellemzjk van:
118

memriablokk helye (kezdcme) memriablokk mrete memriablokk llapota (foglalt - szabad) memriablokk (tulajdonosnak) neve

Ezekrl az adatokrl a DOS nem vezet kln adminisztrcit egy sajt, opercis rendszeri memriaterleten, ahol pl. klnbz listkban troln ket (amihez termszetesen senkinek semmi kze), hanem egyszeren az adott memriablokk elejn helyezi el ket. Ezek az adatok szintn egy blokkot alkotnak, amelynek mrete 16 bjt, neve pedig memriavezrl blokk (MCBMemory Control Block). Ezzel megengedi a felhasznli programoknak is azt, hogy elrhessk ezeket az informcikat, ami a DOS szemszgbl elg nagy hiba, ugyanis brki turklhat bennk, ami miatt tnkremehet a memria nyilvntartsa. Ezalatt azt rtem, hogy adott esetben egy program a memriablokkokra vonatkoz mveleteket nem a DOS szabvnyos eljrsain keresztl vgzi, hanem sajt maga, mgpedig gy, hogy egyszeren trja az MCB-t, s/vagy j(ak) at hoz ltre, ha jabb memriablokk(ok) keletkeztek. Egybknt hrom mveletet rtelmez a DOS a memriablokkjain, mindegyik eljrsnak vannak hibakdjaik (visszatrsi rtkeik): adott mret memriablokk lefoglalsa (memria foglalsa) Ha sikerlt lefoglalni a kvnt mret memrit, akkor visszakapjuk a lefoglalt terlet cmt. Hibakdok: nincs elg memria, ekkor visszakapjuk a legnagyobb szabad blokk mrett is. adott kezdcim blokk felszabaditsa Hibakdok: a kezdcm nem egy blokk kezdetre mutat.
119

adott kezdcim 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 kezdcmnl 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 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 eljrsok a kvetkez hibakddal trnek vissza: az MCB-k tnkrementek. Ilyenkor termszetesen az adott mvelet sem hajtdik vgre. Erre plda: ha az adott blokk kezdcmhez hozzadjuk annak mrett, akkor megkapjuk a kvetkez blokk kezdcmt (pontosabban annak MCB-jnek kezdcmt), s gy tovbb, azt kell kapnunk, hogy a legutols blokk utni terlet kezdcme 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.
120

Mindesetre ilyenkor hasznlhatatlann vlik a nyilvntarts. A DOS is az emltett (sajt) eljrsokat hasznlja. Ha az elbbi hibval tallkozik, akkor azt gy kezeli le, hogy a "Memory Allocation Errormemriakiosztsi 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.

12.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 rszbl tevdik ssze: Kd ez alatt magt az alacsony szint programkdot rtjk, a forditprogramok feladata, hogy a magas szint nyelven lert algoritmust a processzor szmra feldolgozhat kdra alaktsk t. Adat ebben a rszben helyezkednek el a program globlis vltozi, azaz a statikusan lefoglalt memria.
121

Verem magas szint nyelvekben nem ismeretes ez a fogalom (gy rtve, hogy nem a nyelv rsze), viszont nlklzhetetlen az alacsony (gpi) szinten. A fordtk pl. ennek segitsgvel valstjk meg a loklis vltozkat (amirl mr sz volt).

A gyakorlatban legtbbszr a programkdot nem egyetlen sszefgg egysgknt kezeljk (s ez az adatokra is vonatkozik), hanem "csoportostjuk" a program rszeit, s ennek alapjn kln szegmensekbe (logikailag klnll rszekbe) pakoljuk ket. Pontosan ezt csinljuk akkor, amikor az assemblernek szegmenseket definilunk (ez teht az a msfajta szegmensfogalom, amikor a szegmenseket logikailag klnvlaszthat programrszeknek tekintjk). Meg lehet mg emlteni a Pascalt is: pl. a unitokat tekinti klnll programrszeknek, igy minden unit 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 semmibl ellltani. 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 llitjuk (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 kezdrtkkel nem rendelkez vltozkat egy kln adatszegmensbe rakjuk, s elrjuk (ezt meg lehet mondani az assemblernek), hogy ez a szegmens ne kerljn be az llomnyba (azaz a linker ne szerkessze be), viszont a
122

program indtsakor az opercis rendszer tudjon eme szegmensrl, 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 kezdrtkkel rendelkez vltozkat, a msik felben pedig az azzal nem rendelkez vltozkat helyezzk el, s azt rjuk el, 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 kezdrtke (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 rendszernek (mivel indtja a programokat), hogy hol tallhat(ak) az llomnyban a kdot tartalmaz rszek. Ha ez megvan, lefoglalja nekik a megfelel mennyisg 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 az kezdrtke), 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 van
123

ksztve a futsra), majd tadja a vezrlst (rugrik) a program els utastsra valamelyik kdszegmensben. 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.

12.3 Ahogy a DOS indtja a programokat


A DOSnak ktfle futtathat llomnya van (hha!), a . COM s a .EXE formtum. Amit ebben a fejezetben ltalnossgban lerunk, az mind a kettre vonatkozik. A kett 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 szegmensekrl semmit sem tud! Nem tudja, hogy hny szegmensrl van sz, gy pl. azt sem, hogy melyik hol kezddik, 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 memriablokkot foglal le, ezen bell kap majd helyet minden szegmens. Annak, hogy a szksges memrit egyben foglalja le, annyi htrnya
124

van, hogy ha nincs ekkora mret szabad memriablokk, akkor a programot nem tudja futtatni (ekkor kikpi a "Program too big to fit 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, igy 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 nyilvn az t indt program nem tud azeltt befejezdni, mieltt ez befejezdne. Ebbl 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 legelszr felszabadtani. Persze azrt a DOS esetben is felaprzdhat a memria, ha egy program dinamikusan allokl magnak memrit, aztn bizonyos lefoglalt terleteket tetszleges 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 elbbi 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 sokmindenre lehet rteni). Fontos, hogy ezekkel a fogalmakkal tisztban legynk.

125

Mint arrl mr sz volt, a programszegmens akkora mret, amekkora a szegmensek ltal sszesen ignyelt memria. Nos, ez nem teljesen igaz, ugyanis a programszegmens LEGALBB ekkora (+256 bjt, ld. ksbb), 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. Ebbl 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 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-prefixet (Program Segment Prefix, PSP), ami egy 256 bjtbl ll informcis tmb. A +256 bjt teht PSP miatt kell. Mire kell a PSP s mit tartalmaz?

Sokmindent. Ezen 256 bjtos terlet msodik fele pl. azt a stringet tartalmazza, amit a promptnl a program neve utn runk paramternek. Azt, hogy az els 128 bjt miket trol, azt
126

nagyon hossz lenne itt felsorolni (inkbb nzzk meg egy knyvben), szmunkra nem is igazn fontos, csak egy-kt rdekesebb dolog: az els kt bjt az INT 20h kdja (0CDh 20h), vagy pl. a krnyezeti stringek (amelyeket a DOS SET parancsval llthatunk be) szmra is le van foglalva egy memriablokk, ennek a szegmenscime (ami azt jelenti, hogy a cm offszetrsze 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 stringekhez, 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 (COMMAND.COM), hiszen legtbbszr onnan indtjuk a programokat. Mire kell ez? Arra, hogy ha a program befejezdik, akkor a DOS tudja, hogy kinek kell visszaadnia a vezrlst, s ez nyilvn a programot betlt program. Ezek utn nzzk meg a klnbsget .COM s .EXE kztt:

12.4 .COM llomnyok


Ezek a fjlok voltak a DOS els futtathat llomnyai, nagyon egyszer felptsek, ugyanis olyan programok szmra terveztk, amelyek egyetlen szegmensbl llnak. Errl 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 errl. Mint tudjuk, egy szegmens max. 64 Kbjt lehet, gy egy .COM program is. Rtesznk azonban
127

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 offszetcmhez adjon hozz 100h-t, azaz az offszeteket tolja el 256 bjttal, mivel a PSP nyilvn nem troldik el a programllomnyban, de mindig a "oda kell kpzelnnk" a szegmens elejre). Indulskor a DOS a verembe berak egy 0000-t, ami a PSP-ben lev INT 20h utasts offszetcme. 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) esettl, amikor mr 64 Kbjt szabad memria sincs a program szmra, de ezzel most nem foglalkozunk. Mirt van az, hogy a szegmens mindig kibvl 64 Kbjtra? Azrt, hogy minl tbb hely legyen a verem szmra. Ugyanis a .COM fjlokban a programrl semmi kisrinformci 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 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. Ebbl az is kvetkezik, hogy a program rsakor neknk sem kell trdnnk a veremmel.

128

Ezek szerint azt sem tudjuk megadni, hogy a szegmensben hol tallhat az els 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.

12.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 Mbjt memria elejn kezddik, ekkor a szegmensek relatv cmei egyben abszolt cmek is, a program futkpes lenne), azonban a program a memria szinte tetszleges rszre betltdhet, 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:

129

Kod SEGMENT PARA

ASSUME CS:Kod, DS:Adat

;paragrafushatron kezddjn ;a szegmens ;mondjuk meg az assemblernek, ;hogy mely szegmensregiszter ;mely szegmensre mutat, ;eszerint generlja majd az ;offszetcmeket

MOV MOV
tegynk is

AX,Adat DS,AX

;Az adat szegmens szegmenscme ;A felttelezsnek ;eleget, ne vgjuk t szegny ;assembler bcsit

. .

. MOV INT

AX,4C00h 21h
;paragrafushatron kezddjn ;a szegmens

Kod ENDS Adat SEGMENT PARA Valami Akarmi Adat ENDS END DB DB 2 14

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 tltdik majd be. A vlasz az, hogy az Adat egy relatv rtk, a program els szegmenshez kpest. Hogy melyik lesz az els szegmens, az csak a linkelsnl vlik el, amikor a linker az egyes szegmensdarabokat sszefzi egyetlen
130

szegmenss, valamint a szegmenseket egyetlen programm, de hogy a szegmensek milyen sorrendben kvessk egymst a programban, arrl dnt. Az 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, s hogy a Kod szegmens mrete pl. 36 bjt (mivel ez nem lenne 16-tal oszthat, ezrt a mret linkelskor 16-tal oszthatra n, hogy az utna kvetkez szegmens paragrafushatrra essen, gy most 48 bjt lesz). Ekkor a lefordtott program a kvetkez lesz:
MOV
MOV . . .

AX,0003
DS,AX

;48/16=3

MOV INT
szemt . cimre . .

AX,4C00h 21h

;Ezutn szksg szerint

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

DB DB

2 14

Most a program egy relatv szegmenscmet tartalmaz (0003), de mg mieltt elindthatnnk, azt t kell javtani a tnyleges cmre. Ha pl. a Kod szegmens a memria 5678h:0000h terletre kerl majd, akkor a 0003-hoz hozz kell adni az 5678h-t, hogy helyes rtket kapjunk.

131

Mivel ezt a program indtsakor kell elvgezni, gy ez a feladat a DOS-ra hrul, de ezt csak az .EXE fjlok esetben kpes elvgezni, mivel ott el van trolva a relokcihoz szksges informci. Ebbl 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:
DOSSEG Kod SEGMENT PARA ASSUME CS:Kod, DS:Adat ORG 100h ;PSP helye AX,Kod:Adat_eleje
;a "Kod" szegmens elejhez ;kpest az adat_eleje cmke, ;azaz az adat szegmens eleje ;hny bjtra helyezkedik el ;osztva 16-tal (az elz pl;dban kzvetlenl ez az rtk ;volt benne az utastsban) ;DS ekkor mg a PSP elejre, ;azaz a kod szegmens elejre ;mutat ;rlltjuk az adatszegmensre ;innen DS mr az adat ;szegmensre mutat

@Start: MOV

MOV SHR MOV ADD MOV


. . .

CL,4h AX,CL BX,DS AX,BX DS,AX

132

MOV INT Kod Adat ENDS

AX,4C00h 21h

SEGMENT PARA ORG 0h

Adat_eleje LABEL Valami Akarmi Adat ENDS END DB 2 DB 14 @Start

;Ezen szegmensen bell nincs ;eltols

A program elejn lev 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 szegmens.

12.6 .EXE llomnyok


Az .EXE llomnyokat a bonyolultabb programok szmra talltk ki, amelyek tetszleges szm szegmensbl llnak. Magban az llomnyban ezek egymst kveten, folyamatosan vannak eltrolva, ahogyan a linker egyms utn fzte ket. Fontos azonban megjegyezni, hogy nem biztos, hogy az egsz llomny magt a programot trolja, mivel az llomnyban a program utn mg tetszleges hosszsgban trolhatunk pl. adatokat, mint egy kznsges adatfjlban. Ezek az adatok nem tartoznak a programhoz, mgegyszer kihangslyozzuk. Az .EXE fjlok elejn mindig tallhat egy
133

fejlc, azaz egy informcis tmb, amely a DOS szmra nlklzhetetlen a program elindtshoz. A betltsi folyamat hasonl a .COM-okhoz: a fejlcbl a DOS megnzi, hogy a fejlc utn eltrolt program milyen hossz, azaz hol a hatr a program s az elbb 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 fejlcbl 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, amirl mr beszltnk. A programszegmens gy legalbb az sszmret+tbbletmemria mret 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 lehetsggel, szinte mindig maximumra llitjk (a linkerek, merthogy k hozzk ltre a futtathat llomnyokat). A DOS teht lefoglalja a programszegmenst, bemsolja az .EXE-bl 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 szegmensbl ll, kijellhetjk, hogy melyik a veremszegmens (szintn relatvan), indtskor a DOS az SS:SP-t ennek megfelelen lltja be. Ugyangy relatvan adhatjuk meg, hogy hol van a program belpsi pontja, 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 irsakor sehol sem az ORG 100h direktiva megadsra. Kezdeti adatszegmenst nem tudunk kijellni a program szmra, a DOS gy van vele, hogy ha egy programnak tbb szegmense is van,
134

akkor azok kztt valsznleg 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 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.

13 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. Ebbl 8 (vagy 16) db. az IRQ-k kezelsre van fenntartva, nhny pedig specilis clt szolgl, de a tbbi mind
135

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 szolgltatsokat. Megszaktst az egyoperandus INT utastssal kezdemnyezhetnk. Az operandus kizrlag egy bjt mret kzvetlen adat lehet, ami a krt szoftver-megszaktst azonostja. Az utasts pontos mkdsvel a kvetkez fejezetben foglalkozunk majd. rdemes megemlteni mg egy utastst. Az INTO (INTerrupt on Overflow) egy 04h-s megszaktst kr, ha OF=1, klnben pedig mkdse megfelel egy NOP-nak (azaz nem csinl semmit sem, csak IP-t nveli). Ennek akkor vehetjk hasznt, ha mondjuk az eljeles szmokkal vgzett mveletek sorn keletkez 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 regiszterekben kell kzlni, s a visszatr 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 Brown's Interrupt List. A programok mindegyike hozzfrhet, s tudtunkkal magnclra ingyenesen hasznlhat. Mindegyik tulajdonkppen egy hatalmas adatbzison alapul, amiben hardveres s szoftveres tmkat is tallhatunk kedvnk szerint. Most felsorolunk nhny gyakoribb, fontos megszaktst a teljessg ignye nlkl: 10h Kpernyvel kapcsolatos szolgltatsok (Video services)
136

13h 14h 16h 1Ch 20h 21h 25h 26h 27h 2Fh 33h

Lemezmveletek (Disk operation) Soros ki-/bemenet (Serial I/O) Billentyzet (Keyboard) Idzt (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)

A kvetkezkben nhny pldn keresztl bemutatjuk a fontosabb szolgltatsok hasznlatt.

13.1 Szvegkirats, billentyzet-kezels


Legyen a feladat a kvetkez: a program rja ki a kpernyre a "Tetszik az Assembly?" szveget, majd vrjon egy billenty 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 mkdst. Egyb billentyre ne reagljon, hanem vrakozzon valamelyik helyes vlaszra. Lssuk a programot:

Pelda11.ASM: MODEL SMALL .STACK

137

ADAT Kerdes Igen Nem ADAT KOD @Start:

SEGMENT DB Tetszik az Assembly? $ DB Igen.,0Dh,0Ah,$ DB Nem.,0Dh,0Ah,$ ENDS SEGMENT ASSUME CS:KOD,DS:ADAT MOV MOV MOV LEA INT XOR INT CMP JE CMP JE CMP JE CMP JNE LEA JMP LEA MOV INT MOV INT ENDS END AX,ADAT DS,AX AH,09h DX,[Kerdes] 21h AH,AH 16h AL,i @Igen AL,I @Igen AL,n @Nem AL,N @Ciklus DX,[Nem] @Vege DX,[Igen] AH,09h 21h AX,4C00h 21h @Start

@Ciklus:

@Nem: @Igen: @Vege:

KOD

138

A program elg rvid, s kevs jdonsgot tartalmaz, gy megrtse nem lesz nehz. Szveget sokflekppen ki lehet rni a kpernyre. 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 offszetcmt DX-ben kell megadni, szegmensknt DS-t hasznlja. A billentyzet 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 billentyzeten, majd a gomb ASCII-kdjt visszaadja AL-ben. Htrnya, hogy nhny billenty lenyomst nem tudjuk gy megfigyelni (pl. Ctrl, Shift), mg ms billentyk ALben 00h-t adnak vissza, s kzben AH tartalmazza a billentyt azonost szmot (ez a scan code). Most neknk csak a kicsi s nagy "I" ill. "N" betkre kell figyelnnk, 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 lenyomand billentyt. 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 offszetjnek DX-be betltse utn a @Vege cmknl ktnk ki, ahol kirjuk a vlaszt, majd kilpnk a programbl.

139

13.2 Szveges kperny kezelse, szmok hexadecimlis alakban kirsa


Kvetkez problmnk mr rafinltabb: a program indtskor trlje le a kpernyt, majd a bal fels sarokba folyamatosan rja ki egy sz mret vltoz tartalmt hexadecimlisan, mikzben figyeli, volt-e lenyomva billenty. A vltoz rtkt minden kirst kveten eggyel nvelje meg, kezdetben pedig a 0000h-rl induljon. Ha volt lenyomva billenty, akkor annak 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 HexKiir SEGMENT DW 0000h DB 0123456789ABCDEF ENDS SEGMENT ASSUME CS:KOD,DS:ADAT PROC PUSH LEA MOV MOV SHR XLAT XCHG AND XLAT AX BX CX DX BX,[HexaJegy] CL,4 DL,AL AL,CL AL,DL AL,0Fh
140

HexKiir Torol

MOV PUSH XCHG MOV SHR XLAT XCHG AND XLAT MOV MOV INT MOV INT POP INT MOV INT POP RET ENDP PROC PUSH MOV MOV XOR MOV INT POP RET ENDP PROC PUSH MOV XOR INT POP

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

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

Torol GotoXY

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


141

GotoXY @Start:

RET ENDP MOV MOV CALL XOR CALL MOV CALL INC MOV MOV INT JZ CMP JE INC CALL MOV MOV INT XOR INT JMP 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

@Ciklus:

@Vege:

KOD

Az adatszegmensben nincs semmi ismeretlen, br a HexaJegy tartalma kicsit furcsnak tnhet. A homlyt
142

rvidesen el fogja oszlatni, ha megnzzk, hogyan rjuk ki a szmot. A HexKiir az AX-ben lev eljeltelen szmot rja ki ngy karakteres hexadecimlis alakban (teht a vezet nullkkal egytt). Az eljrsban a sz kirst visszavezetjk kt bjt hexadecimlis kirsra, azt pedig az als s fels bitngyesek szmjeggy alaktsra. Mivel a kpernyre elszr a fels bjt rtkt kell kirni, az als bjtot dolgozzuk fel, amit aztn berakunk a verembe, majd a fels bjt hasonl talaktsai utn azt kirjuk a kpernyre, vgl a verembl 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. Elszr a fels bitngyest kell szmjeggy alaktanunk. Ezrt AL-t elrakjuk DL-be, majd AL felveszi a fels 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 ngy bitje lekerl az als ngy helyre, mikzben a fels bitngyes kinullzdik (ez a shiftels tulajdonsga). Ez pedig azt fogja jelenteni, hogy AL-ben ugyanakkora szm lesz, mint amekkora eredetileg a fels bitngyesben volt. Az operandus nlkli XLAT (transLATe byte; X=trans) utasts az AL-ben lev bjtot kicserli a DS:BX cm fordttblzat AL-edik elemre (nulltl szmozva az elemeket), teht szimbolikusan megfelel a MOV AL,[BX+AL] utastsnak (ami ugyebr gy illeglis), de AL-t eljeltelenl rtelmezi. Az alaprtelmezett DS szegmens fellbrlhat prefixszel. Esetnkben ez most azt jelenti, hogy az AL-ben lev szmot az azt szimbolizl hexadecimlis szmjegyre cserli le, hiszen BX a HexaJegy offszetcmt tartalmazza. gy mr vilgos a HexaJegy defincija. Most, hogy megvan az els 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
143

DX-ben fogjuk gyjteni. Most teht clszernek 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 flag-eket persze nem bntja. Specilis esetnek szmt, ha AX-et cserljk fel valamelyik msik 16 bites ltalnos regiszterrel, ez ugyanis csak 1 bjtos mveleti kdot eredmnyez. Az XCHG AX,AX utasts a NOP (No OPeration) mnemonikkal is elrhet. AL teht ismt az eredeti rtkt tartalmazza. Most a fels 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 tesz, hogy a fels bitngyes trldik (hiszen Valami AND 000b=0h), az als pedig vltozatlan marad (mivel Valami AND 111b=Valami). AL-t most mr talakthatjuk szmjeggy (XLAT), majd miutn DH-ban eltroltuk, DX-et berakjuk a verembe. AH mg mindig az eredeti rtkt tartalmazza, ideje ht t is feldolgozni. Az XCHG AL,AH utn (ami MOV AL,AH is lehetne) az elzkhz hasonlan ellltjuk 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 fenti tblzatban lthat, hogy az INT 10h felels a megjelentssel kapcsolatos szolgltatsokrt. gy logikus, hogy ehhez a megszaktshoz fordulunk segtsgrt a kperny letrlshez. A Torol eljrs nagyon rvid, ami azrt van, mert a trlst egyetlen INT 10h hvssal elintzhetjk. A 06h-s szolgltats egy szveges kpernyablak felfel grgetsre (scrolling) szolgl, s gy mkdik, hogy az AL-ben megadott szm sorral felfel cssztatja a kperny tartalmt, az alul
144

megresed sorokat pedig a BH-ban megadott szn (attribtum) szkzkkel tlti fel. Ha AL=0, akkor az egsz kpernyt felgrgeti, ami vgl is a kp trlshez vezet. Az ablak bal fels sarknak koordintit CX, mg a jobb als sarokt DX tartalmazza. A fels bjtok (CH s DH) a sort, az alsk (CL s DL) az oszlopot jelentik, a szmozs 0-tl kezddik. Most gy tekintjk, hogy a kperny 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 legals sornak elejre kerl. A GotoXY eljrs a kurzor pozcionlst teszi meg. A 02h szm video-szolgltats a DH-adik sor DL-edik oszlopba rakja a kurzort, a szmozs itt is 0 bzis. BH-ba 0-t rakunk, de ezzel most ne trdjnk. (Akit rdekel, BH-ban a hasznlt kpernylap sorszmt kell megadni.) A fprogram nagyon egyszerre sikeredett, hiszen a legtbb dolgot eljrshvssal intzi el. A kperny letrlse (CALL Torol) utn belpnk a @Ciklus kezdet hurokba. Itt a kurzort felrakjuk a bal fels sarokba, ahov kirjuk a szmll aktulis rtkt, majd megnveljk a vltozt. Most jn az, hogy meg kell nzni, nyomtak-e le billentyt. 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 lenyomva: ha ZF=1, akkor nem, klnben AX tartalma megfelel a 00h-s szolgltats ltal visszaadottnak (teht AL-ben 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 (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 ASCII kdjt, ami AL-ben van. Az utna kvetkez kt sor
145

(XOR AH,AH // INT 16h) feleslegesnek tnhet, de enlkl a kvetkez lenyomott karaktert nem fogja rzkelni a program. (Kicsit preczebben: Az INT 16h egy pufferbl olvassa ki a kvetkez lenyomott gomb kdjait. A 01h-s szolgltats a puffer mutatjt nem lltja t, gy a kvetkez hvs ismt ezt a billentyt jelezn lenyomottnak, ami nem lenne oks. A 00h hvsa viszont mdostja a mutatt, s ezzel minden rendben lesz.) Dolgunk vgeztvel visszatrnk a ciklusba.

13.3 Munka llomnyokkal


Az llomny-kezels nem tartozik a knny dolgok kz, de egyszer rdemes vele foglalkozni, sokszor ugyanis egyszerbben clhoz rhetnk Assemblyben, mint valamelyik magas szint nyelvben. A feladat nem tl bonyolult: hozzunk ltre egy llomnyt, majd figyeljk a billentyzetet. Minden bert karaktert rjon ki a program a kpernyre 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 mkdst.
Pelda13.ASM: MODEL SMALL .STACK ADAT SEGMENT
146

FNev Hiba Karakter ADAT KOD @Start:

DB DB DB DB ENDS

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

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

@Ciklus:

@Lezar:

@Hiba:

@Vege: KOD

INT MOV INT ENDS END

21h AX,4C00h 21h @Start

Ha llomnyokkal, knyvtrakkal vagy lemezekkel kell dolgoznunk, azt mindenkppen a DOS szolgltatsain keresztl rdemes tenni, hacsak valami egyb indok (pl. a sebessg kritikus) nem indokol mst. A DOS az sszes megszokott tevkenysg vgrehajtst lehetv teszi az INT 21h megszakts szolgltatsain keresztl: 39h 3Ah 3Bh 3Ch 3Dh 3Eh 3Fh 40h 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)

41h Lezrt llomny trlse (Delete/Unlink) 42h Fjlmutat pozcionlsa (Seek) 43h Attribtumok belltsa/olvassa (CHMOD) Ezeknek az llomnykezel fggvnyeknek kzs tulajdonsga, hogy az llomnyra a megnyits s/vagy ltrehozs utn nem az llomny nevvel, hanem egy specilis, egyedi azonostszmmal, az .n. file handle-lel hivatkoznak. Ez egy 16 bites rtk. A szabvnyos ki-/bemeneti eszkzk (standard input s output) a 0000h..0004h rtkeken rhetk el, ezekre is ugyangy rhatunk, ill. olvashatunk rluk, mintha
148

kznsges fjlok lennnek. Az albbi tblzat mutatja az ilyen eszkzk handle szmt: 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 llomny attribtumait a kvetkez 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 kombincija hatrozza meg a vgleges attribtumot. Most neknk egy norml attribtum fjlra van szksgnk, gy CX nulla lesz. DS:DX tartalmazza az llomny nevt, amely 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 AXben a file handle tallhat. Hiba esetn kirjuk a hibazenetet a 09h-s szolgltatssal, majd befejezzk a programot. llomny ltrehozsnl figyelni kell arra, hogy ha az adott nev 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 billentyzetrl val olvassra a mr emltett 00h-s funkcit hasznljuk. Az Esc billenty 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 BX-ben vrja a handle-t,

149

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 vltozba, majd kiratjuk a kpernyre 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.

13.4 Grafikus funkcik hasznlata


Most ismt egy kicsit nehezebb feladatot oldunk meg, de a fradozs meg fogja rni. A program elszr tvlt a 640*480 felbonts grafikus videomdba, majd egy pattog fehr pontot jelent meg. A pont mindegyik falon (a kperny szlein) rendesen vissza fog pattanni. Billenty lenyomsra pedig vissza fogja lltani a kpernymdot szvegesre, majd ki fog lpni.
Pelda14.ASM: MODEL SMALL .STACK KOD @Start: SEGMENT ASSUME CS:KOD,DS:NOTHING MOV INT AX,0012h 10h
150

@Ciklus:

XOR MOV MOV MOV XOR MOV INT ADD JNS NEG ADD CMP JB NEG ADD ADD JNS NEG ADD CMP JB NEG ADD

CX,CX DX,CX SI,3 DI,2 BH,BH AX,0C00h 10h CX,SI @V1 SI CX,SI CX,640 @V2 SI CX,SI DX,DI @F1 DI DX,DI DX,480 @F2 DI DX,DI AL,0Fh 10h CX DX DL,10 CX,CX @Var2 DL @Var1
151

@V1:

@V2:

@F1:

@F2:

MOV INT ;Vrakozs... PUSH MOV @Var1: XOR @Var2: LOOP DEC JNZ

POP MOV INT JZ XOR INT MOV INT MOV INT ENDS END

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 kpernyn hasznlt videomd, az ignyelt md szmt AL-ben kell kzlnnk. Sok szabvnyos videomdnak van elre rgztett szma, de neknk most csak a 80*25 felbonts sznes szveges (ez a 03h szm md), ill. a 640*480 felbonts grafikus (12h a szma) VGA-mdokra lesz szksgnk. A VGA (Video Graphics Array) a videovezrl 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 0 bzis, az orig teht a (0,0). BH a hasznlt kpernylap sorszmt tartalmazza, de ez most lnyegtelen. SI lesz a vzszintes, DI pedig a fggleges lpskz, azaz ennyi kpponttal fog arrbb ugrani a pont. A f ciklusban elszr trlni kell a pont elz kpt, majd ki kell szmolni az j koordintkat, ki kell rakni az j helyre a pontot, vgl ellenrizni kell a billentyzetet.

152

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 kvetkez tblzatokat: 00h 01h 02h 03h 04h 05h 06h 07h Fekete Kk Zld Cinkk Vrs Bborlila Barna Vilgosszrke 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh Sttszrke Vilgoskk Vilgoszld Vilgoscin Vilgospiros Vilgosbbor Srga Fehr

Ltjuk, hogy a fekete kdja a 00h. BH-ban a mr emltett kpernylap-sorszm van, a kirakand pont koordintit pedig ppen a CX, DX regiszterekben vrja. Miutn trltk a pont elz pldnyt, ideje, hogy az j hely koordintit meghatrozzuk. A vzszintes s fggleges koordintkat hasonlan dolgozzuk fel, ezrt csak az egyiket nzzk most meg. Tekintsk mondjuk az abszcissza kiszmtst. Elszr 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 eljelt megfordtjuk (teht negljuk a lpskzt), majd ezt az j lpskzt ismt hozzadjuk CX-hez. Az egyoperandus NEG (NEGate) utasts az operandust neglja, teht kpezi a kettes komplemenst, az aritmetikai flag-eket is belltva. Ha ezen az ellenrzsen tljutottunk, akkor mg meg kell nzni, hogy a kperny jobb oldaln nem mentnk-e tl. Ha igen (azaz CX>639), akkor ugyangy jrunk el, mint az elbb, teht negljuk a lpskzt s
153

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 nhny sor nem tartozik az eredeti clkitzshez, de a mkds ellenrzshez elengedhetetlen. A kt pontosvesszvel 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 kpernyn. Miutn letelt a ksleltets, a 01h-s INT 16h szolgltats hvsval megnzzk, hogy nyomtak-e le billentyt, s ha nem, akkor irny vissza a ciklus elejre. Kilps eltt mg egyszer kiolvassuk a billentyzetet, majd visszalltjuk a videomdot szvegesre.

14 MEGSZAKTS-TDEFINILS, HARDVER-MEGSZAKTSOK, REZIDENS PROGRAM, KAPCSOLAT A PERIFRIKKAL, HARDVERPROGRAMOZS


Ideje, hogy kicsit mlyebben elmerljnk a megszaktsok vilgban. Nzzk meg elszr, hogy is hajtja vgre a processzor az INT utastst. A 0000h szegmens els 1024 bjtjn (a 0000h s a 03FFh offszetek kzti terleten) tallhat a megszakts-vektor tbla. Ez nem ms, mint egy ugrtbla, mivel mindegyik bejegyzse egy 4 bjtos tvoli pointer (azaz szegmens:offszet tpus mem154

riacm), 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 kezdcme. Ezeket a programokat megszakts-kezelnek (interrupt handler) nevezzk. Minden megszaktsnak pontosan egy kezelprogramja van, de ugyanaz a kezel tbb megszaktshoz is tartozhat. Ha a programban az INT utasts kdjval tallkozik a processzor (ami 0CDh), akkor kiolvassa az utna lev 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 utasts cmt tartalmazza), majd az IF s TF flag-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 duplaszt, azaz CS-be a 0000h:(N*4+2) cmen lev, mg IPbe 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. Ha a kezel elvgezte dolgt, akkor egy klnleges utasts segtsgvel visszatr az t hv 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 elszr az IP-t, majd CS-t a verembl), a Flags regiszter tartalmt szintn visszalltja a verembl, 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=0F283h (azaz IF=SF=CF=1, a tbbi flag mind 0), CS=7000h, IP=1000h, SS lnyegtelen, SP=0400h.
155

Az INT 21h megszakts vektora a 0000h:0084h cmen tallhat, ennek rtke most legyen mondjuk 2000h:3000h. Az INT 21h utasts vgrehajtsnak hatsra a kvetkezk trtnnek: CS:IP rtke 2000h:3000h lesz, Flags-ben trldik az IF flag, gy az a 0F083h rtket fogja tartalmazni, valamint a verem a kvetkez kpet fogja mutatni: SS:0400h : ?? SS:03FEh : 0F283h (Flags) SS:03FCh : 7000h (CS) SP=> SS:03FAh : 1000h (IP) SS:03F8h : ?? Mivel tudjuk, hogy hol tallhatk az egyes megszaktsok belpsi pontjai, megtehetjk, hogy brmelyik vektort kedvnkre trjuk. Ezzel a lehetsggel rengeteg program l is, elg, ha a DOS-t, BIOS-t, vagy mondjuk az egeret kezel programot (eszkzmeghajtt) emltjk. s mivel a hardvermegszaktsok is bizonyos szoftver-megszaktsokon keresztl lesznek lekezelve, akr ezeket is tirnythatjuk sajt programunkra. Mindkt esetre mutatunk most pldkat.

14.1 Szoftver-megszakts tirnytsa


Els programunk a kvetkezt fogja tenni: indtskor t fogja venni az INT 21h kezelst. Az j kezel a rgit fogja meghvni, de ha az ignyelt funkci a 09h-s lesz (az a bizonyos sztringkir rutin), akkor DS:DX-et egy elre rgztett szveg cmre fogja belltani, s arra fogja meghvni az eredeti szvegkir funkcit. A program billenty lenyomsa utn vissza fogja lltani az eredeti megszakts-kezelt, majd be fog fejezdni.

156

Pelda15.ASM: MODEL SMALL .STACK ADAT Helyes Teszt ADAT KOD RegiCim UjKezelo SEGMENT DB "Ha ezt ltod, akkor" DB " mkdik a dolog.$" DB "Ez nem fog megjelenni!$" ENDS SEGMENT ASSUME CS:KOD,DS:ADAT DW PROC PUSHF CMP JNE POPF PUSH PUSH MOV MOV LEA PUSHF CALL POP POP IRET POPF JMP ENDP MOV ?,?

AH,09h @Nem09h DS DX DX,ADAT DS,DX DX,[Helyes] DWORD PTR CS:[RegiCim] DX DS

@Nem09h: UjKezelo @Start:

DWORD PTR CS:[RegiCim]

AX,ADAT
157

KOD

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

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 szembetn dolog az, hogy a kdszegmensben van definilva a RegiCim nev vltoz, ami majd az eredeti INT 21h kiszolgl cmt fogja trolni. Ennek magyarzata a megszakts-kezel rutin mkdsben rejlik. Azt mr emltettk, hogy minden eljrs elejn rdemes s illend elmenteni a hasznlt regisztereket a verembe, hogy
158

azokat az eljrs vgn gond nlkl visszallthassuk eredeti rtkkre. Ez a szably a megszakts-kezel rutinokra ktelezre vltozik. A regiszterekbe a szegmensregisztereket s a Flags regisztert is bele kell rteni. Az operandus nlkli PUSHF (PUSH Flags) utasts a verembe berakja a Flags regisztert, mg a POPF (POP Flags) a verem tetejn lev szt a Flags-be tlti be. A sajt kezel rutinunk mkdse kt gra fog szakadni aszerint, hogy AH egyenl-e 09h-val avagy nem. A felttel tesztelst a hagyomnyos CMPJNE prossal oldjuk meg, de mivel ez az utasts megvltoztat(hat) nhny flag-et, ezrt a tesztels eltt PUSHF ll, valamint mindkt g a POPF-fel indul. Ez garantlja, hogy az sszes flag rintetlenl marad. Erre krdezhetn valaki, hogy mirt rizzk meg a flag-ek rtkt, ha a Flags gyis el van mentve a veremben. Nos, mr lttuk, hogy nhny szolgltats pl. a CF-ben jelzi, hogy volt-e hiba. Ezek a szolgltatsok visszatrs sorn a veremben lev Flags regiszter-pldnyt egyszeren eldobjk (ksbb ltni fogjuk, hogyan), gy mdostsunk a hv programra is visszahatna, ami kellemetlen lehetne. Ha AH 09h, akkor a @Nem09h talnyos nev cmkn folytatdik a megszakts kiszolglsa. Azt mondtuk, hogy minden egyb esetben a rgi funkcit fogjuk vgrehajtatni. Ennek megfelelen cselekszik a programban szerepl JMP utasts. Ezt a mnemonikot mr ismerjk s hasznltuk is. Itt viszont kt jdonsgot is lthatunk: az els, hogy az operandus nem egy eljrs neve vagy cmkje mint eddig, hanem egy memriahivatkozs (szegmensprefixszel 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 vltozban lev pointer hatrozza meg. Magyarn: a JMPt gy hajtja vgre a processzor, hogy kiszmtja az operandus
159

(esetnkben a CS:RegiCim vltoz) tnyleges cmt, majd az azon a cmen lev pointert tlti be a megfelel regiszterekbe (IPbe 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 kzeli (near) ugrst tenn meg, azaz csak IP-t vltoztatn meg. Neknk viszont CS:IP-t kell j rtkekkel feltltennk, s ez mr szegmenskzi vagy tvoli ugrst jelent (intersegment vagy far jump). A DWORD helyett llhatna mg a FAR is, az ugyancsak tvoli pointert rna el. Az utasts most teht CS-be a CS:(RegiCim+2) cmen lev, mg IP-be a CS:RegiCim cmen lev 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 legegyszerbb 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 megfelelen. Mivel nem szp dolog, ha a vltozs visszahat a hvra, mindkt regisztert elmentjk a verembe. Ez a mvelet azonban meggtol bennnket abban, hogy a msik esethez hasonlan rugorjunk a rgi kezel cmre. Ha ugyanis a JMP DWORD PTR CS:[RegiCim] utastst alkalmaznnk itt is, akkor a hv programba visszatrs nem igazn sikerlne, mondhatni csdt mondana. Hogy mirt? A kulcs a verem. A legutols kt veremmvelettel a verem tetejn a DS s DX regiszterek hvskori rtke lesz, amit a rgi kezelrutin a CS:IP regiszterekbe fog betlteni, s ez valsznleg katasztroflis lesz (nem beszlve arrl, hogy SP is meg fog vltozni a hvskori helyzethez kpest). Ezrt most ugrs helyett
160

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 CALLnak is ltezik kzeli s tvoli alakja, s mindkettbl van direkt s indirekt vltozat is.) A CALL hatsra CS s IP bekerl a verembe, a Flags 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 eltt mg kiadunk egy PUSHF-et. Aki kicsit jobban elgondolkodik, annak feltnhet, hogy ez az utastspros tulajdonkppen egy INT utastst szimull. gy ha a rgi kiszolgl vgez, akkor visszatr a sajt kezelnkbe, ahol mi kitakartjuk a verembl a DS s DX rtkeit, majd visszatrnk a hv programba. Ezt most IRETtel tesszk meg annak ellenre, hogy emltettk, nmelyik szolgltats esetleg valamelyik flag-ben adhatna vissza eredmnyt. Mi most viszont csak a 09h szm szolgltats mkdsbe avatkozunk be, ami nem mdostja egyik flag-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 verembl (teht mkdse szimbolikusan POP IP // POP CS). Az opcionlis sz mret 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 annyiba tr el az IRETtl, hogy a Flags eredeti rtkt nem lltja vissza a verembl, 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 flag eredmnyt tartalmaz. Nem vlaszoltuk mg meg, hogy mirt a kdszegmensben definiltuk a RegiCim vltozt. A vlasz sejthet: ha az adatszegmensben lenne, akkor annak elrshez elszr be
161

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 szegmensben definiltuk volna a RegiCim vltozt. Mivel azonban a kdszegmensbe raktuk a defincit, a kezel rutin kzvetlenl el tudja rni a vltozt. (Ehhez azrt az is kell, hogy az INT 21h kiadsa utn a sajt kezel 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. Mieltt nekifognnk trni az INT 21h vektort, a CLI (CLear Interrupt flag) utastssal letiltjuk a hardvermegszaktsokat (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 kezeljben szerepelne egy INT 21h utasts, akkor a rossz belpsi cm miatt nem a megfelel rutin hvdna meg, s ez valsznleg lomba klden a gpet. A vektor mdostsa utn ismt engedlyezzk a bejv megszaktsokat az IF 1-be lltsval, amit az STI (SeT Interrupt flag) utasts vgez el. A vektor mdostsnl az XCHG egy csapsra megoldja mind a rgi rtk kiolvasst, mind az j rtk berst.

162

Miutn sikeresen magunkra irnytottuk ezt a megszaktst, rgtn ki is prbljuk. A helyes mkds abban ll, hogy nem a Teszt cmkj szveg fog megjelenni, hanem a Helyes. Annak ellenrzsre, hogy a tbbi szolgltatst nem bntottuk, a 02h funkcival egy j sor karakterprt runk ki. Vgl gombnyoms utn visszalltjuk az eredeti kezelt, s kilpnk a programbl.

14.2 Az idzt (timer) programozsa


A kvetkez 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 a szoksosnl, gy ha valaki esetleg nem rten, akkor nyugodtan ugorja t. :)
Pelda16.ASM: MODEL SMALL .STACK KOD Orajel Oszto MSec RegiCim UjKezelo SEGMENT ASSUME CS:KOD,DS:NOTHING DW DW DW DW PROC
163

? ? ? ?,?

@Regi: UjKezelo @Start:

PUSH INC MOV ADD JC MOV OUT POP IRET POP JMP ENDP XOR MOV CLI LEA XCHG MOV MOV XCHG MOV MOV MOV MOV DIV MOV MOV MOV MOV OUT JMP MOV MOV OUT JMP MOV

AX WORD PTR CS:[MSec] AX,CS:[Oszto] CS:[Orajel],AX @Regi AL,20h 20h,AL AX AX DWORD PTR CS:[RegiCim]

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 BX,1000 BX CS:[Oszto],AX WORD PTR CS:[Orajel],0000h BL,AL AL,36h 43h,AL $+2 AL,BL DX,0040h DX,AL $+2 AL,AH
164

@Ciklus:

OUT JMP STI MOV MOV MOV MOV INT INC MOV 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

DX,AL $+2 AH,02h DL,'1' CX,9 BX,1000 21h DL WORD PTR 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

@Var:

KOD

165

Adatszegmensre nem lesz szksgnk, a vltozkat a knnyebb elrhetsg miatt a kdszegmensben definiljuk. A PC hardvernek ttekintsekor mr megemltettk az idztt (timer). Ez az egysg hrom fggetlen szmllval (counter) rendelkezik (szemlletesen hrom stopperrel), s mindegyik egy idzt-csatornhoz tartozik. Ebbl egyik a mr szintn emltett memria-frisstshez kell, egy pedig a bels hangszrra van rktve. A harmadik felels a bels rendszerra karbantartsrt, valamint a floppy meghajt motorjnak kikapcsolsrt. Br elsre nem ltszik, a megoldst ez utbbi fogja jelenteni. Ha ez a szmll lejr, az idzt egy megszaktst kr, ez a megszakts-vezrl 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 idzt egy kvarckristlyon keresztl lland frekvencival kapja az ramimpulzusokat. Ez a frekvencia az 1234DCh Hz (1193180 Hz). Az idzt mindhrom szmlljhoz tartozik egy 16 bites osztrtk. A dolog gy mkdik, hogy az adott szmll msodpercenknt 1234DCh/Oszt -szor jr le. A rendszerrhoz tartoz szmll (ez a 0-s csatorna) osztja 65536, mg a memria-frisstsrt felels (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 idzt 0-s csatornjnak osztjt olyan rtkre lltjuk be, hogy msodpercenknt 1000-szer generljon megszaktst. A megszaktst az IRQ0 vonalrl a megszakts-vezrl tirnytja az INT 08h szoftver-megszaktsra, de ettl ez mg hardver-megszakts marad, aminek fontossgt ksbb ltjuk
166

majd. Ha IF=1, a processzor rzkeli a megszaktst, majd meghvja az INT 08h kezeljt, ami elvgzi a teendket. Ezt a kezelt cserljk le egy sajt rutinra, ennek neve UjKezelo lesz. Nzzk meg elszr a vltozk szerept. Az eredeti kezel cmt ismt a RegiCim trolja. Oszto tartalmazza a szmllhoz tartoz kiszmolt osztrtket. MSec tartalma minden megszakts-krskor eggyel fog nni, 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 mkdnie, mint eltte. 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 kveten 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 lett volna 65536-nl. Mivel azt mondtuk, hogy Orajel egy oszt szerept jtssza, innen kvetkezik, hogy a rgi kezelrutint pontosan akkor kell meghvni, amikor CF=1 lesz. Gyakorlatilag az idzt mkdst 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 idzt az eredeti 65536os oszt szerinti idkznknt 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.

167

Ha viszont CF=0, akkor neknk magunknak kell kiadni a parancsot a visszatrshez. Eltte 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-vezrlnek, hogy minden ok, lekezeltk az adott hardver-megszaktst. Ha ezt a nyugtzsnak (acknowledgement) nevezett mveletet elfelejtjk megtenni, akkor az esetlegesen berkez tbbi megszaktst nem fogja tovbbtani a processzor fel a vezrl. A megszakts-vezrlt a 0020h s 0021h szm portokon keresztl rhetjk el (AT-k esetben a msodik vezrl a 00A0h, 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 bjt a megadott utn kvetkez portra lesz kirva. A nyugtzs csak annyit jelent, hogy a 0020h szm portra ki kell rni a 20h rtket (knny megjegyezni:). Ezutn IRET-tel befejezzk tnykedsnket. 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 cmt, ill. belltjuk a sajt eljrsunkat. Ezt kveten kiszmoljuk az Oszto rtkt. Mint emltettk, az idzt alapfrekvencija 1234DCh, s minden ezredmsodpercben akarunk majd megszaktst, gy az elz rtket 1000-rel elosztva a hnyados a kvnt rtket fogja adni. Aki nem rten, ez mirt van gy, annak egy kis emlkeztet:
1234DCh/oszt=frekvencia

Ezt az egyenletet trendezve mr kvetkezik a mdszer helyessge. Az Orajel vltozt kinullzzuk a megfelel
168

mkdshez. Ezutn az osztt mg az idztvel 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. Megfigyelhetjk a JMP operandusban a cl megjellsekor a $ szimblum hasznlatt. Emlkeztetl: a $ szimblum az adott szegmensben az aktulis sor offszetjt tartalmazza. Ez a sor egyb rdekessget is tartogat, a hasznlt ugrs ugyanis sem nem kzeli (near), sem nem tvoli (far). Ezt az ugrsfajtt rvid (short) ugrsnak nevezzk, s ismertetjele, 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 mveleti 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 mkdsnek tesztelsre egy rvid ciklus szolgl, ami annyit tesz, hogy kirja a decimlis szmjegyeket 1tl 9-ig, mindegyik jegy utn pontosan 1 msodpercet vrakozva. A vrakozst az MSec vltoz figyelsvel 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 vltoz nullzsakor azrt kell kirni a WORD PTR opertort, mert az assembler nem fogja tudni eldnteni az operandusok mrett (hiszen a cl egy memriahivatkozs, a forrs pedig egy kzvetlen adat). A ciklus lejrta utn egy j sor karakterprt runk mg ki, majd vgezetl visszalltjuk az eredeti INT 08h kezelt, valamint az idzt eredeti osztjt. Ezutn befejezzk a
169

program mkdst. Az idztvel kapcsolatban mg annyit, hogy a 0000h rtk jelli a 65536-os osztt. A program trtnethez hozztartozik, hogy az els verziban az UjKezelo eljrs legutols sorban a DWORD helyn FAR llt. A TASM 4.0-s verzija azonban furcsa mdon nem jl fordtja le ezt az utastst ebben a formban, csak akkor, ha DWORD-t runk tpusknt. Erre ksbbi programjainkban nem rt odafigyelni, ugyanis lehet, hogy a forrs szemantikailag j, csak az assembler hibja miatt nem megfelel kd szerepel a futtathat llomnyban. Errl ltalban a debugger segtsgvel gyzdnk meg.

14.3 Rezidens program (TSR) ksztse, a szveges kperny kzvetlen elrse


Rezidens programon (resident program) egy olyan alkalmazst rtnk, amihez tartoz memriaterletet vagy annak egy rszt a DOS nem szabadtja fel a program befejezdsekor. 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. MSCDEX.EXE, egrmeghajtk (MOUSE.COM, GMOUSE.COM stb.), klnfle kpernylopk, commanderek (Norton Commander, Volkov Commander, DOS Navigator) stb. TSR-t .COM programknt egyszerbb rni, gy most mi is ezt tesszk. A feladat az, hogy a program rezidensen maradjon a memriban az indts utn, s a kperny bal fels sarkban lev karakter kdjt s annak szninformciit folyamatosan nvelje eggyel. (Csak szveges mdban!) Nem tl hasznos, de legalbb ltvnyos.
170

Pelda17.ASM: MODEL TINY KOD SEGMENT ASSUME CS:KOD,DS:KOD ORG 0100h JMP DW PROC PUSHF CALL PUSH MOV MOV XOR INC INC INC POP IRET ENDP XOR MOV CLI LDS MOV MOV LEA MOV MOV @Start ?,?

@Start1: RegiCim UjKezelo

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:

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


171

KOD

STI LEA INT ENDS END

DX,@Start 27h @Start1

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 idzt ltal kivltott INT 08h eredeti kezelje dolga vgeztvel egy INT 1Ch utastst ad ki, aminek a kezelje alapesetben csak egy IRET-bl ll. Ezt a megszaktst brki szabadon tirnythatja sajt magra, feltve, hogy meghvja az eredeti (pontosabban a megszakts-vektor szerinti) kezelt, illetve hogy a megszaktsban nem tlt el tl sok idt. Az idkorlt betartsa azrt fontos, mert az INT 08h ugyebr egy hardver-megszakts, s ha a megszakts-vezrlt csak az INT 1Ch lefutsa utn nyugtzza a kezel, akkor az eltelt idtartam hossza kritikuss vlhat. Adatszegmensnk most sem lesz, az egy szem RegiCim vltozt a kdszegmens elejn definiljuk, s mellesleg a rezidens rszben foglal helyet. Az UjKezelo eljrs elejn hvjuk meg az elz kezelt, s ez utn vgezzk el a kpernyn a mdostsokat. A kpernyre nem csak a DOS (INT 21h) vagy a video BIOS (INT 10h) segtsgvel lehet rni. A megjelentend kpernytartalmat a videovezrl krtyn lev videomemriban troljk el, majd annak tartalmt kiolvasva kszl el a vgleges kp a monitoron. Ennek a memrinak egy rsze a fizikai memria egy rgztett cmtartomnyban elrhet. Magyarra fordtva ez azt jelenti, hogy grafikus mdok esetn a 0A0000h, mg szveges mdoknl a 0B0000h (fekete-fehr) vagy a 0B8000h (sznes) fizikai cmeken kezdd terlet a videokrtyn lev memria aktulis llapott tkrzi, s oda berva valamit az igazi videomemria is mdosulni fog. Grafikus
172

mdoknl a 0A000h szegmens teljes terjedelmben felhasznlhat, mg szveges md esetn a 0B000h s 0B800h szegmenseknek csak az els fele (teht a 0000h..7FFFh offszetek kztti terlet). Bennnket most csak a szveges mdok rdekelnek, azokon bell is a sznes kpernyk esetn hasznlatosak. Fekete-fehr (monokrm) kpet elllt videokrtya esetben a 0B000h szegmenset kell hasznlni, egyb vltoztatsra nincs szksg. A videomemriban a kpernyn 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 offszetcmeken tallhatk. Az attribtumot a kvetkez mdon kdoljk: a 0..3 bitek adjk az eltrsznt, a 4..6 bitek a htteret, mg a 7-es bit villogst r el, de gy is bellthat a videokrtya, hogy a httrszn 4. bitjt jelentse. A sznkdok megegyeznek a mr korbban tblzatban lertakkal. Az UjKezelo rutinhoz visszatrve, a bal fels sarokban lev karakter cme a 0B800h:0000h, amit az attribtum kvet. Miutn mindkt bjtot kln-kln inkrementltuk, IRET-tel visszatrnk a hvhoz. A fprogram 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 tvoli mutatt (azaz szegmenst s offszetet) 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 szavakat tlti be. Hasonl mveletet 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.
173

Ezek utn a fprogram be is fejezi mkdst, de nem a hagyomnyos mdon. Az INT 27h egy olyan DOS-megszakts, ami a program mkdst 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 kvetkez 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 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 terlet mrett kell megadnunk paragrafusokban (azaz 16 bjtos egysgekben), a PSP szegmenstl szmtva. Megszakts-vektorok belltsra s olvassra a DOS is knl lehetsget. Az INT 21h 25h szm szolgltatsa az ALben 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.

15 KIVTELEK
A kivtel (exception) egy olyan megszakts, amit a processzor vlt ki, ha egy olyan hibt szlel, ami lehetetlenn teszi a kvetkez utasts vgrehajtst, vagy egy olyan esemny trtnt, amirl a programoknak s a felhasznlnak is rteslnik kell. Minden kivtelt egy decimlis sorszmmal s egy nvvel azonostanak, ezenkvl minden kivtelhez tartozik egy
174

kettskeresztbl (#) s kt betbl 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 flag-eket. Ezutn sor kerl a kivtelt lekezel programrsz (exception handler) vgrehajtsra. Az Intel az INT 00h..1Fh szoftvermegszaktsokat a kivtel-kezel programok szmra tartja fenn. Egy adott N sorszm kivtel esetn az INT N megszakts kezelje lesz vgrehajtva. A teendk elvgzse utn a kezel IRET utastssal visszatrhet abba a programba, amely a kivtelt okozta. Br a ksbbi processzorokon megjelentek olyan, nagyon slyos rendszerhibt jelz kivtelek, amik utn a kivtelt okoz program mr nem indthat jra (vagy nem folytathat), a 8086-os processzoron mindegyik kivtel megfelel 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 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 utasts cmt tartalmazza CS:IP veremben lev 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: Szm Mnemo Nv Tpus Kivlt felttelek
175

0 1 3 4

#DE #DB #BP #OF

Divide Error Debug Breakpoint Overflow

Trap Trap Trap Trap

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

A 0-s kivtel az osztskor megtrtn hibk sorn keletkezik. A DIV s az IDIV utastsok vlthatjk ki, s alapveten kt oka van: az egyik, hogy nullval prbltunk meg osztani, ez az eset ltalban a hibs algoritmusokban fordul el. 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/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 AHban). Ennek eredmnye a 0-s kivtel lesz. Ezt a kivtelt alapesetben a DOS kezeli le, egy hibazenet kirsa utn egyszeren terminlja az ppen fut programot, majd visszaadja a vezrlst a szl alkalmazsnak (COMMAND.COM, valamilyen shell program, commander stb.). Megjegyezzk, hogy a 0-s kivtelt a 80286-os processzortl kezdden hibaknt (fault) kezelik. Az 1-es kivtel keletkezsnek kt oka lehet: vagy kiadtunk egy INT 01h utastst (kdja 0CDh 01h), vagy bekapcsoltuk a TF flag-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 mkdst vlt ki, ez azonban csak a 80386-os vagy annl jabb processzorokon ltez virtulis-8086 zemmdban nyilvnul meg. 4-es kivtel akkor keletkezik, ha OF=1 s kiadunk egy INTO utastst.
176

Br nem kivtel, emltst rdemel egy korbban mg be nem mutatott megszakts. Az NMI (NonMaskable Interrupt) olyan hardver-megszakts, ami a megszakts-vezrlt kikerlve kzvetlenl a processzor egyik lbn (rintkezjn) keresztl jut el a kzponti egysghez, s amint neve is mutatja, nem tilthat le. A CPU az IF flag llstl fggetlenl mindig ki fogja szolglni ezt a megszaktst, mgpedig az INT 02h kezelt meghvva. Mivel NMI csak valamilyen hardverhiba folytn keletkezik (pl. memria-paritshiba, nem megfelel tpfeszltsg stb.), lekezelse utn a szmtgp nincs biztonsgos llapotban a folytatshoz, ezrt az NMI-kezelben ltalban hibazenet kirsa (esetleg hangjelzs adsa) utn lelltjk a mkdst. Ez utbbit gy rik el, hogy kiadnak egy CLI utastst, majd egy vgtelen ciklusba engedik a processzort (ez a legegyszerbben egy nmagra mutat JMP utastst jelent). 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 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 koprocesszor (FPU) is generlhat NMI-t. Ebben az esetben az NMI keletkezse nem hardverhibt, hanem a szmtsok kzben elfordul numerikus hibkat (kivteleket) jelzi. Az NMI-kezelnek a dolga, hogy eldntse, le kell-e lltani a szmtgpet avagy nem.

177

16 OPTIMALIZLS MDJAI
Ktfle szempont optimalizlni: alapjn tudjuk a programot

sebessgre: a program, vagy annak valamely rsze a lehet leggyorsabban fusson le mretre: a program, vagy annak valamely rsze a lehet legkisebb legyen Meg kell jegyeznnk, hogy az Assemblyre a magas szint nyelvekkel szemben ltalban igaz a tmrebb-gyorsabb elv, valjban azonban a kt tulajdonsg nagyjbl egyms rovsra megy, mintha azok "forditott arnyossgban llnnak" egymssal (nem mindig, errl mg lesz egy pr sz). Manapsg gy tnik, hogy egyikre sem optimalizlnak (legalbbis egyesek), mert az jabb gpek gyis gyorsabbak lesznek, tbb memrival, stb., azaz a szoftverhez igazitjk a hardvert, s nem forditva.

16.1 Sebessgre optimalizls


Szerintnk ez az a tulajdonsg, amire inkbb rdemes egy programot optimalizlni (kivve, ha valami nyoms okunk van az ellenkezjre). A sebessgre optimalizls esetben szre kell vennnk, hogy a program futsidejnek dnt tbbsgt a ciklusok vgrehajtsa teszik ki. pp ezrt elg, ha csak ezekkel foglalkozunk. Tovbb szkithetjk azonban a krt, mert a ciklusok kztt is elg csak azokkal foglalkozni, amelyek biztosan a legtbbszr hajtdnak vgre, igy az sebessgket kell mocsokmd megnvelni. Erre egy plda: a 3 dimenzis jtkok esetn (persze a rgebbiekre gondolok, nem a mai 3D178

krtysokra) a szoftvernek kell megrajzolnia az egsz 3D-s ltvnyt, ami poligonokbl pl fel. A tr megrajzolsnak a lehet leggyorsabbnak kell lennie, klnben a jtk lass, lvezhetetlen lesz. Mivel ilyenkor a legtbbszr a poligont megrajzol eljrs fut, annak azon ciklusait kell a vgletekig optimalizlni, amelyek pl. egy sort vagy oszlopot rajzolnak meg a poligonbl. A sebessgre optimalizls alapveten gy trtnik, hogy ismerve a gpi utasitsok raciklusban mrt vgrehajtsi sebessgt, az adott programrszt olyan utasitsok felhasznlsval irjuk meg, hogy az sszid minl kisebb legyen. Ne higgyk azonban, hogy ez ennyire egyszer: az egyes utasitsok tnyleges vgrehajtsi ideje fgghet attl, hogy konkrtan milyen operandusokra adjuk ki, vagy hogy pl. mennyi ideig tart az operandus kihozsa a memribl, ha az nincs benne a processzor cache-ben (bntetraciklusokat kaphatunk, amikor a proci nem csinl semmit), stb. Ez igaz a programkdra is, jobb ha az befr a proci kd-cache-be (ilyenformn mretre is optimalizlnunk kell!). De ez mg mind semmi, ha egy mai processzorra akarunk optimalizlni (pl. Pentium-tl felfel). Ezek ugyanis kpesek pl. kt utasitst szimultn vgrehajtani, de csak ers felttelek mellett. Viszont a programrsz akkor fut le a leggyorsabban, ha a lehet legtbb utasits hajtdik vgre prban, teht ezen bizonyos feltteleket is figyelembe kell vennnk. Ha van feltteles elgazsunk is egy cikluson bell, akkor a processzor leghatkonyabb kihasznlshoz nem rt ismernnk annak elgazselrejslsnak mkdsi elvt. Ha mindezeket figyelembe vesszk (ami mg mindig kevs, mert vannak mg ms nyalnksgok is m), akkor pl. egy optimlis ciklusra olyan megoldsok szletnek, amit vagy senki nem rt meg, vagy egyltaln nem tnik optimlisnak, vagy ezek lineris kombincija.

179

A sebessgre val teljes optimalizls teht rendkivl nehz feladat, igy csak egy-kt ltalnos tippet adunk. 1.Hlyn hangzik, de lehetleg kerljk a ciklusokat! Kevs iterciszm vagy specilis ciklusok esetn lteznek velk ekvivalens s nluk gyorsabb szekvencilis kdok. 2.Ne ltalnositsuk a ciklusokat, hanem lehetsg szerint specializljuk. Ez alatt azt rtjk, hogy ne olyan ciklust irjunk, ami valaminek tbbfle esett is kezelni tudja, mert ilyenkor az esetek vizsglata vagy az abbl szrmaz "felesleges" kd is a cikluson bell van, ami lassitja azt. Irjunk inkbb egy-egy ciklust kln-kln minden esetre, s azok vgrehajtsa eltt dntsk el, hogy melyiket is kell majd meghivni. Ezzel az esetek vizsglatt kivettk a ciklusokbl. Pl.:
MOV CX,1000 @Ujra: OR BL,BL JZ @Oda ADD AX,[SI] JMP @Vege @Oda: ADD [SI],DX @Vege: ADD SI,2 LOOP @Ujra

helyett:
MOV OR JE @Ujra1: ADD ADD LOOP CX,1000 BL,BL @Ujra2 AX,[SI] SI,2 @Ujra1
180

JMP @Ujra2: ADD ADD LOOP @Vege:

@Vege [SI],DX SI,2 @Ujra2

Ez lhatan hosszabb, viszont gyorsabb is. 3.Bontsuk ki a ciklusokat (roll out), azaz ismteljk meg a ciklusmagot, hogy kevesebb id menjen el pl. a ciklus elejre val visszaugrsokra:
@Ujra: ADD ADD LOOP AX,[SI] SI,2 @Ujra

helyett:
SHR CX,1 JNC ADD ADD @Ujra: ADD ADD ADD LOOP @Ujra AX,[SI] SI,2 AX,[SI] AX,[SI+2] SI,4 @Ujra

Elszr osztjuk 2-vel a ciklusszmllt, ha az pratlan volt, akkor egyszer vgrehajtjuk a ciklusmagot. A tnyleges ciklus viszont mr csak feleannyiszor fut le, radsul kevesebb sszeadst hatjunk vgre sszesen, viszont ez csak a fejlettebb procikra igaz, mivel 8086-on tbb raciklusig tart kiszmolni a cimet az [SI+2] cimzsmdbl, mint az [SI]-bl. Ebbl is ltszik, hogy a sebessgre optimalizls mennyire processzorfgg.
181

4.A cikluson bell a lehet legkevesebb legyen a memriahivatkozs, a vltozk rtkt lehetleg regiszterekben troljuk, mivel azok nagysgrendekkel gyorsabban elrhetek, mint a memria. 5.Ha nem mindent tudunk regiszterbe tenni, mert tl sok vltoznk van, akkor egy sokak ltal elitlt mdszert, az nmdosit kdot is alkalmazhatjuk:
@Ujra: ADD ADD LOOP [SI],DX SI,Adando @Ujra

Tegyk fel, hogy az adando rtkt nem tudjuk regiszterbe betenni, ekkor:
MOV AX,Adando MOV WORD PTR CS:@Utasitas+2,AX JMP $+2 @Ujra: ADD [SI],DX @Utasitas: ADD SI,1234h ;gpi kdja: 81h C6h 34h 12h LOOP @Ujra

Azaz az ADD SI,1234h kzvetlen operandust tirtuk a megfelel rtkre a kdszegmensben. A JMP $+2 azrt kell, mert a fejlettebb procikon a ciklus kdja mr azeltt bekerl (het) a kd-cache-be, mieltt tirnnk az operandust, igy nem lenne neki semmi hatsa. A JMP viszont trli a cache-t, igy a mr tirt utasits fog bekerlni oda. Ez a mdszer csak akkor ri meg, ha a ciklus viszonylag sokszor iterl. 6.A ciklusra nzve konstans rtkek kiszmitst vigyk ki a ciklus el, azaz ne szmoljunk ki mindig valamit a cikluson bell, ha minden iterciban ugyanazt az eredmnyt kapjuk.

182

Olyan ez, mintha egy szorztnyezt emelnnk ki egy sszegbl. 7.Az sszetett utasitsokat helyettesithetjk tbb egyszerbbel. Idig pl. LOOP-pal szerveztk a ciklust, viszont gyorsabb nla a DEC CX // JNZ pros, brmily meglep! Ilyenekre akkor jhetnk r, ha bngsznk egy tblzatot az egyes utasitsok vgrehajtsi idejrl. Lehetsg szerint kerljk az idignyes aritmetikai mveleteket, mint pl. a szorzs/oszts (a DIV/IDIV utasitsok klnsen sok raciklust ignyelnek), s helyettesitsk ket egyszerbbekkel, pl. ha 2 hatvnyval kell osztani/szorozni.
MOV @Ujra: MOV MUL MOV ADD DEC JNZ BX,10 AX,[SI] BX [SI],AX SI,2 CX @Ujra

helyett:
@Ujra: MOV SHL MOV SHL SHL ADD ADD ADD DEC JNZ

AX,[SI] AX,1 BX,AX BX,1 BX,1 AX,BX [SI],AX SI,2 DX @Ujra

183

16.2 Mretre optimalizls


Lttuk, hogy a sebessgre optimalizlt rszek hossza megn. A program azon rszeit viszont, amelyeket nem szksges sebessgre optimalizlni, azt optimalizlhatjuk mretre. Ezzel kompenzlhatunk, s sszessgben megtarthatjuk a tmr-gyors tulajdonsgprost. Mretre optimalizlni mr sokkal knnyebb, ilyenkor csak az utasitsok hosszt kell figyelnnk. Lssunk egy-kt dolgot: 1. Az ltalnos regiszterek kzl az AX-en vgzett elemi mveletek kdja ltalban egy bjttal rvidebb, mint a tbbi esetben:
MOV ADD AX,Valami AX,1234h

rvidebb, mint pl.


MOV ADD BX,Valami BX,1234h

2. Ha AL/BL/CL/DL kzl valamelyiket eggyel kell nvelni, s tudjuk, hogy nem lesz tlcsorduls, valamint a jelzk llapotra sem lesznk kivncsiak, akkor pl.
INC CL

helyett egy bjttal rvidebb az


INC CX

184

3. Olyan esetekben, amikor biztosan tudjuk, hogy AL, illetve AX nemnegativ, akkor egy bjttal nullzhatjuk az AH, illetve a DX regisztert:
CBW

kinullzza AH-t, s
CWD

kinullzza DX-et. 4. Rvidebb a memriba val mozgats, ahhoz hozzads, stb., ha az operandus egy regiszter, mintha kzvetlenl adnnk meg, igy pl.:
ADD ADD ADD ADD VALTOZO1,3 VALTOZO2,3 VALTOZO3,3 VALTOZO4,3

helyett rvidebb
MOV ADD ADD ADD ADD AX,3 VALTOZO1,AX VALTOZO2,AX VALTOZO3,AX VALTOZO4,AX

5.

Utasits elrejtse egy msiknak az operandusba. Pl.:


JE STC JMP CLC
185

@OK @Ki

@OK:

@Ki:

RET

helyett rvidebb
JE STC DB CLC RET @OK 0B0h

@OK:

Itt a B0h bjt a MOV AL,... utasits kdja. Mivel a CLC egybjtos (F8h), igy az pont ennek az utasitsnak lesz az operandusa. Az STC utn teht egy MOV AL,0F8h utasits hajtdik vgre, ami nem befojsolja a jelzket. Ez persze csak akkor alkalmazhat, ha AL tartalmt el szabad rontanunk.

6.

Felesleges ugrsok elkerlse.Pl.:


CMP JE MOV JMP AL,7 @Oda BL,5 @Ki

@Oda: @Ki:

MOV BL,9

helyett:
MOV CMP JE MOV BL,5 AL,7 @Ki BL,9

@Ki:

186

7. Ha kt gnak megegyezik az eleje, akkor azt "ki lehet emelni" az elgazs el. Ha csak hasonlitanak, akkor megvizsglhatjuk, hogy lehet-e ket egyesiteni egy mindkettvel ekvivalens, de rvidebb kddal.
CMP JE SI,DX @Ag2 BL,6h DX,DX @Oda1 BL,13

@Ag1:

MOV OR JNE MOV @Oda1: . . . @Ag2: MOV OR JNE MOV @Oda2: . . .

BL,6h DX,DX @Oda2 BL,13

helyett:
MOV OR JNE MOV CMP JE . .
187

@Oda: @Ag1:

BL,6h DX,DX @Oda BL,13 SI,DX @Ag2

@Ag2:

. . . .

17 JABB ARCHITEKTRK
Ez a fejezet az eddig ismertetett anyagon jcskn tlmutat, ezrt fleg azok olvassk el, akiket rdekel, hogyan is fejldtt a PC-k piaca az 1981-es vi megjelenstl napjainkig (ebben a pillanatban 1999-et runk). A 18 v alatt lezajlott sszes vltozst s jdonsgot nem lehet egyetlen fejezetben bemutatni, lehet, hogy egy knyv is kevs lenne r. Itt mgis sszegyjtttk a megjelent Intel-kompatibilis processzorok fontosabb ismrveit, jtsait, st rejtett kpessgeit. Ennek a vilgnak az sszetettsgt is jelzi, hogy a PC-t meglmod IBM-en (International Business Machines) s annak processzort gyrt Intel-en kvl szmos ms cg is gyrtott s gyrt mg manapsg is az Intel termkeivel kompatibilis mikroprocesszorokat: Sony, NEC, Chips and Technologies (C&T), TI (Texas Instruments), NexGen, UMC (United Microelectronics Corporation), IDT Incorporated, Centaur Technology, National Semiconductor, Rise Technology, Cyrix, AMD Incorporated (Advanced Micro Devices). A lista valsznleg nem teljes, de ennl tbb gyrtrl nem volt informcink. A mostani processzorpiacon az Intel s az AMD verseng a vsrlk kegyeirt, az IBM s a Cyrix pedig fleg hordozhat gpekbe s begyazott rendszerekbe (embedded systems) gyrt olcs, kzepes teljestmny procikat. jdonsgnak szmtanak a Rise Technology alacsony teljestmny-felvtel processzorai.
188

A legels mikroprocesszort az Intel Corporation ksztette el 1971-ben, amit 4004-es nven kereszteltek meg. A rkvetkez vben ezt a 8008-as, majd 1974-ben a 8080-as processzorok kvettk. Ez utbbi chip kt szmtgp-csald snek tekinthet: belle fejldtt ki az 1976-ban megjelent Z80-as, a Zilog Corporation ltal gyrtott processzor (erre alapult sok ksbbi mikroszmtgp, mint pl. Enterprise s a Sinclair-termkek), de ennek a mikroprocesszornak a tovbbfejlesztsbl szletett meg az els PC-k kzponti egysge, az 1978-ban kiadott Intel 8086-os is, aminek elfutra a szintn 1976-ban gyrtott 8085-s volt. A 8086-os mr valdi 16 bites processzor volt, 16 bites regiszterekkel s adatbusszal, valamint 20 bites cmbusszal (ez 1 Mbjt memria megcmzsre elg). Az els IBM XT (taln az eXtended Technology rvidtse) azonban nem ezzel a processzorral, hanem az 1979ben vilgra jtt Intel 8088-as CPU-val kerlt a piacra. Ez a mikroprocesszor minden bels tulajdonsgban megegyezik az elbbivel, viszont a kls adatbusza csak 8 bites volt, ami olcsbb tette a szmtgpek gyrtst. A processzort kezdetben 4.77 MHz-es rajel hajtotta, amit a ksbbiekben t lehetett kapcsolni 10 MHz-re is (erre szolglt a legends Turbogomb a gphzon). Ezek a gpek az 1975-ben alaptott, manapsg is "kzkedvelt" Microsoft cg ltal ksztett MS DOS 1.0-s opercis rendszerrel jelentek meg. A ksbbi gpek is mind ennek az op. rendszernek a klnbz vltozatait hasznltk (a legelterjettebbek az MS DOS 3.3, 4.0, 5.0, 6.2, 6.22 verzik voltak). Az 1992-ben megjelent MS Windows 3.1, valamint az 1995-ben kiadott MS Windows 95 (igazbl Windows 4.0) azonban a j "reg" DOS levltsnak idejt mind kzelebb hozzk. Ha lehet hinni a Microsoft hreinek, akkor a 2000-ben megjelen Windows 2000 opercis rendszer mr nem a DOS-

189

ra fog plni, rajta csak a Windows 9x/Windows NT rendszerekre rt programok fognak futni. 1982-ben hrom processzort is megjelentetett az Intel: a 80186 s 80188 nev chipek csak nhny j utastssal s megvltoztatott kls interfsszel trtek el a korbbi kt processzortl. A 80286-os mikroprocesszor megjelensvel azonban beksznttt az AT-k (Advanced Technology) korszaka, s ez mind a mai napig tart. Ez a proci mr nagyon sok jtst tartalmazott: j utastsok, j mkdsi md, 16 Mbjt megcmezhet memria (azaz a cmbusz 24 bit szles volt) stb. j regiszterknt megjelent a gpi llapotsz (Machine Status WordMSW), mindegyik szegmensregiszter kapott egy rejtett rnykregisztert (segment descriptor cache), valamint a vdett mddal egytt 4 rendszerregiszter is be lett vezetve (GDTR, IDTR, LDTR, TR). rajele 12.5/16/20 MHz volt. 1985-ben igazi ttrst hozott az Intel 80386-os processzor (fednevn P9) piacra dobsa, ami az addigi 16 bites architektrt 32 bitesre vltotta t. Rengeteg jtsval az addig megvalsthatatlannak hitt dolgok is realizlhatak lettek: ers vdelem a tbbi programmal szemben, 32 bites regiszterek, 4 Gbjt (=4*1024*1024*1024 bjt) megcmezhet memria, virtulis memria kezelse lapozssal (ktszint szegmenslapcmzs, 4 Kbjtos lapmrettel), hatkonyabb cmzsi mdok, kt j adatszegmens-regiszter, kibvtett debuggolsi lehetsgek (hardveres trspontok, nyomkvet regiszterek), tesztregiszterek, vezrlregiszterek s mg sorolhatnnk. Hasonlan a 8086-8088 proshoz, ennek a processzornak is kt vltozata terjedt el igazn: a 80386SX 16 bites kls adatbuszt kapott, rajele 20/25/33 MHz lehetett, mg a 80386DX 32 bites volt klsleg is, rajele pedig 33 illetve 40 MHz volt tpustl fggen.

190

Az 1989-ben bejelentett Intel 80486-os processzor ltszlag nem sok jdonsggal szolglt: a processzorra ptett 8 Kbjt mret gyorsttr (cache memory), prhuzamos vgrehajts lehetsge (parallel processing/execution), egy-kt j utasts. Ezek azonban igen fontos jtsok voltak, mivel a ksbb megjelent P5 s P6 architektrk fbb alapjait leraktk. Ez a processzor volt az els, amely bels rajelknt a kls rajel tbbszrst hasznlta a gyorsabb mkds rdekben. A 25, 33 vagy 40 MHz nagysg kls jelet a processzor klnbz tpusai ms-ms rtkkel szoroztk fel: a 80486SX (P4S, P23) s 80486DX (P4) tpusok 1-es szorzt hasznltak, a 80486DX2 (P24, P24S, P24D) tpusok duplztak (55, 66 ill. 80 MHz-es vltozatok), mg a 80486DX4 (P24C, P24CT) szm vltozatok hromszoroztk a kls rajelet (75, 100 ill. 120 MHz-es tpusok). Eddig nem emltettk, de mr a 8086-os proci megjelense ta lehetsg volt a rendszerben a kzponti egysg mellett egy segdprocesszor (co-processor) hasznlatra is. Mivel a CPU csak egsz tpusokat ismer, szksg volt egy olyan hardverre, ami hatkonyan kpes szmolni lebegpontos szmokkal (floating-point number). Ezek olyan, specilisan brzolt racionlis szmok, ahol a tizedespont helye nincs rgztve, ellenttben a fixpontos szmokkal (fixpoint number). A 8086/8088 processzorokhoz a 8087, mg a 80286-os processzorhoz a 80287 tpusjelzs segdprocesszorokat lehetett hasznlni. A 80386-os proci kt fajta koprocesszort is kpes volt kezelni: 80287-es s 80387-es is mkdtt vele. A 80486 processzor legnagyobb jtsa taln az volt, hogy a processzor immr magba foglalta ezt a segdprocesszort is. Mivel azonban ez igen megdrgtotta az amgy sem olcs processzort, ebbl a sorozatbl is kszlt "gyengtett" vltozat: a 80486SX processzor nem tartalmazott segdprocesszort, viszont lehetett hozz venni ilyet 80487SX (P23S, P23N) nven. A segdprocesszor hrom nven terjedt el: numerikus
191

segdprocesszor (numeric co-processor), numerikus adatfeldolgoz (Numeric Data ProcessorNDP), valamint lebegpontos egysg (Floating-Point UnitFPU), gy brmelyik kifejezssel tallkozunk is, mindegyik ugyanarra az eszkzre utal. A numerikus koprocesszor egybknt 8 regisztert tartalmaz, melyek azonban csak veremknt kezelhetk (co-processor stack), kzvetlenl nem rhetk el. A verem tetejt az ST vagy ST0 kifejezsek jellik, ST1 a verem teteje eltte (alatti) elemet jelzi, s gy tovbb, egszen ST7-ig. Mindegyik regiszter 80 bites, s tartalmuk binris egsz, BCD egsz, illetve 32, 64 vagy 80 bites lebegpontos szm lehet. Ekkortjt jelentkezett az igny a mobil szmtgpek (gymint notebook-ok, laptop-ok) megjelensre. Az Intel ezekbe a szmtgpekbe sznta 80386SL s 80486SL Enhanced nev processzorait, amelyek klnfle, az energiatakarkossgot tmogat szolgltatst is nyjtottak. Ilyen volt a processzor automatikus lelltsa (Auto Halt Powerdown), a processzor bels rajelnek lelasstsa (Stop Clock), illetve egy specilis karbantart zemmd (System Management ModeSMM). 1993-ban jelent meg az eredetileg P5 fednev Intel Pentium processzor, de P54C nv is ezt a processzort takarja. Mivel az addigi Intel termkeknek sok hasonmsa jelent meg ms gyrtktl, s azok mindegyike magban hordozta a nevben valamelyik 86-ra vgzd tpusszmot (teht 386, 486, 486SX stb.), ez elgg legyengtette az Intel processzorok eslyt. Egy szmot nem lehet mrkanvknt bejegyeztetni (regisztrltatni), egy szt viszont lehet. Ezrt ettl az idponttl kezdve az sszes gyrt valamilyen egyedi nevet ad az jdonslt processzorainak. Innen ered a Pentium nv is, amely a "penta" szval utal arra, hogy ez az 586-os sorozat tagja. Ez teht mr jogilag vdett bejegyzett mrkanv (registered trademark), azaz ha a "Pentium" szt halljuk, akkor az csak az eredeti Intel
192

Pentium valamelyik vltozatt jelentheti, ms termkek csak a "Pentium kompatibilis" jelzt hasznlhatjk. A P5 architektra ismt hozott nhny kellemes jtst: szuperskalr utasts-vgrehajts (kt utasts rajelenknt), az ezt lehetv tev kt vgrehajt-csvezetk (u s v execution pipeline-ok), 2*8 Kbjt nagysg cache (writeback s writethrough mdokban is), elgazs-elrejelzs (branch prediction); a lapok mrete immr nem csak 4 Kbjt, de 4 Mbjt is lehet; 64 bites kls adatbusz, tovbbfejlesztett megszakts-vezrl (Advanced Programmable Interrupt ControllerAPIC), valamint ktprocesszoros rendszerek tmogatsa (dual processing). Ezenkvl a 80386-oson bevezetett tesztregisztereket eltrltk. A 2*8 Kbjt cache 8 Kbjt utasts-cache-t s 8 Kbjt adatcache-t jelent. A Pentium tmogatja az SMM zemmdot is, s ez a tovbbi processzorok esetn is gy lesz valsznleg. Ezen kvl a Pentium-tl kezdve minden processzor magban foglalja a numerikus egysget is. A 80486-os processzorok ksbbi vltozatai mr tartalmaztak nhny .n. modell-specifikus regisztert (ModelSpecific RegisterMSR), de igazn csak a Pentium processzorral terjedtek el. Ezek a 64 bites regiszterek elg vltozatos tartalmak lehetnek, kzlk nagyon hasznos pldul a Time- Stamp Counter (TSC), amely tartalma a processzor resetelsekor kinullzdik, s minden rajel eggyel nveli rtkt. A MSR regiszterek olvassra s rsra szolgl RDMSR s WRMSR, valamint RDTSC utastsok, de az MSRek klnsen elg gyengn dokumentltak voltak. Ennek ellenre a legtbb Pentium-kompatibilis termk is tmogatta ket. A Pentium kategrij processzorok immr olyan alaplapon foglaltak helyet, amire a processzor maga nincs gyrilag rltetve. A processzort egy specilis foglalatba kell beilleszteni, ennek neve Socket 7. A processzor s az alaplapi perifrik mkdsnek meggyorstsra a kzponti rajelet az
193

addigi 33 MHz-rl t lehetett kapcsolni 66 vagy 83 MHz-re, st nhny alaplapon mg ms rtkre is. A processzor bels rajele az elzkhz hasonlan ennek a kls jelnek a felszorzsval ll el. A korbbi 80486-os processzorok gyrilag rgztett szorzszmtl eltren azonban az sszes j processzor a Pentium-tl kezdve egy kvlrl, az alaplapon llthat szorzrtket hasznl. A Pentium processzor elg sokfajta vltozatban kerlt a piacra, gy voltak 66, 75, 90, 100, 133 MHz-es rajelet ignyl tpusok. A klsleg, kzzel llthat szorzk bevezetse magval vonta egy j fogalom megjelenst is. Tlprgetsen (overclocking) azt rtjk, amikor olyan szorzt lltunk be, ami a hivatalos rajelnl magasabb tem jelet vlt ki. Az, hogy egy Pentium-ot mondjuk 100 MHz-esknt knlnak, nem felttlenl jelenti, hogy a processzor csak ekkora rajelet visel el. gy trtnhetett meg pldul, hogy egy 90 MHz-es Pentiumot mondjuk 166 MHz-en mkdtettek (ez 5*33 , 2.5*66 vagy 2*83 MHz-nek felel meg). A tlprgets elvileg krostja a processzort, mivel a magasabb rajel miatt jobban melegszik a proci, ez viszont megfelel htssel ellenslyozhat. gy aztn nem lehet azon sem csodlkozni, hogy sokan hasznljk szmtgpket "felhzva". Ha mr a hts szba kerlt, azt sem rt megemlteni, hogy mg egy 80386-os proci vgan elvolt magban, egy 80486-ost mr illett valamivel hteni (htbordval s/vagy ventiltorral), addig a Pentium procikat s utna megjelent trsait szinte ktelez hteni, ha nem akarjuk, hogy a chip leolvadjon az alaplaprl. (Ez nem is lenne oly nehz, hiszen egy 300 MHz-en mkd proci krlbell 2025W-nyi teljestmnyt fogyaszt, ami hts nlkl akr 60-70 Cos hmrskletre is felmelegten a processzor tokjt, s ezt a gphzban uralkod meleg leveg csak tovbb emeln.) A sovny pnztrcjak szmra dobta piacra az Intel a Pentium Overdrive (P24T) processzort, amit egy 80486-os

194

tetejre kellett rhelyezni, ezzel az majdnem elrte egy igazi Pentium sebessgt, viszont jval olcsbb volt annl. Ettl a ponttl kezdve kt szlon folytatjuk a trtnetet. Az Intel mellett ugyanis igazn csak az AMD processzorai rghatnak labdba. Sajnos az IBM s a Cyrix processzorait nem ismerjk kzelebbrl, s pontosabb informcink sincs rluk, ezrt itt nem foglalkozunk velk. Az AMD is elksztette sajt Pentium-kompatibilis mikroprocesszort K5 nven. A kvetkez genercit a P6-os fednev Intel Pentium Pro processzor hozta, melyet 1995-ben jelentettek be. Fbb jdonsgai: hromutas szuperskalr vgrehajts (azaz hrom utasts vgrehajtsa raciklusonknt), dinamikus vgrehajts (dynamic execution), ami adatramls-analzist (micro-data flow analysis), soronkvli utasts-vgrehajtst (out-of-order execution), fejlett elgazs-elrejelzst (superior branch prediction) s spekulatv vgrehajtst takar (speculative execution); ezenkvl a 2*8 Kbjt elsszint (Level 1L1) cache mellett 256 Kbjtos msodszint (Level 2L2) cache, 64 bites kapcsolat-orientlt kls adatbusz (transaction-oriented external data bus), valamint 64 Gbjt cmterletet biztost 36 bites cmbusz. Ez a processzor mr a tokozs tern is elindul a vltozs fel, ugyanis specilis, Socket 8 nev csatlakozba illeszkedett csak, amire egy kln e clra val alaplap szolglt. A multimdis alkalmazsok egyre gyorsabb tem terjedse magval hozta azt a termszetes ignyt, hogy a processzor is tmogassa utastsszinten a klnfle szmolsignyes feladatokat. Ebbl a clbl jelentette be az Intel az MMX (MultiMedia eXtension) technolgit 1997-ben. A technolgia a kvetkez jtsokbl ll: j adattpusok (kvadrasz, valamint csomagolt bjt, sz s duplasz), 8 db j
195

64 bites regiszter (MM0..MM7), illetve 57 db. j utasts. Az j utastskszlet adatmozgat, aritmetikai, logikai, shiftel, sszehasonlt s konverzis utastsokat tartalmaz. A 8 db. j regisztert sajnlatos mdon a koprocesszor vermre kpeztk r, ami a gyakorlat szempontjbl annyit jelent, hogy ha mdostjuk mondjuk az MM2 regisztert, akkor az ST2 regiszter tartalma is mdosulni fog, s viszont. Ez a tny magval hozta azt a knyelmetlensget is, hogy ha koprocesszor- s MMX utastsokat akarunk keverni egymssal, akkor az MMX utastsokat tartalmaz blokk utn szksg van egy specilis utasts, az EMMS (Empty MMX State) hasznlatra, ami a koprocesszor-verem mindegyik bejegyzst rvnytelennek jelli be. Br bejelentsekor nagyon csbtnak tnt az j technolgia, igazn nem vltotta be a hozz fztt remnyeket. Ez fleg annak a kvetkezmnye, hogy az MMX csak egsz vagy fixpontos szmokkal kpes dolgozni, lebegpontos rtkekkel nem. Az MMX technolgia nagy jtsa igazn az, hogy ez az els olyan utastskszlet-bvts, ami az addig megszokott SISD elv (Single Instruction, Single Data) helyett a SIMD (Single Instruction, Multiple Data) elvet kveti. Ennek lnyege, hogy egyetlen utasts egyszerre tbb adaton (operanduson) vgzi el ugyanazt a mveletet. Ha pldul a csomagolt-bjt (packed byte) adattpust hasznljuk, ami 8 db fggetlen bjtot jelent egy 64 bites MMX regiszterben vagy memriaterleten, s sszeadunk kt ilyen tpus operandust, az eredmny szintn egy csomagolt-bjt tpus 64 bites adat lesz. A msik fontos jdonsg a szaturcis (telt) aritmetika (saturation arithmetic). Ha mondjuk a 80h s 90h eljel nlkli bjtokat sszeadjuk, akkor az eredmny ktfle lehet: a hagyomnyos krbeforg (wrap-around) aritmetikval 10h, mg a telt aritmetikval 0FFh lesz. Ennek az aritmetiknak teht az a lnyege, hogy az eredmnyt az brzolhat legnagyobb rtkre lltja be, ha egybknt tvitel keletkezne. A szaturci
196

mindhrom csomagolt tpusra mkdik, s van eljeles s eljeltelen vltozata is. Az MMX technolgia bejelentse utn rgvest megjelentek az t tmogat processzorok is: Intel Pentium MMX (P55C), AMD K6, Cyrix MediaGX (fednevn GXm s GXm2), Cyrix 6x86MX (M2), IDT/Centaur WinChip C6, IBM 6x86MX s mg taln msok is. Az olcsbb tllst knnytette meg az Intel Pentium MMX Overdrive (P54CTB), amit egy norml Intel Pentium-mal egytt hasznlva, azt kpess tette az MMX kihasznlsra. Az AMD K6 trtnete elg klnleges. Az AMD-nak volt gyrtsora, viszont nem volt elg tlete. Ezrt felvsrolta a NexGen vllalatot, aminek voltak j tletei s ksz tervei, viszont nem tudott sajt maga processzort gyrtani. Az AMD K6 gy a AMD K5 s a majdnem ksz NexGen Nx686 processzorok alapjaibl szletett hibrid lett. Az 1998-as v is elg mozgalmas volt. Ekkor jelentek meg az els Intel Pentium II processzorok (fednevk Klamath, majd Deschutes). Ez a proci alapveten a Pentium Pro architektrjt hasznlja, de mr MMX kpessgekkel is fel van vrtezve. Az Intel ezzel a processzorral kezdden kiszllt a Socket 7-es processzorok piacrl, s valsznleg a Pentium Pro-t sem fogja tmogatni. A Pentium II jdonsgai: 2*16 Kbjt L1 cache, 256 Kbjt, 512 Kbjt, 1 Mbjt vagy 2 Mbjt nagysg L2 cache, valamint szmos j zemmd az alacsonyabb fogyaszts rdekben (AutoHALT, Stop-Grant, Sleep, Deep Sleep). A processzor teljesen j tokozst kapott, s kt vltozatban kaphat: a Slot 1 nev tokozs processzor Pentium II nven vsrolhat meg, ebben 256 vagy 512 Kbjtos L2 cache van, mg a Slot 2 tokozs Pentium II Xeon 1 Mbjt vagy 2 Mbjt mret L2 cache-sel kerl forgalomba, s fleg nagy teljestmny szerverekbe sznjk. A sima Pentium II-esek L2 cache-je csak a processzor rajelnek felvel zemel, a Xeon
197

viszont teljes gzzel jratja mindkt cache-t. Mindkt processzorhoz gy j alaplapra lesz szksg, mivel a Slot 1 s Slot 2 nem kompatibilis a Socket 7-tel. Az j csatolhoz j buszsebessg dukl gondolhattk az Intel-nl, mivel a Pentium II-ket befogad alaplapok rendszerbusza 100 MHz-es, de ezt hamarosan fel fogjk emelni 133 MHz-re is. A processzor bels rajele 266, 300, 333, 350, 400 s 450 MHz lehet tpustl fggen, s felprgetni is csak kb. 500 MHz-ig lehet technikai okokbl. A Pentium II ra igen borsos volt megjelensekor (s mg ennek a jegyzetnek az rsakor is elg magas). Voltak, akiknek a Pentium II sebessgre volt szksgk, de nem engedhettk meg azt maguknak. Nekik sznta az Intel a Celeron nven megjelentetett (Covington fednev), ugyancsak P6 magra pl processzort. Az eredetileg 266 vagy 300 MHz-es Celeron nem tartalmazott L2 cache-t. Hamarosan lehetett kapni azonban a Mendocino fednev Celeron-okat, melyek mindegyikben volt 128 Kbjt nagysg L2 cache is. A Mendocino-k kz tartozik a Celeron A jelzs processzor, valamint az sszes olyan Celeron, aminek rajele legalbb 333 Mhz. Mendocino-kat a jelenlegi lls szerint 300, 333, 366, 400, 433 s 466 MHz-es vltozatban lehet kapni. Csatolt tekintve sem egyszer a helyzet, mivel az eredetileg Slot 1-es Celeron-ok mellett mr lehet kapni Socket 370-es foglalatba illeszked, PPGA (Plastic Pin Grid Array) tokozs Celeron-okat is. A Socket 370 nev foglalat a Socket 7-hez hasonl, ngyzet alak, 370 ts processzorcsatol, s ltezik olyan talakt, amivel a Slot 1-es alaplapokon is hasznlhatunk Socket 370-es processzort. A L2 cache immr nem a processzormagban helyezkedik el, hanem attl elklntve, de ugyanabban a tokban (ez a Slot 1 tokozs lnyege). Ezzel a cache-sel a processzor egy specilis buszon keresztl kommunikl, ennek neve backside bus (BSB), mg az alaplap kzponti buszt frontside bus-nak (FSB) hvjk.
198

Hasonlan a processzortokban elhelyezked L2 cache neve backside cache, mg az alaplapon levt frontside L3 cache-nek nevezik. Ezek alapjn mondhatjuk, hogy a Pentium II flsebessg (half clock speed, rviden half-speed) backside bust s L2 cache-t tartalmaz, mg a Xeon teljes sebessgt (full clock speed, rviden full-speed). A Celeron processzorok (a Mendocino-t belertve) teljes sebessg L2 cache-t tartalmaznak. A Pentium II-vel majdnem egyidben, szintn 1998-ban jelent meg az AMD K6-os sorozatnak kvetkez tagja, a K6-2. A processzort az AMD egyrtelmen visszavgsnak sznta (termszetesen az Intel-lel szemben), s ennek rdekben sok rdekessget rakott ebbe a chipbe: 10 prhuzamos vgrehajtsi egysg, 2 szint elgazs-elrejelzs, spekulatv vgrehajts, soronkvli vgrehajts, RISC86 szuperskalr architektra (6 RISC utasts raciklusonknt), 32 Kbjt L1 utasts-cache, 20 Kbjt eldekdol cache (predecode cache), 32 Kbjt L1 adatcache, SMM tmogatsa, nhny zemmd a fogyaszts cskkentsre (Halt, Stop Grant, Stop Clock llapotok), 7 db. MSR. A 321 ts CPGA (Ceramic Pin Grid Array) tokozs processzor Socket 7 vagy Super7 foglalatba illeszkedik, tpustl fggen. A Super7 az AMD s zleti partnerei ltal kifejlesztett, 100 MHz buszsebessget tmogat, a Socket 7-tel kompatibilis foglalat mrkaneve. Ez a processzor is elg sokfle vltozatban kaphat rajel ignyt tekintve: 266, 300, 333, 350, 366, 380, 400, 450 s 475 MHz-es darabok lteznek. A legalbb 400 MHzes tpusok fedneve egybknt Chomper. A processzor az Intel MMX technolgijt is tmogatja, azokat nagyon gyorsan (ltalban 1 raciklus alatt) kpes vgrehajtani, akr prhuzamosan is. Ez nem nagy jdonsg, hiszen mr a K6 is nyjtott MMX-tmogatst. Az MMX bevezetsre az AMD is lpett azonban, ennek eredmnye lett a 3DNow! technolgia. Ez a kvetkezket foglalja magban: 8 db
199

64 bites regiszter, amik az MMX regiszterekre kpzdnek le (azok pedig a koprocesszor vermre), nevk MM0..MM7; j pakolt lebegpontos tpus, ami kt 32 bites, egyszeres pontossg lebegpontos szmot trol egy 64 bites 3DNow!/MMX regiszterben vagy memriaterleten; valamint 21 j utasts. Az utastsok az aritmetikai, akkumulltlagol, szlsrtk-meghatroz, konverzis, sszehasonlt s teljestmny-nvel kategrikat lelik t. Az aritmetikai utastsok kztt a szoksos additv utastsok mellet tallunk szorzst kerektssel s anlkl, reciprok-kpzst s reciprok ngyzetgykt meghatroz utastsokat. A teljestmny-nvel csoportba 2 utasts tartozik: az EMMS MMX utastst felvlt, annl gyorsabb FEMMS (Faster Entry/Exit of the MMX or floating- point State), valamint a PREFETCH s PREFETCHW mnemonikok, melyek a megadott memriaoperandus cmtl legalbb 32 bjnyi terletet beolvasnak az L1 adat-cache-be. A 3DNow! utastsok egy rsze vektoron (azaz pakolt lebegpontos tpuson), mg msok skalron (teht egyetlen lebegpontos szmon) tudnak dolgozni. A vektor-utastsok a SIMD elvet kvetik, de az MMX-tl eltren nem egsz, hanem egyszeres pontossg lebegpontos racionlis szmokkal kpesek szmolni. Ez az igazi ereje a 3DNow! technolginak az MMX-szel szemben, ennek hatsra tmogatja egyre tbb alkalmazs hasznlatt. A visszavgs, gy tnik, sikerlt. Idn, 1999-ben mutatta be az Intel legjabb ergpt, a Pentium III-at (fedneve Katmai). A szintn P6-os architektrra pl processzor egy-kt jellemzje: 2*32 Kbjt L1 cache, 512 Kbjt L2 cache (lesz ez mg tbb is), 8 j 128 bites regiszter, 70 j utasts. Remnytelenl sok, pontosan 79 db. modell-specifikus regisztert (MSR) tartalmaz. Ezt a processzort mr ellttk egy 96 bites gyri azonost sorszmmal is, ami processzoronknt egyedi, s valamilyen mdon ki is olvashat. Ez a bejelents nagy port kavart, ezrt az
200

Intel "bekapcsolhatv" tette az azonostt. A processzor 100 MHz-es (frontside) buszfrekvencit kvn, Slot 1 csatolba dughat, de lesz Slot 2-es Xeon vltozata is (fednevn Tanner), ami legalbb 512 Kbjt L2 cache-t tartalmaz majd. Csak a Xeon-ban lesz teljes sebessg L2 cache, a Pentium III tovbbra is a magsebessg felvel zemelteti ezt a cache-t. Egyelre 450, 500 s 550 MHz-es tpusai vannak. Az utastskszlet-bvtst eredetileg MMX2-nek hvtk, majd tkereszteltk KNI-re (Katmai New Instructions), vgs neve pedig SSE lett (Streaming SIMD Extensions). Az elnevezs sokat sejtet: a "streaming" sz utal arra, hogy immr adatfolyamok prhuzamos feldolgozsa vlik lehetv, mghozz a SIMD elvet kvetve. Ezt tmogatand 8 j 128 bites regisztert kapott a processzor, nevk XMM0..XMM7, s az MMX regiszterekkel ellenttben nem a koprocesszor vermn foglalnak helyet. Szintn bevezetsre kerlt egy j sttuszregiszter, az MXCSR (neve hivatalosan: SIMD Floating-point Control/Status Register), ennek mrete 32 bit. Tartalmt az STMXCSR s FXSAVE utastsokkal trolhatjuk memriban, mg megvltoztatsra az LDMXCSR s FXRSTOR mnemonikok szolglnak. A regiszterekkel egytt egy j adattpus is megjelent, ez a SIMD lebegpontos pakolt tpus, ami a 128 bites regiszterben vagy memriaterleten 4 db. 32 bites, egyszeres pontossg lebegpontos szmot trol. A 70 db. j utasts szmos kategriba sorolhat: vannak adatmozgat, aritmetikai, sszehasonlt, konverzis, logikai, kever (shuffle), llapot-kezel (state management), cache-selst vezrl (cacheability control), tovbb egszekkel operl utastsok (MMX-bvts). Az Intel-t egy httel megelzve jelentette be az AMD legjabb processzort, az AMD K6-III-at, fednevn a Sharptooth-t. Nhny fbb jtsa: 100 MHz-es frontside bus, teljes sebessg, 256 Kbjtos backside L2 cache, frontside L3
201

cache tmogatsa (TriLevel Cache Design), 11 db. MSR. A processzor tovbbra is 321 ts CPGA tokozst hasznl, s Super7-es foglalatba illeszthet. L1 cache-nek mrete a K6-2vel megegyez, azaz 32 Kbjt utasts-cache, 20 Kbjt eldekdol cache, s 32 Kbjt adat-cache. Tmogatja az SMMet, az MMX s 3DNow! technolgikat. A K6-III egyelre 400, 450 s 500 MHz-es vltozatokban kaphat. Most pedig tekintsnk kicsit elre a (kzeli) jvbe! Az Intel Katmai-sorozatnak kvetkez darabjai a Coppermine s Cascades processzorok lesznek. Az els Slot 1-es, a msodik pedig Slot 2-es (Xeon) processzor lesz, s mindkettben legalbb 1 Mbjt teljes sebessg L2 cache lesz. Ezek a processzorok mr a 133 MHz-es frontside bus-t lehetv tev 0.18 mikronos cskszlessggel fognak kszlni, az eddigi 0.25 mikronnal szemben, ami 100 MHz buszsebessget s max. 500 MHz krli magsebessget biztostott. rajelk legalbb 600 MHz lesz. ket kveti majd a P7-es architektra kt kpviselje, a legalbb 700 MHz-es Willamette, s a 800 MHz fltti magrajelet hasznl Foster. Ez utbbi mr 200 MHz-es frontside bus-t fog tmogatni, s lltlag egy j csatolt, a Slot M-et fogja hasznlni. A nagy durrans azonban a Merced fednev, teljesen 64 bites processzor lesz, ami mr az IA-64 (Intel Architecture 64-bit) architektrra fog plni. Az AMD a K7 architektra fejlesztsvel foglalatoskodik. Az Athlon nev processzort 1999 jliusban jelentettk be hivatalosan. (A processzor a jegyzet rsakor mg nem kaphat, gy ezek csak elzetes informcik.) A nv kicsit flrevezet, mivel az Athlon az Intel processzorokhoz hasonlan a processzormagra vonatkozik, s az ezt hasznl processzorok neve eltr lehet majd. Ezek a processzorok kezdetben a
202

hagyomnyos 0.25 mikronos, a ksbbiekben pedig 0.18 mikronos cskszlessggel kszlnek majd, vgl pedig az alumnium vezett felvltja a rz. A rzalap technolgia lehetv fogja tenni az 1 GHz fltti processzor-rajelet. Addig is a 22 milli tranzisztort tartalmaz, 575 lb processzor magja 500-600 MHz krnykn fog ketyegni. Az FSB sebessge 133, 200, 266, majd ksbb 400 MHz lesz. Ha mr az FSB-t emltettk, fontos, hogy az j AMD processzor s ksbbi trsai nem az Intel P6-os buszrendszert hasznljk, hanem a Compaq/Digital 21264-es, msnven EV6-os processzornak buszt. Ezek a processzorok mr nem tmogatjk a Socket 7/Super7 platformot. Hromfle csatol kpzelhet el: az asztali gpekbe sznjk a Socket A-t, a munkallomsokba a Slot A nev csatolt, s vgl a szerverekbe s a tbbprocesszoros rendszerekbe a Slot B-t. A Socket A-rl nem sokat tudni, csak annyi bizonyos, hogy a Socket kialakts olcsbb a Slot-nl. Az Athlon 2*64 Kbjt L1 cache-t fog tartalmazni, az L2 cache pedig 512 Kbjt (Socket A s Slot A), ill. 512 Kbjt-8 Mbjt (Slot B) lesz. Az L2 cache sebessge a processzormag sebessgnek 1/5-e, 1/3-a vagy fele lesz, a fels hatr pedig a 2/3szoros sebessg. Elkpzelhet, hogy az Intel SSE (MM2/KNI) technolgijt ez a processzor t fogja venni. Az azonban biztos, hogy az eddig jl bevlt 3DNow! s MMX technolgikat tmogatni fogja. Tvolabbi tervek kztt szerepel mg a K8-as projekt, ami az IA-64 nyomdokait fogja kvetni. Megemltjk, hogy a processzorok nevt rvid alakban is szoks rni. A 80186-os s 80188-as processzoroktl kezdden a szmmal jellt processzorok nevbl elhagyhatjuk az ell ll 80-as rtket, s gy az adott processzort csak az utols 3 szmjeggyel azonostjuk. Ezrt pl. a 386 szimblum a 80386-os,

203

a 186 a 80186-os processzort jelli. Szintn szoksos, hogy a rvidebb lers cljbl "Intel 80486" helyett "i486"-ot runk.

17.1 Dokumentlatlan lehetsgek


Szinte mindegyik megjelent processzor tartalmaz olyan funkcikat, utastsokat stb., amiket a gyrt hivatalosan nem ismer(t) el, azaz nem hozta ket nyilvnossgra. Ezeket kzs nven dokumentlatlan lehetsgeknek (undocumented features) nevezzk. Hogy derltek ki ezek mgis? Nmelyikre elvetemlt gpbuherlk jttek r ksrletezs tjn, mg msokrl a gyrttl szivrogtak ki hrek. Ezek a lehetsgek alapveten kt tborba tartoznak: nmelyek minden Intel s azzal kompatibilis processzoron lteznek (vagy legalbbis illik lteznik), mg vannak, amik egy bizonyos gyrt adott termkre vonatkoznak csak. Itt most kizrlag olyan rejtett utastsokkal foglalkozunk, ami az Intel processzorokon biztosan megtallhat, s nagy valsznsggel a tbbi gyrt is tvette ket. Fontos mg tudni, hogy a krdses utasts (vagy annak egy bizonyos kdolsi formja) milyen tpus processzorokon rhet el. Ez alapjn is lehet osztlyozni az utastsokat: Vannak, amik egy adott tpus processzortl kezdve minden jabb tpuson hasznlhatk. Jellsk: a processzor neve mellett egy plusz (+) jel szerepel. gy pl. a 186+ azt jelenti, hogy a 80186/80188-as processzorokon s az annl jabb CPU-kon (mint a 80286, 80386DX, Pentium stb.) ltezik az adott utasts. Nmelyik utasts hasznlata egy konkrt processzorcsald tagjaira korltozdik. Ebben az esetben annak a processzornak a nevt rjuk ki, amelyen az adott utasts elrhet.
204

Ritkn az is megtrtnik, hogy az a bizonyos utasts csak egy processzorcsald nhny, bizonyos feltteleket teljest tagjn tallhat meg. gy pldul van olyan utasts, ami csak a 80386-os processzorok korai vltozatn ltezik. A fenti pontban a "korai" sz nem tl pontos meghatrozst ad, de rgtn pontostjuk. Egy processzorcsald megjelentetsekor gyakran megtrtnik, hogy az adott processzor mr kaphat az zletekben, mikor a gyrt valami apr hibt vesz szre a termkben, s ezrt vagy egyb okbl valamit megvltoztat abban. Az gy mdostott processzor ezutn kikerl a piacra. Ezt nevezzk revzinak (revision), vagy magyarul fellvizsglatnak. Mindegyik processzor tartalmaz egy gyrilag begetett azonostszmot (processor identification number). Ez hrom rszbl ll: processzorcsald (family), modell (model) s az .n. stepping. Ez utbbit nem igazn lehet magyarra lefordtani, mindenesetre valami olyan jellst takar, ami a revzi "szintjt" mutatja (teht nevezhetnnk akr revzi-azonostnak is). A processzorcsald lehet pldul 486os, P5 (Pentium), P6 (Pentium Pro, Pentium II stb.). A modell a csaldon belli tagokat klnti el, gy pl. a 486SX, 486DX, 486DX2 tagok mind klnbz modellek. A stepping egy adott csald adott modelljn bell osztlyozza a processzorokat a revzi szerint. Pldul a 386-os csald SX modelljeinek lteztek A0, B, C s D1 jelzs darabjai. Hogy a klnbz steppingrtkkel rendelkez processzorokban milyen vltozsok trtntek, azt csak a gyrt tudja, de ezeket ltalban nem rulja el. St, a legtbb vsrl nem is tudja, pontosan milyen processzort vsrol, mrmint a revzi szempontjbl. A processzor azonostszmt nem mindig knny megszerezni: Pentium-tl "felfel" a CPUID utasts szpen visszaadja ezt, rgebbi processzorok esetn azonban nem ennyire rzss a helyzet. Ha nincs CPUID, akkor vagy a BIOS egy kevsb ismert szolgltatst hasznljuk fel (INT 15h,
205

AX=0C910h), vagy a processzort szoftverbl jraindtva, a reset utn DX/EDX regiszterben megtallhatjuk a keresett adatokat. Ez utbbi, mondani sem kell, egyltaln nem knny mdszer, viszont ltezik r szabadon terjeszthet Assembly forrskd s lers is. Az albbiakban a kzponti egysg s a numerikus koprocesszor ltal ismert rejtett utastsokat ismertetjk. Mindegyik utastsnl szerepel annak mnemonikja, operandusainak tpusa, kdolsa (azaz gpi kd formja), elrhetsge (teht mely processzorokon s milyen krlmnyek kztt hasznlhat), valamint mkdsnek, hatsnak lersa. Mindegyik utastst a kvetkez sma szerint ismertetjk: MNEMONIK {elrhetsg} operandusok

[gpi kd alak(ok)] (mnemonik elnevezsnek eredete angolul) Az utasts hatsnak, rejtett voltnak stb. lersa. A kvetkez jellseket alkalmaztuk: (no op) nincs operandus src forrs (source) dest cl (destination) reg ltalnos cl regiszter (general purpose register) ?? tetszleges megfelel operandus imm8, imm16 8 illetve 16 bites kzvetlen rtk (immediate data) reg/mem8, reg/mem16 memriahivatkozs vagy ltalnos cl regiszter, 8 illetve 16 bites mretben 8086 Intel 8086 vagy 8088 vagy ezekkel kompatibilis proci 186 80186 vagy 80188 187 80187 s kompatibilis koprocesszor
206

286 80286 386 80386 486 80486 Pent Pentium (P5 architektra) PROC+ az adott PROC processzoron s attl kezdve minden ksbbin ltezik az utasts csak PROC csak az adott PROC csald tagjain rvnyes az utasts csak PROC STEP csak a PROC processzorcsald valamely modelljeinek STEP stepping- tagjain rhet el az utasts (pre-B a B revzi eltti tagokat jelli, gy pl. A-t, A0-t, A1-t stb., ha ilyenek voltak) *r a cmzsi md/operandus info bjtot jelli (addressing mode/operand info byte); lerst lsd az "Utastsok kdolsa" cm fejezetben *r+N a cmzsi md/operandus info bjt kzps, 'Reg' mezje (3..5 bitek) a megadott N rtket tartalmazza (0N7) A trtvonal (/) mindenhol vagylagossgot jelez (kizr vagy). A gpi kd alak lersban az egyes sszetevket vesszvel vlasztottuk el. A cmzsi md bjtot esetlegesen kvetheti egy S-I-B bjt valamint egy abszolt offszet/eltolsi rtk (1, 2 vagy 4 bjt), ez a hasznlt cmzsi mdtl fgg. Ezeket a plusz bjtokat nem tntettk fel, de ha valamelyik elfordul, akkor az utasts kzvetlen operandusa (ha van ilyen) mindenkppen a cmzsi md bjt(ok) s az offszet/eltols utn kvetkezik. AAD (no op)/imm8 {8086+} [0D5h, 0Ah/imm8]

(ASCII Adjust before Division) Ez az utasts hivatalosan is ltezik, korbban is szltunk mr rla. Mkdse: az AX-ben lev pakolatlan BCD szmot talaktja binriss, az eredmnyt AL-be teszi, AH-t pedig kinullzza.
207

Ekzben PF, ZF s SF mdosulhat, mg CF, AF s OF meghatrozatlanok. A pakolatlan BCD olyan tpus, ahol egy sz als s fels bjtja egyetlen decimlis szmjegyet tartalmaz (ez ASCII 00h..09h kztti rtkeket jelent). gy pl. a 0104h a decimlis 14-et jelli. Hivatalosan ez az utasts operandus nlkli, s csak BCD (azaz tzes szmrendszerbeli) szmokat kezel. Ezzel ellenttben az utasts kdolsa tartalmazza azt a bizonyos 10-es rtket (0AH), amit nyugodt szvvel trhatunk brmilyen ms rtkre, s az ott megadott rtk fogja mutatni a hasznlt szmrendszer alapjt. Az utasts ezen formja mr az "sidktl kezdve" elrhet, s valsznleg az is marad a jvben is. AAM (no op)/imm8 8086+} [0D4h, 0Ah/imm8] (ASCII Adjust after Multiplication) Az AAD-hez hasonlan mr errl az utastsrl is szltunk korbban. Mkdse: AL tartalmt maradkosan elosztja 10-zel, a hnyados AH-ba, a maradk AL-be kerl (azaz az AL-ben lev binris szmot pakolatlan BCD-szmm alaktja, s azt az AX-ben trolja el). A flag-eket az AADhoz hasonlan kezeli. Hasonl cselt alkalmazhatunk, mint az AAD-nl, mivel a 10-es konstanst (0Ah) itt is eltroljk az utasts kdolsakor, amit mi szpen trhatunk brmire. Elrhetsge is megegyezik az AAD-val. CMPXCHG dest, src reg {csak 486 pre-B step} [0Fh, 0A6/A7h, *r] (CoMPare and eXCHanGe)

208

Ez az utasts a 80486-os processzoron jelent meg, s szemaforok kezelst knnyti meg. Mkdse: az akkumultort (AL-t, AX-et vagy EAX-et) sszehasonltja a cllal (dest) a CMP utastsnak megfelelen. Ha ZF=1, akkor a forrs regiszter tartalmt betlti a clba, klnben pedig a clt betlti az akkumultorba. Ez eddig rendben is van, az utastst is elismeri hivatalosan az Intel. Viszont a kdolssal mr nem minden oks. A nagyon korai, B stepping eltti 80486-osok a fenti kdolst hasznltk, de ez tkztt a 80386osokon korbban ltezett, ksbb viszont eltrlt IBTS s XBTS utastsok kdjval. Ezrt, a visszafel kompatibilits rdekben az Intel megvltoztatta a CMPXCHG utasts kdjt a 0Fh, 0B0/0B1h, *r formra a B stepping-tl kezdve, s a ksbbi processzorok is mind ez utbbi formt hasznljk. Ez teht inkbb processzorhiba, mint rejtett funkci. Zavar, hogy nhny assembler s debugger mg a rgi kdolst hasznlja, gy pl. a 3.1-es verzij Turbo Debugger is hibsan fordtja le ezt a mnemonikot. CPUID (no op) {486+} [0Fh, 0A2h] (CPU IDentification) Ez az utasts a processzorrl szolgl klnfle informcikkal. Hvsa eltt EAX-ban a kvnt funkci szmt kell kzlni. Ha EAX=00000000h, akkor az utasts lefutsa utn EAX-ben kapjuk meg azt a legnagyobb rtket, amit funkciszmknt megadhatunk, ECX:EDX:EBX pedig a gyrt nevt azonost szveget tartalmazza. Ez Intel esetn "GenuineIntel", az AMD processzorainl "AuthenticAMD", mg Cyrix
209

prociknl "CyrixInstead". Ha EAX=00000001h hvskor, akkor visszatrs utn EAX tartalmazza a processzor csaldjt, modelljt s steppingszmt, EBX s ECX meghatrozatlan, mg EDX a processzor specilis tulajdonsgainak jelenltt vagy hinyt jelzi. Az utasts hivatalosan a Pentium-on jelent meg, de nhny ksbbi gyrts 80486-os is ismerte mr. Ha az EFlags regiszter 21-es bitjt (ID) tudjuk mdostani, akkor a processzorunkon van CPUID utasts. FCOS (no op) {187+} [0D9h, 0FFh] (compute COSine) Ez a koprocesszor-utasts az ST-ben radinban megadott szg koszinuszt rakja vissza ST-be. Az utasts hivatalosan a 80387-es koprocesszoron jelent meg, de mr ismertk az Intel 80187, Intel 80287xl koprocesszorok, valamint az Integrated Information Technology Incorporated cg IIT 2c87 jel chipje is. FSIN (no op) {187+} [0D9h, 0FEh] (compute SINe) Az utasts az FCOS-hoz hasonlan mkdik, teht ST tartalmt cserli ki annak szinuszra. Elrhetsge is az elz utastsval egyezik meg. FSINCOS (no op) {187+} [0D9h, 0FBh] (compute SINe and COSine) Az utasts az ST-ben radinban megadott szg szinuszt ST-be rakja, majd a verembe a koszinusz rtkt is berakja (PUSH), gy ST-ben a koszinusz, ST(1)-ben pedig a szinusz rtk lesz. Elrhetsge az elz kt utastshoz hasonl,
210

viszont az IIT 2c87 koprocesszor nem ismeri ezt az utastst. IBTS base, EAX/AX, CL, src reg {csak 386 A-B0 step} [0Fh, 0A7h, *r] (Insert BiT String) Az utasts nem igazn jl dokumentlt, gy mkdse nem biztos, hogy megfelel az itt lertaknak. Teht: a forrs regiszter (src reg) als CL db. bitjt tmsolja a bzis (base) cm terlet EAX/AX sorszm bitjtl kezdd bitekre, a krnyez bitek srtetlenek maradnak. Az utasts trtnete enyhn szlva is furcsa: a 80386-as processzorok nagyon korai vltozatn (A s B stepping-rtk) jelent meg, de az Intel valamilyen megfontolsbl a B0 stepping utni vltozatoktl kezdve megszntette. gy az a helyzet llt el, hogy egyazon processzorcsald klnbz tagjai mskpp viselkedtek, ha tallkoztak a 0Fh, 0A7h bjtsorozattal: a korai vltozatok rtelmeztk s vgrehajtottk, mg a ksbbi tpusok 6-os kivtellel (Undefined/Invalid Opcode#UD) reagltak. A 80486-os processzoron szintn keveredst idzett el ez az utasts, ezt a CMPXCHG utastsnl trgyaltuk. A lersok szerint hasznosnak tnne ez az utasts, csakgy, mint trsa, az XBTS, de sajnlatos mdon mindkettt megszntette az Intel, gy valsznleg a tbbi gyrt sem tmogatja ket. ICEBP/SMI (no op) {386+} [0F1h] (In-Circuit Emulator BreakPoint/System Management Interrupt) Ez az utasts mr igazn dokumentlatlan, annyira, hogy ahny lers van rla, annyifle mkdst
211

rnak. Kt mnemonikja van, de egyiket sem ismerik sem az assemblerek, sem a debuggerek. Az utasts alapveten kt clt szolgl: ha teljesl egy bizonyos felttel, akkor a processzor az SMM (System Management Mode) zemmdba vlt t, klnben pedig egy INT 01h hvst hajt vgre. A felttel az, hogy a DR7 regiszter 12-es bitje 1 legyen. Az Intel dokumentcii szerint SMM mdba csak kls hardverjel hatsra kerlhet a processzor, szval ez elg furcsv teszi a dolgot. Az utasts legfbb haszna, hogy a 0CCh kd INT 3 utastshoz hasonlan ez az egyetlen bjt egy INT 01h hvst tesz lehetv. Egyetlen htrnya, hogy csak CPL=0 szinten adhat ki, teht vagy vals mdban, vagy vdett mdban az opercis rendszer szintjn. Ez a korltozs nem tudni, mi miatt van, SMM-mdba ugyanis brmely zemmdbl tkerlhet a processzor. Az SMM zemmd mr nhny 80386-os s 80486-os procin megtallhat, hivatalosan pedig a P5 (Pentium) csalddal vezettk be. LOADALL (no op) {csak 286, 386} [0Fh, 04h/05h/07h] (LOAD ALL/every register) Ha lehet mondani, ez az utasts mg rejtlyesebb, mint az ICEBP/SMI. Az operandus nlkli mnemonikot a 80286-os processzorokon a 0Fh, 05h bjtokkal kdoltk (egyes forrsok szerint a 0Fh, 04h is ezt az utastst jelli), a 80386-os procik viszont a 0Fh, 07h formt ismertk. Mkdse rviden: a memria adott cmn tallhat tblzatbl a processzor (majdnem) sszes regiszternek tartalmt betlti, majd nem tudni, mit csinl, de a logikus az, hogy az j CS:IP
212

helyen folytatja a vgrehajtst. A tblzat cme a 80286-os esetn rgztett, a 00000800h fizikai (vagy lineris?) cmen keresi az rtkeket, mg a 80386-osoknl ES:EDI adja a tblzat cmt. Kicsit klns, ha jobban belegondolunk: vdett mdban nem szegmensregiszterek, hanem szelektorok vannak, gy nem tudni, pontosan mit is csinl ez az utasts (fleg a 80286-os vltozat). A betlttt regiszterek kz rtend az sszes ltalnos cl regiszter, a szegmens-(szelektor) regiszterek, a Flags regiszter, IP, az MSW (Machine Status Word), a rendszerregiszterek, gymint LDTR, GDTR, IDTR, TR, st mg az rnykregiszterek (descriptor cache) is. A 80386oson ez kiegszl a regiszterek 32 bites alakjnak betltsvel, tovbb az FS, GS, CR0, DR6 s DR7 regiszterek is mdosulnak. Az utasts csak CPL=0 esetben hajthat vgre, klnben 13-as kivtel (General Protection fault#GP) keletkezik. Nhny gyrt (pl. az IBM is) az Intel-tl eltr mdon valstott meg az utastst, ami mondjuk abban ll, hogy a tblzatok felptse kicsit ms. Az utasts mkdst ismerve teljesen rthetetlen, mirt nem lehetett szabvnyostani az utasts hasznlatt, illetve, ami fontosabb, mirt kellett eltrlni az utastst a 80486-osoktl kezdve? MOV CS,?? {csak 8086} [8Eh, *r+1] (MOVe data) Korbban mr emltettk a MOV utasts els elfordulsnl, hogy clknt nem szerepelhet a CS regiszter. Ez igazbl csak a 80186/80188 processzoroktl van gy, a 8086/8088-at kivve
213

ugyanis minden processzor 6-os kivtellel vlaszol erre a kdra. A 8086/8088 viszont rtelmezni tudja ezt a formt is, s gy egy olyan felttel nlkli vezrlstadst valst meg, ahol csak CS vltozik. Lsd mg az albbi POP CS utastst is. POP CS {csak 8086} [0Fh] (POP data from stack) A POP trgyalsnl szltunk rla, hogy a CS regisztert operandusknt nem adhatjuk meg. A helyzet azonban egy kicsit sszetettebb. A 8086/8088 gond nlkl rtelmezi a 0Fh bjtot, s a MOV CS,?? -hez hasonlan felttel nlkli vezrlstadst hajt vgre. A 80186/80188 mr nem ezt teszi, helyette 6-os kivtelt vlt ki. A 80286-os processzoron sok j utasts lett bevezetve, ezek lekdolshoz a 0Fh bjtot egyfajta prefixknt hasznlja a processzor. gy a 0Fh bjt nmagban semmit sem jelent a 80286-os s annl ksbbi processzorok szmra, viszont az utna ll bjttal egytt valamilyen j utastst kpezhet. Ez az egyik md a 8086/8088 processzorok detektlsra. (A msik mdszer, hogy pldul CL-be 1Fh-nl nagyobb rtket rakunk, s gy hajtunk vgre egy shiftelst. Magyarzatt lsd a 80186-os processzor jdonsgait ismertet fejezetben.) RDMSR (no op) {386+} [0Fh, 32h] (ReaD Model-Specific Register) Ez az utasts az ECX-ben megadott sorszm MSR tartalmt olvassa ki, s adja vissza EDX:EAXben. Ha CPL 0, vagy a megadott MSR nem ltezik, 13-as kivtel (#GP) keletkezik. Az utasts hivatalosan a Pentium-on lett bevezetve, de az
214

IBM 386SLC s az Intel 486SLC processzorok mr ismertk. RDTSC (no op) {Pent+} [0Fh, 31h] (ReaD Time-Stamp Counter) A Time-Stamp Counter egy olyan MSR, aminek tartalma a processzor resetelsekor kinullzdik, s attl kezdve minden ratem eggyel nveli rtkt. Az RDTSC utasts a TSC rtkt olvassa ki, s azt EDX:EAX-ben visszaadja. Vgrehajthatsga a CR4 regiszter 2-es bitjnek (Time-Stamp instruction DisableTSD) llstl fgg: ha TSD=0, akkor brmikor kiadhat, klnben pedig csak akkor, ha CPL=0. Ha TSD=1 s CPL>0, akkor 13-as kivtel (#GP) keletkezik. Az utasts a Pentium-tl kezdve elrhet, s nem rejtett, egyszeren csak nem volt tlsgosan dokumentlva a kezdetekben. RSM (no op) {386+} [0Fh, 0AAh] (ReSuMe from System Management Mode) Az utasts kiadsval a processzor kilp az SMM zemmdbl, a processzorllapotot visszalltja az SMRAM-bl (System Management RAM), s visszatr a futs elz helyre (CS:IP vagy CS:EIP). Az utastst csak az SMM mdban ismeri fel a processzor, ms mdban kiadva azt az eredmny 6-os kivtel (#UD) lesz. Ha az llapot visszalltsa sorn az elmentett informciban (SMM state dump) valami illeglis van, akkor a processzor .n. shutdown llapotba kerl, ahonnan csak egy hardveres reset bresztheti fel. Hrom f hibaforrs van: az egyik, ha a CR4 regiszter tkrkpben valamelyik fenntartott bit
215

1-es rtk, a msik, ha a CR0 rvnytelen belltsokat tartalmaz (pl. PE=0 s PG=1, CD=0 s NW=1 stb.). Szintn hibnak szmt, ha a mentsi terlet kezdcme nem oszthat 32768cal, de ez csak a Pentium processzorokig fontos, utna mr nem. Az utasts hivatalosan a Pentium-on lett bejelentve az SMM-mel egytt, de mivel SMM mr az Intel 386SLC s 486SLC processzorokon is volt (st nhny ms gyrt hasonl processzorcsaldjn is), gy ez az utasts rejtetten mr sok 80386-os processzoron elrhet. SETALC (no op) {8086+} [0D6h] (SET AL from Carry flag) Igazi gyngyszem ez az egybjtos, operandus nlkli utasts, mely radsul az sidktl kezdve elrhet minden Intel processzoron, s a kompatibilits miatt sok ms gyrt is implementlta termkbe. Mkdse majdnem megfelel az SBB AL,AL utastsnak, azaz AL-t kinullzza, ha CF=0, illetve AL-be 0FFh-t tlt, ha CF=1. Az SBB-vel ellenttben viszont nem vltoztatja meg egyetlen flag llst sem. Minden privilgiumszinten s minden zemmdban vgrehajthat, s mint emltettk, minden teljesen Intelkompatibilis processzornak ismernie kell. Teljesen rthetetlen, annyi v utn mirt nem ismeri el egyetlen gyrt sem ennek az utastsnak a ltezst. (Jelenleg, 1999-ben az Intel s az AMD dokumentcija is fenntartott bjtnak nevezi ezt a kdot, de az Intel legalbb azt megmondja, hogy az utasts vgrehajtsa nem okoz 6-os kivtelt.) SHL dest,1 {8086+} [0D0h/0D1h, *r+6]
216

SHL dest,CL SHL dest,imm8

{8086+} [0D2h/0D3h, *r+6] {186+} [0C0h/0C1h, *r+6, imm8]

(SHift logical Left) Ezt az utastst mr jl ismerjk, esetleg az tnhet fel, hogy a lptets szmt 8 bites kzvetlen konstansknt is meg lehet adni. Ez a lehetsg a 80186/80188 processzorokon jelent meg, s azta is elrhet. Az utasts maga nem rejtett, viszont ez a fajta kdolsa igen. A hivatalos verzi szerint a cmzsi md bjt (*r) 'Reg' mezjben (3..5 bitek) az 100b rtknek kell szerepelnie, de az 110b rtk (mint fent is lthat) is ugyanezt az utastst jelenti. Nhny forrs azt lltja, hogy a mostani kdols (*r+6) a SAL mnemonikhoz tartoz utastst jelzi, de mivel tudjuk, hogy SHL=SAL, nem vilgos, mirt van szksg ugyanannak az utastsnak kt pldnyra. TEST reg/mem8,imm8 {8086+} [0F6h, *r+1, imm8] TEST reg/mem16,imm16 {8086+} [0F7h, *r+1, imm16] (TEST) Ez az utasts is jl ismert. Itt azt a vltozatt ltjuk, ami a cl memriaterletet vagy ltalnos regisztert teszteli egy kzvetlen rtkkel. Az utasts szintn nem rejtett, az eltrs itt is a kdolsban van az SHL-hez hasonlan. A hivatalos formban a cmzsi md bjt 'Reg' mezje 000b-t kell hogy tartalmazzon, viszont a

217

001b rtk ugyanezt a hatst vltja ki. Az utasts duplzsra itt sincs rtelmes magyarzat. WRMSR (no op) {386+} [0Fh, 30h] (WRite Model-Specific Register) Ez az utasts az ECX-ben megadott sorszm MSR regiszterbe az EDX:EAX-ben megadott rtket rja. Ha CPL 0, vagy a megadott MSR nem ltezik, 13-as kivtel (#GP) keletkezik. Elrhetsge megegyezik az RDMSR utastsnl lertakkal. XBTS dest reg, base, EAX/AX,CL{csak 386 A-B0 step} [0Fh, 0A6h, *r] (eXtract BiT String) Az IBTS utasts prja, minden tekintetben. Mkdse: a bzis (base) cmen elhelyezked terlet EAX/AX sorszm bitjtl kezdve CL db. bitet kimsol, s a cl regiszterbe (dest reg) jobbra igaztva betlti, a fennmarad biteket pedig kinullzza. Ezt az utastst is eltrltk a B0 stepping utni 80386-osoktl kezdve, kdja azutn "feltmadt" CMPXCHG formjban egy kis idre, majd rkre eltnt.

17.2 A numerikus koprocesszor szolgltatsai


Mint mr korbban emltettk, a vals szmok kzelt brzolsra a legelterjedtebb mdszer a lebegpontos formtum. Ezzel az adattpussal lehetv vlik a vals szmok egy vges elemszm rszhalmaznak megjelentse. Br azt rtuk, hogy vals, igazbl csak racionlis szmok trolhatk ilyen mdon. Mivel azonban minden irracionlis szm tetszleges pontossggal megkzelthet racionlis szmokkal
218

(pontosabban alulrl s fellrl is korltozhat egy-egy racionlis szmsorozattal), a gyakorlati feladatok sorn ez is elegend. A lebegpontos szmok gpi formtumt az IEEE (Institute of Electrical and Electronics Engineers Incorporated) nev szervezet szabvnyostotta, ezek az IEEE-754 s IEEE-854 nev szabvnyok. A szmok ltalnos alakja a kvetkez:

Az eljel (SSign) a szoksos jelentst hordozza, teht 1 esetn negatv, 0 esetn pozitv szmot jelez. A mantissza (mantissa, significand) kt rszre oszthat: egy 1 bites egszrszre (J-bit, binary integer bit), valamint trtrszre (fraction). Az exponens (exponent) azt a binris (2-es alap) hatvnykitevt adja meg, amire a mantisszt emelni kell, hogy az brzolt szmot megkapjuk. (A binris hatvnykitev most azt jelenti, hogy a hatvnyalap lesz 2.) A binris egszrszt alkot J-bitet gyakran nem troljk el tnylegesen, hanem odakpzelik (implied J-bit). Az exponens egy binris egsz szm, s gy troljk, hogy valdi rtkhez hozzadnak egy eltolst (bias, biasing constant), gy alakul ki az .n. eltolt exponens (biased exponent). Az eltolsi rtket gy vlasztjk meg, hogy egyrszt az exponens eltolt rtke mindig pozitv legyen (mrmint decimlis alakban, teht nem a kettes komplemens forma szerint), msrszt a legkisebb abszolt rtk brzolhat szm reciproka szintn brzolhat maradjon. A kvetkez tpus szmok alakjt rgztettk: eljeles nulla (signed zeros) eljeles vgtelen (signed infinities) normalizlt vges szm (normalized finite numbers)
219

denormalizlt vges szm (denormalized finite numbers) rvnytelen, "nem szm" rtkek (NaNsNot a Number) meghatrozatlan szmok (indefinite numbers) Brmely eljel nullnak azonos a numerikus rtke, az eljel pedig ltalban azt mutatja, hogy a nulla milyen eljel szm alulcsordulsakor, ill. milyen eljel vgtelen rtk reciproknak kpzse sorn keletkezett. A vgtelen rtkek az brzolhat legkisebb negatv ill. legnagyobb pozitv rtket kpviselik, s egy aritmetikai tlcsorduls (overflow) kvetkezmnyei. Vges rtkek trolsakor a hasznlt formt a szm nagysga hatrozza meg. A koprocesszor, ha lehet, minden szmot normalizlt alakban trol el. Ez azt jelenti, hogy a szmot olyan alakra hozzk, ahol a 1mantissza<2 felttelek teljeslnek, tovbb a trtrsz elejn minimlis szm bevezet nulla (leading zero) ll (ezt csak akkor veszi figyelembe, ha az brzoland szm 1.0-nl kisebb). Ha az gy kpzdtt szm exponense a trolhat tartomnyon kvlre esik, akkor aritmetikai alulcsorduls (underflow) kvetkezik be. Alulcsorduls esetn a koprocesszor megprblja az eredmnybl a lehet legtbb rszt brzolhatv tenni, erre szolgl a denormalizl eljrs (a hasznlt mdszer neve: gradual underflow technique). Ennek eredmnye egy denormalizlt szm, aminek az exponense a lehet legkisebb, az egszrszt trol J-bit 0 lesz. Tovbb a trtrsz elejn nem minimlis szm zr lesz, teht azokat itt nem lehet eliminlni, ppen ellenkezleg, a koprocesszor mindaddig nullt szr be a trtrsz elejre, amg az exponens ismt rvnyes nem lesz. Ebbl az okbl a denormalizlt szmok mr nem lesznek olyan pontosak, mint az eredeti vgeredmny vagy a normalizltak. Lthat, hogy normalizlt esetben a J-bit rtke mindig 1, gy azt felesleges eltrolni, s a koprocesszor kt esetben (egyszeres s dupla pontossg) gy is tesz.

220

A NaN rtkek, mint nevk is mutatja, nem numerikus adatok, teht normlis esetben nem is kaphatjuk meg ket szmols tjn. Kezdrtket nem tartalmaz vltoz vagy memriaterlet inicializlsra azonban jl hasznlhatk, hiszen biztosan nem jellnek egyetlen szmot sem. Kt tpusuk van: csendes (quiet NaNQNaN) s jelz (signaling NaNSNaN) NaN-ok. Az SNaN-ok kivtelt (exception) vltanak ki, ha megprblunk velk szmolni, mg a QNaN-ok ezt nem teszik meg. Meghatrozatlan rtk akkor keletkezik, ha egy numerikus kivtelt vlt ki a koprocesszor, de a kivtelek maszkolva (tiltva) vannak. Meghatrozatlan rtkknt ltalban a QNaN-t hasznlja a koprocesszor. A koprocesszor a kvetkez 7 adattpust kpes hasznlni: egyszeres pontossg vals (single-precision real) dupla pontossg vals (double-precision real) kiterjesztett pontossg vals (extended-precision real) sz mret egsz (word integer) rvid egsz (short integer) hossz egsz (long integer) pakolt BCD egsz (packed BCD integer) A koprocesszoron bell csak a kiterjesztett pontossg vals tpus ltezik, a tbbi tpus pedig a memriban elfordul adatok formtuma, amelyek betltskor tkonvertldnak a kiterjesztett vals tpusra, illetve trolskor ilyen tpusra vissza tudja alaktani a koprocesszor a (koprocesszor)verem tartalmt. Az egyes tpusok gpi alakjt mutatja a kvetkez tblzat: Tpus Hossz Exp. J Trt Tartomny Egyszeres 32 23..30 imp. 0..22 1.18*10-383.40*1038 Dupla 64 52..62 imp. 0..51 2.23*10-3081.79*10308 Kiterjesztett 80 64..78 63 0..62 3.37*10-49321.18*104932 Sz egsz 16 -3276832767 Rvid egsz 32 -2.14*1092.14*109
221

Hossz egsz 64 -9.22*10189.22*1018 Pakolt BCD 80 (-1018+1)(1018-1) A "Hossz" oszlop az adattpusok bitekben elfoglalt mrett mutatja. Az "Exp." rvidts oszlop azt a bittartomnyt rja le, ahol az eltolt exponens kerl trolsra. A "Trt" felirat oszlop hasonl mdon a trtrsz kdolsi tartomnyt mutatja. A "J" jelzs oszlop a J-bit (teht a binris egszrszt trol bit) pozcijt mutatja, mg a "Tartomny" jelzs oszlop az adott tpus szmbrzolsi tartomnyt tartalmazza. Az eljelbit (S) mindegyik tpus esetn a legfels bitet foglalja el. Az egyszeres s dupla pontossg vals tpusok esetn az "imp." (implied) rvidts utal arra, hogy a J-bit rtke itt nem troldik el, rtkt denormalizlt vges szmok s az eljeles nullk esetn 0-nak, minden ms esetben 1-nek veszi a koprocesszor. Az brzolsi tartomny csak kzelt rtkeket mutat vals tpusoknl. Az exponens trolsnl hasznlt eltolsi rtkek a kvetkezek: 127 (egyszeres), 1023 (dupla) s 16383 (kiterjesztett). Az exponens brzolsi tartomnya ennek megfelelen: -126127, -10221023, illetve -1638216383. Az egsz tpusok trolsi alakja megfelel a CPU ltal hasznltnak, gy termszetes mdon nincs exponens, J-bit, sem trtrsz. Az eljelbitet kivve a tbbi bit trolja a szm binris alakjt. A negatv szmok a szoksos kettes komplemens alakot hasznljk. Az brzolsi tartomny minden egsz tpusnl pontosan megadhat: a rvid egszek -2147483648 +2147483647 (-231(231-1)) kztt, mg a hossz egszek -9223372036854775808 +9223372036854775807 (-263(263-1)) kztt brzolnak. A pakolt BCD tpus 18 db. decimlis szmjegyet trol a kvetkez mdon: a 0..8 szm bjtok als s fels bitngyese egy-egy decimlis szmjegyet kdol le (ASCII 0..9 karakterek).
222

A decimlis szm legals szmjegye a 0-s bjt als felben van, mg a 8-as bjt fels fele a szm legels, legnagyobb helyirtk szmjegyt trolja. A 9-es bjtnak csak a legfels, 7-es bitje van kihasznlva (eljelbit), a tbbi bit rtke nem szmt. A BCD szmok NEM kettes komplemens alakban troldnak el, csak az eljelbit klnbzteti meg az azonos abszolt rtk pozitv s negatv szmokat. A pozitv s negatv nulla azonos rtket kpvisel. Az egyes szmtpusok binris kdolsi formjt mutatjk a kvetkez tblzatok vals, binris egsz s pakolt BCD egsz tpusok esetn. rtk tpusa S Eltolt exponens J Trt +Vgtelen 0 1111 1 0000 +Normlt 0 11100001 1 11110000 +Denormlt 0 0000 0 11110001 +Zr 0 0000 0 0000 -Zr 1 0000 0 0000 -Denormlt 1 0000 0 11110001 -Normlt 1 11100001 1 11110000 -Vgtelen 1 1111 1 0000 SNaN ? 1111 1 0XXX QNaN ? 1111 1 1??? Meghatrozatlan 1 1111 1 1000 rtk tpusa Pozitv binris egsz Negatv binris egsz Zr Meghatrozatlan rtk tpusa Max. pozitv Min. pozitv Zr S 0 0 0 S rtkes bitek 0 11110001 1 11110000 0 0000 1 0000 1. jegy 1001 0001 0000
223

Spec 18. jegy 17. jegy 16. jegy 00 1001 1001 1001 00 0000 0000 0000 00 0000 0000 0000

-Zr Min. negatv Max. negatv Meghatrozatla n

1 1 1 1

00 00 00 11

0000 1001 0000 1111

0000 1001 0000 1111

0000 1001 0000 ????

0000 1001 0001 ????

A tblzatokban a krdjellel (?) jelzett bitek rtke tetszleges lehet. A vals tpusok esetn az SNaN-ok kdolsra hasznlt szm trtrsze nem lehet nulla, klnben az X-ek helyn tetszleges rtk llhat. Az SNaN-t a QNaN-tl a trtrsz legfels (legrtkesebb) bitjnek rtke klnbzteti meg. A binris egszek a meghatrozatlan rtket ugyangy kdoljk, mint a legkisebb negatv szmot. A koprocesszorba betltskor ezt az rtket szmnak rtelmezi az FPU, mg a memriba trols esetn a numerikus kivtelt jelz flag-ek (a sttuszregiszterben) vizsglatval kiderthet, melyik rtkrl van sz. A harmadik tblzatban a "Spec" cmkj oszlop a pakolt BCD szmok 9-es bjtjnak 0..6 bitjeire vonatkozik, de ezeknek az rtkeknek csak a szmok memriba val trolsakor van szerepk, mivel a koprocesszorba betltskor ezek a bitek figyelmen kvl lesznek hagyva. A meghatrozatlan BCD rtk betltse a koprocesszorba megjsolhatatlan eredmnnyel jr.

A koprocesszor szmos regisztert tartalmaz a mveletek elvgzsre s egyb clokra: 8 db. 80 bites adatregisztert (data registers), egy 16 bites sttuszregisztert (Status register/Word SW), egy 16 bites vezrlregisztert (Control register/Word CW), egy 16 bites tag-regisztert (tag word), egy 48 bites FPU utastsmutatt (FPU Instruction PointerIP), egy 48 bites FPU operandusmutatt (FPU Operand PointerOP), s vgl egy 11 bites mveleti kd regisztert (opcode register).
224

Az adatregiszterek neve FPR0, FPR1, , FPR7. Ezek a nevek azonban nem hasznlhatak kzvetlenl, mivel az adatregiszterek verem szervezsek, ami annyit jelent, hogy minden regisztert csak a verem tetejhez (Top Of StackTOS) kpest relatvan tudunk elrni. Ha pl. TOS=2, akkor a verem teteje a 2-es adatregiszter (FPR2), s erre az ST nvvel hivatkozhatunk. A verem tetejtl szmtott i-edik adatregiszter elrsre az ST (i) jellst hasznljuk, ahol 0i7. ST(0) megegyezik ST-vel, teht ugyancsak a verem tetejt jelli ki. A pldnl maradva, ST(1) az FPR3, ST(5) az FPR7, mg ST(7) az FPR1 regisztert vlasztja ki. Ebbl is ltszik, hogy a regiszter sorszma a (TOS+i) mod 8 kifejezs eredmnye lesz. A betlt (load) utastsok hasonlan cselekszenek a PUSH utastshoz: cskkentik TOS-t, majd a verem j tetejre rakjk a krt adatot, amit hasznltnak jellnek be (teht ezentl mr nem lesz res). A trol (store) utastsok a TOS ltal mutatott regiszter tartalmt olvassk ki. A POP mvelet itt azt jelenti, hogy ST-t resnek jelli be, majd TOS rtkt eggyel megnveli. TOS teht SP (Stack Pointer) szerept jtssza. Ha TOS=0, akkor egy betlt utasts hatsra TOS rtke 7 lesz, s keletkezik egy veremtlcsorduls kivtel (floating-point stack-overflow exception, #IS). A sttusz regiszter, nevhez mltan, a koprocesszor llapott mutatja. Felptse az albbi brn lthat:

Az als hat bit kivtelek keletkezst jelzik, sorban rvnytelen mvelet (Invalid operation Exception), denormalizlt operandus (Denormalized operand, #D), nullval val oszts (division by Zero, #Z), tlcsorduls (Overflow, #O),
225

alulcsorduls (Underflow, #U), illetve a pontossgbl veszts (Precision loss, #P) tnyt kzlik. Ezek a bitek addig megrzik llapotukat, mg azt valamilyen vezrl utasts (mint pl. FCLEX/FNCLEX, FINIT/FNINIT, FSAVE/FNSAVE, FRSTOR, FLDENV) meg nem vltoztatja. Mindegyik kivtelt maszkolni (tiltani) lehet a vezrlregiszterben. Ha legalbb egy maszkolatlan (engedlyezett) bit be van lltva, akkor ES (Error Summary status) rtke 1, klnben 0. Ha ES rtke 1 lesz, akkor a CPU a kivtelt megprblja orvosolni a megfelel kezelrutin meghvsval. A B (FPU Busy) bit a 8087-es koprocesszoron jtszik csak szerepet, s rtke mindig megfelel az ES bitnek. Az rvnytelen mvelet kivtel (IE=1) kt dolgot jelenthet: veremhibt vagy rvnytelen aritmetikai operandust. Az SF (Stack Fault) bit jelzi, hogy keletkezett-e veremtlcsorduls vagy -alulcsorduls. Ha SF=1, akkor veremkivtel keletkezett (Invalid Stack operation, #IS), s C1 llapota mutatja a tnyleges hiba jellegt: C1=0 esetn alulcsorduls, egybknt tlcsorduls trtnt. Ezek a hibk sszefggnek az adatregiszterek tartalmval, s gy a tag-regiszterrel is. Ez a bit a kivtelt jelzkhz hasonlan megrzi rtkt a kvetkez trlsig. SF=0 esetn akkor a legutols aritmetikai utasts rvnytelen operandussal lett meghvva (Invalid Arithmetic operand, #IA) A 3 bites TOS mez a verem aktulis tetejnek megfelel adatregiszter sorszmt tartalmazza, rtke teht 0..7 lehet. A C0, C1, C2, C3 bitek llapott kln-kln is lltja nhny utasts, ilyenkor szmos jelentst hordozhatnak. Az sszehasonlt utastsok is ezekben a bitekben jelzik az sszehasonlts eredmnyt, s mivel sszehasonltst elgazsok (feltteles vezrlsi szerkezetek) megvalstsakor hasznlunk, ezeket a biteket kzs nven feltteljelz (condition code) biteknek hvjuk.

226

Ahhoz, hogy feltteles ugrst hajthassunk vgre a feltteljelzk llstl fggen, a legegyszerbb mdszer a kvetkez lehet:
FSTSW AX SAHF

Az els utasts a sttusz regiszter (SW) rtkt az AX regiszterbe msolja t. Vegyk szre, hogy a C0, C1, C2 s C3 bitek pozcija megfelel a CF, PF s ZF flag-eknek (C1-et kihagyva), gy AH-t a Flags als bjtjba betltve clhoz is rtnk. AX operandust csak 80287-es vagy annl jabb tpus koprocesszor esetn kaphat az FSTSW utasts, gy a 8087-esen SW-t elszr a memriba kell berni, majd onnan kiolvasni AX-be (vagy rgtn AH-ba). A Pentium Pro processzortl "flfel" ltez FCOMI, FCOMIP, FUCOMI s FUCOMIP utastsok hasznlatakor nincs szksg a fenti kt plusz lpsre, mivel ezek az sszehasonlts eredmnyt kzvetlenl az EFlags regiszter megfelel flag-jeiben jelzik. A vezrlregiszter a koprocesszor mkdst befolysol biteket tartalmaz:

Az als hat bit a numerikus kivtelek tiltsra szolgl. Ha valamelyik bit rtke 1, akkor a megfelel kivtel nem keletkezhet, azaz a CPU nem szleli ket, s gy a kivtel-kezel rutin sem fut le. A PC (Precision Control) bitek llapota adja meg, hogy az FPU milyen pontossggal vgezze el az additv (FADD, FADDP, FSUB, FSUBP, FSUBR, FSUBRP), multiplikatv (FMUL, FMULP, FDIV, FDIVP, FDIVR, FDIVRP) s ngyzetgyk-von (FSQRT) utastsokat. Jelentse: PC rtke Pontossg
227

00 Egyszeres 01 10 Dupla 11 Kiterjesztett Az RC (Rounding Control) mez rtke hatrozza meg, milyen kerektst alkalmazzon az FPU. Jelentse: RC rtke Kerekts mdja 00 Legkzelebbi rtkhez 01 Lefel (-Inf fel) 10 Felfel (+Inf fel) 11 Nulla fel (csonkts) A legkzelebbi rtkhez kerekts (round to nearest, even) az eredmnyhez legkzelebbi rtket vlasztja, s egyenl tvolsg esetn a pros rtket vlasztja. A lefel (round down) s felfel (round up) kerektsek az intervallum-aritmetika megvalstst segtik ("Inf"=Infinityvgtelen). Csonktst (truncate, chop) ltalban akkor alkalmazunk, ha az eredmnyt valamilyen binris egsz alakban vrjuk. Az IC (Infinity Control) bitnek csak a 8087, 80187 s 80287 (a 80287xl-t kivve) koprocesszorok esetn van jelentse. A pozitv vgtelen rtkt ltalban gy definiljuk, hogy az nagyobb brmely pozitv vges szmnl. Ezt affin szemlletnek hvjuk, megklnbztetve a projektv szemllettl. IC=1 esetn affin mdon kezeli a vgteleneket az FPU, egybknt pedig projektvan. Az I (Interrupt enable mask) bit csak a 8087-es koprocesszoron ltezik, s a megszaktsok engedlyezsre szolgl. A tag-regiszter 8 mezt tartalmaz, melyek mindegyike egy-egy adatregiszterhez tartozik. rtkk mutatja, hogy a megfelel adatregiszternek mi a tartalma. Felptse, s a mezk jelentse:

228

Tag rtke Tartalom 00 rvnyes szm (Valid) 01 Nulla (Zero) 10 Klnleges (Special) 11 res (Empty) A koprocesszor inicializlsa (FINIT/FNINIT vagy FSAVE/ FNSAVE tjn) utn mindegyik tag rtke 11b, teht az sszes adatregisztert resnek jelzik. Klnleges rtknek minslnek a NaN-ok, rvnytelen rtkek, vgtelenek s a denormlt szmok. Veremtlcsorduls trtnik, ha TOS cskkentse utn egy nem res adatregiszterre mutat. Hasonlan, veremalulcsordulsrl akkor beszlnk, ha TOS-t nvelve az egy res regiszterre fog mutatni, vagy ha az utasts egyik operandusa egy res adatregisztert vlaszt ki. Nem resnek tekinthet minden olyan adatregiszter, aminek tag rtke 00b, 01b vagy 10b. Az utasts- s operandus mutatk a legutols, nem vezrl utasts cmt, ill. legutbb hasznlt operandus cmt tartalmazzk. A regiszterek tartalma egy szablyos tvoli mutat: 16 bites szegmens/szelektor, valamint 32 bites offszet. Minden koprocesszor utasts mveleti kdjnak els bjtja a 0D8..DFh rtkek valamelyike. Mivel ennek a fels t bitje lland (11011b), ezt felesleg lenne eltrolni. Ezrt csak az els bjt als hrom bitje, valamint a msodik bjt kerl eltrolsra, gy jn ki a 11 bit. A mveleti kd regiszter 0..7 bitjei a mveleti kd msodik bjtjt tartalmazzk, mg a 8..10
229

bitekben az els bjt als hrom bitje tallhat. Ebben a regiszterben a legutols, nem vezrl utasts opcode-jt talljuk meg. A kivtelek kezelsrl is kell nhny szt ejteni. Ha a koprocesszor egy numerikus hibt szlel, akkor ktflekppen cselekedhet. Ha az adott kivtel az FPU vezrlregiszterben (CW) maszkolva (tiltva) van, a koprocesszor sajt maga kezeli le a hibt, ami ltalban azt fogja jelenteni, hogy az eredmny a meghatrozatlan rtk (real/integer indefinite) vagy egy denormlt szm (denormalized number) lesz. Ha azonban engedlyeztk a krdses numerikus kivtel keletkezst, a koprocesszor a kivtelt tudatja a processzorral. A 8087-es koprocesszor numerikus hiba szlelsekor aktivlja az INT# nev kivezetst, ami a 8086/8088-as processzor NMI# lbra van kzvetlenl rktve. Egy numerikus kivtel keletkezse gy az NMI megszakts ltrejtthez vezet, amit a processzor az INT 02h szoftvermegszakts kezeljnek vgrehajtsval intz el. Az NMI kezelnek teht elszr el kell dntenie, FPU-hiba vagy egyb hardveresemny okozta az NMI-t, csak ezutn cselekedhet. A 80286-os processzor mr kln bemenettel rendelkezik a koprocesszor-hibk fogadsra, ennek neve ERROR#. A kezdetben kitztt cl az volt, hogy numerikus hiba keletkezse esetn a koprocesszor az azonos nev kimenett aktivlja. A jelet az ERROR# bemeneten rzkelve a processzor 16-os kivtelt (#MF) vltott volna ki, amit kifejezetten erre a clra vezettek be ezen a processzoron. Mgsem ez trtnt. Korbbi ismereteinkbl mr tudhatjuk, hogy a kivtelek az INT 00h..1Fh szoftver-megszaktsokra kpzdnek le. A 16-os kivtelnek az INT 10h felel meg, amit az IBM mr lefoglalt a kpernyvel kapcsolatos szolgltatsok szmra. ppen ezrt az sszes IBM AT s kompatibilis szmtgpen a 80286-os
230

processzor ERROR# bemenett llandan magas feszltsgszinten tartjk, a koprocesszor ERROR# kivezetse pedig a megszakts-vezrl IRQ13-as vonalra van rktve. Egy numerikus kivtel keletkezse esetn gy a processzor IRQ13-at rzkel, vgrehajtja annak kezeljt (ez alapllapotban az INT 75h), ami vgl egy INT 02h utastst hajt vgre. A numerikus kivtelek lekezelse teht a 80286-os processzoron is az NMI-n keresztl trtnik a visszafel kompatibilits megrzse vgett. Az NMI-t ignybe vev mdszert MS-DOS-kompatibilis mdnak hvjk, szemben a 16-os kivtelt generl natv mddal (native mode). A 80286-os processzor tmogatja a natv mdot, de az emltett okokbl egyetlen IBM AT-kompatibilis szmtgpen sem keletkezhet 16-os kivtel hardveres ton. A 80386-os processzor a 80286-ossal megegyez mdon kezeli a numerikus kivteleket. A 80486-os processzor mr lehetv teszi a felhasznlnak (vagy inkbb az opercis rendszernek), hogy vlasszon az MSDOS-kompatibilis s a natv numerikus hibakezels kztt. A CR0 regiszter NE (5-s) bitjnek llapota dnti el, mi trtnjen numerikus kivtel szlelsekor. Ha NE=0, akkor a processzor az MS-DOS-kompatibilis mdnak megfelelen cselekszik. Ez egsz pontosan azt jelenti, hogy aktivlja FERR# nev lbt, ami a megszakts-vezrln keresztl IRQ13-at vlt ki, s vgl ismt az NMI kezelje (INT 02h) kerl vgrehajtsra. Ha NE=1, akkor is keletkezik IRQ13, de 16-os kivtelt is generl a processzor. A P5 architektrj processzorok (Pentium, Pentium MMX) a 80486-ossal megegyez mdon kezelik a numerikus hibkat. A 80486-os s a Pentium processzorokon elfordulhat, hogy MS-DOS-kompatibilis mdban numerikus hiba keletkezse esetn nem azonnal reagl a processzor IRQ13-mal, hanem csak a kvetkez FPU vagy WAIT utastsnl. Ez a
231

ksleltetett kivtel-kezels a P6-os architektrban (Pentium Pro, Pentium II, Pentium III stb.) megsznt, ezek a processzorok ugyanis a natv mdhoz hasonlan azonnal reaglnak a kivtelre. Az albbiakban megtallhat a koprocesszorok utastskszlete, a 8087-estl egszen a Pentium Pro-ig (ezen a processzoron vezettek be legutoljra j numerikus utastst). Mindegyik utasts utn olvashat az operandusok formja, az utasts elrhetsge kapcsos zrjelek kztt (azaz milyen koprocesszorokon ill. processzorokon tallhat meg), a mnemonik jelentse angolul, valamint az utasts mkdsnek rvid lersa. Nem clunk teljes rszletessggel bemutatni minden utastst, mivel errl a tmrl elg sok irodalom jelent meg. Az utastsok mnemonikjnak els betje ("F") utal arra, hogy ezek FPU utastsok. A kvetkez jellseket alkalmaztuk: (no op) nincs operandus src forrs (source) dest cl (destination) mem memriaoperandus m16 sz binris egsz memriaoperandus (word integer) m32 rvid binris egsz vagy egyszeres pontossg vals memriaoperandus (short integer, single real) m64 hossz binris egsz vagy dupla pontossg vals memriaoperandus (long integer, double real) m80 pakolt BCD egsz vagy kiterjesztett pontossg vals memriaoperandus (packed BCD integer, extended real) ST ST(0) -t rvidti, a koprocesszor verem teteje
232

ST(i) a TOS rtkhez relatv i-edik koprocesszor adatregiszter/verembejegyzs 8087 Intel 8087 vagy vele kompatibilis koprocesszor 287 Intel 80287, Intel 80287xl, IIT 2c87 stb. 387 Intel 80387 vagy vele kompatibilis koprocesszor PPro Intel Pentium Pro (P6 architektra) s vele kompatibilis processzor PROC+ az adott PROC processzoron/koprocesszoron s attl kezdve minden ksbbin ltezik az utasts csak PROC csak az adott PROC csald tagjain rvnyes az utasts A trtvonal (/) mindenhol vagylagossgot jelez (kizr vagy). Ahol nem jeleztk kln egy utasts elrhetsgt, akkor az adott utasts a 8087-es koprocesszoron s attl kezdve minden ksbbi rendszeren is megtallhat. 17.2.1 Adatmozgat utastsok FLD m32/m64/m80/ST(i) (LoaD real) Cskkenti TOS-t, majd a megadott forrsbl betlti ST-be a vals szmot. FST m32/m64/ST(i) (STore real) FSTP m32/m64/m80/ST(i) (STore real and Pop) A megadott helyre eltrolja ST tartalmt vals alakban. Az FSTP vltozat ezutn mg egy POPot hajt vgre. FILD m16/m32/m64 (LoaD Integer) Cskkenti TOS-t, majd a megadott forrsbl betlti ST-be a binris egsz szmot.
233

FIST m16/m32 (STore Integer) FISTP m16/m32/m64 (STore Integer and Pop) A megadott helyre eltrolja ST tartalmt binris egsz alakban. Az FISTP vltozat ezutn egy POP-ot hajt vgre. FBLD m80 (LoaD BCD integer) Cskkenti TOS-t, majd a megadott forrsbl betlti ST-be a pakolt BCD egsz szmot. FBSTP m80 (STore BCD integer and Pop) A megadott helyre eltrolja ST tartalmt pakolt BCD egsz alakban, majd vgrehajt egy POP-ot. FXCH (no op)/ST(i) (eXCHange registers) Megcserli ST tartalmt ST(i)-vel, vagy ha nincs operandus megadva, akkor ST(1)-gyel. FCMOVE/FCMOVZ ST,ST(i) {PPro+} (MOVe if Equal/Zero) FCMOVNE/FCMOVNZ ST,ST(i) {PPro+} (MOVe if Not Equal/Not Zero) FCMOVB/FCMOVC/FCMOVNAE ST,ST(i) {PPro+} (MOVe if Below/Carry/Not Above or Equal) FCMOVBE/FCMOVNA ST,ST(i) {PPro+} (MOVe if Below or Equal/Not Above) FCMOVNB/FCMOVNC/FCMOVAE ST,ST(i) {PPro+} (MOVe if Not Below/Not Carry/Above or Equal) FCMOVNBE/FCMOVA ST,ST(i) {PPro+} (MOVe if Not Below or Equal/Above) FCMOVU ST,ST(i) {PPro+} (MOVe if Unordered)
234

FCMOVNU ST,ST(i) {PPro+} (MOVe if Not Unordered) Ez a 8 utasts valamilyen felttel teljeslse esetn ST (i) tartalmt ST-be mozgatja. Az utastsok az EFlags bitjeit veszik figyelembe, nem pedig a sttuszregiszterben lev felttelbiteket (condition code bits). Az unordered felttel akkor teljesl, ha PF=1 (C2=1). Egy elz sszehasonlts alapjn akkor ll fent az unordered felttel, ha a kt operandus kzl legalbb egy NaN vagy rvnytelen rtk volt. A mnemonikban a CMOV sz utal arra, hogy feltteles adatmozgats trtnik (conditional move).

17.2.2 Alap aritmetikai utastsok FADD (no op)/m32/m64 FADD ST,ST(i) FADD ST(i),ST (ADD real) FADDP (no op) FADDP ST(i),ST (ADD real and Pop) Az FADD a vals forrs rtket hozzadja a clhoz, az FADDP pedig ezutn mg vgrehajt egy POP-ot. Az operandus nlkli vltozatok megfelelnek az FADDP ST(1),ST utastsnak mindkt esetben. FIADD m16/m32 (ADD Integer) A binris egsz forrs tartalmt hozzadja ST-hez. FSUB (no op)/m32/m64 FSUB ST,ST(i) FSUB ST(i),ST (SUBtract real)
235

FSUBP (no op) FSUBP ST(i),ST (SUBtract real and Pop) Az FSUB kivonja a vals forrst a clbl, az eredmnyt a cl helyn eltrolja, ami utn az FSUBP vgrehajt egy POP-ot is. Az operandus nlkli vltozatok az FSUBP ST(1),ST utastst rvidtik. FSUBR (no op)/m32/m64 FSUBR ST,ST(i) FSUBR ST(i),ST (SUBtract real Reversed) FSUBRP (no op) FSUBRP ST(i),ST (SUBtract real Reversed) Az FSUBR a cl tartalmt kivonja a vals forrsbl, az eredmnyt a clban eltrolja, ezutn az FSUBRP vgrehajt egy POP-ot. Az op. nlkli formk az FSUBRP ST(1),ST utastsnak felelnek meg. FISUB m16/m32 (SUBtract Integer) A binris egsz forrst kivonja ST-bl, majd az eredmnyt ST-be rakja. FISUBR m16/m32 (SUBtract Integer Reversed) ST tartalmt kivonja a memriban lev binris egsz forrsbl, majd az eredmnyt ST-be rakja. FMUL (no op)/m32/m64 FMUL ST,ST(i) FMUL ST(i),ST (MULtiply real) FMULP (no op) FMULP ST(i),ST (MULtiply real and Pop)
236

Az FMUL megszorozza a clt a vals forrssal, majd az FMULP vgrehajt egy POP-ot. Az operandus nlkli vltozatok megegyeznek az FMULP ST(1), ST utastssal. FIMUL m16/m32 (MULtiply Integer) ST-t megszorozza a binris egsz forrs operandussal. FDIV (no op)/m32/m64 FDIV ST,ST(i) FDIV ST(i),ST (DIVide real) FDIVP (no op) FDIVP ST(i),ST (DIVide real and Pop) Az FDIV elosztja a clt a vals forrssal, az eredmnyt a cl helyn eltrolja, ami utn az FDIVP vgrehajt egy POP-ot is. Az operandus nlkli vltozatok az FDIVP ST(1),ST utastst rvidtik. FDIVR (no op)/m32/m64 FDIVR ST,ST(i) FDIVR ST(i),ST (DIVide real Reversed) FDIVRP (no op) FDIVRP ST(i),ST (DIVide real Reversed) Az FDIVR a vals forrst elosztja a cllal, az eredmnyt a clban eltrolja, ezutn az FDIVRP vgrehajt egy POP-ot. Az operandus nlkli formk az FDIVRP ST(1),ST utastsnak felelnek meg. FIDIV m16/m32 (DIVide Integer) ST-t elosztja a binris egsz forrssal, a hnyadost STben trolja el.
237

FIDIVR m16/m32 (DIVide Integer Reversed) A binris egsz forrst elosztja ST-vel, majd az eredmnyt ST-ben eltrolja. FPREM (no op) (Partial REMainder) FPREM1 (no op) {387+} (IEEE 754 Partial REMainder) Ez a kt utasts ST-t elosztja ST(1)-gyel, majd a maradkot ST-be rakja. A hnyados legals hrom bitjt ugyancsak eltroljk C0:C3:C1-ban (teht C0 a 2-es, C3 az 1-es, C1 pedig a 0-s bit). A maradk az osztand (ST) eljelt rkli. Az FPREM1 utasts az IEEE 754-es szabvny szerint adja meg a maradkot. FABS (no op) (ABSolute value) ST-t kicserli annak abszolt rtkre. FCHS (no op) (CHange Sign) ST-t neglja (eljelt megfordtja). FRNDINT (no op) (RouND to INTeger) ST-t a vezrlregiszter RC mezje szerint egsz rtkre kerekti. FSCALE (no op) (SCALE by a power of 2) ST rtkt megszorozza 2-nek ST(1)-ben megadott hatvnyval, majd az eredmnyt ST-be rakja. ST (1) tartalmt egsznek rtelmezi, amit a benne lev rtk csonkolsval r el. Teljeslnie kell, hogy -215ST(1)<215. Ha 0<ST(1)<1, a mvelet eredmnye megjsolhatatlan. FSQRT (no op)
238

(SQuare RooT) ST-t lecserli annak ngyzetgykre. ST-nek nagyobb vagy egyenlnek kell lennie (-0)-nl. A -0 ngyzetgyke nmaga lesz. FXTRACT (no op) (eXTRACT exponent and significand) Legyen N=ST. ST-t lecserli N valdi (nem eltolt) exponensre, cskkenti TOS-t, s az j ST-be berakja N mantisszjt. Vgl teht az exponens ST(1)-ben, a mantissza ST-ben lesz, s mindkettt rvnyes vals szmknt trolja el. Ha a kiindul operandus nulla, akkor exponensknt negatv vgtelent, mantisszaknt pedig nullt trol el, aminek az eljele megegyezik a forrsval. Tovbb ebben az esetben egy nullval val oszts numerikus kivtel (#Z) is keletkezik.

17.2.3 sszehasonlt utastsok FCOM (no op)/m32/m64/ST(i) (COMpare real) FCOMP (no op)/m32/m64/ST(i) (COMpare real and Pop) FCOMPP (no op) (COMpare real and Pop twice) sszehasonltjk ST-t a vals forrssal (teht ST-bl kivonjk a forrst), majd az eredmnynek megfelelen belltjk a feltteljelz biteket a sttuszregiszterben. Az FCOMP az sszehasonlts utn egy, az FCOMPP pedig kt POP-ot hajt vgre. Az operandus nlkli vltozatok minden esetben ST(1)-et hasznljk. A nulla eljele lnyegtelen, azaz -0=+0. Ha legalbb az egyik operandus NaN vagy rvnytelen rtk,
239

akkor a bitek az unordered belltst fogjk mutatni, s egy rvnytelen operandus kivtel (#IA) keletkezik. Ha a kivtel keletkezst el akarjuk kerlni, akkor hasznljuk az FUCOM, FUCOMP s FUCOMPP utastsokat. A feltteljelz bitek lehetsges llapott mutatja az albbi tblzat: Eredmny ST>forrs ST<forrs ST=forrs Unordered C0 C2 C3 0 0 0 1 0 0 0 0 1 1 1 1

FICOM m16/m32 (COMpare Integer) FICOMP m16/m32 (COMpare Integer and Pop) ST-t sszehasonltjk a binris egsz forrssal, majd az eredmny alapjn belltjk a feltteljelz biteket. Az FICOMP ezutn mg egy POP-ot is vgrehajt. FUCOM (no op)/ST(i) {387+} (COMpare real Unordered) FUCOMP (no op)/ST(i) {387+} (COMpare real Unordered and Pop) FUCOMPP (no op) {387+} (COMpare real Unordered and Pop twice) Az FCOM, FCOMP, FCOMPP utastshoz hasonlan mkdnek, teht a vals forrst sszehasonltjk ST-vel, majd az FUCOMP egy, az FUCOMPP pedig kt POP-ot hajt vgre. Az operandus nlkli esetben ST(1) a forrs. Ha az operandusok kzl legalbb az egyik SNaN vagy rvnytelen rtk, akkor rvnytelen operandus kivtel (#IA)
240

keletkezik. QNaN-ok esetn viszont nincs kivtel, a feltteljelz bitek pedig az unordered belltst fogjk mutatni. FCOMI ST,ST(i) {PPro+} (COMpare real and set EFlags) FCOMIP ST,ST(i) {PPro+} (COMpare real, set EFlags, and Pop) sszehasonltjk ST(i)-t ST-vel, majd az eredmnynek megfelelen belltjk a CF, PF s ZF flag-eket az EFlags regiszterben. Az FCOMIP ezutn vgrehajt egy POP-ot is. A nulla eljele nem szmt, teht -0=+0. Ha az operandusok kzl legalbb az egyik NaN vagy rvnytelen rtk, a flag-eket az unordered jelzsre lltjk be, majd egy rvnytelen operandus kivtelt (#IA) vltanak ki. Ha ezt el akarjuk kerlni, hasznljuk az FUCOMI s FUCOMIP utastsokat. A flag-ek llapotnak jelentse az albbi tblzatban lthat: Eredmny CF PF ZF ST>forrs 0 0 0 ST<forrs 1 0 0 ST=forrs 0 0 1 Unordered 1 1 1

FUCOMI ST,ST(i) {PPro+} (COMpare real Unordered and set EFlags) FUCOMIP ST,ST(i) {PPro+} (COMpare real Unordered, set EFlags, and Pop) Teljesen hasonlan mkdnek az FCOMI s FCOMIP utastsokhoz, azzal a klnbsggel, hogy QNaN operandus(ok) esetn nem generlnak kivtelt. FTST (no op)
241

(TeST for zero) ST-t sszehasonltja 0.0-val, majd az eredmnynek megfelelen belltja a feltteljelz biteket a sttuszregiszterben. A bitek llapott az albbi tblzat szerint rtelmezhetjk: Eredmny ST>0.0 ST<0.0 ST=0.0 Unordered C0 C2 C3 0 0 0 1 0 0 0 0 1 1 1 1

FXAM (no op) (eXAMine) ST-t megvizsglja, majd a benne lev adatnak megfelelen belltja a feltteljelz biteket. C1 mindig az eljelet tartalmazza (0=pozitv, 1=negatv), a tbbi bit jelentse az albbi tblzatban lthat: Tartalom C3 C2 C0 Nem tmogatott 0 0 0 NaN 0 0 1 Normalizlt vges szm 0 1 0 Vgtelen 0 1 1 Zr 1 0 0 res 1 0 1 Denormalizlt szm 1 1 0

17.2.4 Transzcendentlis utastsok FSIN (no op) (calculate SINe) {387+}


242

ST-t lecserli annak szinusz rtkre. Az operandus radinban rtend, s teljeslnie kell, hogy ST<263. Ha rvnytelen operandust adunk meg, akkor ST rintetlen marad, s a C2 feltteljelz bitet 1-re lltja. FCOS (no op) {387+} (calculate COSine) ST-t lecserli annak koszinusz rtkre. Az operandus radinban rtend, s teljeslnie kell, hogy ST<263. Ha rvnytelen operandust adunk meg, akkor ST rintetlen marad, s a C2 feltteljelz bitet 1-re lltja. FSINCOS (no op) {387+} (calculate SINe and COSine) Legyen N=ST. ST-t lecserli N szinusz rtkre, cskkenti TOS-t, majd az j ST-be berakja N koszinusz rtkt. Vgl teht ST(1)-ben lesz a szinusz, mg ST-ben a koszinusz rtk. Az operandus radinban rtend, s teljeslnie kell, hogy ST<263. Ha rvnytelen operandust adunk meg, akkor ST s TOS rintetlen marad, s a C2 feltteljelz bitet 1-re lltja. FPTAN (no op) (calculate Partial TANgent) ST-t lecserli annak tangens rtkre, cskkenti TOSt, majd az j ST-be 1.0-t rak be, gy ST(1)-ben lesz a tangens rtk. Az operandus radinban rtend, s teljeslnie kell, hogy ST<263 (a 80387 eltti koprocesszoroknl 0STPi/4 legyen). Ha rvnytelen operandust adunk meg, akkor ST s TOS rintetlen marad, s a C2 feltteljelz bitet 1re lltja. Ha utna kiadunk egy FDIVR vagy FDIVRP utastst, akkor ST-ben a kotangens rtket kapjuk meg.
243

FPATAN (no op) (calculate Partial ArcTANgent) Kiszmtja az ST(1)/ST hnyados arkusztangenst, az eredmnyt berakja ST(1)-be, majd vgrehajt egy POP-ot. Az ST-ben lev eredmnyt radinban kapjuk meg, s -PiST+Pi, valamint a szg az eredeti ST(1) eljelt rkli. A 80287-es s rgebbi koprocesszorokon a kiindul operandusokra teljeslnie kell a kvetkeznek: 0ST(1)< ST<+. F2XM1 (no op) (compute 2 to the power of X minus one) Kiszmtja a 2ST-1 kifejezs rtkt, majd azt visszarakja ST-be. A kiindul operandusnak 80287-es s korbbi FPU-n teljestenie kell a 0<ST<0.5 egyenltlensgeket, a 80387-es s jabb koprocesszorokon pedig a -1.0<ST<+1.0 feltteleket. FYL2X (no op) (compute Y*Log2 X) Kiszmtja ST-nek (X) kettes alap (binris) logaritmust, azt megszorozza ST(1)-gyel (Y), az eredmnyt visszarja ST(1)-be, majd vgrehajt egy POP-ot. Ha X negatv, akkor rvnytelen operandus kivtel (#IA) generldik. Ha X=0, akkor kt eset lehetsges: ha a vezrlregiszterben ZM=1, akkor nullval val oszts numerikus kivtel (#Z) generldik, klnben az eredmny vgtelen lesz, aminek az eljele Y eljelnek ellentettje. FYL2XP1 (no op) (compute Y*Log2 (X+1.0) ) Veszi ST-t (X), hozzad 1.0-t, kiszmtja ennek a kettes alap logaritmust, ezt megszorozza ST(1)-gyel
244

(Y), az eredmnyt eltrolja ST(1)-ben, majd vgrehajt egy POP-ot. A kiindul operandusokra teljeslnik kell a kvetkezknek: -(1- 2 /2)ST 1- 2 /2, tovbb -ST(1). Ha rvnytelen operandus(ok)ra prbljuk meg vgrehajtani az utastst, a reakci kiszmthatatlan, s nem fog felttlenl kivtel generldni. 17.2.5 Konstansbetlt utastsok FLD1 (no op) (LoaD 1.0) FLDZ (no op) (LoaD 0.0) FLDPI (no op) (LoaD PI) FLDL2E (no op) (LoaD Log2 E) FLDLN2 (no op) (LoaD LN 2=Loge 2) FLDL2T (no op) (LoaD Log2 10) FLDLG2 (no op) (LoaD LG 2=Log10 2) Ezek az utastsok cskkentik TOS-t, majd az j ST-be sorban az 1.0, 0.0, Pi, log2 e, ln 2, log2 10 s lg 2 konstansokat tltik be.

17.2.6 Koprocesszor-vezrl utastsok FINCSTP (no op) (INCrement floating-point STack Pointer) Hozzad egyet a TOS-hoz. Ha TOS rtke 7 volt, akkor az 0-v vlik. Ez NEM egyezik meg a POP245

pal, mivel a tag-ek nem mdosulnak (teht nem jelli be ST-t resnek TOS nvelse eltt). FDECSTP (no op) (DECrement floating-point STack Pointer) Kivon egyet a TOS-bl. Ha TOS rtke eltte 0 volt, akkor az j rtke 7 lesz. Az utasts NEM egyezik meg a PUSH/LOAD utastsokkal, mivel nem mdostja a tag-eket. FFREE ST(i) (FREE data register) A megadott adatregiszter tag rtkt resre (empty, 11b) jelli be, a regiszter ill. a TOS rtkt nem vltoztatja meg. FINIT (no op) (INITialize FPU) FNINIT (no op) (INITialize FPU, No wait) A koprocesszort alaphelyzetbe hozzk. Ez pontosan annyit jelent, hogy a vezrlregiszterbe a 037Fh (a legkzelebbi rtkhez kerekts, kiterjesztett pontossg, minden numerikus kivtel letiltva), a sttuszregiszterbe a 0000h (minden kivtel jelzbitje trlve, TOS=0, ES=B=0), mg a tagregiszterbe a 0FFFFh (mindegyik adatregiszter res) rtkeket tltik. A 80486 s jabb processzorokon az utasts s operandus mutatkat is trlik. Az FINIT utasts ezek eltt vgrehajt egy FWAIT utastst is az esetleges fgg numerikus kivtelek kezelsre, mg az FNINIT ezt nem teszi meg. FCLEX (no op) (CLear EXceptions) FNCLEX (no op) (CLear EXceptions, No wait)
246

Trlik a sttuszregiszterben az sszes kivtel jelzbitjt, valamint ES-t s B-t. Az FCLEX egy FWAIT utastst is kiad mindezek eltt, az FNCLEX viszont nem. FENI (no op) {csak 8087} (ENable Interrupts) FNENI (no op) {csak 8087} (ENable Interrupts, No wait) A vezrlregiszter I bitjt lltjk 0-ra, ezltal az FPU generlhat megszaktst. Az FENI egy FWAIT utasts kiadsval biztostja az esetleges fgg kivtelek lekezelst, mg az FNENI ezt nem teszi meg. FDISI (no op) {csak 8087} (DISable Interrupts) FNDISI (no op) {csak 8087} (DISable Interrupts, No wait) A vezrlregiszter I bitjt lltjk 1-re, ezltal az FPU nem generlhat megszaktst. Az FDISI egy FWAIT utasts kiadsval biztostja az esetleges fgg kivtelek lekezelst, mg az FNDISI ezt nem teszi meg. FSETPM (no op) {csak 287} (SET Protected Mode) A CPU ezzel az utastssal jelzik az FPU-nak, hogy vdett mdba lpett t. A 80387-es s annl jabb koprocesszorok figyelmen kvl hagyjk ezt az utastst. FRSTPM (no op) {csak 287} (ReSTore/resume Protected Mode) Vals mdba visszatrskor kell kiadni ezt az utastst, ezzel jelezve az FPU-nak a vltozst. Csak a

247

80287-es csald esetn van jelentsge, az FSETPM-hez hasonlan. FLDCW m16 (LoaD Control Word) A megadott forrst betlti a vezrlregiszterbe. Ha a sttuszregiszterben valamelyik kivtel jelzbitje be volt lltva, akkor ez problmkat okozhat. Ennek elkerlsre vgrehajtsa eltt rdemes kiadni egy FCLEX utastst. FSTCW m16 (STore Control Word) FNSTCW m16 (STore Control Word, No wait) A megadott cmre eltroljk a vezrlregiszter tartalmt. Az FSTCW utasts egy FWAIT utastst hajt vgre a trols eltt, az FNSTCW viszont nem teszi ezt meg. FSTSW m16 FSTSW AX {287+} (STore Status Word) FNSTSW m16 FNSTSW AX {287+} (STore Status Word, No wait) A megadott memriacmre vagy az AX regiszterbe eltroljk a sttuszregisztert. Az FSTSW utasts egy FWAIT utastst is vgrehajt a trols eltt, az FNSTSW viszont nem. FRSTOR source mem (ReSTORe saved FPU state) Az elzleg FSAVE vagy FNSAVE utastssal elmentett llapotot lltja vissza a megadott forrscmrl. A terlet mrete 16 bites kdszegmens esetn 94 bjt, 32 bites kdszegmens hasznlatakor pedig 108 bjt.
248

FSAVE dest mem (SAVE FPU state) FNSAVE dest mem (SAVE FPU state) Eltroljk a koprocesszor llapott a megadott cmre, majd jrainicializljk az FPU-t az FINIT, FNINIT utastshoz hasonlan. Az FSAVE egy FWAIT utastst is kiad elszr, ezt az FNSAVE nem teszi meg. 16 bites kdszegmens esetn 94, mg 32 bites kdszegmens esetn 108 bjtnyi informci kerl eltrolsra. A kvetkez bra vals mdban, 32 bites operandusmret esetn mutatja a trols formtumt. Jobb oldalon a terlet kezdettl mrt offszet lthat bjtokban.

249

Vdett mdban, 32 bites operandusmret esetn az albbi a helyzet:

Vals mdban, 16 bites operandusmretet hasznlva gy pl fel a tblzat:

250

Vgl vdett mdban, 16 bites operandusmret hasznlatakor a tbla a kvetkez alakot lti:

A processzor zemmdjtl fggen ms lesz az elmentett informci. A fenti kpek pontosan azt mutatjk, amit az FLDENV utasts betlt, illetve az FSTENV s FNSTENV utastsok elmentenek. Az resen hagyott mezk rtke definilatlan, azokat ne hasznljuk. Az FSAVE s FNSAVE utastsok ezen kvl a koprocesszor verem tartalmt is kirjk a fenti adatokon kvl: elszr a ST(0) rtke troldik el (10 bjt), majd ST(1) kvetkezik, stb. sszesen teht 14+80=94 bjtot
251

trolnak el 16 bites kdszegmens esetn, valamint 28+80=108 bjtot 32 bites kdszegmenst hasznlva. FLDENV source mem (LoaD FPU ENVironment state) Az elzleg FSTENV vagy FNSTENV utastssal elmentett llapotot lltja vissza a megadott forrscmrl. A terlet mrete 16 bites kdszegmens esetn 14 bjt, 32 bites kdszegmens hasznlatakor pedig 28 bjt. FSTENV dest mem (STore FPU ENVironment state) FNSTENV dest mem (STore FPU ENVironment state, No wait) Eltroljk a koprocesszor llapott a megadott cmre, majd az sszes koprocesszor-kivtelt letiltjk a vezrlregiszterben. Az FSTENV egy FWAIT utastst is kiad elszr, ezt az FNSTENV nem teszi meg. 16 bites kdszegmens esetn 14, mg 32 bites kdszegmens esetn 28 bjtnyi informci kerl eltrolsra. A terlet tartalmt, formtumt lsd az FSAVE, FNSAVE utastsok lersnl. FWAIT/WAIT (no op) (FPU WAIT) Addig meglltja a CPU-t, amg a koprocesszoron be nem fejezdik minden utasts lefutsa. Segtsgvel a CPU s az FPU munkjt szinkronizlhatjuk ssze, amire a Pentium processzorok eltti processzorok s koprocesszorok esetn szksg is van. Az utasts gpi kdja 9Bh, mindkt mnemonik erre a kdra vonatkozik. Ezt az utastst a CPU hajtja vgre, teht nem koprocesszor utasts. FNOP (no op)
252

(No OPeration) A CPU NOP utastshoz hasonlan nem vgez semmi mveletet, csak az utastsmutat regiszterek rtkt vltoztatja meg a CPU-n s az FPU-n is.

17.3 Az Intel 80186-os processzor jdonsgai


17.3.1 Vltozsok az utastskszletben IMUL dest reg16,source reg/mem16,imm8/imm16 Az IMUL utasts immron hromoperandus formban is hasznlhat. Mkdse: a msodik (forrs) operandust megszorozza a harmadik operandussal, az eredmnyt pedig az els (cl) operandusban trolja el. A cl 16 bites ltalnos regiszter, a forrs ltalnos regiszter vagy memriahivatkozs lehet, a harmadik operandus pedig egy bjt vagy sz mret kzvetlen rtk. IMUL dest reg16,imm8/imm16 Ez a forma az IMUL reg16,reg16,imm8/imm16 utastst rvidti, ahol a cl s a forrs is ugyanaz az ltalnos regiszter. MOV CS,reg/mem16 Ennek az utastsnak a vgrehajtsa 6-os kivtelt eredmnyez. PUSH SP Az utasts mkdse a 8086/8088-os processzorokon szimbolikusan ilyen volt:
SUB MOV SP,0002h SS:[SP],SP
253

Mostantl viszont az elvrt mveletet vgzi el, azaz:


MOV SUB MOV TEMP,SP SP,0002h SS:[SP],TEMP

A TEMP itt egy 16 bites ideiglenes vltozt jell. Ha mindenkppen olyan kdot akarunk, ami brmely processzoron ugyanazt az rtket helyezi a verembe (ami SP cskkentett rtke lesz), hasznljuk a kvetkez utastsokat a PUSH SP helyett:
PUSH MOV XCHG BP BP,SP BP,[BP]

PUSH imm8/imm16 A PUSH immr kpes kzvetlen rtket is a verembe rakni. A bjt mret operandusnak a 16 bitesre eljelesen kiterjesztett rtke kerl a verembe. POP CS Ez az utasts (melynek kdja 0Fh) 6-os kivtelt okoz a 80186/80188 processzorokon. SHL/SAL dest,imm8 SHR dest,imm8 SAR dest,imm8 ROL dest,imm8 ROR dest,imm8 RCL dest,imm8 RCR dest,imm8 Mindegyik forgat s lptet utasts most mr kpes 1-tl eltr kzvetlen rtkkel lptetni a

254

cloperandust. A lpsszm rtelmezst illeten lsd a kvetkez bekezdst. SHL/SAL dest,imm8/CL SHR dest,imm8/CL SAR dest,imm8/CL ROL dest,imm8/CL ROR dest,imm8/CL RCL dest,imm8/CL RCR dest,imm8/CL A forgat s lptet utastsok azon formja, ahol a lpsszmot 8 bites kzvetlen rtkknt vagy CLben adjuk meg, a msodik operandusnak csak az als 5 bitjt veszi figyelembe, szemben a 8086/8088-os processzorokkal, amik CL-nek mind a 8 bitjt rtelmeztk, kzvetlen rtkknt pedig csak az 1-et fogadtk el. Ez az eltrs lehetsget ad r, hogy ezeket a processzorokat megklnbztethessk a 8086-os s 8088-as prociktl.

17.3.2 j utastsok BOUND dest reg16,source mem (check array index against BOUNDs) A cl regiszter eljeles tartalmt mint tmbindexet hasonltja ssze a memriban lev tmbhatrokkal. A forrs egy olyan memriaoperandus, ami 2 szt tartalmaz. Ha a cl kisebb mint az els rtk (als hatr), vagy nagyobb mint a msodik rtk (fels hatr), 5-s kivtel (#BR) keletkezik. ENTER imm16,imm8 (ENTER new stack frame) A magas szint nyelvek blokkstruktrjnak megvalstst knnyti meg, mivel egy megadott
255

tulajdonsg j veremkeretet kszt el. Mindkt operandus rendhagy mdon kzvetlen rtk. Az els, sz mret operandus neve legyen LOCALS, a msodik, bjt mret operandus pedig NESTING. Az utasts mkdst a kvetkez pszeudokd mutatja be:
Push BP TEMP:=SP NESTING:=NESTING Mod 32 While (NESTING>0) DO NESTING:=NESTING-1 BP:=BP-2 Push SS:[BP] BP:=TEMP SP:=SP-LOCALS

A TEMP egy 16 bites ideiglenes vltozt jell. A NESTING operandusnak csak az als 5 bitjt veszi figyelembe. Az utasts prja a LEAVE, ami a legutbbi ENTER ltal ltrehozott veremkeretet szabadtja fel. INS dest,DX (INput String from port) INSB (no op) (INput String Byte from port) INSW (no op) (INput String Word from port) Ez egy jabb sztringkezel utasts. A tbbihez hasonlan az INSB s INSW mnemonikok operandus nlkliek, mg az INS kt operandust kap: az els egy loperandus, amely egy memriacmet jell ki, a msodik pedig a DX regiszter kell legyen. Az utasts a DX portrl beolvas egy bjtot vagy egy szt, ezt az rtket
256

eltrolja az ES:DI cmre, majd DI rtkt a DF flag llstl fggen nveli vagy cskkenti az olvasott adat mretvel. A REP prefix ezzel az utastssal is hasznlhat. LEAVE (no op) (LEAVE stack frame) A legutols ENTER utasts tevkenysgt sznteti meg a kvetkez utastsok vgrehajtsval:
MOV POP SP,BP BP

OUTS DX,source (OUTput String to port) OUTSB (no op) (OUTput String Byte to port) OUTSW (no op) (OUTput String Word to port) Az INS/INSB/INSW utasts prja. Az OUTSB s OUTSW mnemonikok operandus nlkliek, mg az OUTS kt operandust kap: az els a DX regiszter, a msodik pedig egy loperandus, amely egy memriacmet jell ki. Az utasts a DS:SI cmen lev bjtot vagy szt kirja a DX portra, majd SI rtkt a DF flag llstl fggen nveli vagy cskkenti az olvasott adat mretvel. A DS szegmens fellbrlhat prefixszel. A REP prefix ezzel az utastssal is hasznlhat. POPA (no op) (POP All general purpose registers) A kvetkez utastssorozatot hajtja vgre:
POP POP POP DI SI BP
257

ADD POP POP POP POP

SP,0002h BX DX CX AX

A negyedik sorban szerepl ADD SP,2 utasts csak szimbolikusan nz gy ki, mivel a flag-ek tartalmt NEM befolysolja a POPA utasts. PUSHA (no op) (PUSH All general purpose registers) A kvetkez utastsokat hajtja vgre:
PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH AX CX DX BX SP BP SI DI

Az tdik sorban szerepl utastst gy hajtja vgre, ahogyan a "hagyomnyos" PUSH SP esetn is teszi, teht SP aktulis rtke lesz eltrolva az SS: (SP-2) cmen, majd SP rtke cskken 2-vel. 17.3.3 j kivtelek Szm Mnemo Nv Tpus Kivlt felttelek 5 #BR Bound Range Trap BOUND utasts 6 #UD Undefined Opcode Fault rvnytelen utasts

258

5-s kivtel akkor keletkezik, ha a BOUND utasts cloperandusban lev eljeles tmbindex a megadott hatrokon kvl esett. A 6-os kivtelt akkor generlja a processzor, ha olyan bjtsorozattal tallkozik, amit nem kpes utastsknt rtelmezni. A ksbbi processzoroktl kezdve ez a kivtel nagyon "univerzlis", mivel elg sok dolog kivlthatja (pl. privilegizlt utastsok kiadsa vals mdban, LOCK prefix helytelen hasznlata, egy MMX utasts kiadsa gy, hogy a CR0 regiszter EM bitje be van lltva, stb.). A kvetkez felttelek valamelyike okoz 6-os kivtelt: rvnytelen vagy fenntartott mveleti kdot vagy kdolst (pl. rvnytelen 'Mod' vagy 'Reg' mez a cmzsi md/regiszter info bjtban) prbltunk meg vgrehajtani egy utasts adott mveleti kdjt rvnytelen operandussal prbltuk meg vgrehajtani

17.4 Az Intel 80286-os processzoron megjelent j szolgltatsok


17.4.1 Vltozsok az utastskszletben BOUND dest reg16,source mem A 80186/80188-as processzor csapdaknt (trap) kezelte az 5-s kivtelt, azaz az elmentett CS:IP a BOUND utastst kvet utastsra mutatott. Mostantl hibaknt (fault) kezeli ezt a kivtelt a 80286-os processzor, teht a BOUND utastsra mutat CS:IP lesz eltrolva.
259

CLI (no op) IN AL/AX,imm8/DX INS dest,DX LOCK OUT imm8/DX,AL/AX OUTS DX,source STI (no op) Ezek az utastsok (ill. a LOCK prefix) IOPLrzkenyek. Ha a Flags regiszter IOPL mezjnek (12..13 bitek) tartalma nagyobb vagy egyenl, mint a CPL (Current Privilege Level), akkor az utasts vgrehajthat, klnben pedig 13-as kivtel (#GP) keletkezik. HLT (no op) Ez a j reg utasts vdett mdban privilegizlt lett, teht csak akkor hajthat vgre, ha CPL=0, klnben 13-as kivtel (#GP) keletkezik. POP CS Vgrehajtsa nem felttlenl eredmnyez 6-os kivtelt. rtelmezshez lsd mg az "j prefixek" alfejezetet. POPF (no op) Vals mdban vagy vdett mdban CPL=0 esetn minden flag mdosthat Flags-ben. Vdett mdban, ha CPL>0, az IOPL mez nem mdosthat, vltozatlan marad.

Vdett mdban a JMP, CALL, INT, INTO, IRET s RET utastsok mkdse sokkal sszetettebb, de errl a vdett mdrl szl fejezetben szlunk majd bvebben. 17.4.2 j prefixek 0Fh
260

(Extended instruction prefix) A hajdani POP CS utasts gpi kdjt ezentl az j utastsok lekdolshoz hasznljk fel. Azt jelli, hogy az utna kvetkez bjttal egytt kapott ktbjtos rtk adja meg az utasts mveleti kdjt (opcode). Nem igazi prefix, az elnevezs csak az elhelyezkedsn alapul. Bvebb lerst lsd az "Utastsok kdolsa" c. fejezetben. 17.4.3 j utastsok ARPL dest selector,source selector reg16 (Adjust RPL field of destination selector) Ha a cl szelektor RPL mezje (0..1 bitek) kisebb rtket tartalmaz, mint a forrs regiszter RPL mezje, akkor a ZF flag-et 1-re lltja, s a cl RPL rtkt belltja a forrs RPL rtkre. Klnben ZF-et kinullzza. Ez az utasts nem privilegizlt. CLTS (no op) (CLear Task Switched flag) A gpi llapotsz regiszter (MSW) TS (3-as) bitjt trli. LAR access rights reg16,source selector (Load Access Rights) A forrs szelektorhoz tartoz deszkriptor 32..47 bitjeinek rtkt 0FF00h-val maszkolva (logikai S kapcsolatba hozva) a cl ltalnos regiszterbe tlti. Sikeres olvass esetn ZF-et belltja, klnben ZF rtke 0 lesz. Ez az utasts nem privilegizlt. LGDT source mem (Load Global Descriptor Table register)

261

A megadott memriaoperandus hat bjtjt betlti a GDTR regiszterbe. Az als sz (0..1 bjtok) a hatrt, a 2..4 bjtok pedig a bzis lineris cmt tartalmazzk. A 5-s bjtnak nincs szerepe. LIDT source mem (Load Interrupt Descriptor Table register) A megadott memriaoperandus hat bjtjt betlti az IDTR regiszterbe. Az als sz (0..1 bjtok) a hatrt, a 2..4 bjtok pedig a bzis lineris cmt tartalmazzk. A 5-s bjtnak nincs szerepe. LLDT source selector (Load Local Descriptor Table register) A megadott operandusban lev szelektorhoz tartoz deszkriptort betlti az LDTR regiszterbe. A szelektornak a GDT-be kell mutatnia, s az ltala megjellt deszkriptor csak egy LDT-hez tartozhat. Az operandus a nullszelektor is lehet, ebben az esetben rvnytelennek jelli be az LDTR tartalmt. LMSW source status word (Load Machine Status Word) Az ltalnos regiszterbl vagy memriaoperandusbl betlti a gpi llapotszt, amit az MSW regiszterbe tesz. A PE (0-s) bitet ezzel a mdszerrel nem trlhetjk. LSL limit reg16,selector reg/mem16 (Load Segment Limit) A forrs operandusban lev szelektor ltal mutatott deszkriptor hatr (limit) mezjt betlti a cl ltalnos regiszterbe. Az eltrolt rtk mindig bjtokban rtend. Ha a deszkriptor lthat a CPL-en, valamint megfelel a deszkriptor tpusa (kdszegmens vagy adatszegmens), a sikeres

262

betltst a ZF=1 jelzi, klnben ZF-et kinullzza. Ez az utasts nem privilegizlt. LTR source selector (Load Task Register) Az operandusban lev szelektor ltal mutatott TSS deszkriptort betlti a taszkregiszterbe (TR), majd a TSS-t foglaltnak (busy) jelli be. SGDT dest mem (Store Global Descriptor Table register) A GDTR regiszter tartalmt berja a megadott memriaoperandus hat bjtjba. Az als sz (0..1 bjtok) a hatrt, a 2..4 bjtok pedig a bzis lineris cmt tartalmazzk. A 5-s bjtnak nincs szerepe, azt 0FFh-val tlti fel az utasts. Ez az utasts nem privilegizlt. SIDT dest mem (Store Interrupt Descriptor Table register) Az IDTR regiszter tartalmt berja a megadott memriaoperandus hat bjtjba. Az als sz (0..1 bjtok) a hatrt, a 2..4 bjtok pedig a bzis lineris cmt tartalmazzk. A 5-s bjtnak nincs szerepe, azt 0FFh-val tlti fel az utasts. Ez az utasts nem privilegizlt. SLDT dest selector (Store Local Descriptor Table register) A megadott operandusba eltrolja az LDTR regiszter szelektor rszt. Ez az utasts nem privilegizlt. SMSW dest status word (Store Machine Status Word) A cloperandusba eltrolja a gpi llapotsz regiszter (MSW) tartalmt. Ez az utasts nem privilegizlt. STR dest selector (Store Task Register)

263

A taszkregiszter (TR) tartalmt a cloperandusba tlti. Ez az utasts nem privilegizlt. VERR source selector (VERify segment for Readability) VERW source selector (VERify segment for Writability) A forrsba lev szelektor ltal mutatott szegmenst vizsgljk, hogy az elrhet-e, tovbb lehet-e olvasni (VERR) ill. lehet-e rni (VERW). Ha a felttelek teljeslnek, ZF-et belltjk, klnben ZF rtke 0 lesz. A szelektornak egy rvnyes, GDT-beli vagy LDT-beli kdszegmens vagy adatszegmens deszkriptorra kell mutatnia. Ha kdszegmenst vizsglunk, akkor a VERR esetn a kvetkez felttelek esetn lesz ZF=1: ha az adott szegmens nem illeszked (nonconforming), akkor a DPLCPL s DPLRPL egyenltlensgeknek kell teljeslnik; ha a szegmens illeszked (conforming), DPL rtke tetszleges lehet. Mindkt esetben a kdszegmensnek termszetesen olvashatnak kell lennie. Ezek az utastsok nem privilegizltak.

A felsorolt utastsok kzl a CLTS, LGDT, LIDT, LLDT, LMSW s LTR privilegizltak (privileged), teht csak CPL=0 esetn hajthatk vgre. Ezen kvl az ARPL, LAR, LLDT, LSL, LTR, SLDT, STR, VERR s VERW utastsok csak vdett mdban adhatk ki, vals zemmdban 6-os kivtelt (#UD) vltanak ki. 17.4.4 j zemmdok A 8086/8088-os s 80186/80188-as processzorok csak egyfle zemmdban voltak kpesek mkdni. A 80286-os
264

processzor alapllapotban szintn ezt az zemmdot hasznlja, aminek neve vals cmzs md vagy rviden vals md (realaddress mode, real mode). Ez a processzor azonban tkapcsolhat egy gynevezett vdett mdba is (protected mode). A vdett md, amint neve is mutatja, ers vdelmi szolgltatsokat nyjt. Ezek alapja a privilegizlsi rendszer (privilege system), ami annyit tesz, hogy brmely program (taszk) a 4 privilegizlsi szint brmelyikn futhat. A 0-s szint jelenti a legersebb, mg a 3-as a leggyengbb vdelmi szintet. Ezrt a 0-s szinten ltalban csak az opercis rendszer magja (kernel) fut, mg a felhasznli programok a 3-as, esetleg 2-es privilgium szintet hasznljk. A szegmensregiszterek j neve szegmens szelektor regiszter (segment selector register) a vdett mdban. A szelektor (selector) nem a szegmens bziscmt jelli, hanem csak egy index egy tblzatba. Hrom ilyen rendszertblzat ltezik: globlis deszkriptor tbla (Global Descriptor TableGDT), loklis deszkriptor tbla (Local Descriptor TableLDT) s megszakts deszkriptor tbla (Interrupt Descriptor Table IDT). A tblzatban tallhatk a deszkriptorok (descriptor), amik egy adott szegmens tpust, bziscmt, mrett, elrhetsgt stb. tartalmazzk. Vdett mdban sok kivtel egy 16 bites hibakdot is berak a verembe az IP-msolat utn. Vdett mdba a gpi llapotsz (MSW) regiszter PE (0-s) bitjnek 1-be lltsval juthatunk. Ezt a mveletet egy tvoli vezrlstadsnak kell kvetnie. A vals mdba val visszatrs sokkal krlmnyesebb, mivel az egyetlen utastssal, ami kpes az MSW mdostsra (LMSW), nem trlhetjk a PE bitet. Ezrt a processzort szoftverbl resetelni kell, amit pl. tripla hibval oldhatunk meg. A vdett mdrl szl egy kln fejezet is, ott bvebb lerst tallhatunk errl az sszetett problmakrrl.

265

17.4.5 Vltozsok a kivtel-kezelsben Vdett mdban (valsban sosem) sok kivtel az IP utn egy 16 bites hibakdot is berak a verembe. A hibakdok alakja az albbi tblzatban lthat: Bitpozci Nv 0 EXT 1 IDT 2 TI 3..15 Index Ha az EXT (EXTernal event) bit rtke 1, akkor egy kls esemny (pl. hardver-megszakts) okozta a kivtelt. Az IDT bit 1 rtke jelzi, hogy a szelektor az IDT egy elemt vlasztja ki. Ha IDT=0, akkor a TI (Table Indicator) bit rtke hatrozza meg, mire vonatkozik az index: ha TI=0, akkor a GDT, klnben az LDT egy deszkriptort vlasztja ki a szelektor. Az Index mez tartalmazza az adott tblzat egy elemnek sorszmt (ez maga a szelektor). Az eddig bevezetett kivtelek (0, 1, 3, 4, 5, 6) kzl egy sem rak hibakdot a verembe. Az j kivtelek kzl a 8, 10, 11, 12 s 13 szmak tesznek hibakdot a verembe. A 0-s kivtelt (#DE) mostantl hibaknt (fault) kezeli a processzor: Szm Mnemo Nv Tpus Kivlt felttelek 0 #DE Divide Error Fault DIV s IDIV utastsok Az 1-es kivtel (#DB) mostantl akkor is keletkezhet, ha taszkvltskor az j taszk TSS-ben a T bit rtke 1. A kivtel tpusa ebben az esetben is csapda (trap). Az 5-s kivtel (#BR) mostantl hibaknt (fault) kezeldik:
266

Szm Mnemo Nv Tpus Kivlt felttelek 5 #BR Bound Range Fault BOUND utasts 6-os kivtel a kvetkez felttel teljeslse esetn is keletkezik: az ARPL, LAR, LLDT, LSL, LTR, SLDT, STR, VERR s VERW utastsok valamelyikt prbltuk meg vgrehajtani vals mdban 17.4.6 j kivtelek A 10 s 11 szm kivtelek csak vdett mdban keletkezhetnek. Szm Mnemo Nv 7 #NM No Math Coprocessor 8 #DF Double Fault 9 Coprocessor Segment Overrun 10 #TS Invalid TSS 11 12 13 16 #NP #SS #GP #MF Tpus Kivlt felttelek Fault FP vagy WAIT utasts Abort Sokfle Abort FP utasts

Fault Taszkvlts vagy TSS elrse Segment Not Fault Szegmensregiszter Present betlts vagy rendszerreg. elrs Stack-Segment Fault Veremmveletek, SS Fault betltse General Protection Fault Sokfle Math Fault Fault FP vagy WAIT utasts

7-es kivtel az albbi hrom esetben trtnik: egy lebegpontos (FP) utastst hajtottunk vgre gy, hogy az MSW regiszter EM (2-es) bitje be volt lltva
267

egy lebegpontos (FP) utastst hajtottunk vgre gy, hogy az MSW regiszter TS (3-as) bitje be volt lltva egy WAIT/FWAIT utastst hajtottunk vgre gy, hogy az MSW regiszter TS (3-as) s MP (1-es) bitjei be voltak lltva Az els felttel azt jelenti, hogy a szmtgpben nincs numerikus koprocesszor, de az FPU utastsokat az opercis rendszer emullni tudja, ha ezt a kivtelt szleli. A msodik eset akkor ll fenn, ha egy taszkvlts kvetkezik be, s az FPU gy jelzi az opercis rendszernek, hogy a koprocesszor aktulis llapott j lenne elmentenie. Vgl a harmadik felttel a taszkvltskor szksges FPU-llapot elmentst terjeszti ki a WAIT/FWAIT utastsra, mivel ez nem FPU hanem CPU utasts. A kivtel msik elnevezs alatt is ismeretes: Device Not Available. Hibakd nem kerl a verembe. Az elmentett CS:IP rtk a hibz utastsra mutat. Ha egy kivtel-kezel meghvsa sorn egy jabb kivtel keletkezik, akkor a processzor ltalban megprblja lekezelni elszr az utbbi kivtelt, majd visszatr az eredeti kivtelhez. Nhny esetben azonban ez nem mkdik. A processzor ilyenkor 8-as kivtelt generl, s hibakdknt 0000h-t rak a verembe. Ezt a helyzetet nevezzk dupla hibnak, amirl a kivtel a nevt kapta. Ez a kivtel abort tpus, ennek megfelelen a veremben lev CS- s IP-msolatok rtke meghatrozatlan, s a kivtel lekezelse utn a hibz taszk nem indthat jra. Ha a 8-as kivtel-kezel meghvsa sorn egy jabb kivtel keletkezik, akkor tripla hibrl beszlnk. Tripla hiba esetn a processzor shutdown llapotba kerl, ahonnan csak egy NMI vagy hardveres reset breszti fel. Ha az NMI kezel (INT 02h megszakts) vgrehajtsa kzben trtnik tripla hiba, akkor csak egy hardveres reset indthatja jra a processzort.

268

Dupla hiba akkor trtnik, ha az els s a msodik kivtel is a 0, 10, 11, 12, 13 kivtelek valamelyike. A 9-es kivtel azt jelzi, hogy egy koprocesszor utasts memriban lev operandusa szegmenshatr-srtst kvetett el. A kivtel abort tpus, s br az elmentett CS:IP rtk a hibz utastsra mutat, a kivtel keletkezsekor a koprocesszor s a program (taszk) llapota definilatlan. Hibakd nem kerl a verembe. Lsd mg a 80486-os processzor fejezetben lev megjegyzst is. 10-es kivtel akkor keletkezik, ha taszkvlts sorn a processzor rvnytelen informcit tall az j taszk TSS-ben. A kvetkez felttelek valamelyike okozhatja ezt a hibt: a TSS szegmens hatra tl kicsi (index=TSS szelektor index) rvnytelen vagy nem jelenlev LDT (index=LDT szelektor index) a veremszegmens szelektor a megfelel deszkriptor tbla hatrn tlmutat (index=veremszegmens szelektor index) a veremszegmens nem rhat (index=veremszegmens szelektor index) veremszegmens DPL CPL (index=veremszegmens szelektor index) veremszegmens szelektor RPL CPL (index=veremszegmens szelektor index) a kdszegmens szelektor a megfelel deszkriptor tbla hatrn tlmutat (index=kdszegmens szelektor index) a kdszegmens nem vgrehajthat (index=kdszegmens szelektor index) a nem illeszked (nonconforming) kdszegmens DPL CPL (index=veremszegmens szelektor index)
269

illeszked kdszegmens DPL>CPL (index=veremszegmens szelektor index) az adatszegmens szelektor a megfelel deszkriptor tbla hatrn tlmutat (index=adatszegmens szelektor index) az adatszegmens nem olvashat (index=adatszegmens szelektor index) A hiba szlels trtnhet a taszkvltst kezdemnyez taszk llapotban vagy az j taszk krnyezetben is. Az elmentett CS:IP rtk ennek megfelelen vagy a taszkvltst okoz utastsra, vagy az j taszk els utastsra mutat. A kivtel hibakdjnak index mezje a hibt okoz szelektor indext tartalmazza. 11-es kivtel akkor keletkezik, ha az elrt szegmens vagy kapu deszkriptor "jelenlev" (present) bitje trlve van. A kvetkez esetekben keletkezik ez a kivtel: CS, DS vagy ES szegmensregiszterek betltsekor LLDT utasts esetn LTR utasts esetn, ha a TSS nem jelenlevnek van megjellve kapu deszkriptor vagy TSS hasznlatakor, ha az nem jelenlevnek van bejellve, de egybknt rvnyes informcit tartalmaz A hibakd index mezje a hibt okoz deszkriptor szelektor indext tartalmazza. Ha a kivtel taszkvlts kzben, a TSS-ben lev szelektorokhoz tartoz deszkriptorok betltsekor trtnt, akkor a veremben lev CS:IP az j taszk els utastsra mutat. Minden egyb esetben azonban a hibz utasts cmt tartalmazza CS:IP veremben lev pldnya. Ezt a kivtelt a szegmens szint virtulis memria megvalstsra hasznlhatja az opercis rendszer. 12-es kivtel a kvetkez esetekben kvetkezik be:
270

szegmenshatr-srts trtnt a POP, PUSH, CALL, RET, IRET, ENTER, LEAVE utastsoknl, vagy egyb, a vermet megcmz utasts vgrehajtsakor SS-be egy nem jelenlev szegmenst prbltunk meg betlteni Ha a hiba nem jelenlev szegmens miatt trtnt, vagy taszkvltskor az j taszk verme tlcsordult (hatrt srtett), a hibakd index mezje a hibt okoz deszkriptor szelektor indext tartalmazza. Egyb esetben azonban 0000h a hibakd. Ha a kivtel taszkvlts kzben trtnt, akkor a veremben lev CS:IP az j taszk els utastsra mutat. Minden egyb esetben a hibz utasts cmt tartalmazza CS:IP veremben lev pldnya. 13-as kivtelt okoz minden olyan rvnytelen, a vdelmet megsrt mvelet, ami ms vdelmi kivtelt (9, 10, 11, 12) nem okoz. Ha a kivtel egy szegmens deszkriptor betltsekor keletkezett, a hibakd index mezje a hivatkozott deszkriptorra mutat szelektor indext tartalmazza. Egyb esetekben a hibakd 0000h lesz. A verembe mentett CS:IP mindig a hibz utastsra mutat. A kvetkez felttelek valamelyiknek teljeslse esetn keletkezik 13-as kivtel: szegmenshatrsrts a CS, DS, ES szegmensek hasznlatakor deszkriptor tbla hatrnak megsrtse (taszkvltst s veremvltst kivve) vezrlstads egy nem vgrehajthat szegmensre kdszegmensbe vagy rsvdett (read-only) adatszegmensbe prbltunk meg rni egy csak vgrehajthat (execute-only) kdszegmensbl prbltunk meg olvasni SS-be egy csak olvashat szegmens szelektort prbltuk meg betlteni (kivve, ha ez taszkvltskor trtnik, mert ilyenkor 10-es kivtel keletkezik)
271

egy rendszerszegmens szelektort prbltuk meg betlteni a DS, ES, SS regiszterekbe egy csak vgrehajthat (execute-only) kdszegmens szelektort tltttk be a DS, ES regiszterekbe SS-be a nullszelektort vagy egy csak vgrehajthat szegmens szelektort tltttk be CS-be a nullszelektort vagy egy adatszegmens szelektort tltttk be nullszelektort tartalmaz DS, ES regiszterekkel trtn memriaelrs foglalt (busy) taszkra trtn ugrs vagy annak meghvsa egy szabad (nonbusy) taszkra trtn visszatrs az IRET utastssal taszkvltskor egy olyan szegmens szelektor hasznlata, ami az aktulis LDT-beli TSS-re mutat valamelyik privilegizlsi vdelmi szably megsrtse megszakts vagy kivtel esetn az IDT-nek egy olyan bejegyzst hasznltuk, ami nem megszakts-, csapda-, vagy taszkkapu (interrupt, trap, task gate) egy privilegizlt utastst prbltunk meg vgrehajtani, amikor CPL 0 egy nullszelektort tartalmaz kaput rtnk el egy INT utastst hajtottunk vgre gy, hogy a cl deszkriptor DPL-je kisebb mint a CPL egy call-, megszakts- vagy csapdakapu (call, interrupt, trap gate) szegmens szelektora nem kdszegmensre mutat az LLDT utasts operandusa nem GDT-beli szelektor, vagy nem egy LDT deszkriptorra mutat az LTR utasts operandusa LDT-beli, vagy egy foglalt (busy) taszk TSS-re mutat

272

egy hvs (call), ugrs (jump) vagy visszatrs (return) alkalmval a cl kdszegmens szelektora nullszelektor Br a 80286-os processzor tmogatja a 16-os kivtelt, ez a kivtel nem keletkezhet hardveres ton ezen a processzoron. A 16-os kivtel egybknt azt jelzi, hogy egy numerikus kivtel (#IA, #IS, #D, #Z, #O, #U vagy #P) keletkezett a legutols FPU utasts vgrehajtsakor. Hibakd nem kerl a verembe. A CS:IP-msolat a hibt okoz utasts utn kvetkez FPU utastsra mutat, a tnyleges cmet a koprocesszor utastsmutat regisztere tartalmazza. Lsd mg a 80486-os processzor fejezetben lev megjegyzst is. 17.4.7 Vltozsok a regiszterkszletben A Flags regiszter kt j mezt kapott: Bitpozci Nv 12..13 IOPL 14 NT Az IOPL (Input/Output Privilege Level) egy ktbites mez. Tartalma nhny olyan utasts vgrehajtst befolysolja, amelyek korltlan hasznlata vdett mdban klns veszlyt jelenthetne az opercis rendszerre. Ilyen pl. a CLI, IN vagy OUT utasts. Ha az aktulis privilegizlsi szint (CPL) nagyobb, mint az IOPL, az IOPL-rzkeny utastsok vgrehajtst megtagadja a processzor, s 13-as kivtel (#GP) keletkezik. Az NT (Nested Task) bit jelzi, ha az aktulis taszkot CALL utastssal, megszakts vagy kivtel miatt hvtk meg. Mindkt bitnek vdett mdban, multitaszkos krnyezetben van szerepe.

273

A szegmensregiszterek neve vdett mdban szegmens szelektor regiszter lett. Ezek a regiszterek ilyenkor szegmensbziscm helyett szelektort (selector) tartalmaznak: Bitpozci Nv 0..1 RPL 2 TI 3..15 Index A ktbites RPL (Requested Privilege Level) meznek a deszkriptorok s azokon keresztl a szegmensek elrsnl szksges vdelmi ellenrzsek sorn van szerepe. Ha a TI (Table Indicator) rtke 0, akkor a GDT, klnben az aktulis LDT egy deszkriptort vlasztja ki a szelektor. Az Index mez tartalmazza a megfelel deszkriptor tbla kvnt elemnek sorszmt. 17.4.8 j regiszterek Mindegyik szegmensregiszterhez (CS, DS, ES, SS) be lett vezetve egy szegmens deszkriptor cache-regiszter (segment descriptor cache register). Ezek a specilis regiszterek nem rhetk el programbl, ezrt sokszor hvjk ket rnykregisztereknek (shadow register) is. Feladatuk, hogy az adott szegmensregiszter ltal mutatott szegmens bziscmt, mrett, hozzfrsi jogait troljk, ezzel felgyorstva a memria elrst. Fontos, hogy tartalmuk NEM trldik a processzor mdvltsa kzben, gy pl. a vals mdbl vdettbe tkapcsolva tartalmuk megmarad. (Ennek ellentmond az a tny, hogy az MSW regiszter PE bitje nem trlhet az LMSW utastssal, gy a processzor knyszer resetelse mgiscsak trli a szegmens deszkriptor cache regisztereket.)

274

A gpi llapotsz regiszter (Machine Status Word registerMSW) egy 16 bites rendszerregiszter. Felptse az albbi tblzatban lthat: Bitpozci Nv 0 PE 1 MP 2 EM 3 TS 4..15 A PE (Protection Enable) bitet 1-be lltva juthatunk vdett mdba. A bitet csak reset segtsgvel trlhetjk ezutn. Az MP (Monitor coProcessor, vagy Math Present) bit llstl fgg, hogy a WAIT/FWAIT utasts vgrehajtsa generl-e 7-es (#NM) kivtelt, ha az MSW regiszter TS bitje be van lltva. Ha MP=1, akkor keletkezik kivtel az emltett felttel esetn, klnben nem. Ha az EM (EMulation) bit be van lltva, akkor brmely FPU utasts vgrehajtsa 7-es kivtelt vlt ki. A TS (Task Switched) bitet minden taszkvltskor belltja a CPU. Lsd mg fentebb a 7-es kivtel lerst. A 4..15 bitek fenntartottak. Az MSW regisztert az LMSW privilegizlt utastssal rhatjuk, ill. tartalmt brmikor kiolvashatjuk az SMSW utastssal. A PE bitet csak belltani lehet az LMSW-vel, a trlshez resetelni kell a processzort. A GDTR (Global Descriptor Table Register) s IDTR (Interrupt Descriptor Table Register) regiszterek a GDT ill. IDT bziscmt s mrett (hatrt) tartalmazzk: Bitpozci Tartalom 0..15 Hatr 16..39 Bziscm 40..47

275

A 0..15 bitek a 16 bites hatrt (azaz a tblzat szegmensnek legutols megcmezhet offszetjt), mg a 16..39 bitek a tbla szegmensnek 24 bites fizikai bziscmt tartalmazzk. A 40..47 bitek fenntartottak. Az LDTR (Local Descriptor Table Register) az aktv LDT szelektort tartalmaz 16 bites regiszter. A szelektornak a GDT-be kell mutatnia. Az TR (Task Register) az aktv taszk TSS-nek (Task State Segment) szelektort tartalmaz 16 bites regiszter. A szelektornak a GDT-be kell mutatnia. Az LDTR s a TR regiszterek igazbl az adott szegmens deszkriptornak minden fontos adatt troljk, de ebbl csak a 16 bites szelektor rsz lthat s rhet el a programok szmra. A GDTR, IDTR, LDTR s TR regisztereknek vdett mdban van jelentsgk.

17.5 Az Intel 80386-os processzor jtsai


17.5.1 Vltozsok az utastsok rtelmezsben Mostantl az utastsok maximlis hossza gpi kd alakban (belertve a prefixeket, kzvetlen operandusokat, eltolsi rtkeket is) 15 bjt lehet, az ennl hosszabb utastsok 13-as kivtelt (#GP) vltanak ki. Ezt a hatrt csak redundns prefixekkel srthetjk meg (azaz ha ugyanabbl a kategribl

276

tbbfle prefixet hasznlunk, pl. kt szegmensprefixet adunk meg egyetlen utasts eltt). A mnemonikok elnevezsben bevezettek egy j konvencit. Egy utasts mnemonikja utn "W" bett rva az adott utasts 16 bites, mg "D" bett rva a 32 bites operandusmret vltozatot kaphatjuk. A rgi, kiegszts nlkli mnemonik hasznlata esetn az assemblerre bzzuk, az utastsnak mely vltozatt fogja generlni. Nem mindegyik assembler tmogatja ezeket a mnemonikokat. Egy j plda az ENTER-ENTERW-ENTERD tri. ENTERW esetn a 16 bites, ENTERD esetn a 32 bites vltozatot kapjuk, mg az ENTER mnemonik a kdszegmens operandusmret jellemzje (attribtuma) alapjn jelentheti a 16 vagy a 32 bites vltozatot is. 17.5.2 Vltozsok az utastskszletben CLI (no op) IN AL/AX/EAX,imm8/DX INS dest,DX INT imm8 INTO (no op) IRET (no op) OUT imm8/DX,AL/AX/EAX OUTS DX,source POPF (no op) PUSHF (no op) STI (no op) Ezek az utastsok IOPL-rzkenyek. Az INT, INTO, IRET, POPF, PUSHF utastsok csak a virtulis86 (V86) mdban, az IN, INS, OUT, s OUTS utastsok csak vdett mdban (V86-ban nem), mg a CLI s STI utastsok vdett s virtulis
277

mdban is rzkenyek. Ha a Flags regiszter IOPL mezjnek (12..13 bitek) tartalma nagyobb vagy egyenl, mint a CPL (Current Privilege Level), akkor az utasts vgrehajthat, klnben pedig 13-as kivtel (#GP) keletkezik. ARPL dest selector,source selector reg16 LAR access rights reg16,source selector LLDT source selector LSL limit reg16,selector reg/mem16 LTR source selector SLDT dest selector STR dest selector VERR source selector VERW source selector Ezek az utastsok virtulis zemmdban is 6-os kivtelt (#UD) vltanak ki. ENTER imm16,imm8 IRET (no op) LEAVE (no op) POPA (no op) POPF (no op) PUSHA (no op) PUSHF (no op) Ha az operandusmret 32 bit, az utastsok mkdse eltr. Lsd az ENTERD, IRETD, LEAVED, POPAD, POPFD, PUSHAD, PUSHFD utastsok lerst. JCXZ relative address LOOP relative address LOOPE/LOOPZ relative address LOOPNE/LOOPNZ relative address Ha a cmmret 32 bit, az utastsok mkdse eltr. Lsd a JECXZ, LOOPD, LOOPDE/ LOOPDZ, LOOPDNE/LOOPDNZ utastsok lerst.
278

CMPS source string,dest string INS dest string,DX LODS source string MOVS dest string,source string OUTS DX,source string SCAS dest string STOS dest string Ha a cmmret 32 bites, a sztringutastsok SI s DI helyett ESI-t s EDI-t hasznljk indexregiszterknt. BOUND dest reg16/32,source mem Az utasts cloperandusa 32 bites regiszter is lehet, a memriaoperandus ilyenkor kt duplaszbl fog llni. CALL address Az utasts mostantl tmogatja a 32 bites offszetet hasznl cmeket is. DIV source reg/mem32 Ha az operandus 32 bites, EDX:EAX-et osztja el a forrssal, a hnyadost EAX-be, a maradkot pedig EDX-be teszi. IDIV source reg/mem32 Ha az operandus 32 bites, EDX:EAX-et osztja el a forrssal, a hnyadost EAX-be, a maradkot pedig EDX-be teszi. IMUL source reg/mem32 Ha az operandus 32 bites, EAX-et megszorozza a forrssal, a szorzatot pedig EDX:EAX-ban eltrolja. IMUL dest reg32,source reg/mem32,imm8/imm32 A cl s a forrs is lehet 32 bites, a harmadik kzvetlen operandus ilyenkor bjt vagy duplasz mret kell legyen. Mkdse egybknt megfelel a korbbinak.
279

IMUL dest reg32,imm8/imm32 Ez a forma az IMUL reg32,reg32,imm8/imm32 utastst rvidti, ahol a cl s a forrs is ugyanaz a 32 bites ltalnos regiszter. IMUL dest reg16,source reg/mem16 IMUL dest reg32,source reg/mem32 Az IMUL utastsnak van egy j ktoperandus formja is. A cl egy 16 vagy 32 bites ltalnos regiszter lehet, mg a forrs szintn 16 vagy 32 bites ltalnos regiszter vagy memriahivatkozs kell legyen. Mkdse: a forrst sszeszorozza a cllal, az eredmnyt pedig a clban eltrolja. IN EAX,imm8/DX A cl a 32 bites akkumultor is lehet. INT 3 Az egybjtos INT 3 utasts (0CCh) nem IOPLrzkeny virtulis mdban. A ktbjtos alakra (0CDh, 03h) ez nem vonatkozik, az tovbbra is IOPL-rzkeny marad. Jccc relative address A clutasts relatv cme most mr 16 ill. 32 bites is lehet. A cm mrett a kdszegmens cmmret jellemzje (attribtuma) hatrozza meg. A "ccc" a szoksos felttelek valamelyikt jelentheti (pl. JE=JZ, JO, JP, JAE, JNGE stb.) JMP address Az utasts mostantl tmogatja a 32 bites offszetet hasznl cmeket is. LAR access rights reg32,source selector Ha a cl 32 bites, a forrs szelektorhoz tartoz deszkriptor 32..63 bitjeinek rtkt 00F0FF00hval maszkolva (logikai S kapcsolatba hozva) a cl ltalnos regiszterbe tlti. Sikeres olvass

280

esetn ZF-et belltja, klnben ZF rtke 0 lesz. Ez az utasts nem privilegizlt. LDS dest reg32,source Ha a cl regiszter 32 bites, a forrst 16:32 alak tvoli pointernek rtelmezi. Az als duplaszt (0..3 bjtok) a cl ltalnos regiszterbe, a fels szt (4..5 bjtok) pedig a DS-be tlti. LEA dest reg16/32,source A LEA utasts mkdse az operandusmret s cmmret jellemzk fggvnyben ms s ms:

Op. Cm Hats 16 16 a 16 bites EA kerl a 16 bites clba 16 32 a 32 bites EA als 16 bitje kerl a 16 bites clba 32 16 a 16 bites EA zrkiterjesztve kerl a 32 bites clba 32 32 a 32 bites EA kerl a 32 bites clba A cl lehet 32 bites ltalnos regiszter is. LES dest reg32,source Ha a cl regiszter 32 bites, a forrst 16:32 alak tvoli pointernek rtelmezi. Az als duplaszt (0..3 bjtok) a cl ltalnos regiszterbe, a fels szt (4..5 bjtok) pedig az ES-be tlti. LGDT source mem LIDT source mem Ez a kt utasts az operandusmret aktulis llapota szerint klnbz mdon mkdik. Ha az operandusmret 16 bit, a szoksos mdon figyelmen kvl hagyjk az operandus legfels bjtjt, egybknt pedig a teljes 32 bites bziscmet betltik. LMSW source status word

281

A 80286-ossal val kompatibilits megrzse vgett a CR0/MSW regiszter ET (4-es) bitjt nem mdostja az LMSW utasts. LOCK Ez a prefix mostantl NEM IOPL-rzkeny. LOCK Ez a prefix mostantl csak a ADC, ADD, AND, BTC, BTR, BTS, DEC, INC, NEG, NOT, OR, SBB, SUB, XCHG, XOR utastsokkal hasznlhat, klnben 6-os (#UD) kivtel keletkezik. LSL limit reg32,selector reg/mem32 A cl lehet 32 bites regiszter is, ilyenkor a szelektor ltal kijellt szegmens hatrnak bjtokban mrt 32 bites rtkkt tlti be a clba. Ha a hatr 32 bit mret, de a cl csak 16 bites regiszter, a hatr als szavt tlti a cl regiszterbe. MOV FS,source reg/mem16 MOV GS,source reg/mem16 MOV dest reg/mem16,FS MOV dest reg/mem16,GS A kt j szegmensregiszter (FS s GS), valamint egy 16 bites ltalnos regiszter vagy memriaoperandus kztti adatcsert bonyoltjk le a MOV utasts j formi. MOV dest reg32,CRx MOV dest reg32,DRx MOV dest reg32,TRx MOV CRx,source reg32 MOV DRx,source reg32 MOV TRx,source reg32 A MOV utasts j alakjai kpesek a vezrl(control), nyomkvet (debug) s tesztregiszterek (test) s valamelyik 32 bites ltalnos regiszter kztt adatot mozgatni. Ezek az utastsok
282

privilegizltak, gy vagy vals mdban, vagy vdett mdban CPL=0 mellett hajthatk vgre. CR0 als szavnak olvassra hasznljuk inkbb az SMSW utastst, mivel az nem privilegizlt. MUL source reg/mem32 Ha az operandus 32 bites, EAX-et megszorozza a forrssal, a szorzatot pedig EDX:EAX-ban eltrolja. NOP (no op) Vdett mdban, ha a kdszegmens operandusmret jellemzje 32 bit, ez a mnemonik az XCHG EAX,EAX utastsra lesz lefordtva, aminek gpi kdja ilyenkor ugyancsak 90h. 16 bites kdszegmens esetn az XCHG EAX,EAX utasts a 66h, 90h bjtokra fordul le. OUT imm8/DX,EAX A forrs a 32 bites akkumultor is lehet. POP FS POP GS POP reg/mem32 A POP utasts kpes a kt j szegmensregisztert (FS s GS), tovbb brmelyik 32 bites ltalnos regisztert a verem tetejrl kiszedni. Duplasz mret memriaoperandus szintn betlthet a verembl. POP DS/ES/FS/GS/SS Ha a veremszegmens cmmret jellemzje 32 bit, a kiolvasott duplasznak az als szava lesz betltve az adott szegmensregiszterbe. A fels szt figyelmen kvl hagyja az utasts. POP dest Ha a veremszegmens cmmret jellemzje 32 bit, a POP utasts SP helyett ESP-t hasznlja. POPF (no op)
283

Virtulis mdban az IOPL mez nem mdosthat Flags-ben, hanem vltozatlan marad. Lsd mg a korbbi megjegyzst az IOPL-rzkenysgrl. PUSH FS PUSH GS PUSH reg/mem32 PUSH imm8 PUSH imm32 A PUSH utasts kpes a kt j szegmensregisztert (FS s GS), tovbb brmelyik 32 bites ltalnos regisztert a verembe rakni. Duplasz mret memriaoperandus vagy 32 bites kzvetlen rtk szintn verembe tehet. 32 bites cmmret verem esetn a PUSH imm8 utasts a bjt mret operandust eljelesen kiterjeszti duplaszv, majd ez utbbit rakja a verem tetejre. PUSH CS/DS/ES/FS/GS/SS Ha a veremszegmens cmmret jellemzje 32 bit, olyan duplasz lesz a verembe rakva, amelynek az als szava tartalmazza az adott szegmensregisztert, a fels sz rtke pedig meghatrozatlan. PUSH source Ha a veremszegmens cmmret jellemzje 32 bit, a PUSH utasts SP helyett ESP-t hasznlja. PUSH ESP Az utasts mkdse hasonl a PUSH SP mkdshez:
MOV SUB MOV TEMP,ESP SP/ESP,00000004h SS:[SP/ESP],TEMP

A TEMP itt egy 32 bites ideiglenes vltozt jell. REP REPE/REPZ


284

REPNE/REPNZ Ha a cmmret jellemz 32 bit, a prefixek CX helyett ECX-et hasznljk. SGDT source mem SIDT source mem Ez a kt utasts az operandusmret aktulis llapota szerint klnbz mdon mkdik. Ha az operandusmret 16 bit, figyelmen kvl hagyjk az operandus legfels bjtjt, de a 80286-tl eltren 00h-t trolnak a helyre. Ha az operandusmret 32 bit, a teljes 32 bites bziscmet eltroljk. XCHG dest,source Ha valamelyik operandus memriahivatkozs, az XCHG utasts automatikusan alkalmazza a buszlezrst a LOCK prefix hasznlattl fggetlenl. XLAT (no op) XLAT table address Ha a cmmret 32 bites, az utasts a DS:(EBX+AL) cmen lev bjtot tlti be AL-be. AL-t tovbbra is eljeltelenl rtelmezi, s az alaprtelmezett DS szegmens is fellbrlhat.

Az sszes vezrlstad utasts eltren viselkedik, ha az operandusmret 32 bites. Ez a kvetkez dolgokat jelenti: IP helyett EIP vltozik meg mindegyik utasts esetben a CALL, JMP utastsok 32 bites relatv vagy abszolt offszet cmet s 16:32 alak tvoli mutatt hasznlnak operandusknt a vermet hasznl utastsok IP s Flags helyett EIP s EFlags tartalmt rakjk a verembe vagy veszik ki onnan

285

Virtulis mdban a JMP, CALL, INT, INTO, IRET, IRETD s RET utastsok mkdse sokkal sszetettebb, de errl a vdett mdrl szl fejezetben szlunk majd bvebben. A kvetkez utastsok esetben is lehetsges 32 bites operandusok (kzvetlen rtk, memriahivatkozs vagy ltalnos regiszter) hasznlata: ADC, ADD, AND, CMP, DEC, INC, MOV, NEG, NOT, OR, RCL, RCR, ROL, ROR, SAL, SAR, SBB, SHL, SHR, SUB, TEST, XCHG, XOR. 17.5.3 j prefixek 64h (FS Segment override prefix) 65h (GS Segment override prefix) A tbbi szegmensfellbrl prefixhez hasonlan az alaprtelmezett DS szegmens helyett az FS ill. GS szegmensregiszter hasznlatt rjk el. 66h (Operand size prefix) Az utasts (ill. a kdszegmens) alaprtelmezett operandusmrett lltja t 16 bitesrl 32 bitesre, vagy fordtva. Csak arra az utastssal van hatssal, ami eltt alkalmazzuk. 67h (Address size prefix) Az utasts (ill. a kdszegmens) alaprtelmezett cmmrett lltja t 16 bitesrl 32 bitesre, vagy fordtva. A hasznlt cmzsi mdot s nhny egyb dolgot befolysol. Csak arra az utastssal van hatssal, ami eltt alkalmazzuk.

286

17.5.4 j utastsok BSF dest reg16/32,source (Bit Scan Forward) A forrsban megkeresi azt a legalacsonyabb helyirtk bitet, ami be van lltva. Ha mindegyik bit 0 volt a forrsban, ZF-et 1-re lltja, a cl tartalma meghatrozatlan. Klnben pedig ZF-et trli, majd a bit sorszmt a cl ltalnos regiszterbe teszi. CP, PF, AF, SF s OF tartalma meghatrozatlan az utasts vgrehajtsa utn. A forrs 16 vagy 32 bites ltalnos regiszter vagy memriaoperandus lehet. BSR dest reg16/32,source (Bit Scan Reverse) A forrsban megkeresi azt a legmagasabb helyirtk bitet, ami be van lltva. Ha mindegyik bit 0 volt a forrsban, ZF-et 1-re lltja, a cl tartalma meghatrozatlan. Klnben pedig ZF-et trli, majd a bit sorszmt a cl ltalnos regiszterbe teszi. CP, PF, AF, SF s OF tartalma meghatrozatlan az utasts vgrehajtsa utn. A forrs 16 vagy 32 bites ltalnos regiszter vagy memriaoperandus lehet. BT dest reg/mem,bit mask reg16/32 BT dest reg/mem,bit mask imm8 (Bit Test) BTC dest reg/mem,bit mask reg16/32 BTC dest reg/mem,bit mask imm8 (Bit Test and Complement) BTR dest reg/mem,bit mask reg16/32 BTR dest reg/mem,bit mask imm8 (Bit Test and Reset) BTS dest reg/mem,bit mask reg16/32
287

BTS dest reg/mem,bit mask imm8 (Bit Test and Set) A cl operandus megadott sorszm bitjt CF-be msoljk. A forrs operandus tartalmazza a kiolvasand bit szmt. A kiolvass utn a BTC komplementlja (neglja), a BTR trli (0-ra lltja), mg a BTS belltja a clban az adott bitet. A forrs bjt mret kzvetlen rtk, ill. 16 vagy 32 bites ltalnos regiszter lehet, mg clknt 16 vagy 32 bites ltalnos regisztert vagy memriaoperandust rhatunk. CDQ (no op) (Convert Doubleword to Quadword) Az EAX-ban lev szmot eljelesen kiterjeszti EDX:EAX-be. CMPSD (no op) (CoMPare String Doubleword) A CMPS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti. CWDE (no op) (Convert byte to doubleword) Az AL-ben lev rtket eljelesen kiterjeszti EAX-be. (A mnemonik a CWD utasts nevbl szrmazik.) ENTERD imm16,imm8 (ENTER new stack frame, 32 bit) Az ENTER utasts 32 bites alakja. Az els, sz mret operandus neve legyen LOCALS, a msodik, bjt mret operandus pedig NESTING. Az utasts mkdst a kvetkez pszeudokd mutatja be:
Push EBP TEMP:=ESP NESTING:=NESTING Mod 32 While (NESTING>0) DO
288

NESTING:=NESTING-1 EBP:=EBP-4 Push SS:[EBP] EBP:=TEMP ESP:=ESP-LOCALS

Az

utols sorban a kivonst a LOCALS zrkiterjesztett rtkvel vgzi el. A TEMP egy 32 bites ideiglenes vltozt jell. A NESTING operandusnak csak az als 5 bitjt veszi figyelembe. Az utasts prja a LEAVED, ami a legutbbi ENTERD ltal ltrehozott veremkeretet szabadtja fel. INSD (no op) (INput String Doubleword) Az INS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti. IRETD (no op) (Interrupt RETurn, 32 bit) Az IRET utasts 32 bites alakja. Mkdse vals mdban szimbolikusan: POP EIP // POP CS // POPFD. Vdett s virtulis mdban az IRET-hez hasonlan sokkal tbb dolgot csinl mint vals mdban, de errl a vdett mdrl szl fejezetben szlunk majd. JECXZ relative address (Jump if ECX is/equals Zero) A JCXZ utasts 32 bites alakja. Ha ECX=00000000h, az operandusban megadott cmre ugrik, klnben a JECXZ-t kvet utasts vgrehajtsval folytatja. LEAVED (no op) (LEAVE stack frame, 32 bit)

289

A LEAVE utasts 32 bites alakja. A legutols ENTERD utasts tevkenysgt sznteti meg a kvetkez utastsok vgrehajtsval:
MOV POP ESP,EBP EBP

LFS dest reg16/reg32,source (Load full pointer into FS and a general purpose register) Ha a cl regiszter 16 bites, a forrst a megszokott 16 bites szelektorbl (vagy szegmensbl) s 16 bites offszetbl ll tvoli mutatnak rtelmezi. Az als szt (0..1 bjtok) ilyenkor a cl ltalnos regiszterbe, a fels szt (2..3 bjtok) pedig FS-be tlti. Ha a cl regiszter 32 bites, a forrst 16:32 alak tvoli pointernek rtelmezi. Ekkor az als duplaszt (0..3 bjtok) a cl regiszterbe, a fels szt (4..5 bjtok) pedig FS-be tlti. LGS dest reg16/reg32,source (Load full pointer into GS and a general purpose register) Ha a cl regiszter 16 bites, a forrst a megszokott 16 bites szelektorbl (vagy szegmensbl) s 16 bites offszetbl ll tvoli mutatnak rtelmezi. Az als szt (0..1 bjtok) ilyenkor a cl ltalnos regiszterbe, a fels szt (2..3 bjtok) pedig GS-be tlti. Ha a cl regiszter 32 bites, a forrst 16:32 alak tvoli pointernek rtelmezi. Ekkor az als duplaszt (0..3 bjtok) a cl regiszterbe, a fels szt (4..5 bjtok) pedig GS-be tlti. LODSD (no op) (LOaD String Doubleword) A LODS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti.
290

LOOPD relative address (LOOP, 32 bit) LOOPDE/LOOPDZ relative address (LOOP while Equal/Zero, 32 bit) LOOPDNE/LOOPDNZ relative address (LOOP while Not Equal/Not Zero, 32 bit) A LOOP, LOOPE/LOOPZ s LOOPNE/ LOOPNZ utastsok 32 bites alakjai. Mkdsk csak abban tr el eldeiktl, hogy CX helyett ECX-et hasznljk szmllknt. LSS dest reg16/reg32,source (Load full pointer into SS and a general purpose register) Ha a cl regiszter 16 bites, a forrst a megszokott 16 bites szelektorbl (vagy szegmensbl) s 16 bites offszetbl ll tvoli mutatnak rtelmezi. Az als szt (0..1 bjtok) ilyenkor a cl ltalnos regiszterbe, a fels szt (2..3 bjtok) pedig SS-be tlti. Ha a cl regiszter 32 bites, a forrst 16:32 alak tvoli pointernek rtelmezi. Ekkor az als duplaszt (0..3 bjtok) a cl regiszterbe, a fels szt (4..5 bjtok) pedig SS-be tlti. Az LSS SP/ESP,? utastst ajnlott hasznlni a MOV SS,? // MOV SP/ESP,? utastspr helyett olyankor, amikor a verem cme egy memriban lev vltozban tallhat. MOVSD (no op) (MOVe String Doubleword) A MOVS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti. MOVSX dest reg16/32,source (MOVe with Sign eXtension)

291

A bjt vagy sz mret operandust eljelesen kiterjeszti 16 vagy 32 bitesre, majd az rtket eltrolja a cl ltalnos regiszterben. A forrs csak ltalnos regiszter vagy memriaoperandus lehet. MOVZX dest reg16/32,source (MOVe with Zero eXtension) A bjt vagy sz mret operandust zrkiterjesztssel 16 vagy 32 bitesre egszti ki, majd az rtket eltrolja a cl ltalnos regiszterben. A forrs csak ltalnos regiszter vagy memriaoperandus lehet. OUTSD (no op) (OUTput String Doubleword) Az OUTS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti. POPAD (no op) (POP All general purpose registers, 32 bit) A POPA utasts 32 bites alakja. A kvetkez utastssorozatot hajtja vgre:
POP POP POP ADD POP POP POP POP EDI ESI EBP SP/ESP,00000004h EBX EDX ECX EAX

A negyedik sorban szerepl ADD SP/ESP,4 utasts csak szimbolikusan nz gy ki, mivel a flag-ek tartalmt NEM befolysolja a POPAD utasts. POPFD (no op) (POP EFlags)
292

A POPF utasts 32 bites alakja. A verem tetejrl leemel 4 bjtot, majd az rtket az EFlags regiszterbe tlti. A processzor aktulis zemmdjtl s a CPL-tl fggen az utasts mskpp viselkedik. Vals mdban s vdett mdban CPL=0 esetn az sszes flag mdosthat, kivve a fenntartott biteket s a VM (17-es) flaget. A VM flag llapota vltozatlan marad. Vdett mdban, ha 0<CPLIOPL, az IOPL mezt s a VM flag-et kivve brmelyik flag mdosthat. Az IOPL s VM bitek vltozatlanok maradnak. Vdett mdban, ha CPL>0 s CPL>IOPL, nem keletkezik kivtel, s az emltett bitek is vltozatlanok maradnak. Virtulis mdban, ha IOPL=3, a VM (17-es), RF (16-os) flag-ek s az IOPL mez (12..13 bitek) vltozatlanok maradnak, ezek nem mdosthatk. A POPF utastshoz hasonlan ez az utasts is IOPLrzkeny virtulis mdban. PUSHAD (no op) (PUSH All general purpose registers, 32 bit) A PUSHA utasts 32 bites alakja. A kvetkez utastsokat hajtja vgre:
PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH EAX ECX EDX EBX ESP EBP ESI EDI

Az tdik sorban szerepl utastst gy hajtja vgre, ahogyan a "hagyomnyos" PUSH ESP esetn is
293

teszi, teht ESP aktulis rtke lesz eltrolva az SS:(SP-4) vagy SS:(ESP-4) cmen, majd SP vagy ESP rtke cskken 4-gyel. PUSHFD (no op) (PUSH EFlags) A PUSHF utasts 32 bites alakja. Az EFlags regisztert a verem tetejre teszi. A PUSHF-hez hasonlan virtulis mdban IOPL-rzkeny ez az utasts. SCASD (no op) (SCAn String Doubleword) A SCAS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti. SETccc dest reg/mem8 (SET byte on condition) Ha a "ccc" ltal megadott felttel teljesl, a clba 01ht tlt, klnben pedig 00h lesz a cl tartalma. A felttelek ugyanazok lehetnek, mint a feltteles ugrsoknl, a CXZ-t kivve. A clnak egy bjt mret ltalnos regiszternek vagy memriaoperandusnak kell lennie. SHLD dest,source reg16/32,CL/imm8 (Double precision SHift Left logical) A cloperandusban s a forrsban lev rtkeket egyetlen szmknt kezeli gy, hogy a forrsoperandus lesz az alacsonyabb helyirtk. Ezutn ezt a szmot balra lpteti a harmadik operandusban megadott szmszor, majd a vgeredmnynek a fels (magasabb helyirtk) felt berja a cloperandusba. A forrs tartalma vltozatlan marad. A flag-eket a tbbi shiftel utastshoz hasonlan kezeli, de itt OF is meghatrozatlan lesz. A forrsnak egy 16 vagy 32 bites ltalnos regiszternek, a clnak 16 vagy 32 bites ltalnos regiszternek vagy memria294

operandusnak kell lennie, a lpsszmot pedig egy bjt mret kzvetlen rtk vagy a CL regiszter hatrozza meg. A lpsszmot modulo 32 veszi, gy az a 0..31 rtkek valamelyike lesz. A kvetkez kt utastssal pl. knnyedn balra lptethetjk az EDX:EAX-ban lev 64 bites szmot:
SHLD SHL EDX,EAX,CL EAX,CL

SHRD dest,source reg,CL/imm8 (Double precision SHift Right logical) A cloperandusban s a forrsban lev rtkeket egyetlen szmknt kezeli gy, hogy a forrsoperandus lesz a magasabb helyirtk. Ezutn ezt a szmot jobbra lpteti a harmadik operandusban megadott szmszor, majd a vgeredmnynek az als (alacsonyabb helyirtk) felt berja a cloperandusba. A lptets logikai lesz, teht az operandusokat eljeltelen rtkekknt kezeli. A forrs tartalma vltozatlan marad. A flag-eket a tbbi shiftel utastshoz hasonlan kezeli, de itt OF is meghatrozatlan lesz. A forrsnak egy 16 vagy 32 bites ltalnos regiszternek, a clnak 16 vagy 32 bites ltalnos regiszternek vagy memriaoperandusnak kell lennie, a lpsszmot pedig egy bjt mret kzvetlen rtk vagy a CL regiszter hatrozza meg. A lpsszmot modulo 32 veszi, gy az a 0..31 rtkek valamelyike lesz. A kvetkez kt utastssal pl. knnyedn jobbra lptethetjk az EDX:EAX-ban lev 64 bites, eljel nlkli szmot:
SHRD EAX,EDX,CL
295

SHR

EDX,CL

STOSD (no op) (STOre String Doubleword) A STOS utasts rvid alakja. A sztringet duplasz mret elemekbl llnak tekinti.

17.5.5 Vltozsok az architektrban Fontos jdonsgnak szmt az igny szerinti lapozson alapul virtulis memria (demand-paged virtual memory). A virtulis memria egy olyan cmterletet jelent, amit a felhasznli s rendszerprogramok felhasznlhatnak, de annak mrete esetenknt sokszorta nagyobb lehet a fizikai memrinl. Multitaszkos s tbbfelhasznls opercis rendszerek ezrt elszeretettel alkalmazzk. A 80286-os processzor vdett mdban mr lehetv tette a virtulis memria hasznlatt, de csak a szegmensek szintjn. Mivel a vdett md szegmensek ltalban klnbz mretek, ez nem valami knyelmes s hatkony mdszer, ezen kvl nem biztost elg vdelmet sem. A 80386-os processzor egy j technikt, a lapozst (paging) is biztostja. Ennek az a lnyege, hogy a fizikai cmterletet (ami ennl a processzornl 4 Gbjt) azonos mret, sszefgg terletekre osztja fel. Ezeket lapoknak (page) hvjuk, mretk 4 Kbjt, s mindegyik lap bziscme 4096-tal oszthat cmen tallhat (azaz a lapok a szegmensekkel ellenttben nem tfedek). Lapozs csak a vdett (s gy a virtulis) mdban mkdik. Engedlyezshez a CR0 regiszter PG (31-es) bitjt be kell lltanunk. A lapozs megvalstshoz j rendszerelemeket vezettek be. A laptblk (page-table) 1024 db. 4 Kbjtos lapnak tartalmazzk a bziscmt, elrhetsgt s egyb informciit. A lapcmtr (page-directory) 1024 db. laptbla bziscmt s
296

egyb adatt tartalmazza. (Bziscmen itt fizikai cmet rtnk.) Ez gy sszesen 1024*1024=1048576 db. lapot jelent, s mivel a lapok mrete 4 Kbjt=4096 bjt, ezzel kijn a 4 Gbjt=4096*1024*1024 bjtos elrhet cmterlet. A laptblk s a lapcmtr egyarnt 4 bjtos bejegyzseket hasznlnak, gy az 1024 db. bejegyzs pont belefr egy lapba. A lapcmtr bziscmre ugyancsak teljeslnie kell a 4096tal val oszthatsgnak. A bziscm fels 20 bitjt a CR3 regiszter 12..31 bitjei tartalmazzk, ezrt ezt a regisztert hvjk mg lapcmtr bzisregiszternek is (Page-Directory Base RegisterPDBR). A memria gyorsabb elrse cljbl a leggyakrabban (legutbb) hasznlt lapcmtr-bejegyzsek (Page-Directory EntryPDE) s laptbla-bejegyzsek (Page-Table EntryPTE) specilis cache-ben, az .n. Translation Lookaside Buffer-ekben (TLBs) troldnak el a processzoron bell. Ezek tartalma nem rhet el a programok szmra, de tartalmuk CPL=0 esetn trlhet. A TLB-k tartalma a CR3 regiszter rsakor, valamint taszkvltskor automatikusan rvnytelentdik. A 32 bites lineris cm a lapozs hasznlatakor mr nem kzvetlenl a fizikai cmet jelenti. A lineris cm 22..31 bitjei vlasztjk ki a lapcmtr bejegyzst, ami egy laptblra mutat. A 12..21 bitek hatrozzk meg, ennek a laptblnak mely lapjra vonatkozik a krs. Vgl a 0..11 bitek tartalmazzk a lapon belli offszetet. A lapozs a felhasznli- (virtulis md) s a rendszerprogramok (CPL=1 vagy 2) szmra teljesen tltsz. Csak az opercis rendszer magjban (kernel) tallhat, a memria kezelsvel foglalkoz rutinoknak s a kivtel-kezelknek kell tudniuk a lapozs folyamatrl. A TLB-k tesztelsre is lehetsget ad a 80386-os a tesztregiszterek biztostsval. A TR6 a teszt parancsregiszter
297

(test command register), TR7 pedig a teszt adatregiszter (test data register). A TLB egy ngyutas kszlet-asszociatv memria (fourway set-associative memory). Ez azt jelenti, hogy 4 bejegyzskszlet van a processzorban, s mindegyik kszlet 8 bejegyzst tartalmaz. Egy bejegyzs kt rszre bonthat: tag s adat (data) rszekre. A tag 24 bites, ebbl 20 bit a 32 bites lineris cm fels bitjeit tartalmazza, 1 bit jelzi, az adott bejegyzs rvnyes-e (validV bit), valamint 3 attribtum-bitet is tartalmaz. Az adat tartalmazza a 32 bites fizikai cm fels 20 bitjt. Egy bejegyzs TLB-be rst a kvetkez mdon tehetjk meg: 1)A TR7 regiszterbe tltsk be a kvnt fizikai cmet tartalmaz rtket. A HT bitnek 1-nek kell lennie, mg a REP mez rtke azt a kszletet vlasztja ki, ahov az j bejegyzs kerlni fog. 2)A TR6 regiszterbe tltsnk olyan rtket, amely a kvnt lineris cmet, valamint V, D, U s W jellemzket tartalmazza. A C bitnek 0-nak kell lennie. Ha a TLB-bejegyzsek kztt keresni (lookup) akarunk, az albbi lpseket kell vgrehajtani: 1)A TR6 regiszterbe tltsnk olyan rtket, amely a kvnt lineris cmet, valamint V, D, U s W jellemzket tartalmazza. A C bitnek 1-nek kell lennie. Szintn ajnlott a V bitet is 1-re lltani. 2)Olvassuk ki, majd troljuk el a TR7 regiszter tartalmt. Ha HT=1, a keress sikeres volt, egybknt a regiszter tbbi bitjnek llapota definilatlan. A TLB tesztelsnek ez a mdszere a 80486-os processzoron mg elrhet, a ksbbi processzorok (a Pentiumtl kezdve) viszont modell-specifikus regisztereken (MSR)

298

keresztl biztostjk ezeket a lehetsgeket, st mg ezeknl tbbet is. A nyomkvetst (debugging) mr az eddigi processzorok is tmogattk. Ilyen lehetsgeket jelentett a Flags regiszter TF (8-as) flag-je, a TSS-ek T bitje, valamint az INT 3 utasts. A 80386-os processzoron azonban lehetsg van ezeknl fejlettebb, hardveres trspontok (hardware breakpoint) megadsra. A kvetkez felttelek mindegyike szerepelhet egy trspont kivlt okaknt: tetszleges utasts-vgrehajts (instruction execution), ms nven utasts-lehvs (instruction fetch) adott cmen lev tetszleges utasts vgrehajtsa adott cmen lev bjt, sz, duplasz olvassa vagy rsa valamelyik nyomkvet regiszter tartalmnak megvltoztatsra tett ksrlet (general detect) Brmelyik felttel teljeslse esetn, persze ha engedlyeztk az adott trspontot, 1-es kivtel (#DB) keletkezik. sszesen 4 fggetlen trspontot adhatunk meg, ezek kln-kln engedlyezhetk is. A DR0..DR3 regiszterek tartalmazzk az egyes trspontok 32 bites lineris (nem felttlenl fizikai) cmt. A DR6 regiszter mutatja, mely trspontok miatt keletkezett kivtel, mg a DR7 regiszter szolgl a trspontot kivlt felttelek belltsra. Az j, 32 bites regiszterek s a 32 bites cmzsi mdok bevezetse szksgess tette, hogy a szegmensek mrett ennek megfelelen meg lehessen nvelni, tovbb meg kellett adni a vlasztsi lehetsget az j s a rgi cmzsi mdok kztt. Ennek megfelelen a deszkriptorok formtuma eltr a 80286oson hasznlttl:
299

a szegmens hatrt tartalmaz mez mrete 20 bites lett a szegmens bziscme immron 32 bites lehet a szegmens mretnek alapegysge (granularity) bjt vagy lap lehet, ennek megfelelen a hatr maximum vagy 1 Mbjt lehet bjtos lpsekben, vagy 4 Gbjt 4096 bjtos lpsekben Szintn jdonsg, hogy mindegyik szegmensnek van egy operandusmret s egy cmmret jellemzje is (operand size s address size attribute). Vals s virtulis mdban ez mindegyik szegmenstpusnl (adat, kd, verem) 16-16 bit. Vdett md 32 bites szegmens esetn az operandusmret s a cmmret is egyarnt 32 bit. Ezek a jellemzk mindhrom szegmenstpusnl mst jelentenek. A kdszegmensek esetn mindkt jellemz dnt hatssal van a szegmens tartalmnak (azaz az utastsoknak) rtelmezsre. Az operandusmret az utastsok operandusnak alaprtelmezett mrett befolysolja: 16 bites operandusmret esetn 8 vagy 16 bites, mg 32 bites operandusmret megadsakor 8 vagy 32 bites operandus(oka)t hasznlnak az utastsok. A cmmret az effektv cm (offszet) hosszt s a hasznlt cmzsi md jellegt befolysolja: 16 bites cmmret esetn 16 bites effektv cmet s 16 bites cmzsi mdokat hasznl a processzor, mg a 32 bites cmmret 32 bites effektv cm s a 32 bites cmzsi mdok hasznlatt rja el. Szintn teljesl, hogy 16 bites cmmret esetn IP-t, klnben pedig EIP-t hasznlja utastsmutatknt a processzor. Az adatszegmensekre csak a cmmret rtke van hatssal. A vdett md lefel bvl adatszegmensek (expand-down data segment) esetn a cmmret hatrozza meg a szegmens fels hatrt. 16 bites cmmret esetn a hatr 0FFFFh, egybknt pedig 0FFFFFFFFh lesz. Mivel a verem egy specilis adatszegmens, ez a tulajdonsg a veremre is rvnyes lehet.

300

16 bites operandusmret szavakbl ll vermet jelent, 32 bites operandusmret esetn pedig duplaszavakbl fog llni a verem. 16 bites cmmret esetn a verem SP-t, mg 32 bites cmmretnl ESP-t hasznlja veremmutatknt. Ezek a kijelentsek csak a vermet implicite hasznl utastsokra vonatkoznak, gymint PUSH, PUSHF/PUSHFD, PUSHA/ PUSHAD, POP, POPF/POPFD, POPA/POPAD, INT, INTO, IRET/IRETD, CALL, RET, BOUND, ENTER/ENTERD, LEAVE/LEAVED. Kivtelek s hardver-megszaktsok kezeljnek meghvsakor szintn figyelembe veszi a processzor a verem ezen jellemzit. Az alaprtelmezett operandus- vagy cmmretet fellbrlhatjuk egy-egy prefixszel (66h ill. 67h). Az assemblerek ltalban automatikusan alkalmazzk ezeket a prefixeket a szksges helyeken, de nha jl jn, ha mi is meg tudjuk adni ezeket a jellemzket egy adott utastshoz. 17.5.6 j zemmdok Az eddig ltez vals cmzs s vdett mdok mellett a 80386-os processzor egy j zemmdot is knl, melynek neve virtulis-8086 md vagy rviden virtulis md (virtual-8086 mode, virtual-86 mode, V86 mode, virtual mode). Ennek az zemmdnak az a f jellemzje, hogy ltala lehetsgess vlik a korbban vals mdra rt alkalmazsok futtatsa a vdett md krnyezetben, st egynl tbb ilyen alkalmazs (taszk) is futhat egyms mellett s egymstl fggetlenl. Mindegyik virtulis taszknak megvan a sajt 1 Mbjtos memriaterlete, sajt regiszterei. Az I/O s a megszaktssal kapcsolatos utastsok mkdse taszkonknt szablyozhat. Ebben a mdban CPL=3, gy sok utasts vgrehajtsa korltozott vagy tiltott az opercis rendszer vdelmben. Virtulis mdban a cmek kiszmtsa teljesen ugyangy megy vgbe, mint vals mdban. Ez a kvetkezket jelenti:
301

a szegmensregiszterek tartalmt nem szelektornak rtelmezi a processzor, gy sem a GDT-t sem az LDT-t nem hasznlja a cmek lefordtshoz a memriacmek meghatrozsa gy trtnik, hogy a 16 bites szegmensrtket balra lpteti 4-gyel (megszorozza 16-tal), majd ehhez a 20 bites rtkhez hozzadja a 16 bites offszet zrkiterjesztett rtkt, s gy jn ki a 21 bites lineris cm a szegmenshatr 64 Kbjt, ennek megsrtse 12-es (#SS) vagy 13-as (#GP) kivtel keletkezshez vezet A virtulis md engedlyezshez az EFlags regiszter VM (17-es) bitjt 1-be kell lltani. Ezt a POPFD utastssal nem tehetjk meg, csak egy taszkvltssal vagy megszakts- ill. kivtel-kezelbl val visszatrssel (IRETD utastssal) rhetjk el, hogy vdett mdbl virtulis mdba vltson a processzor. A virtulis mdot csak egy szoftver- vagy hardvermegszakts, ill. egy kivtel tjn hagyhatjuk el (s persze a processzor resetelsvel). A virtulis mdrl bvebben a vdett mdot trgyal ksbbi fejezetben lesz sz. 17.5.7 j cmzsi mdok Mivel az ltalnos regiszterek mrett 32 bitre nveltk, szksg volt olyan j cmzsi mdokra, amikkel ez a nvekeds hatkonyan kihasznlhat. A kvetkez 32 bites cmzsi mdok mindegyike hasznlhat a processzor brmelyik zemmdjban, 16 s 32 bites kdszegmens esetn is. 17.5.7.1 Kzvetlen cmzs

302

A cmzs alakja [offs32], ahol offs32 egy 32 bites abszolt, szegmensen belli offszetet jell. 17.5.7.2 Bziscmzs A lehetsges alakok: [EAX], [EBX], [ECX], [EDX], [ESI], [EDI], [ESP], [EBP]. A cl bjt offszetcmt a hasznlt ltalnos regiszterbl fogja venni. 17.5.7.3 Bzis+relatv cmzs Ide a [bzis+rel8], [bzis+rel32] formj cmmegadsok tartoznak. Bzis brmelyik 32 bites ltalnos regiszter lehet, rel8 s rel32 a bjt ill. duplasz mret eltolst (displacement) jellik. 17.5.7.4 Bzis+index cmzs A kvetkez formkat ltheti: [bzis+index]. Bzis brmelyik, index pedig ESP kivtelvel brmelyik 32 bites ltalnos regiszter lehet. 17.5.7.5 Bzis+index+relatv cmzs ltalnos alakja [bzis+index+rel8] s [bzis+index+rel32] lehet. 17.5.7.6 Bzis+index*skla cmzs

303

Alakja [bzis+index*skla], ahol bzis s index a szoksos 32 bites ltalnos regiszterek lehetnek, mg skla rtke 1, 2, 4 vagy 8 lehet. 17.5.7.7 Bzis+index*skla+relatv cmzs Alakja [bzis+index*skla+rel8] s [bzis+index*skla+rel32] lehet. 17.5.7.8 Index*skla+relatv cmzs Alakja [index*skla+rel32]. Minden cmzsi mdhoz tartozik egy alaprtelmezett (default) szegmensregiszter-elrs. Ez a kvetkezket jelenti: a bzisknt ESP-t vagy EBP-t hasznl cmzsi mdok SS-t hasznljk a tbbi cmzsi md DS-t hasznlja Az a felttel, hogy index nem lehet az ESP regiszter, a gyakorlatban annyit jelent, hogy az
[ESP+ESP] [ESP+ESP+rel8/rel32] [ESP+ESP*skla] [ESP+ESP*skla+rel8/32]

alak cmzsek illeglisak. Azonban, ha skla=1, akkor az


[ESP*skla+rel8/rel32]=[ESP*1+rel8/rel32]=[ESP+rel8/rel32]

cmzs megengedett, mivel ESP itt a bzis szerept tlti be. Br vals s virtulis mdban vigyznunk kell, hogy az effektv cm ne haladja meg a szegmenshatrt (0FFFFh), ez all a LEA utasts kivtelt lvez. Ezek a cmzsmdok a LEA
304

utastssal ugyanis nagyon hatkony mdszert adnak szorzsok gyors elvgzsre. A kvetkez 2 egyszer utasts
LEA LEA EAX,[EAX+8*EAX] EAX,[EAX+4*EAX]

az EAX-ben lev eljeles vagy eljeltelen rtket megszorozza +45-tel, s mindezt igen gyorsan (4-6 raciklus) teszi. Ugyanez ADD s MUL/IMUL, esetleg SHL/SAL utastsok sorozatval legalbb 3-szor lassabb lenne. 17.5.8 Vltozsok a kivtel-kezelsben Az sszes kivtel nemcsak a vdett, de a virtulis mdban is keletkezhet. 32 bites verem esetn a hibakdok mrete is 32 bit lesz. A fels 16 bit ilyenkor kihasznlatlanul kerl a verembe. A hibakdot virtulis mdban is berakjk a kivtelek a verembe. Az j 14-es (#PF) kivtel hibakdjnak formtuma eltr az eddig hasznlttl: Bitpozci Nv 0 P 1 R/W 2 U/S 3..15 Ha a P bit rtke 0, akkor a laphiba egy nem jelenlev lap miatt keletkezett, klnben egy hozzfrsi vdelmi srts az ok. Ha az R/W bit rtke 0, akkor olvassi, klnben rsi mvelet a bns. Ha U/S=1, akkor felhasznli szint (user), egybknt pedig rendszerszint (supervisor) lapon trtnt a hiba. A 3..15 bitek fenntartottak.
305

1-es kivtel keletkezsnek okait a nyomkvet (debug) regiszterek bevezetsvel kibvtettk, s a kivtel immr lehet csapda (trap) s hiba (fault) tpus is: utasts-lehvs (instruction fetch) trspont fault adat olvass vagy rs trspont trap brmelyik nyomkvet regiszter rsa (general detect) fault 6-os kivtel a kvetkez valamelyik felttel teljeslsekor is keletkezik: az ARPL, LAR, LLDT, LSL, LTR, SLDT, STR, VERR s VERW utastsok valamelyikt prbltuk meg vgrehajtani virtulis mdban a LOCK prefixet egy rvnytelen utasts eltt alkalmaztuk, vagy az utasts cloperandusa nem memriahivatkozs A dupla hiba (8-as, #DF) kivtel keletkezsnek oka kt j felttellel bvlt: az els kivtel a laphiba (14-es), a msodik pedig a 0, 10, 11, 12, 13 kivtelek valamelyike mindkt kivtel laphiba (14-es, #PF) Az eddig ltez felttel, vagyis ha az els s a msodik kivtel is a 0, 10, 11, 12, 13 kivtelek valamelyike, tovbbra is rvnyes marad. 13-as kivtel (#GP) a kvetkez felttelek esetn is keletkezik: szegmenshatrsrts a FS, GS szegmensek hasznlatakor egy rendszerszegmens szelektort prbltuk meg betlteni a FS, GS regiszterekbe egy csak vgrehajthat (execute-only) kdszegmens szelektort tltttk be az FS, GS regiszterekbe
306

nullszelektort tartalmaz FS, GS regiszterekkel trtn memriaelrs az utastsok maximlis hossznak hatrt (15 bjt) megsrtettk CR0-ba olyan rtket tltttnk be, ahol PG=1 (31-es bit) s PE=0 (0-s bit) virtulis mdban egy olyan megszakts- vagy kivtelkezelt prbltunk meg elrni megszakts- vagy csapdakapun keresztl, amely kdszegmensnek DPL-je nagyobb mint 0 17.5.9 j kivtelek Szm Mnemo Nv 14 #PF Page Fault Tpus Kivlt felttelek Fault Memriahivatkozs

14-es kivtel akkor keletkezik, ha a CR0 regiszter PG (31es) bitjnek 1-es llsa mellett a kvetkez felttelek valamelyike teljesl: a hivatkozott cm lefordtshoz szksges lapcmtr vagy laptbla bejegyzs "jelenlev" (PresentP) bitje trlve van egy felhasznli (user) szinten fut taszk megprbl elrni egy rendszerszint (supervisor) lapot egy felhasznli (user) szint taszk egy rsvdett (readonly) lapra prbl meg rni A verembe egy specilis formtum hibakd kerl, ennek lerst lsd az elz alfejezetben. Ezen kvl a kivtel-kezel meghvsakor a CR2 regiszter tartalmazza a hibt okoz 32 bites lineris cmet. A veremben lev CS:IP/EIP pldny ltalban a hibt okoz utastsra mutat. Ha azonban a hiba taszkvlts kzben trtnt, elfordulhat, hogy az j taszk els utastsnak cmt tartalmazza a veremben lev msolat.
307

17.5.10 Vltozsok a regiszterkszletben A 8 ltalnos regiszter (AX, BX, CX, DX, SI, DI, SP, BP), az utastsmutat (IP) regiszter, a Flags regiszter s az MSW regiszter mrett 32 bitesre bvtettk ki. Ezek a regiszterek j nv alatt rhetk el, lersukat ezrt a kvetkez alfejezetben lehet megtallni. A GDTR s IDTR regiszterek immr a tblk teljes 32 bites fizikai bziscmt trolni tudjk: Bitpozci Tartalom 0..15 Hatr 16..47 Bziscm 17.5.11 j regiszterek Kt j szegmensregisztert kapott a 80386-os processzor. Az FS s GS regiszterek funkcija, felptse s tartalma ugyanaz, mint az ES regiszter, teht egy harmadlagos s negyedleges adatszegmenst definilnak. A processzor brmely zemmdjban, brmely CPL esetn hasznlhatjuk ket. Az FS s GS szegmensregiszterekhez egy-egy szegmens deszkriptor cache-regiszter (rnykregiszter) is be lett vezetve. 8 j 32 bites ltalnos regisztert is bevezettek, ezek nevei EAX, EBX, ECX, EDX, ESI, EDI, ESP s EBP. Amint az albbi brn is lthat, az j regiszterek als szavt a megszokott AX, BX stb. regiszterek foglaljk el, ezeket szintn hasznlhatjuk. A fels szt nem rhetjk el kln nven. Az AX, BX, CX s DX regiszterek als s fels bjtjai tovbbra is hasznlhatk AL/AH, BL/BH, CL/CH s DL/DH neveken.
308

A rgi 16 bites regiszterek fizikailag vannak rkpezve az jakra, gy pl. ha az EAX regiszterben 12345678h van, akkor AX tartalma 5678h, AH- 56h, AL-ben pedig 78h-t tallunk. Ha ezutn AX-be 9ABCh-t tltnk, akkor EAX j tartalma 12349ABCh lesz. Az j ltalnos regisztereket csakgy, mint a rgieket is, a processzor brmely zemmdjban, tetszleges CPL mellett elrhetjk s brmilyen rtket tlthetnk beljk. (ESP kivteles eset, de ez a funkcijbl kvetkezik.) A korbban 16 bites utastsmutat regiszter mrete mostantl 32 bit, j neve EIP. A regiszter als szavban a korbbi IP regiszter helyezkedik el. A korbban sttuszregiszternek vagy Flags-nek hvott regiszter mrete ugyancsak 32 bit lett, j neve EFlags. Als szavban a korbbi Flags regiszter tallhat meg. Az EFlagsben lev bitek (flag-ek) funkcijt a kvetkez tblzat mutatja: Bitpozci 0 1 2 3 4 5 Jells Nv CF Carry Flag PF Parity Flag AF Auxilliary/Adjust Flag
309

6 ZF Zero Flag 7 SF Sign Flag 8 TF Trap Flag 9 IF Interrupt Flag 10 DF Direction Flag 11 OF Overflow Flag 12..13 IOPL Input/Output Privilege Level 14 NT Nested Task 15 16 RF Resume Flag 17 VM Virtual-8086 Mode 18..31 A CF, PF, AF, ZF, SF, TF, IF, DF, OF, IOPL s NT flagek funkcija s mkdse megfelel az eddigieknek. Az RF flag 1-es rtke az rvnyben lev utaststrspontok keletkezst tiltja le a kvetkez utasts idejre. Ha az az utasts vgrehajtdott, RF rtke automatikusan trldik. A processzor RF-et mindig belltja, ha egy hiba (fault) vagy abort tpus kivtel keletkezik. A kezel meghvsakor a verembe mentett EFlags-msolatban RF teht 1 rtk lesz. Az egyetlen kivtel ez all az utasts-trspontok miatt generlt 1-es kivtel, ahol RF rtke vltozatlan marad az EFlags-msolatban. Azonban RF-et mindig trli a processzor, mieltt egy megszakts vagy kivtel kezeljt megkezden vgrehajtani. (Ez trtnik a TF s az IF flag-ekkel is, br ha csapdakaput hasznlunk, IF rtke vltozatlan marad.) A VM flag ltal kapcsolhatjuk a processzort virtulis-8086 zemmdba. Ha VM=0, akkor a processzor vals vagy vdett mdban van, klnben pedig a virtulis mdot hasznlja. Ezt a bitet a POPFD utasts NEM kpes mdostani. Ahhoz, hogy bellthassuk, CPL=0 esetn kell vgrehajtani egy IRETD utastst (ekkor a veremben lev EFlags-tkrkpben VM=1), vagy egy olyan taszkra kell ugranunk, amelynek TSS-ben lev
310

EFlags-msolatban VM=1. VM-et mindig trli a processzor, mieltt egy megszakts vagy kivtel kezeljt megkezden vgrehajtani. Az 1, 3, 5, 15 s 18..31 szm bitek fenntartottak, ami most annyit jelent, hogy rtkk nem mdosthat, s nem is definilt. Magnak az EFlags regiszternek az elrhetsge nincs korltozva, viszont az t kezel PUSHF, PUSHFD, POPF, POPFD, IRET s IRETD utastsok hasznlata megktsekkel jr. Ezen kvl nhny flag tartalma nem minden zemmdban s nem minden CPL rtk mellett olvashat s rhat. Errl bvebbet az elbb emltett utastsokhoz fztt megjegyzsekben olvashatunk. 3 vezrlregisztert (control register) is tallunk a 80386oson. Ezeket sorban CR0-nak, CR2-nek s CR3-nak nevezik. Ezek a regiszterek csak CPL=0 esetn rhetk el, gy vals s vdett mdokban hasznlhatjuk ket. Mindegyik vezrlregiszter 32 bites. Vezrlregiszterbl elvileg 8 db. lehetne, legalbbis a kdols alakjbl erre lehet kvetkeztetni. A CR1 s CR4..CR7 regiszterek azonban nem rhetk el, ezeket a ksbbi processzorok szmra tartjk fenn. A CR0 regiszter a korbbi MSW (Machine Status Word) regiszter kibvtett alakja. Als szavban az emltett MSW-t talljuk, meg egy j bitet (ET). Az MSW-t tovbbra is rhatjuk az LMSW utastssal, illetve tartalma az SMSW-vel kiolvashat. Mivel az SMSW utasts nem privilegizlt, ezt rdemes hasznlni, ha csak arra vagyunk kvncsiak, hogy az MSW 0..3 bitjei (PE, MP, EM, TS) kzl valamelyik be van-e lltva. A CR0 felptse a kvetkez tblzatban lthat:
311

Bitpozci Jells Nv 0 PE Protection Enable 1 MP Monitor coProcessor 2 EM EMulation 3 TS Task Switched 4 ET Extension Type 5..30 31 PG PaGing enable A PE, MP, EM s TS bitek funkcija megfelel az MSW hasonl bitjeinek. Az j ET bit llapota azt mutatja, milyen koprocesszor tpus van a szmtgpben. Ha ET=0, akkor a 80287-es, klnben a 80387-es koprocesszor utastskszletvel kompatibilis koprocesszort hasznlunk. Ha PG=1, akkor a lapozs engedlyezett, klnben a szoksos mdon trtnik a cmszmts (azaz a lineris cm kzvetlenl a fizikai cmet jelenti). Ezt a bitet csak vdett mdban kapcsolhatjuk be, mert klnben 13-as kivtel (#GP) keletkezik. A CR2 regiszter laphiba (#PF, 14-es) kivtel keletkezse esetn a hibt okoz lineris cmet tartalmazza. Szerepe csak a lapozs hasznlatakor fontos. Szintn a lapozs mechanizmusban jtszik szerepet a CR3 regiszter. Felptst a kvetkez tblzat mutatja: Bitpozci Jells Nv 0..11 12..31 PDB Page-Directory Base

312

A PDB mez a lapcmtr 31 bites fizikai bziscmnek fels 20 bitjt tartalmazza, a bziscm als 12 bitjt pedig 0-nak veszi a processzor. A 0..11 bitek fenntartottak, rtkk ezrt 0. A CR3 regiszter msik elnevezse (utalva tartalmra) a lapcmtr bzisregiszter (Page-Directory Base RegisterPDBR). A korbbi processzorok mr tmogattk a nyomkvets (debugging) nhny fajtjt, de igazn hatkony mdszert nem adtak. A 80386-os processzor 6 db nyomkvet regiszterrel (debug register) tmogatja a sikeresebb hibakeresst s programfejlesztst. A DR0, DR1, DR2, DR3, DR6 s DR7 nev 32 bites regiszterekben a nyomkvetshez szksges minden fontosabb dolog bellthat. Ezek a regiszterek is privilegizltak a vezrlregiszterekhez hasonlan. A DR0, DR1, DR2 s DR3 regiszterek a 4 trspont lineris cmt troljk. Nevk ezrt nyomkvet cmregiszter (debug address register). A DR6 regiszter tartalma azt mutatja, mirt keletkezett 1es kivtel (#DB). Neve ezrt nyomkvet sttuszregiszter (debug status register). Felptse a kvetkez: Bitpozci Nv 0 B0 1 B1 2 B2 3 B3 4..11 12 ? 13 BD 14 BS 15 BT 16..31
313

A fenntartott bitek rtke mindig 1 kell hogy legyen. A B0..B1 mezk jelzik, a definilt trspont-felttelek kzl melyik vagy melyek keletkeztek be. Ha valamelyik rtke 1, a DR7 regiszterben a hozz tartoz LEN s R/W mez ltal megadott trspont-felttel teljesl. A BD bit rtke 1, ha valamelyik nyomkvet regiszterbe rni prbltak gy, hogy a DR7 regiszterben GD=1. Ha BS=1, a trspont kivtelt a lpsenknti vgrehajtsi md (single-step execution mode) vltotta ki. Ez akkor kvetkezik be, ha a Flags/EFlags regiszterben TF=1. Ha BT=1, akkor taszkvlts miatt kvetkezett be a kivtel. Ezt egy olyan taszk vltja ki, melynek TSS-ben T=1. A DR7 regiszter szolgl az egyes trspontok engedlyezsre, valamint az ket kivlt (definil) felttelek megadsra. Neve ezrt nyomkvet vezrlregiszter (debug control register). rtelmezst az albbi tblzat mutatja: Bitpozci 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Nv L0 G0 L1 G1 L2 G2 L3 G3 LE GE ? GD
314

14..15 16..17 18..19 20..21 22..23 24..25 26..27 28..29 30..31

R/W0 LEN0 R/W1 LEN1 R/W2 LEN2 R/W3 LEN3

A 11-es, 14-es s 15-s bitek rtke fenntartott, ezek rtke mindig 0. A 10-es bit szintn fenntartott, de ennek rtke 1 kell hogy legyen. Az L0, L1, L2 s L3 bitek az egyes trspontokat engedlyezik az aktulis taszkra vonatkozan, azaz a trspontokat lokliss teszik. Ha valamelyik bit rtke 1, az adott trspont keletkezse lehetsges. Ezeket a biteket a processzor automatikusan trli taszkvltskor. A G0, G1, G2 s G3 bitek az egyes trspontokat engedlyezik az sszes taszkra vonatkozan, azaz a trspontokat globliss teszik. Ha valamelyik bit rtke 1, az adott trspont keletkezse lehetsges. Az LE s GE bitek 1-es rtke arra utastja a processzort, hogy az adattrsponton (data breakpoint) elakad utasts cmt pontosan meghatrozzk. Ha ezeket nem lltjuk be, a trspont kivtel (#DB) rendesen generldni fog, de a veremben lev CS:IP/EIP-tkrkp nem felttlenl a kivtelt kivlt utastsra fog mutatni. Ezeknek a biteknek a szerepe a 80486-os processzortl kezdve megvltozik. Az R/W0, R/W1, R/W2 s R/W3 mezk hatrozzk meg, az adott trspont milyen mvelet hatsra generljon kivtelt: R/W Trspont felttele 00 Csak utasts-vgrehajts
315

01 10 11

Csak adat rsa Adat olvassa vagy rsa, de nem utastsvgrehajts

Vgl a LEN0, LEN1, LEN2 s LEN3 mezk az adott trspont memriacmn kezdd kritikus terlet hosszt tartalmazzk: LEN rtk Tartomny hossza 00 1 bjt 01 2 bjt 10 11 4 bjt Utaststrspont esetn a megfelel LEN rtk csak a 00 bellts lehet (teht 1 bjt hossz memriaterlet). Egy utaststrspontot csak akkor ismer fel a processzor, ha a trspont cme az utasts legels bjtjra mutat (ami vagy a legels prefix, vagy a mveleti kd els bjtja). Kt bjt hossz terletek esetn a memriacmnek 2-vel, mg ngy bjtos terlet esetn 4-gyel kell oszthatnak lennie (teht a cmnek sz- vagy duplaszhatrra kell illeszkednie). Debug kivtel (#DB, 1-es) akkor keletkezik, ha az elrt memriacm a megfelel DR0..DR3 regiszter, ill. a DR7 regiszter adott LEN mezjvel meghatrozott tartomny tetszleges bjtjnak cmvel megegyezik. Br nem emltettk, a DR4 s DR5 regiszterekre val hivatkozs egyenrtk a DR6 ill. DR7 regiszterek hasznlatval. Mgsem ajnlott a DR4 s DR5 regiszternevek hasznlata, mivel a Pentium processzortl kezdve inkompatibilits lphet fel (lsd a Debugging Extensions szolgltatst).
316

A DR6 s a DR7 regiszter 12-es bitjt kln-kln be lehet 1-re lltani, de ezen bitek funkcija nem ismert pontosan. (A dokumentlatlan ICEBP/SMI utastsnl azonban emltettk, hogy az SMM mdba kapcsolsnak felttele, hogy a DR7 regiszter ezen bitje 1-es rtk legyen.) Az architektrban trtnt vltozsok lersnl mr emltettk, hogy a 80386-os processzoron lehetsg van a lapozssal egytt bevezetett TLB-k mkdsnek tesztelsre. Ezt a tesztregisztereken (test register) keresztl tehetjk meg. Kt 32 bites tesztregiszter rhet el, nevk TR6 s TR7. Ezek a regiszterek is privilegizltak, gy csak vals mdban vagy vdett mdban CPL=0 esetn hasznlhatk. A TR6 regisztert teszt parancsregiszternek (test command register) nevezzk, mivel tartalma hatrozza meg, a TLB-bl olvasni vagy abba rni szeretnnk-e. Csak ezt a kt mveletet tmogatja a processzor. A regiszter felptst a kvetkez tblzat mutatja: Bitpozci Jells Nv 0 C Command select 1..4 5 W# R/W bit complement 6 W R/W bit 7 U# U/S bit complement 8 U U/S bit 9 D# Dirty bit complement 10 D Dirty bit 11 V Valid bit 12..31 Linear address

317

Az 1..4 szm bitek fenntartottak, rtkk mindig legyen 0. A C bit llapota hatrozza meg a TLB-n vgrehajtott mveletet. Ha C=0, akkor a TLB-be rs, klnben onnan val olvass fog trtnni. A V bit 1-es rtke azt jelzi, hogy az adott bejegyzs rvnyes rtkeket tartalmaz. A D, U s W bitek a megfelel lapcmtr- vagy laptblabejegyzs D, U/S s R/W bitjeinek felelnek meg. A D#, U# s W# jells bitek rtke a trsuk rtknek ellentettje. Ezek a bitprok mskpp funkcionlnak a TLB-be rskor s az onnan val olvasskor. A kvetkezekben jellje X a D, U, W bitek valamelyikt, mg X# az adott bit komplemens prjt. A TLB-be rskor az X s X# bitek az j bejegyzs X bitjnek rtkt hatrozzk meg: X X# Az j bejegyzs X rtke 0 0 0 1 0 1 0 1 1 1 A TLB-ben keresskor, ill. egy TLB-bejegyzs olvassakor az X s X# bitek a keress eredmnyt befolysoljk: X X# Tallat, ha 0 0 0 1 X=0 1 0 X=1 1 1 A lineris cmet tartalmaz meznek is ms a szerepe a mvelettl fggen. A TLB-be rskor az j bejegyzs ehhez a lineris cmhez lesz rendelve. Ha a TLB-ben keresnk, akkor a TLB-bejegyzseket ezzel a mezvel hasonltja ssze, s egyetlen tallat esetn a TR7 regiszter megfelelen fel lesz tltve.
318

A TR7 regiszter neve teszt adatregiszter (test data register), mivel ez tartalmazza a TLB-bejegyzs adat rsznek tartalmt, a lap fizikai cmt. Felptse albb lthat: Bitpozci Jells Nv 0..1 2..3 REP block Report 4 HT HiT 5..11 12..31 Physical address A 0..1 s 5..11 bitek fenntartottak, rtkk mindig legyen 0. A REP mez funkcija is vltozik a mvelettl fggen. A TLB-be rskor azt a kszletet (blokkot) vlasztja ki, ahov az j bejegyzsnek kerlnie kell. A TLB-ben keresskor, ha az eredmnyben HT=1, akkor REP mutatja, melyik kszletben helyezkedik el a tallat. Ha HT=0, rtke meghatrozatlan. A HT bit 1-es rtke jelzi, hogy sikeres volt a keress, s a TR7 regiszter tbbi mezje rvnyes informcit tartalmaz a tallattal kapcsolatban. A TLB-be rskor ennek a bitnek 1-et kell tartalmaznia. Vgl a fizikai cmet tartalmaz mez tartalmt is mskpp kell rtelmezni a TLB rsakor s olvassakor. rskor ez tartalmazza az j bejegyzs adat rsznek tartalmt. Olvasskor, ha HT=1, ez a mez tartalmazza a tallat adat mezjt. Ha HT=0, rtke meghatrozatlan.

319

17.6 Az Intel 80486-os processzoron bevezetett jdonsgok


17.6.1 Vltozsok az utastskszletben LOCK Ez a prefix a CMPXCHG s XADD utastsokkal is hasznlhat, elttk nem okoz 6-os (#UD) kivtelt.

17.6.2 j utastsok BSWAP reg32 (Byte SWAP) Az operandusban lev rtket little-endian trolsrl big-endian-re konvertlja, azaz megfordtja a bjtok sorrendjt. Csak egy 32 bites ltalnos regiszter lehet az operandus. Az utasts hatsra a regiszter 0. s 3., valamint 1. s 2. bjtjai megcserldnek. CMPXCHG dest,source reg (CoMPare and eXCHanGe) Az akkumultort (AL-t, AX-et vagy EAX-et) sszehasonltja a cllal a CMP utastsnak megfelelen. Ha ZF=1 (azaz a cl megegyezik az akkumultorral), akkor a forrs regiszter tartalmt betlti a clba, klnben pedig a clt betlti az akkumultorba. Az operandusok mrete 8, 16 s 32 bit is lehet. Cloperandusknt memriahivatkozst s ltalnos regisztert, forrsknt pedig csak ltalnos regisztert rhatunk. Mind a hat aritmetikai flag-et mdostja. Ez az utasts a szemaforok kezelst knnyti meg.
320

INVD (no op) (INValiDate caches) A bels cache-memrikat kirti, majd a processzor a kls (alaplapi) cache-eket is arra kszteti, hogy semmistsk meg tartalmukat. A cache-ben lev, a rendszermemriba mg nem visszart adatok nem kerlnek frisstsre, gy adatveszts fordulhat el. Ez az utasts privilegizlt utasts. INVLPG mem (INVaLidate TLB-entry of given PaGe) A memriaoperandust tartalmaz lap TLBbejegyzst rvnytelenti. Ez az utasts privilegizlt utasts. WBINVD (no op) (Write Back and INValiDate caches) A bels cache-ekben lev mdostott adatokat visszarja a rendszermemriba, s kirti a cache-eket. Ezutn a kls cache-eket arra utastja, hogy azok is rjk vissza a mdostsokat, majd semmistsk meg tartalmukat. Ez az utasts privilegizlt utasts. XADD dest,source reg (eXchange and ADD) A forrs s a cl tartalmt felcserli, majd a clhoz hozzadja a forrst. Az operandusok mrete 8, 16 s 32 bit is lehet. Cloperandusknt memriahivatkozst s ltalnos regisztert, forrsknt pedig csak ltalnos regisztert rhatunk. Az utasts hatsa megegyezik az
XCHG ADD dest,source dest,source

vagy az
321

ADD XCHG

source,dest dest,source

utastsok vgrehajtsval. Az aritmetikai flag-eket (CF, PF, AF, ZF, SF, OF) az ADD utasts eredmnye szerint lltja be. (A fenti kt utastssorozat vgrehajtsa igazbl egy plusz dolgot is jelent: az XCHG utasts vgrehajtsakor a buszt automatikusan lezrja a processzor, mg ezt az XADD esetben nem teszi meg.) A felsorolt utastsok kzl az INVD, INVLPG s WBINVD privilegizltak, teht csak CPL=0 esetn hajthatk vgre. 17.6.3 Vltozsok az architektrban A 80486-os processzorba egy 8 Kbjtos, egyestett utasts-/adat-cache-t is beptettek. A cache csak write-through mdban kpes zemelni. A cache-sor (cache line) mrete 16 bjt. A 80486-os a TLB mellett lehetv teszi a cache tesztelst is. Ennek tmogatsra 3 j tesztregiszter lett bevezetve. A TR3 a cache-teszt adatregiszter (cache test data register), a TR4 a cache-teszt sttuszregiszter (cache test status register), a TR5 pedig a cache-teszt vezrlregiszter (cache test control register). Megjegyezzk, hogy ezeket a regisztereket (a TR6 s TR7 regiszterekkel egytt) a Pentium processzor mr nem tmogatja.

322

17.6.4 Vltozsok a kivtel-kezelsben A 9-es kivtel megsznt a 80486-os processzoron, helyette mindig 13-as (#GP) kivtelt generl a processzor. 13-as kivtel (#GP) a kvetkez felttelek teljeslsekor is keletkezik: CR0-ba olyan rtket tltttnk be, ahol NW=1 (29-es bit) s CD=0 (30-as bit) minden olyan mvelet, ami a 80386-oson 9-es kivtelt okozott volna A 14-es (#PF) kivtel mostantl akkor is keletkezik, ha egy rendszerszint (supervisor) taszk egy rsvdett (read-only), felhasznli (user) szint lapra prbl meg rni gy, hogy a CR0 regiszter WP (16-os) bitje be van lltva. 17.6.5 j kivtelek Szm Mnemo Nv Tpus Kivlt felttelek 17 #AC Alignment Check Fault Brmely adathivatkozs A 17-es kivtel akkor keletkezik, ha a processzor egy nem megfelelen illeszked (unaligned) memriaoperandust tallt, mikzben az illeszkeds-ellenrzs (alignment check) funkci engedlyezve volt. Az engedlyezs a kvetkez felttelek mindegyiknek teljeslst jelenti: a CR0 regiszter AM (18-as) bitjnek rtke 1 az EFlags AC (18-as) flag-jnek rtke szintn 1 CPL=3

323

A processzor csak adat- s veremszegmensekben figyeli az illeszkedst, kd- s rendszerszegmensekben nem foglalkozik vele. A verembe mindig egy nulls hibakd (0000h vagy 00000000h) kerl. CS:IP/EIP veremben lev pldnya mindig a hibt okoz utastsra mutat. A kvetkez tblzat mutatja a klnfle adattpusok esetn szksges illeszkeds tpust. A msodik oszlopban lev rtk azt adja meg, az adott tpus operandus cmnek mennyivel kell oszthatnak lennie. Illeszkeds bjtokban Sz 2 Duplasz 4 Egyszeres vals 4 Dupla vals 8 Kiterjesztett vals 8 Szegmens szelektor 2 32 bites tvoli pointer 2 48 bites tvoli pointer 4 32 bites kzeli pointer (offszet) 4 GDTR, IDTR, LDTR, TR tartalom 4 FLDENV, FSTENV terlet 2 vagy 4 FRSTOR, FSAVE terlet 2 vagy 4 Bitsztring 2 vagy 4 Az utols 3 esetben az illeszkeds az alkalmazott operandusmrettl fgg: az els rtk 16 bites, a msodik 32 bites operandusmretre vonatkozik. 17.6.6 Vltozsok a regiszterkszletben Az EFlags regiszter egy j flag-et kapott: Bitpozci Nv
324

Adat tpusa

18 AC Az AC (Alignment Check enable) flag 1-es rtke engedlyezi az illeszkeds-ellenrzst. A 17-es (#AC) kivtel keletkezshez mg kt felttelnek teljeslnie kell: CPL=3, s a CR0 regiszter AM (18-as) bitjnek is be kell lennie lltva. A CR0 regiszterben 5 j bit lett bevezetve: Bitpozci Nv 5 NE 16 WP 18 AM 29 NW 30 CD Az NE (Numeric Error handling) bit llsa vlasztja ki a koprocesszorban keletkez numerikus hibk lekezelsnek mdjt. Az NE=0 llapot a rgi, MS-DOS-kompatibilis mdot jelenti, mg NE=1 esetn a natv mdnak megfelelen trtnik a numerikus kivtelek jelzse. Errl a tmrl bvebben a koprocesszort trgyal fejezetben runk. A WP (Write Protect) bit vdett mdban az rsvdett felhasznli (user) szint lapok elrsre van hatssal. WP=0 esetn a rendszerszint (supervisor) taszkok rhatnak ezekre a lapokra, mg WP=1 esetn az ilyen prblkozsok lapkivtelt (#PF, 14-es) okoznak. Az AM (Alignment check Mask) bit 1-es rtke esetn engedlyezett az illeszkeds-ellenrzs. A 17-es (#AC) kivtel keletkezshez mg kt felttelnek teljeslnie kell: CPL=3, s az EFlags regiszter AC (18-as) flag-jnek is be kell lennie lltva. A CD (Cache Disable) s NW (cache Not Write-through) bitek a cache mkdst vezrlik a kvetkez mdon: CD NW Kvetkezmny 0 0 Cache engedlyezve, WT 0 1 1 0 Cache korltozva, WT
325

1 1 Cache korltozva A WT jells a Write-Through kifejezst rvidti. Ez a cache optimlis mkdsre utal fogalom, s annyit takar, hogy a mdostott adatok a cache-be s a rendszermemriba is bekerlnek rgvest egyms utn. A cache korltozsa annyit jelent, hogy a cache bizonyos fokig kevesebb szerepet jtszik a memriaelrsek lebonyoltsban. A CD=1, NW=1 esetben a cache olyan szempontbl kiiktatdik, hogy ha nincs olvassi vagy rsi tallat (azaz read miss vagy write miss fordul el), a megfelel cache-sor (cache line) nem kerl betltsre a cache-be. Ha a cache-t ebben a belltsban kirtjk az INVD vagy a WBINVD utastssal, az immron res cache tnyleg ki lesz iktatva a memriaelrs folyamatbl. A CD=1 esetek a CR3 regiszterben, a lapcmtr- s a laptbla-bejegyzsekben tallhat PWT (3-as) s PCD (4-es) bitek mkdsre is hatssal vannak. A CD=0, NW=1 bellts rvnytelen, hasznlata 13-as (#GP) kivtel keletkezst vonja maga utn. A CR3 regiszterben kt j bit lett bevezetve, melyek a lapcmtr-bejegyzsek cache-selst vezrlik: Bitpozci Nv 3 PWT 4 PCD A PWT (Page-level Write-Through) s PCD (Page-level Cache Disable) bitek llsa hatrozza meg, a lapcmtr bejegyzseit (PDE) cache-seli-e a processzor: PCD PWT Kvetkezmny 0 0 Nincs PDE cache-sels 0 1 WT PDE cache-sels 1 0 Nincs PDE cache-sels 1 1 Nincs PDE cache-sels
326

Ezen bitek llst figyelmen kvl hagyja a processzor, ha a CR0 regiszterben PG=0 vagy CD=1. A lapcmtr- s laptbla-bejegyzsekben ugyanezen a bitpozcikban megtallhat mindkt bit, s mkdsk is megegyezik az itt megadottakkal. A lapcmtr-bejegyzsekben lev hasonl bitek a laptblk, mg a laptbla-bejegyzsek azonos bitjei a lapok cache-selst szablyozzk. A DR7 nyomkvet regiszter LE (8-as) s GE (9-es) bitjeinek llst figyelmen kvl hagyja a processzor, s a trsponton fennakad utastst mindig pontosan jelzi ezek rtktl fggetlenl. 17.6.7 j regiszterek 3 j tesztregiszter ll a felhasznl rendelkezsre a cache tesztelse cljbl. A TR3, TR4 s TR5 regiszterek felptse sajnos nem ismert szmunkra, gy ezek ismertetstl eltekintnk.

17.7 Az Intel Pentium bvtsei


17.7.1 Vltozsok az utastskszletben INT 3 Az egybjtos INT 3 utastsra (0CCh) virtulis mdban nincs hatssal a megszakts-tirnyts (interrupt redirection), ami akkor trtnhetne, ha a CR4 regiszter VME (0-s) bitje be van lltva. Az utasts ltal kivltott 3-as kivtelt (#BP)
327

mindig a vdett md kezel fogja elintzni. A ktbjtos alakra (0CDh, 03h) ez nem vonatkozik. LOCK Ez a prefix a CMPXCHG8B utastssal is hasznlhat, eltte nem okoz 6-os (#UD) kivtelt. MOV dest reg32,TRx MOV TRx,source reg32 A MOV utasts ezen formi mostantl rvnytelenek, mivel a tesztregisztereket eltrltk a Pentium (P5 architektrj) processzortl kezdve. Kiadsuk 6os (#UD) kivtel keletkezst vonja maga utn. POPFD (no op) Vals mdban s vdett mdban CPL=0 esetn a VIF (19-es) s a VIP (20-as) flag-ek mindig kitrldnek. Vdett mdban, ha 0<CPLIOPL, a VIF s a VIP flag-ek ugyancsak mindig kitrldnek. Vdett mdban, ha CPL>0 s CPL>IOPL, nem keletkezik kivtel, s az emltett bitek is vltozatlanok maradnak. Virtulis mdban, ha IOPL=3, a VIF s a VIP flag-ek vltozatlanok maradnak. PUSH CS/DS/ES/FS/GS/SS Ha a veremszegmens cmmret jellemzje 32 bit, olyan duplasz lesz a verembe rakva, amelynek az als szava tartalmazza az adott szegmensregisztert, a fels sz rtke pedig 0000h.

17.7.2 j utastsok CMPXCHG8B source mem64 (CoMPare and eXCHanGe 8 Bytes) Az EDX:EAX regiszterprban lev rtket sszehasonltja a 64 bites memriaoperandussal. Ha a kt rtk megegyezik, az ECX:EBX
328

regiszterpr tartalmt berja a memriaoperandusba, s ZF-et 1-re lltja. Klnben a memriaoperandust eltrolja az EDX:EAX regiszterprban, s ZF=0 lesz. A CF, PF, AF, SF s OF flag-ek rtke vltozatlan marad. Ha operandusknt nem memriahivatkozs szerepel, 6-os (#UD) kivtel keletkezik. CPUID (no op) (CPU IDentification) A processzor pontos tpusnak s az ltala tmogatott szolgltatsok azonostsra szolgl ez az utasts. Az utasts operandus nlkli, de az EAX regiszter vgrehajts eltti rtke hatrozza meg, milyen informcira van szksgnk. Az utasts vgrehajtsa utn az EAX, EBX, ECX s EDX regiszterek tartalmazzk a krt informcikat. EAX=00000000h bemenet esetn EAX tartalmazza majd az a legmagasabb rtket, amit inputknt a CPUID utasts az EAX regiszterben elfogad. Az ECX:EDX:EBX regiszterhrmas a gyrt nevt azonost ASCII szveget tartalmazza. Ez Intel esetn "GenuineIntel", az AMD processzorainl "AuthenticAMD", mg Cyrix prociknl "CyrixInstead". EAX=00000001h bemenet esetn EAX a processzor pontosabb tpust tartalmazza. A 0..3 bitek a stepping-rtket (revziszm), a 4..7 bitek a modellt, mg a 8..11 bitek a processzorcsald azonostjt tartalmazzk. A 12..31 bitek fenntartottak. Az EBX s ECX regiszterek tartalma meghatrozatlan. Az EDX regiszter a processzor ltal tmogatott, modell-specifikus szolgltatsokat (features) sorolja fel.

329

Ez a kt funkci minden P5 s ksbbi architektrj processzor esetn megtallhat, a tbbi ltezse viszont gyrttl fgg. (A dokumentlatlan lehetsgeket trgyal fejezetben emltettk, hogy nhny 80486-os processzor is tmogatta ezt az utastst. Ezek esetben is mindkt emltett funkcinak ktelezen mkdnie kell.) A CPUID utastssal rszletesebben a "Processzorok detektlsa" cm fejezetben foglalkozunk. RDMSR (no op) (ReaD Model-Specific Register) Az ECX regiszterben megadott sorszm modellspecifikus regiszter tartalmt az EDX:EAX regiszterprba tlti. Ez egy privilegizlt utasts. Ha egy nem ltez MSR-t prblunk meg kiolvasni, 13-as kivtel (#GP) keletkezik. RDTSC (no op) (ReaD Time-Stamp Counter) A Time-Stamp Counter regiszter rtkt az EDX:EAX regiszterprba tlti. A TSC a 10h szm MSR, melynek tartalma resetkor nullzdik, s minden raciklus 1-gyel nveli rtkt. Ha a CR4 regiszter TSD (2-es) bitje trlve van, az utasts brmikor vgrehajthat. Ha azonban TSD=1, az utasts csak CPL=0 esetn adhat ki. RSM (no op) (ReSuMe from System Management Mode) Az utasts kiadsval a processzor kilp az SMM zemmdbl, a processzorllapotot visszalltja az SMRAM-bl (System Management RAM), s visszatr a futs elz helyre (CS:IP vagy CS:EIP). Az utastst csak az SMM mdban ismeri fel a processzor, ms mdban kiadva azt az eredmny 6-os kivtel (#UD) lesz. Ha az llapot
330

visszalltsa sorn az elmentett informciban (SMM state dump) valami illeglis van, akkor a processzor shutdown llapotba kerl, ahonnan csak egy hardveres reset bresztheti fel. Hrom f hibaforrs van: az egyik, ha a CR4 regiszter tkrkpben valamelyik fenntartott bit 1-es rtk, a msik, ha a CR0 rvnytelen belltsokat tartalmaz (pl. PE=0 s PG=1, CD=0 s NW=1 stb.). Szintn hibnak szmt, ha a mentsi terlet kezdcme nem oszthat 32768cal. WRMSR (no op) (WRite Model-Specific Register) Az EDX:EAX regiszterpr tartalmt az ECX-ben megadott sorszm MSR-be tlti. Ez az utasts privilegizlt. Ha egy nem ltez MSR-be prblunk meg rni, vagy egy ltez MSR valamelyik fenntartott bitjt belltjuk, 13-as kivtel (#GP) keletkezik.

Az RDMSR s WRMSR utastsok privilegizltak, azaz csak CPL=0 esetn hajthatk vgre. Az RDTSC utasts szintn privilegizltnak viselkedik, ha a CR4 regiszter TSD (2-es) bitjnek rtke 1. Az RSM utasts csak SMM mdban adhat ki. 17.7.3 Vltozsok az architektrban A Pentium-ban mr 8 Kbjt utasts-cache s kln 8 Kbjt adat-cache van. A cache-sor mrete 32 bjt. A cache-ek wtrite-through s writeback mdban is kpesek dolgozni.

331

A 4 Kbjtos lapmret nem idelis, ha egy nagyobb sszefgg terleten helyezkedik el mondjuk a programok kdja (ahogy ez ltalban szoksos is), mivel a sok lap lemezre kivitele vagy onnan beolvassa sok ideig tart. A Pentium processzorok ezrt tmogatjk a lapmret 4 Mbjtra nvelst. Ennek a techniknak Page Size Extension (PSE) a neve. A CPUID utastssal eldnthet, hogy az adott processzor ismeri-e a PSE-t. Elszr az j CR4 regiszter PSE (4-es) bitjt be kell lltanunk. Ha ez megvan, akkor a lapcmtr-bejegyzsek eddig fenntartott 7-es (Page SizePS) bitje hatrozza meg, mi trtnik. Ha PS=0, akkor a bejegyzs egy laptblra mutat, aminek mindegyik bejegyzse egy 4 Kbjtos lap adatai tartalmazza. Ha azonban PS=1, a lapcmtr-bejegyzs kzvetlenl egy 4 Mbjtos lapra fog mutatni. Mivel 1024 lapcmtr-bejegyzs van, gy ugyanennyi db. 4 Mbjtos lap lehet, ami ismtelten kiadja a 4 Gbjtos cmterletet. Mivel a lapcmtr bejegyzseiben kln-kln llthatjuk a PS bitet, 4 Kbjtos s 4 Mbjtos lapokat felvltva is hasznlhatunk. A lapozs ezen fajtja tovbbra is tltsz marad a programok szmra. A 32 bites lineris cm a 4 Mbjtos lapok hasznlatakor ms felpts. A 22..31 bitek tovbbra is a lapcmtr egy bejegyzst vlasztjk ki, ami viszont most egy 4 Mbjtos lapra mutat. A 0..21 bitek tartalmazzk a lapon belli offszetet. A Virtual-8086 Mode virtual interrupt Extension (VME) szolgltats a megszakts-kezels mdszereit bvti ki a virtulis-8086 mdban. Ezt engedlyezni a CR4 regiszter VME (0-s) bitjnek belltsval lehet. Ez a szolgltats a maszkolhat hardver-megszaktsok s a szoftvermegszaktsok kiszolglsra vonatkozik. A hardver ltal

332

kivltott megszaktsok s a kivtelek tovbbra is a vdett md kezelhz futnak be. Elszr nzzk, hogy cselekszik a processzor a maszkolhat hardver-megszaktsok (IRQ0..IRQ15) esetn: Ha VME=0, akkor a megszaktsokat a megszokott mdon kezeli a processzor. Ez azt jelenti, hogy ha IOPL=3, akkor a CLI, STI, POPF, POPFD, PUSHF s PUSHFD utastsok kzvetlenl az IF flag-re vannak hatssal. Ha IOPL<3, 13-as (#GP) kivtel keletkezik. Ha VME=1, a lehetsgek kre tovbb bvl. Ha IOPL=3, nincs vltozs, az emltett utastsok szintn az IF-et befolysoljk. Ha azonban IOPL<3, az EFlags regiszter VIF (19-es) s VIP (20-as) flag-jei letre kelnek. A fent felsorolt utastsok VIF-et fogjk mdostani ill. kiolvasni. A virtulis md taszkokat felgyel vdett md megszakts-kezel ekkor a VIF flag-et megvizsglva dnthet, mi legyen. Ha VIF=1, akkor a hardver-megszaktst a virtulis taszk vagy a CPL=0 szint opercis rendszer kezeljt meghvva lekezelheti. Ha VIF=0, akkor a VIP flag belltsval jelzi, hogy egy fgg hardver-megszakts keletkezett. Ha VIF=0, VIP=1, valamint VME=1, s a virtulis md taszkban kiadunk egy STI utastst, a processzor 13-as kivtelt (#GP) generl, ezzel lehetsget adva a fgg megszakts lekezelsre. Ha VIF=1, VIP=1 s VME=1 egy utasts vgrehajtsa eltt, akkor is ez trtnik. A VIP flag-et a processzor csak olvassa, de sosem mdostja tartalmt kzvetlenl. (Kivteles eset a POPFD utasts, ami kitrlheti a VIF s VIP flag-eket, ha CPL 3.) A szoftver-megszaktsok (teht az INT utasts ltal kivltott megszaktsok) kezelse sokkal sszetettebb. A processzor 6 klnbz mdon kpes ezeket a megszaktsokat kiszolglni. Hogy melyik mdszert vlasztja, az hrom dologtl fgg. Elszr is a CR4 regiszter VME bitjnek llsa hatrozza meg, a klasszikus vagy az j mdszert kell-e alkalmazni.
333

Msrszt az EFlags regiszter IOPL mezjnek rtke befolysolja, mit tegyen a processzor. A harmadik tnyez egy jdonsg, neve pedig megszakts-tirnyt bittrkp (software interrupt redirection bit map). Ez egy 32 bjtos terlet, ami a virtulis taszkok I/O-engedlyez bittrkpe (I/O permission bit map) eltt helyezkedik el kzvetlenl. A 32 bjtnak mindegyik bitje egy-egy szoftver-megszaktsra van hatssal. A 0. bjt 0. bitje az INT 00h-hoz tartozik, mg a 31. bjt 7. bitje az INT 0FFh lekezelst befolysolja. Ha a krdses megszaktshoz tartoz bit rtke 1 a megszakts-tirnyt bittrkpben, a megszaktst a megszokott mdon, a vdett md kezel szolglja ki az IDT-n keresztl, ami azutn meghvhatja a virtulis taszk sajt kezeljt is. Ha azonban ez a bizonyos bit trlve van, a megszakts a vdett md kezelt kihagyva kzvetlenl a virtulis md kezelhz irnytdik. A kvetkez tblzat mutatja az emltett bitek s flag-ek kombincijbl ered mdszereket: VME IOPL 0 3 0 <3 1 <3 1 3 1 3 1 <3 tir. bit 1 1 0 0 Mdszer 1 2 3 4 5 6

Az egyes mdszerek a kvetkezket teszik: 1) A megszaktst a vdett md kezel szolglja ki: 0-s szint veremre vlt a 0-s verembe rakja a GS, FS, DS, ES regisztereket trli a GS, FS, DS, ES regiszterek tartalmt a 0-s verembe rakja SS, ESP, EFlags, CS, EIP tartalmt trli a VM s TF flag-eket
334

2) 3) 4) 5)

6)

ha megszaktskapun (interrupt gate) keresztl trtnik a kiszolgls, IF-et trli CS:EIP-t belltja a kezel cmre a kapubl A 13-as kivtel (#GP) vdett md kezelje hvdik meg. A 13-as kivtel (#GP) vdett md kezelje hvdik meg. A VIF s VIP flag-eket hasznlni lehet a maszkolhat hardver-megszaktsok kiszolglsra. Megegyezik az 1-es mdszerrel. A megszaktst a virtulis md kezel szolglja ki: a verembe rakja az EFlags tartalmt gy, hogy NT=0 s IOPL=0 a msolatban a verembe rakja a CS, IP regiszterek tartalmt trli az IF s TF flag-eket CS:IP-t belltja a virtulis taszk megfelel megszakts-vektorbl A megszaktst a virtulis md kezel szolglja ki, s a VIF s VIP flag-eket is hasznlni lehet a maszkolhat hardver-megszaktsok kiszolglsra: a verembe rakja az EFlags tartalmt gy, hogy IOPL=3 s IF=VIF a msolatban a verembe rakja a CS, IP regiszterek tartalmt trli az VIF s TF flag-eket CS:IP-t belltja a virtulis taszk megfelel megszakts-vektorbl

A Protected mode Virtual Interrupt extension (PVI) szolgltats a maszkolhat hardver-megszaktsok (IRQ0.. IRQ15) kezelst bvti ki az elbb ismertetett mdszerrel a vdett mdban. Ezt engedlyezni a CR4 regiszter PVI (1-es) bitjnek belltsval lehet. Fontos, hogy itt csak a vdett mdrl van sz, a virtulis mdra ez a szolgltats nem vonatkozik. Ezrt felttelezzk, hogy VM=0 az EFlags-ben. Szintn fontos tudni, hogy ez a szolgltats csak a maszkolhat
335

hardver-megszaktsok kiszolglsra van hatssal. A szoftvermegszaktsok, a hardver ltal kivltott megszaktsok s a kivtelek az eddig megszokott mdon lesznek lekezelve. Ha PVI=0, IOPL=3, vagy CPL<3, akkor a CLI s STI utastsok a megszokott mdon mkdnek. Teht ha CPL=0, az utastsok tlltjk IF-et. Ha CPL>0 s CPLIOPL, ugyancsak IF rtke vltozik meg. Ha CPL>0 s CPL>IOPL, 13-as kivtel (#GP) keletkezik. Ha PVI=1, CPL=3 s IOPL<3, a helyzet hasonl a VME=1 s virtulis md taszkok esetn lertakhoz. Ekkor a CLI s STI utastsok a VIF flag-et mdostjk IF helyett. Tovbb a megszakts-kezelnek lehetsge van a VIF flag alapjn a VIP belltsra (ha VIF=0). Ha VIF=1 s VIP=1, vagy VIF=0, VIP=1 s a 3-as szint taszk kiadja az STI utastst, 13-as kivtel keletkezik. A kivtel-kezel ilyenkor kiszolglhatja a fggben lev megszaktst. A PUSHF, PUSHFD, POPF, POPFD, IRET s IRETD utastsokra ez a szolgltats nincs hatssal, a VME-tl eltren. A Debugging Extensions (DE) szolgltats lehetv teszi I/O trspontok megadst. A CR4 regiszter DE (3-as) bitjt bekapcsolva engedlyezhetjk ezt. A DR4 s DR5 regiszterekre val hivatkozs ilyenkor illeglisnak szmt. Cserbe viszont a DR7 regiszter R/W mezjben az eddig fenntartott 10b belltssal egy olyan trspontot adhatunk meg, ami portok megadott tartomnyra rskor vagy onnan olvasskor 1-es kivtelt (#DB) vlt ki. A tartomny kezdett a DR0..DR3 regiszterek valamelyiknek als 16 bitje tartalmazza, mg a tartomny hosszt a DR7 regiszter megfelel LEN mezjnek rtke hatrozza meg.

336

A Pentium processzor tudsa mr a korbbi processzorok tudsnak sokszorosa. A rengeteg funkci egy rszt specilis regisztereken, a modell-specifikus regisztereken (Model-Specific RegisterMSR) keresztl rhetjk el, ill. ezeken keresztl szablyozhatjuk azok mkdst. Ezek olyan 64 bites trolhelyek, amiket csak rendszerutastsok segtsgvel olvashatunk s rhatunk. MSR-be rni a WRMSR, onnan olvasni az RDMSR utastssal lehet. Az Intel gy definilta az MSR-eket, hogy ezek tnylegesen egy adott processzormodellhez tartoznak, s semmi (senki) sem garantlja, hogy mondjuk egy processzorcsald ksbbi modelljei ismerni fogjk az eldk MSR-jeit. Az MSR-ek clja igen sokfle lehet: nhny MSR a cache s a TLB tesztelst segti, msok a nyomkvetst (debugging) tmogatjk. Nhny specilis cl MSR-t mi is bemutatunk a kvetkez bekezdsekben. Mivel az MSR-ek nagy rsze a rendszerprogramozknak, hardverfejlesztknek szl, nem foglalkozunk velk rszletesebben. A Performance-Monitoring Counters (PMCs) olyan MSRek, amikkel a processzoron bell elfordul esemnyek, folyamatok elfordulsainak szmt vagy idtartamukat mrhetjk, szmllhatjuk meg. A kapott adatokat a programok vagy a rendszer teljestmnynek nvelsre hasznlhatjuk fel pldul. 3 MSR tmogatja ezt a szolgltatst: 1 MSR segtsgvel llthatk be a figyelni kvnt esemnyek, mg 2 fggetlen szmll a kvnt esemnyek elfordulsi szmt avagy rajelekben mrt idtartamt mri. A Pentium 42 klnfle esemnyt kpes figyelni, a Pentium MMX pedig mg 18 egyb esemnyt kpes szmolni vagy mrni.

337

A Time-Stamp Counter (TSC) egy olyan MSR, amelynek tartalmt resetkor trli a processzor, majd onnantl kezdve rtke minden rajel-ciklus alatt 1-gyel n. Az Intel dokumentcija garantlja, hogy a 64 bites TSC rtke annak resetelse utn 10 ven bell nem fog tlcsordulni. A TSC olvassra az RDTSC utasts hasznlhat. Br a Pentium-on MSR-knt van megvalstva ez a szmll (mghozz a 10h szm MSR-rel), az Intel szerint nem ajnlott a TSC-t az RDMSR utastssal olvasni, mivel elkpzelhet, hogy a ksbbi processzorok nem fogjk tmogatni ezt. A biztos mdszer az RDTSC hasznlata, miutn a CPUID utastssal megbizonyosodtunk a TSC tmogatottsgrl. Ha a TSC-be mint MSR-be a WRMSR utastssal adatot runk, a TSC tartalma kinullzdik. A Pentium processzor sok szolgltatsnak clja a tbbprocesszoros rendszerek (multiple-processor systems) biztonsgos, hatkony mkdsnek biztostsa. Ilyen pldul a buszlezrs megfelel alkalmazsa, a klnbz processzorokban lev cache-sek tartalmnak sszehangolsa, szablyozott memriahozzfrsek, valamint a megszaktsok kzpontostott lekezelse s sztosztsa a processzorok kztt. Az utbbi problmakrt fedi le a tovbbfejlesztett programozhat megszakts-vezrl (Advanced Programmable Interrupt ControllerAPIC). Az APIC kt alapvet feladatot lt el: Feldolgozza a kvlrl rkez s a szoftver ltal generlt megszaktsokat. Tbbprocesszoros rendszerek esetn az alaplapon tallhat kls APIC eszkzzel kommunikl, ami azutn a rendszertl s a processzoroktl szrmaz megszaktsokat sszegyjti, majd sztosztja azokat a processzorok kztt.

338

Megklnbztets cljbl a processzoron lev APIC egysget helyi APIC-nak (local APIC), az alaplapon lev kls egysget pedig I/O APIC-nak nevezi a szakirodalom. A helyi APIC jelenltt a CPUID utastssal ellenrizhetjk, mg az I/O APIC a tbb processzort tmogat alaplapok chipkszletben biztosan benne van. A helyi APIC az I/O APIC-kal egy kln e clra dediklt buszon (APIC bus) kommunikl. A helyi APIC-ot a memria bizonyos cmein elhelyezked, .n. memriba lekpezett regisztereken (memory-mapped registers) keresztl programozhatjuk. Alapesetben ez a 0FEE00000h-0FEE01000h tartomnyt jelenti, de a regiszterek thelyezhetk egy tetszleges olyan cmre, ami 4096-tal oszthat. A processzorban s az alaplapi eszkzkben, erforrsokban keletkez hardverhibk jelzsre s megfelel lekezelsre a Pentium processzor tmogatja a Machine Check kivtelt (#MC, 18-as). Ha valamely eszkz vagy maga a processzor egy slyos hibt szlel, akkor kt dolgot tehet. Ha a CR4 regiszter MCE (6-os) bitje 1-es rtk, akkor 18-as kivtel keletkezik. Ez a kivtel abort tpus, gy az ppen fut program vagy taszk llapota nem llthat vissza. Ha MCE=0, a processzor shutdown llapotba kerl (ez trtnik pl. a tripla hiba keletkezse esetn is). Az #MC kivtel lekezelse s annak kivlt okai implementci-specifikusak, gy a ksbbi processzorok nem fogjk felttlenl azonos mdon kezelni ezt a szolgltatst. A P6 architektrban az MCE tovbbfejlesztsnek tekinthet az MCA (Machine Check Architecture). 17.7.4 j zemmdok

339

A System Management Mode (SMM) egy olyan specilis cl zemmd, amit kifejezetten rendszerfunkcik, mint pl. teljestmny-szablyozs (power management), hardvervezrls (hardware control), mkds felfggesztse (suspend) stb. megvalstsra fejlesztettek ki. Az SMM md a processzor tbbi zemmdjtl fggetlenl ltezik, s feladatnak megfelelen az alkalmazsok, st mg az opercis rendszer szmra is teljesen tltszan teszi lehetv az emltett tevkenysgek elvgzst. Az egyetlen lehetsg az SMM mdba vltsra az, hogy a processzor az SMI# kivezetsn vagy az APIC-buszon keresztl egy specilis megszaktst, System Management Interrupt-ot (SMI) kap. Az SMI egy nem maszkolhat, kls hardvermegszakts, s nagyobb precedencij mint az NMI vagy a maszkolhat hardver-megszaktsok. Ha SMM mdban van a processzor, a tovbbi SMI-k fogadsa le van tiltva, teht az SMM nem jrabelphet (nonreentrant) zemmd. Az SMM-be lpskor a processzor egy j mkdsi krnyezetbe vlt t. Ezt a terletet System Management RAMnak (SMRAM) nevezik. Az aktulisan fut taszk vagy program llapott elmenti ennek a terletnek egy kijellt rszre (ez az SMM state dump), majd elkezdi az SMI-kezel program kdjnak vgrehajtst. Ha ez befejezte feladatt, az RSM utasts vgrehajtsval a processzor visszalltja a korbbi krnyezetet, majd folytatja a megszaktott program vagy taszk vgrehajtst. Fontos megjegyezni, hogy brmilyen zemmdban is legyen a processzor (vals, vdett vagy virtulis-8086), az SMI hatsra mindig SMM-be vlt t. Az SMM mdot csak az RSM utasts kiadsval lehet elhagyni. Ezt az utastst ms zemmdban nem ismeri fel a processzor, gy 6-os kivtellel (#UD) reagl vgrehajtsra. Az SMRAM terlett a fizikai cmterlet egy adott tartomnyra kpezik r. Az SMRAM nagysga minimum 32 Kbjt, maximum 4 Gbjt lehet, alapesetben pedig 64 Kbjt. A
340

terlet kezdcme (amit SMBASE-nek neveznek) vltoztathat, alaprtke pedig a 00030000h fizikai cm. A processzor llapota az (SMBASE+0FE00h)..(SMBASE+0FFFFh) terletre lesz elmentve, mg az SMI-kezelt az (SMBASE+8000h) cmtl kezdi vgrehajtani. Az SMRAM-ba sok mindent elment a processzor az SMM-be lpskor, de a kvetkezt llapotokat nem: DR0..DR3 regiszterek FPU regiszterek CR2 regiszter MTRR-ek MSR-ek tesztregiszterek (TR3..TR7) APIC megszakts-llapota Szintn nem lesznek elmentve egyb, modell-specifikus funkcik llapotai, mint pl. a Pentium Pro MCA-regiszterei. A TSC (Time-Stamp Counter) s a PMC-k (Performance-Monitoring Counter) tartalmt termszetknl fogva nem lehet visszalltani az SMM-bl visszatrskor. Az SMM-mdban a futsi krnyezet hasonl a valscmzs mdhoz, mivel a CR0 regiszterben PE=0 s PG=0 belltsok lesznek. A kvetkezk a fbb eltrsek a vals mdhoz kpest: a megcmezhet memria terlete 4 Gbjt (a P6 architektrban tmogatott PAE nem mkdik) a szegmensek hatra a megszokott 64 Kbjt helyett 4 Gbjtra ll be az operandusmret s a cmmret is 16 bit, viszont prefixekkel lehetv vlik 32 bites operandusok, 32 bites effektv cm s 32 bites cmzsi mdok hasznlata a maszkolhat hardver-megszaktsok, NMI, kivtelek, SMI, trspontok, single-step csapdk keletkezse tiltott

341

Ha szksges, az IDT megfelel felptsvel, majd az IDTR regiszter belltsval a szoftver-megszaktsok, a kivtelek s a maszkolhat hardver-megszaktsok hasznlhatv vlnak. Az NMI-k kezelse ugyan tiltva van, de az IRET, IRETD utastsok vgrehajtsakor a fgg NMI krseket kiszolglja a processzor. 17.7.5 Vltozsok a kivtel-kezelsben 1-es kivtel (#DB) keletkezsnek okait a Debugging Extensions szolgltats ltal a kvetkez felttellel kibvtettk: I/O olvass vagy rs trspont trap A felttel csak akkor rvnyes, ha a CR4 regiszter DE (3-as) bitje be van lltva. 6-os kivtel (#UD) a kvetkez felttelek valamelyiknek fennllsakor is keletkezik: a DR4 vagy DR5 regisztert gy prbltuk meg elrni, hogy a CR4 regiszter DE (3-as) bitje be volt lltva az RSM utastst gy prbltuk meg vgrehajtani, hogy nem SMM mdban voltunk egy MMX utastst prbltunk meg vgrehajtani egy olyan processzoron, ami nem tmogatja az Intel MMX technolgit egy MMX utastst prbltunk meg vgrehajtani gy, hogy a CR0 regiszter EM (2-es) bitje be volt lltva Az utbbi felttel csak a Pentium MMX processzorokra vonatkozik. 7-es kivtel (#NM) Pentium MMX processzorok esetn a kvetkez felttel esetn is keletkezik: egy MMX utastst hajtottunk vgre gy, hogy a CR0 regiszter TS (3-as) bitje be volt lltva
342

13-as kivtel (#GP) a kvetkez felttelek esetn is generldik: valamely specilis cl regiszter (mint pl. CR4, CR3/PDBR, MXCSR stb.) egy fenntartott bitjbe 1-et prbltunk meg rni nem ltez MSR-be akartunk rni vagy onnan olvasni egy ltez MSR fenntartott bitjbe prbltunk meg 1-et rni A laphiba (14-es, #PF) kivtel hibakdja egy j bitet kapott: Bitpozci Nv 0 P 1 R/W 2 U/S 3 RSVD 4..15 Az j RSVD bit 1 rtke jelzi, ha a hiba azrt keletkezett, mert a lapcmtr (page-directory) vagy egy laptbla (pagetable) egyik bejegyzsben valamelyik fenntartott bit 1-es rtk volt, mikzben a CR4 regiszter PSE (4-es) bitje be volt lltva. 17.7.6 j kivtelek Szm Mnemo Nv 18 #MC Machine Check Tpus Kivlt felttelek Abort Modelltl fgg

A 18-as kivtel keletkezse gpi hiba, buszhiba vagy valamely kls, alaplapi eszkz ltal szlelt slyos hiba detektlst jelenti. A kivtel kivlt okai s a kivtel lekezelsnek mdja processzormodelltl fggek, ezek implementcija
343

esetleg ms lehet a ksbbi architektrkban. Hibakd nem kerl a verembe, a hiba jellemzst e clra fenntartott MSR-ek tartalmazzk. A kivtel abort tpus, a veremben lev CS:IP/EIP msolat ltal mutatott utasts pedig ltalban nincs kapcsolatban a hibval. A megszaktott program vagy taszk ltalban NEM indthat jra. 17.7.7 Vltozsok a regiszterkszletben Az EFlags regiszter 3 j flag-et kapott: Bitpozci Nv 19 VIF 20 VIP 21 ID A VIF (Virtual Interrupt Flag) s VIP (Virtual Interrupt Pending) flag-ek a processzor VME s PVI szolgltatsnak hasznlatakor jtszanak szerepet, mkdsket ezrt lsd azok lersnl. Ha az ID (processor IDentification) flag llapota llthat, az adott processzor tmogatja a CPUID utasts hasznlatt. A CR0 regiszter CD s NW bitjeit a 80486-ostl eltren rtelmezi a Pentium: CD NW Kvetkezmny 0 0 Cache engedlyezve, WB 0 1 1 0 Cache korltozva, WB 1 1 Cache korltozva A WB jells a WriteBack kifejezst rvidti, s annyit takar, hogy a mdostott adatok elszr mindig a cache-be kerlnek be. Ha a rendszerbusz szabadd vlik, a processzor elvgzi a korbban csak a cache-be rt adatok memriban val

344

frisstst, mghozz nem egyenknt, hanem csoportosan. Ez a WT tpus cache-kezelsnl optimlisabb megoldst nyjt. A CR3 regiszterben, a lapcmtr- s a laptblabejegyzsekben lev PWT s PCD biteket szintn eltren rtelmezi a processzor: PCD PWT Kvetkezmny 0 0 WB cache-sels 0 1 WT cache-sels 1 0 Nincs cache-sels 1 1 Nincs cache-sels Ha a CR4 regiszter DE (3-as) bitje be van kapcsolva, nhny nyomkvetsi funkci mskppen mkdik: a DR4 s DR5 regiszterekre val hivatkozs 6-os (#UD) kivtelt okoz a DR0..DR3 regiszterek tartalmt egy 16 bites portszmnak rtelmezi a processzor, ha az adott trspont tpusa szerint I/O-trspont (a fels sznak 0000h-nak kell lennie) a DR7 regiszter R/W0, R/W1, R/W2 s R/W3 mezit eltren rtelmezi a processzor, amint ezt a kvetkez tblzat is mutatja R/W 00 01 10 11 Trspont felttele Csak utasts-vgrehajts Csak adat rsa Port olvassa (input) vagy rsa (output) Adat olvassa vagy rsa, de nem utastsvgrehajts

A DR6 s a DR7 regiszter 12-es bitjeit ezentl nem llthatjuk be, ezek tartalma mindig 0 lesz.
345

A tesztregisztereket (TR3..TR7) eltrltk a Pentium processzortl kezdve, helyket nhny MSR vette t. A rjuk val hivatkozs 6-os kivtelt (#UD) vlt ki. 17.7.8 j regiszterek Az architektrban trtnt sok jts, funkci engedlyezsre s vezrlsre szolgl egy j vezrlregiszter, a CR4 regiszter. A tbbi trshoz hasonlan ennek hasznlata is privilegizlt. Felptse a kvetkez tblzatban lthat: Bitpozci Jells Nv 0 VME Virtual Mode virtual int. Extension 1 PVI Protected mode Virtual Interrupts 2 TSD Time-Stamp instruction Disable 3 DE Debugging Extensions 4 PSE Page Size Extension 6 MCE Machine Check exception Enable 5,7..31 A VME, PVI, DE, PSE s az MCE bitek a mr emltett, azonos nev szolgltatsokat engedlyezik, ha rtkk 1, ill. tiltjk le, ha trlve vannak. Ha TSD=0, az RDTSC utasts brmikor kiadhat. Ha viszont TSD=1, az utasts privilegizltt vlik, azaz csak CPL=0 esetn hajthat vgre, mert klnben 13-as (#GP) kivtel fog keletkezni. Reset utn ez a bit trlve van, erre rdemes odafigyelni. Az 5 s 7..31 szm bitek fenntartottak. Ezeket a biteket ne lltsuk be, mert ezzel a jv processzoraival val kompatibilitst veszlyeztetjk. Az RSM utasts klnsen rzkeny ezeknek a biteknek az llapotra.

346

A Pentium MMX processzoron 8 j MMX regiszter is megjelent, ezek az MM0..MM7 neveken rhetk el. Ezekrl a kvetkez, az MMX technolgit trgyal fejezetben lesz sz.

17.8 Az Intel MMX technolgija


Az MMX technolgia egynl tbb egsz operanduson kpes egyszerre ugyanazt a mveletet elvgezni. Ennek tmogatsra j adatszerkezetek jelentek meg: pakolt bjtok, szavak, duplaszavak (packed bytes, words, doublewords), valamint kvadrasz (quadword). Ezek megrsre nzznk egy pldt! Ha sszeadunk kt, pakolt bjtokat tartalmaz operandus, akkor az eredmny szintn pakolt bjtokat fog tartalmazni. gy teht egyszerre 8 szmprt adtunk ssze, s a 8 eredmnyt egyetlen utastssal kaptuk meg. A 64 bites kvadrasz tpust eddig mg nem hasznltuk, mivel mindegyik processzor regiszterei 16 vagy 32 bitesek. Az MMX technolgia ezrt 8 db. 64 bites adatregisztert is bevezetett, ezeket sorban MM0, MM1, , MM7-nek nevezzk. Mindegyik regiszter kzvetlenl elrhet, s csak adattrolsra s MMX mveletek operandusaknt hasznlhat. A visszafele kompatibilits miatt az MMX regiszterek a koprocesszor adatregisztereinek mantissza rszre (0..63 bitek) vannak rkpezve. Ez azt jelenti, hogy az MM0 regiszter tartalma a fizikailag 0-adik FPU regiszterben (FPR0) van, ami azonban csak akkor egyezik meg ST(0)-val, ha TOS=0. Az MMX utastsok a kvetkez mdon befolysoljk a koprocesszor llapott: az EMMS utastst kivve mindegyik MMX utasts trli az FPU tag-regiszter tartalmt, ezzel mindegyik FPU adatregisztert rvnyesnek jellve be
347

az EMMS utasts 0FFFFh-t tlt az FPU tag-regiszterbe, ezzel mindegyik FPU adatregisztert resnek jell be mindegyik MMX utasts TOS rtkt 000b-ra lltja ha egy MMX utasts adatot tlt be egy MMX regiszterbe (MM0..MM7), az adott regiszterhez tartoz fizikai FPU adatregiszter 64..79 bitjeit (exponens s eljelbit) csupa 1-re lltja Az MMX regiszterek ilyen elhelyezse valban leegyszersti az opercis rendszer dolgt, mivel annak elg csak az FPU llapott elmentenie (az FSAVE vagy FNSAVE utastsokkal), mert ezzel egyttal az MMX llapotot is elmenti. Azonban problmt vagy inkbb knyelmetlensget is okozhat ez a megolds (mrmint az MMX regiszterek keverse az FPU regiszterekkel), mivel mr emltettk, hogy az EMMS-t kivve az sszes MMX utasts rvnyesnek jelli be a koprocesszor adatregisztereit. ppen e miatt nem ajnlott koprocesszor utastsok keverse MMX utastsokkal. A javasolt megolds az lehet, hogy az MMX utastsokat tartalmaz blokkot egy EMMS utastssal zrjuk le, utna mr nyugodtan hasznlhatjuk az FPU-t. Az j adattpusok felptse az albbi brrl leolvashat:

Egy MMX regiszterben teht 8 db. bjt, 4 db. sz vagy 2 db. duplasz operandus lehet egymstl fggetlenl, de tekinthetjk az egsz regisztert egyetlen kvadrasznak is. Az MMX utastsokra jellemz, hogy a mvelet eredmnyt vagy eredmnyeit nem jelzik a flag-ekben, gy
348

pldul tvitel sem keletkezik a CF-ben. Aritmetikai kivtelt szintn nem generl egyetlen MMX utasts sem. Az aritmetika tpusairl is szljunk nhny mondatot. A wrap-around aritmetika ugyanazt csinlja, amit az egsz aritmetiks utastsok (ADD, ADC, SUB, SBB, INC, DEC stb.), teht csak az eredmny tvitel nlkli rszt tartjk meg. A telt aritmetika annyiban klnbzik ettl, hogy ha a mvelet elvgzse utn tvitel keletkezik, akkor az eredmny a lehet legkisebb avagy legnagyobb szm rtke lesz attl fggen, hogy melyik hatron csszott t az eredeti eredmny. A hatrok a szmok szoksos brzolsi tartomnyainak als s fels korltai: eljeles esetben -128..+127, -32768..+32767 s -2147483648..+2147483647, mg eljeltelen operandusok alkalmazsakor 0..+255, 0..+65535 s 0..+4294967295 attl fggen, hogy bjtosak, szavasak vagy duplaszavasak az operandusok. Sok utasts kpes ugyanazt a mveletet elvgezni pakolt bjtokon, szavakon vagy duplaszavakon, az operandusok tpusra ilyenkor a mnemonik utal (BByte, WWord, D Doubleword, QQuadword). Szintn a mnemonik mutatja a hasznlt aritmetika jellegt is: eljeles krbeforg (signed wraparound), eljeltelen telt (Unsigned SaturatingUS), eljeles telt (Signed Saturating arithmeticSS, S). Negatv rtkek trolsra a mr megszokott kettes komplemens alakot hasznljk az MMX utastsok, ami lehetv teszi, hogy ugyanazt a gpi kdot alkalmazzuk eljeles s eljeltelen wrap-around aritmetika esetn is. A ktoperandus utastsokra fennll az a mr megszokott tulajdonsg, hogy az els operandus a cl (nhny esetben forrs is), mg a msodik operandus a forrs. Az adatmozgat MMX utastsokat leszmtva minden ms esetben teljeslnie kell az operandusokra, hogy a cl csak egy MMX regiszter lehet, mg a forrs helyre MMX regiszter vagy memriahivatkozs kerlhet. Az adatmozgat utastsoknl
349

azonban mind a cl, mind a forrs lehet egy 32 bites ltalnos cl regiszter, MMX regiszter vagy memriahivatkozs is. Prefixeket csak a kvetkez megktsekkel hasznlhatunk MMX utastsokkal: szegmensfellbrl (segment override; 26h, 2Eh, 36h, 3Eh, 64h, 65h) s cmhossz (address size; 67h) prefix brmelyik MMX utasts eltt megengedett, az operandushossz (operand size; 66h) s a sztringutastst ismtl (string instruction repeat; 0F2h, 0F3h) prefixek hasznlata fenntartott, mg a buszlezr (bus lock; 0F0h) prefix minden esetben 6-os kivtelt (Invalid/Undefined Opcode#UD) generl. Ha egy MMX utasts kiadsakor a CR0 regiszter EM bitje be van lltva, szintn 6-os kivtel keletkezik. Az albbiakban olvashat az MMX utastsok jellemzse: a mnemonik utn lthat az operandusok tpusa, a mnemonik jelentse angolul, majd az utasts mkdsnek lersa kvetkezik. A PACK kezdet mnemonikokat leszmtva az els "P" bet utal arra, hogy az adott utasts pakolt tpus operandusokat hasznl. A kvetkez jellseket alkalmaztuk: (no op) nincs operandus source forrs; mmreg/mem64 lehet dest cl (destination); mmreg lehet reg/mem32 32 bites ltalnos regiszter vagy memriaoperandus mmreg az MM0, MM1, , MM7 regiszterek valamelyike mmreg/mem64 MMX regiszter vagy 64 bites memriaoperandus 17.8.1 Adatmozgat utastsok MOVD mmreg,reg/mem32 MOVD reg/mem32,mmreg (MOVe Doubleword to/from MMX register)
350

A forrst tmsolja a cl terletre. Ha a cl az MMX regiszter, akkor a forrs zr-kiterjesztssel lesz tmsolva. Ha a forrs az MMX regiszter, akkor annak az als duplaszavt msolja a clba. MOVQ mmreg,mmreg/mem64 MOVQ mmreg/mem64,mmreg (MOVe Quadword to/from MMX register) A forrst bemsolja a clba.

17.8.2 Konverzis utastsok PACKSSWB dest, source (PACK Words into Bytes, Signed with Saturation) PACKSSDW dest, source (PACK Doublewords into Words, Signed with Saturation) PACKUSWB dest, source (PACK Words into Bytes, Unsigned with Saturation) A PACKSSWB a forrsban s a clban lev 8 db. eljeles szt 8 db. bjtra telti, majd azokat a clban eltrolja. A PACKSSDW a forrsban s a clban lev 4 db. eljeles duplaszt 4 db. szra telti, majd azokat a clban eltrolja. Vgl a PACKUSWB a forrsban s a clban lev 8 db. eljeltelen szt 8 db. bjtra telti, majd azokat a clban eltrolja. A forrs operandus teltett bjtjai/szavai az eredmny als rszbe kerlnek. Ez pl. a PACKSSWB esetben a kvetkezket jelenti: az eredmny 0..7 bitjeibe a forrs 0..15 bitjeinek teltett rtke kerl, a 8..15 bitekbe a forrs 16..31 bitjeinek teltett rtke rdik, , a 32..39 bitek a cl 0..15 bitjeinek teltett rtkt tartalmazzk, stb. PUNPCKHBW dest,source
351

(UNPaCK High-order Bytes of Words) PUNPCKHWD dest,source (UNPaCK High-order Words of Doublewords) PUNPCKHDQ dest,source (UNPaCK High-order Doublewords of Quadwords) A forrs s a cl fels bjtjait, szavait vagy duplaszavait felvltva az eredmnybe rjk, majd azt a cl terletn eltroljk. A sorrend a kvetkez: egy elem a clbl, egy a forrsbl, a kvetkez elem a clbl, majd egy a forrsbl, stb. gy pl. a PUNPCKHBW esetn az eredmny 0..7 bitjeibe a cl 32..39 bitjei kerlnek, a 8..15 bitek a forrs 32..39 bitjeit tartalmazzk, a 16..23 bitekbe a cl 40..47 bitjei rdnak stb. PUNPCKLBW dest,source (UNPaCK Low-order Bytes of Words) PUNPCKLWD dest,source (UNPaCK Low-order Words of Doublewords) PUNPCKLDQ dest,source (UNPaCK Low-order Doublewords of Quadwords) A forrs s a cl als bjtjait, szavait vagy duplaszavait felvltva az eredmnybe rjk, majd azt a cl terletn eltroljk. A sorrend a kvetkez: egy elem a clbl, egy a forrsbl, a kvetkez elem a clbl, majd egy a forrsbl, stb. gy pl. a PUNPCKLBW esetn az eredmny 0..7 bitjeibe a cl 0..7 bitjei kerlnek, a 8..15 bitek a forrs 0..7 bitjeit tartalmazzk, a 16..23 bitekbe a cl 8..15 bitjei rdnak stb.

17.8.3 Pakolt aritmetikai utastsok PADDB dest,source (ADD Bytes, wrap-around)


352

PADDW dest,source (ADD Words, wrap-around) PADDD dest,source (ADD Doublewords, wrap-around) PADDSB dest,source (ADD Bytes, Signed with saturation) PADDSW dest,source (ADD Words, Signed with Saturation) PADDUSB dest,source (ADD Bytes, Unsigned with saturation) PADDUSW dest,source (ADD Words, Unsigned with Saturation) sszeadjk a forrsban s a clban lev elemeket egyenknt, az eredmnyeket egy 64 bites tpusba pakoljk, majd eltroljk a cl regiszterbe. Az sszeads trtnhet eljeles s eljeltelen operandusokon is, s mindkt esetben lehet krbeforg s telt aritmetikt is hasznlni. PSUBB dest,source (SUBtract Bytes, wrap-around) PSUBW dest,source (SUBtract Words, wrap-around) PSUBD dest,source (SUBtract Doublewords, wrap-around) PSUBSB dest,source (SUBtract Bytes, Signed with saturation) PSUBSW dest,source (SUBtract Words, Signed with saturation) PSUBUSB dest,source (SUBtract Bytes, Unsigned with saturation) PSUBUSW dest,source (SUBtract Words, Unsigned with saturation) Kivonjk a clban lev elemekbl a forrsban lev elemeket egyenknt, az eredmnyeket egy 64 bites
353

tpusba pakoljk, majd eltroljk azt a cl regiszterbe. Az sszeads trtnhet eljeles s eljeltelen operandusokon is, s mindkt esetben lehet krbeforg s telt aritmetikt is hasznlni. PMULHW dest,source (MULtiply signed Words, and store High-order words of results) sszeszorozza a forrsban s a clban lev eljeles szavakat, az eredmnyek fels szavt bepakolja egy 64 bites tpusba, majd eltrolja azt a clba. PMULLW dest,source (MULtiply signed Words, and store Low-order words of results) sszeszorozza a forrsban s a clban lev eljeles szavakat, az eredmnyek als szavt bepakolja egy 64 bites tpusba, majd eltrolja azt a clba. PMADDWD dest,source (Multiply signed Words, and ADD the resulting Doublewords) sszeszorozza a forrsban s a clban lev eljeles szavakat, ennek eredmnye ngy eljeles duplasz lesz. Ezutn a fels ngy szbl kpzdtt kt duplaszt sszeadja, s az sszeget bepakolja az eredmny fels felbe. Hasonlan az als ngy sz kt szorzatt sszeadja, az sszeg az eredmny als felbe kerl. Vgl az eredmnyt eltrolja a cl regiszterbe.

17.8.4 sszehasonlt utastsok PCMPEQB dest,source (CoMPare Bytes for EQual) PCMPEQW dest,source (CoMPare Words for EQual)
354

PCMPEQD dest,source (CoMPare Doublewords for EQual) PCMPGTB dest,source (CoMPare signed Bytes for Greater Than) PCMPGTW dest,source (CoMPare signed Words for Greater Than) PCMPGTD dest,source (CoMPare signed Doublewords for Greater Than) sszehasonltjk a forrsban lev elemeket a clban levkkel (teht a forrs elemeket kivonjk a cl elemekbl), majd az eredmnyeknek megfelelen kitltik a cl elemeket: ha a megadott felttel teljesl (azaz a kt elem egyenl, vagy a cl elem nagyobb a forrs elemnl), akkor a cl elembe 111b kerl, klnben pedig 000b lesz a cl elem rtke. gy pl. ha a cl operandus rtke 0EEEEEEEE22222222h, a forrs operandus pedig 3333333322222222h, akkor a PCMPEQD s a PCMPGTD utastsok eredmnye sorban 00000000FFFFFFFFh s 0000000000000000h lesz.

17.8.5 Logikai utastsok PAND dest,source (bitwise logical AND) PANDN dest,source (bitwise logical AND plus NOT) POR dest,source (bitwise logical OR) PXOR dest,source (bitwise logical eXclusive OR) A forrs s a cl operandusok mint 64 bites szmok kztt vgeznek bitenknt valamilyen logikai mveletet, majd az eredmnyt a cl operandusba
355

rjk. A PANDN kicsit szokatlan utasts, ugyanis a cl egyes komplemenst hozza a forrssal logikai S kapcsolatba. 17.8.6 Shiftel utastsok PSLLW/PSLAW dest,count (Shift Words Logical/Arithmetical Left) PSLLD/PSLAD dest,count (Shift Doublewords Logical/Arithmetical Left) PSLLQ/PSLAQ dest,count (Shift Quadword Logical/Arithmetical Left) PSRLW dest,count (Shift Words Logical Right) PSRLD dest,count (Shift Doublewords Logical Right) PSRLQ dest,count (Shift Quadword Logical Right) PSRAW dest,count (Shift Words Arithmetical Right) PSRAD dest,count (Shift Doublewords Arithmetical Right) A cl elemeit a megadott lpsszmmal balra vagy jobbra lptetik, az eredmny(eke)t bepakoljk egy 64 bites tpusba, majd azt a cl regiszterbe visszarjk. A lptets eljelesen s eljeltelenl is trtnhet, az elemek pedig szavak, duplaszavak lehetnek, az aritmetikai jobbra lptetst leszmtva pedig kvadrasz is lehet a cloperandus. A forrsoperandus itt kivtelesen kzvetlen bjt rtk (immediate byte) is lehet.

17.8.7 llapot-kezel utastsok


356

EMMS (no op) (Empty MMX State) A koprocesszor tag-regiszterbe 0FFFFh-t tlt, gy mindegyik FPU adatregisztert resnek jelli be.

17.9 Az Intel Pentium Pro friss tudsa


17.9.1 j utastsok CMOVccc dest reg16/32,source (Conditional MOVe data) A forrs tartalmt a cloperandusba msolja, ha a megadott felttel teljesl. A "ccc" egy olyan szimblumot jell, ami a hasznland felttelt hatrozza meg. Ezek a felttelek megegyeznek a feltteles ugrsoknl (Jccc utastsok) hasznlhatkkal, de a CXZ felttel itt nem adhat meg. Az operandusok mrete 16 vagy 32 bit lehet. Cloperandusknt csak ltalnos regisztert, forrsknt pedig ltalnos regisztert vagy memriaoperandust adhatunk meg. Az utasts az EFlags megfelel flag-jeit vizsglja. FCMOVccc ST,ST(i) (Floating-point Conditional MOVe) Ezek az utastsok valamilyen felttel teljeslse esetn ST(i) tartalmt ST-be mozgatjk. Az utastsok az EFlags bitjeit veszik figyelembe, nem pedig az FPU sttuszregiszterben lev felttelbiteket (condition code bits). Felttelknt az E/Z, NE/NZ, B/C/NAE, BE/NA, NB/NC/AE, NBE/A, U s NU szimblumok hasznlhatk. Ez egy koprocesszor utasts, gy bvebb lersa megtallhat a "A
357

numerikus koprocesszor szolgltatsai" cm fejezetben. FCOMI ST,ST(i) (COMpare real and set EFlags) FCOMIP ST,ST(i) (COMpare real, set EFlags, and Pop) FUCOMI ST,ST(i) (COMpare real Unordered and set EFlags) FUCOMIP ST,ST(i) (COMpare real Unordered, set EFlags, and Pop) Az utastsok a forrs tartalmt sszehasonltjk a cllal, majd ennek megfelelen belltjk a CF, PF s ZF flag-eket. Az FCOMIP s FUCOMIP utastsok az sszehasonlts utn egy POP-ot hajtanak vgre. Az FUCOMI s FUCOMIP utastsok QNaN operandusok esetn nem generlnak rvnytelen operandus kivtelt (#IA), a msik kt utasts viszont igen. Az utastsok rszletesebb lersa a koprocesszort trgyal fejezetben tallhat meg. RDPMC (no op) (ReaD Performance-Monitoring Counter) Az ECX regiszterben megadott szm PMC tartalmt az EDX:EAX regiszterprba tlti. ECX rtke csak 00000000h vagy 00000001h lehet, klnben 13-as kivtel (#GP) keletkezik. Az utasts vgrehajthatsga a CR4 regiszter PCE (8-as) bitjnek llstl fgg. Ha PCE=1, brmilyen privilegizlsi szinten s zemmdban vgrehajthat, klnben pedig csak CPL=0 esetn. UD2 (no op) (UnDefined instruction)

358

Az utasts egyetlen feladata, hogy garantltan 6-os kivtelt (#UD) vltson ki a processzor brmely zemmdjban, brmely CPL rtk mellett. Hatsa egybknt megfelel egy NOP-nak, mivel egyetlen regiszter vagy flag rtkt sem vltoztatja meg, persze IP-t/EIP-t kivve. A felsorolt utastsok kzl egy sem privilegizlt, de az RDPMC privilegizltknt viselkedik, ha a CR4 regiszterben PCE=0. 17.9.2 Vltozsok az architektrban Nem kifejezetten jts, hanem inkbb hiba az, hogy a P6 architektrj processzorok nhny ismtelt sztringutasts esetn nem kpesek a trsponton fennakad utastst pontosan megjellni. A REP INS, REP MOVS, REP OUTS s REP STOS utastsok esetn az adattrspont elrse esetn az adott itercis lps vgrehajtsa utn keletkezik csak 1-es kivtel (#DB). (Teht a processzor vgrehajtja egyszer az adott sztringutastst az aktulis regiszterrtkekkel, ezutn generl egy 1-es kivtelt, majd a REP prefix lellsi feltteleit kezdi vizsglni.) Ezen kvl a REP INS s REP OUTS utastsok esetn, ha az utastsok ltal hasznlt portszm egy trspont kivlt felttele, akkor a legels itercis lps vgrehajtsa utn keletkezik csak a debug kivtel. Ha a CR3 regiszter tartalmt gyakran mdostjuk, mint pl. taszkvltskor, a rendszeresen hasznlt memrialapok (mint pl. a kernel terlete) TLB-bejegyzseit feleslegesen rvnytelenti a processzor, mivel azok mindvgig llandak maradnak. Ezt az ellentmondst oldja meg a globlis lapok hasznlata. A laptbla- s lapcmtr-bejegyzsekben a 8-as bit
359

eddig fenntartott volt, mostantl viszont funkcija van, neve G (Global page). Ha G=1, az adott lap globlis. Csak 2 Mbjtos vagy 4 Mbjtos lapra mutat lapcmtr-bejegyzs esetn ltezik ez a bit, a 4 Kbjtos lapokat a laptbla-bejegyzs G bitjvel jellhetjk be globlisnak. A CR4 regiszter 7-es, PGE (Page Global Enable) bitjt belltva a processzor a TLB-k rvnytelentsekor figyelembe veszi a G bit llst, s ha G=1, az adott TLB-bejegyzs vltozatlan marad. Ha PGE=0, a G bit llstl fggetlenl megtrtnik az rvnytelents. Ha valakinek a 4 Gbjtos megcmezhet virtulis memria kevs lenne, az ne csggedjen. A Pentium Pro processzor jdonsgknt lehetv teszi a 32 bites cmterlet 36 bitesre val kiterjesztst. A technika neve Physical Address Extension (PAE). A CPUID utastssal eldnthet, hogy az adott processzor ismeri-e a PAE-t. Hasznlathoz a CR4 regiszter PAE (5-s) bitjt be kell lltanunk. A PAE hasznlatakor a lapozs az eddigiektl eltr mdon trtnik. A laptblk s a lapcmtr megmaradtak, de a bejegyzsek mrete immron 64 bit lett. Ezltal "csak" 512 bejegyzs fr el egy 4 Kbjtos lapban. A lapok mrete 4 Kbjt vagy 2 Mbjt lehet. (Az Intel dokumentcija szerint 4 Mbjtos lap is ltezik, de ez elg furcsa lenne, mivel a lineris cmben az offszet csak 21 bites) A laptblk bejegyzsei tovbbra is 4 Kbjtos lapokra mutatnak. Lapcmtrbl ezentl mr 4 db. van, s ezek fggetlenek egymstl. A lapcmtr bejegyzsei vagy 2 Mbjtos lapokra, vagy 4 Kbjtos laptblkra mutatnak. Hogy melyikre, azt a CR4 regiszter PSE (4-es) s a lapcmtrbejegyzs PS (7-es) bitjnek llsa dnti el. A 4 db. lapcmtr bziscmt egy j tblzat, a lapcmtrmutat tbla (Page-Directory-Pointer TablePDPT) tartalmazza. A PDPT bziscmnek 32-vel oszthatnak kell lennie. A 32 bites PDPT-bziscm fels 27 bitjt a CR3 regiszter 5..31
360

bitjei troljk, ezrt ezt a regisztert ilyenkor lapcmtr-mutat tbla bzisregiszternek is hvjk (Page-Directory-Pointer Table Base RegisterPDPTR vagy PDPTBR). (A bziscm itt is fizikai cmet jelent, a PDBR-hez hasonlan.) A lineris cm felptse klnbz lesz 4 Kbjtos s 2 Mbjtos lapok hasznlata esetn. A cm 30..31 bitjei vlasztjk ki a hasznlni kvnt lapcmtrat. A 21..29 bitek hatrozzk meg a lapcmtr-bejegyzst. Ha ez a bejegyzs 4 Kbjtos lapra mutat (azaz a CR4 regiszterben PSE=0, vagy PSE=1 s PS=0), akkor a 12..20 bitek vlasztjk ki a lapcmtr-bejegyzs ltal mutatott laptbla valamely bejegyzst. Vgl a 0..11 bitek tartalmazzk a lapon belli offszetet. Ha a lapcmtr-bejegyzs 2 Mbjtos lapra mutat (azaz PSE=1 s PS=1), a 0..20 bitek adjk meg a lapon belli offszetet. Mindkt esetben 4 Gbjt mret terlet cmezhet meg egyszerre. A lapcmtr-mutat tbla, a lapcmtrak s a laptblk bejegyzseiben viszont az adott tbla ill. lap 36 bites bziscmnek megfelel bitjei tallhatk meg, gy lehetv vlik a fizikai 4 Gbjt feletti cmek kihasznlsa is. Nhny P6 architektrj processzor egy msik olyan technikt is tmogat, ami lehetv teszi a cmterlet 36 bitesre val kiterjesztst de gy, hogy a jl megszokott 4 bjtos bejegyzseket s 4 Mbjtos lapokat hasznljuk. Ennek neve 36bit Page Size Extension (PSE-36). A CPUID utastssal eldnthet, hogy az adott processzor ismeri-e a PSE-36-ot. Hasznlathoz a CR4 regiszter PSE (4-es) bitjt be kell lltanunk, PAE (5-s) bitjt viszont trlni kell. A lapozsi hierarchia a szoksos marad, teht az egyetlen lapcmtr bejegyzsei 4 Mbjtos lapokra mutatnak (PS=1). A lapcmtr bziscmt tovbbra is CR3 (PDBR) trolja, ennek a cmnek 4096-tal oszthatnak kell lennie. A 4 Mbjtos lapok
361

bziscme 36 bites lett, ennek a fels 24 bitjt a lapcmtr bejegyzsek troljk, az als 12 bitet 0-nak veszi a processzor. A lapcmtr-bejegyzsek eddig fenntartott 13..16 bitjei troljk a lap bziscmnek fels 4 bitjt. A szmtgpben lev hardvereszkzk s perifrik klnbz tpus memrikat tartalmazhatnak. gy pldul sok videovezrl krtya tmogatja a lineris lapkeretet (Linear Frame BufferLFB), ami annyit jelent, hogy a videomemria teljes terlett elrhetv teszi a fizikai cmterlet kihasznlatlan rszn (pl. a 0E0000000h cmen, ahol ltalban nincs alaplapi memria). A processzor minden memriaelrst a cache-sen keresztl bonyolt le. Az LFB tartalma viszont elg gyakran vltozik (lvn hogy videomemrirl van sz), gy felesleges lenne a cache-ben lev, esetleg sokkal fontosabb adatokat fellrni az LFB-bl szrmazkkal. Msrszt, ha mgis szksg van ezekre a videoadatokra, teljesen mindegy, hogy a processzor milyen sorrendben vgzi el a cache-bl a videomemriba rst, elbb-utbb gy is meg fog jelenni annak tartalma a monitoron. A P5 architektrtl kezdve lehetsg van arra, hogy a processzor nem felttlenl a megadott sorrendben vgezze el a memriba rsokat az optimlis sebessg cljbl. Ilyen s ehhez hasonl, a memria cacheselst rint problma megoldsra vezettk be a Memory Type Range Register-eket (MTRRs). Az MTRR-ek olyan MSR-ek (MSR=Model-Specific Register), amik lehetv teszik, hogy a memria 96 db. klnbz sszefgg terletre elrjuk, az adott helyeken a cache-sels szempontjbl milyen memriatpus van. A 96-bl 88 db. tartomny rgztett bziscm s mret, a maradk 8 tartomnyra viszont mi rhatjuk el, hol kezddik, meddig tart, s hogyan kezelje az ottani memriaelrseket a processzor.

362

A 0..7FFFFh tartomnyt 8 db. 64 Kbjtos, a 80000h..0BFFFFh tartomnyt 16 db. 16 Kbjtos, mg a 0C0000h..0FFFFFh tartomnyt 64 db. 4 Kbjtos "szegmensre" osztottk, ezek mindegyikre csak a memria tpusa adhat meg. A szabadon llthat 8 db. MTRR-ben az adott tartomny 36-bites bziscmnek fels 24 bitjt, a tartomny hosszt, valamint a memria tpust llthatjuk be. A memriatpust mindegyik MTRR-ben egy 8 bites mezben adhatjuk meg, ennek a kvetkez a jelentse: Tp. rtk Cache UC 0 N/N WC 1 N/N WT 4 I/I WP 5 I/N WB 6 I/I 2,3,7..255 WB N N N N I Spek. olv. N I I I I Ordering Model Ers Gyenge Spekulatv Spekulatv Spekulatv

A msodik oszlop tartalmazza az MTRR adott mezjnek tartalmt, az els oszlop pedig a mez rtke ltal kivlasztott memriatpus nevt mutatja. A harmadik oszlopban azt lthatjuk, ezt a terletet cache-seli-e a processzor olvasskor (els vlasz) ill. rskor (msodik vlasz). A negyedik oszlopban azt lthatjuk, az adott terlet visszar (WriteBack) mdon cache-selhet-e. Az tdik oszlop mutatja, megengedettek-e a spekulatv olvassok errl a terletrl. Az "I" vlasz "igen"-t, az "N" pedig "nem"-et jelent. Az Ordering Model fogalom arra a sorrendre vonatkozik, amilyenben a processzor a memriakrseket (olvass s rs) a rendszerbuszra helyezi. Ennek tpust a hatodik oszlop mutatja. A szigor (strict), ms nven ers (strong) modell a programban val elfordulsi sorrendnek felel meg. A gyenge (weak) modell lehetv teszi, hogy az egymst kvet sorozatos rsokat sszevonva, de esetleg ms sorrendben vgezze el a processzor.
363

A spekulatv (speculative) modell pedig a mdostott memriaterletek cache-selst is lehetv teszi, gy a mdostsok csak az rst kveten jval ksbb kerlnek be a rendszermemriba, s hogy mikor, azt a processzor dnti el (ettl spekulatv). A memriatpust megad rtkek kzl a 2, 3 s a 7..255 rtkek fenntartottak, ezek alkalmazsa 13-as (#GP) kivtel keletkezst vonja maga utn. A memriatpusok elnevezse: UnCacheable, Write Combining, Write-Through, Write-Protected, WriteBack. Velk nem foglalkozunk rszletesebben, bvebb informcirt az Intel dokumentcijt ajnlott forgatni. A MTRR-ekhez hasonl clt szolgl a Page Attribute Table (PAT) technika. Ennek lnyege, hogy az egyes memriatpusokat a lapok szintjn definilhatjuk, s ez nagyobb rugalmassgot biztost az opercis rendszernek. A CPUID utastssal ellenrizhet, hogy az adott processzor tmogatja-e ezt a szolgltatst. A PAT technikt nem lehet sem engedlyezni sem tiltani. Ha az adott processzor tmogatja, akkor brmelyik lapozsi tpusnl (norml, PSE, PAE vagy PSE-36) hasznlni fogja. A laptbla-bejegyzsek eddig fenntartott 7-es bitjt, ill. a lapcmtr-bejegyzsek eddig szintn fenntartott 12-es bitjt ezentl PAT Index (PATi) bitnek nevezik. A PDBR, PDPTBR regiszterek, ill. a lapcmtr-mutat tbla-, a lapcmtr- s a laptbla-bejegyzsek eddig meglev PWT (3-as) s PCD (4-es) bitjei a PATi bittel egytt egy 3 bites binris szmot alkotnak, ennek alakja PATi:PCD:PWT (PWT a legals bit). Az jonnan bevezetett 00000277h szm MSR-t hvjk PAT-nak. Ebben a 64 bites regiszterben mindegyik bjt egy-egy attribtum-mez, de ezekben csak az als 3 bitet lehet hasznlni, a maradk 5 bit fenntartott (0). A mezkben az MTRR-eknl mr emltett memriatpus-kdolsokat
364

hasznlhatjuk azzal a klnbsggel, hogy a 7-es rtk az UC (UnCacheable) egy olyan formjt jelenti, amit a megfelel MTRR WC (Write Combining) belltsa fellbrlhat. Ezt az UC- szimblum jelli. A korbban emltett PATi:PCD:PWT szm vlasztja ki, az adott lap vagy tbla a PAT regiszter melyik mezjt hasznlja a memriatpus megjellsre. A kvetkez tblzat mutatja a PAT regiszter mezinek tartalmt a processzor resetelse utn, valamint a PATi, PCD s PWT rtkek ltal gy meghatrozott memriatpust: PATi PCD PWT 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 PAT mez szma 0 1 2 3 4 5 6 7 Mem. tpus WB WT UCUC WB WT UCUC

A korbbiak alapjn vilgos, hogy a PAT mezk tartalma a fenti tblzat szerint sorban 6, 4, 7, 0, 6, 4, 7, 0. A PAT technikrl s az MTRR-ekrl bvebb informcit tallhatunk az Intel dokumentcijban (pl. Intel Architecture Software Developer's Manual Volume 3, Chapter 9, "Memory cache control"). A Pentium processzorban bevezetett, gpi hibk jelzsre szolgl Machine Check Exception (#MC, 18-as) a P6 architektrj processzorok esetben is elrhet. Az j, Machine Check Architecture (MCA) sokkal tbbfle hiba
365

jelzst teszi lehetv, mint amire a Pentium kpes volt. Szintn jdonsg, hogy az MCA-t tmogat processzor egy ilyen hiba keletkezsekor elszr megprblja azt orvosolni. Ha a kijavts sikeres volt, nem keletkezik 18-as kivtel. Ha a hiba termszete lehetv teszi, a megszaktott program vagy taszk esetleg mgis jraindthat a kivtel-kezelbl, de ilyenkor ltalban a program llapotban mr olyan vltozs llt be, ami hibs mkdst fog okozni. 17.9.3 Vltozsok a kivtel-kezelsben A 6-os kivtel (#UD) mostantl az UD2 utasts hatsra is keletkezhet. 13-as kivtel (#GP) a kvetkez felttel esetn is kivltdik: a lapcmtr-mutat tbla (page-directory-pointer table) egyik bejegyzsnek valamelyik fenntartott bitje 1-es rtk, mikzben a CR4 regiszter PAE (5-s) bitje is be van lltva A laphiba (#PF, 14-es) kivtel hibakdjban a RSVD (3as) bit rtke akkor is 1 lehet, ha a CR4 regiszter PAE (5-s) bitje be volt lltva, s a hivatkozott lapcmtr s/vagy laptbla bejegyzsben egy fenntartott bit helyn 1 llt. 17.9.4 Vltozsok a regiszterkszletben Ha a CR4 regiszterben PAE=1 (5-s bit), s a lapozs engedlyezett, a CR3 regiszter a lapcmtr helyett a lapcmtrmutat tbla fizikai bziscmt trolja. A regiszter felptse ilyenkor a kvetkezkppen fest: Bitpozci Jells Nv
366

0..2 3 PWT Page-level Write-Through 4 PCD Page-level Cache Disable 5..31 PDPTB Page-Directory-Pointer Table Base A PWT s PCD bitek ekkor a lapcmtr-mutat tbla bejegyzseinek cache-selst vezrlik. A PDPTB mez az emltett tbla 32 bites fizikai bziscmnek fels 27 bitjt trolja. A bziscm als 5 bitjt 0nak veszi a processzor. A CR3 regiszter neve tartalma miatt ekkor PDPTR vagy PDPTBR lesz. A CR4 regiszterben 3 j bit lett bevezetve: Bitpozci Nv 5 PAE 7 PGE 8 PCE A PAE bit az azonos nev szolgltatst engedlyezi 1-es rtk esetn. A PGE (Page Global Enable) bit 1-es llsa engedlyezi a globlis lapok hasznlatt. A PCE (Performance-Monitoring Counter instruction Enable) bit rtke vezrli az RDPMC utasts vgrehajthatsgt. Ha PCE=1, a krdses utasts brmikor vgrehajthat, klnben csak CPL=0 esetn. Reset utn ez a bit trlve van, erre rdemes odafigyelni az utasts hasznlatakor.

17.10 Az Intel Pentium II-n megjelent jdonsgok

367

17.10.1 j utastsok FXRSTOR mem (ReSTORe Floating-Point and MMX state, and SSE state) FXSAVE mem (SAVE Floating-Point and MMX state, and SSE state) Ez a kt utasts a Pentium III processzor SSE technolgijt egszti ki. Feladatuk, hogy az FPU/MMX llapotot, valamint az SSE llapotot elmentsk (FXSAVE) ill. visszalltsk (FXRSTOR). Az utastsokra hatssal van a CR4 regiszter OSFXSR (9-es) bitjnek llsa. Komplett lersuk megtallhat az SSE technolgit ismertet fejezetben. SYSENTER (no op) (transition to SYStem call ENTRY point) SYSEXIT (no op) (transition from SYStem call entry point) A CS, EIP, SS s ESP regisztereket a megadott rtkre lltjk be, s az j krnyezetben folytatjk a vgrehajtst. A SYSENTER kizrlag csak 0-s privilgium szintre tudja tadni a vezrlst. A SYSEXIT viszont csak 0-s szintrl 3-as szintre kpes tugrani. Fontos, hogy egyik utasts sem menti el a processzor aktulis llapott, gy a mdostott regisztereket, EFlags-et stb. sem, errl a felhasznli programnak s az opercis rendszernek kell gondoskodnia. Az utastsok teht nem hasznlhatk kzvetlenl a CALL-RET pros felvltsra. Ezt mutatja az is, hogy igen sok megkts van. Mindkt utasts csak vdett mdban adhat ki, de a SYSEXIT csak CPL=0

368

esetn (teht virtulis mdban nem). Klnben 13-as kivtel (#GP) fog keletkezni. A SYSENTER elszr kitrli az IF s VM flag-eket az EFlags-ben. Ezutn az emltett regisztereket a kvetkez rtkre lltja be: Regiszter Tartalom CS SYSENTER_CS_MSR EIP SYSENTER_EIP_MSR SS 8+SYSENTER_CS_MS R ESP SYSENTER_ESP_MSR Vgl CPL-t 0-ra lltja, s megkezdi a kd vgrehajtst az j cmtl. A SYSENTER_CS_MSR, SYSENTER_EIP_MSR s SYSENTER_ESP_MSR szimblumok sorban a 174h, 175h s 176h szm MSR-eket jelentik. A CS-be tlttt szelektornak egy 32 bites, 00000000h bzis, 4 Gbjt hatr kdszegmensre kell mutatnia, futtatsi s olvassi jogokkal. Az SS-be tlttt szelektor egy 32 bites, 00000000h bzis, 4 Gbjt hatr adatszegmensre kell hogy mutasson, rsi, olvassi s elrt (accessed) jogokkal. A SYSEXIT nem bntja a flag-eket, rgtn a regisztereket lltja be: Regiszter Tartalom CS 16+SYSENTER_CS_MSR EIP EDX regiszter
369

SS ESP

24+SYSENTER_CS_MSR ECX regiszter

Ezutn CPL-t 3-ra lltja, s megkezdi a kd vgrehajtst az j cmtl. A CS-be tlttt szelektornak egy 32 bites, 00000000h bzis, 4 Gbjt hatr, nem illeszked (nonconforming) kdszegmensre kell mutatnia, futtatsi s olvassi jogokkal. Az SS-be tlttt szelektor egy 32 bites, 00000000h bzis, 4 Gbjt hatr, felfel bvl (expand-up) adatszegmensre kell hogy mutasson, rsi s olvassi jogokkal. A szegmensekre vonatkoz felttelek (mint a bzis, hatr s elrsi jogok) teljeslst felttelezi mindkt utasts, s a szelektorok betltsekor a szegmens deszkriptor cache-regiszterekbe ezeket a rgztett rtkeket rjk be. Ellenrzs nem trtnik ezek fennllsra vonatkozan, az illet opercis rendszer feladata, hogy a deszkriptorok tartalma tkrzze a helyes rtkeket. Ha a SYSENTER_CS_MSR regiszter tartalma 0, 13-as kivtel (#GP) keletkezik mindkt utasts esetn. A szelektorok belltott rtke biztostja, hogy a szksges szegmensek deszkriptort kivlaszt indexek a kvetkez rtkeket veszik fel: ha IND jelli a 0-s szint CS indext, akkor a 0-s szint SS indexe IND+1, a 3-as szint CS indexe IND+2, mg a 3-as szint SS indexe IND+3 lesz. A SYSENTER s SYSEXIT utastsok jelenlte ellenrizhet a CPUID utastssal. Arra azonban
370

figyelni kell, hogy ezeket az utastsokat legelszr a Pentium II processzor tmogatta. A Pentium Pro pldul jelzi a CPUID kimenetben, hogy tmogatja az emltett utastsokat, de ez nem fedi a valsgot. Az emltett utastsok kzl a SYSEXIT csak vdett, a SYSENTER pedig csak vdett vagy virtulis-8086 mdban hajthat vgre. A SYSEXIT ezen kvl csak CPL=0 esetn rvnyes. A SYSENTER s SYSEXIT utastsokhoz hasonl feladatot ltnak el az AMD K6-2 SYSCALL s SYSRET utastsai. 17.10.2 Vltozsok a regiszterkszletben A CR4 regiszterben egyetlen j bit lett bevezetve: Bitpozci Nv 9 OSFXSR Az SFENCE, PREFETCHccc, MASKMOVQ, MOVNTQ, FXRSTOR, FXSAVE s az j SIMD MMX utastsok kivtelvel az sszes tbbi SSE utasts csak akkor hajthat vgre, ha az OSFXSR (Operating System supports FXRSTOR/FXSAVE) bit rtke 1. Ez a bit a Pentium III processzor SSE utastskszletnek tmogatsra szletett meg.

17.11 Az AMD K6-2 jtsai

371

17.11.1 j prefixek 0Fh 0Fh (3DNow! instruction prefix) Ez a specilis bjtsorozat az Intel processzorokon fenntartott utastst jell, az AMD processzorain K6-2-tl kezdden azonban a 3DNow! utastsok kdolshoz hasznljk. Azt jelli, hogy az utasts tnyleges mveleti kdjt ez a prefix s a cmzsi md bjt(ok) s az esetleges eltolsi rtk utn ll bjt mret kzvetlen rtk egyttesen jelentik. Az utbbi bjt neve szuffix (suffix). Nem igazi prefix. Bvebb lerst lsd az "Utastsok kdolsa" c. fejezetben.

17.11.2 j utastsok SYSCALL (CALL operating SYStem) SYSRET (RETurn from operating SYStem) A CS, EIP s SS regisztereket a megadott rtkre lltjk be, s az j krnyezetben folytatjk a vgrehajtst. A SYSCALL kizrlag csak 0-s privilgium szintre tudja tadni a vezrlst. A SYSRET viszont csak 0-s szintrl 3-as szintre kpes tugrani. Fontos, hogy a SYSCALL utasts csak EIP-t menti el, a SYSRET pedig csak EIP-t lltja vissza. A processzor llapotnak (fleg EFlags s ESP) elmentsrl ill. visszalltsrl a felhasznli programnak s az opercis rendszernek kell gondoskodnia. Az utastsok teht nem hasznlhatk kzvetlenl a CALL-RET pros felvltsra. Ezt mutatja az is, hogy igen
372

sok megkts van. Mindkt utasts vals s vdett mdban is kiadhat, de a SYSRET csak CPL=0 esetn (teht virtulis mdban nem). Klnben 13-as kivtel (#GP) fog keletkezni. Vals mdban viszont nem sok rtelme van hasznlatuknak, mivel az utastsok szelektorokkal s deszkriptorokkal dolgoznak. A SYSCALL elszr kitrli az IF s VM flag-eket az EFlags-ben. Ezutn EIP-t tmsolja ECX-be, majd az emltett regisztereket a kvetkez rtkre lltja be: Regiszter Tartalom CS STAR 32..47 bitjei EIP STAR 0..31 bitjei SS 8+(STAR 32..47 bitjei) Vgl CPL-t 0-ra lltja, s megkezdi a kd vgrehajtst az j cmtl. A STAR regiszter a 0C0000081h cm MSR-t jelenti. A CS-be tlttt szelektornak egy 32 bites, 00000000h bzis, 4 Gbjt hatr kdszegmensre kell mutatnia, futtatsi s olvassi jogokkal. Az SS-be tlttt szelektor egy 32 bites, 00000000h bzis, 4 Gbjt hatr felfel bvl (expand-up) adatszegmensre kell hogy mutasson, rsi s olvassi jogokkal. A SYSRET IF-et 1-re lltja, majd a regiszterekbe a kvetkez rtkeket tlti: Regiszter Tartalom
373

CS EIP SS

STAR 48..63 bitjei ECX regiszter 8+(STAR 48..63 bitjei)

Ezutn CPL-t s SS RPL mezjt 3-ra lltja, majd megkezdi a kd vgrehajtst az j cmtl. A CS-be tlttt szelektornak egy 32 bites, 00000000h bzis, 4 Gbjt hatr kdszegmensre kell mutatnia, futtatsi s olvassi jogokkal. A szegmensekre vonatkoz felttelek (mint a bzis, hatr s elrsi jogok) teljeslst felttelezi mindkt utasts, s a szelektorok betltsekor a szegmens deszkriptor cache-regiszterekbe ezeket a rgztett rtkeket rjk be. Ellenrzs nem trtnik ezek fennllsra vonatkozan, az illet opercis rendszer feladata, hogy a deszkriptorok tartalma tkrzze a helyes rtkeket. A szelektorok belltott rtke biztostja, hogy a szksges szegmensek deszkriptort kivlaszt indexek a kvetkez rtkeket veszik fel: ha IND_0 jelli a 0-s szint CS indext, akkor a 0-s szint SS indexe IND_0+1 lesz; hasonlan, ha IND_3 jelli a 3-as szint CS indext, akkor a 3-as szint SS indexe IND_3+1 lesz. A SYSCALL s SYSRET utastsok jelenlte ellenrizhet a CPUID utastssal. Arra azonban figyelni kell, hogy ezeket az utastsokat egyelre csak az AMD processzorai tmogatjk, gy a CPUID-t is ennek megfelelen kell hasznlni.

374

Mindkt utasts csak akkor hajthat vgre, ha az EFER MSR (0C0000080h) SCE (0-s) bitje 1-es rtk, klnben 6-os (#UD) kivtel keletkezik. A SYSRET utasts csak vdett, a SYSCALL pedig csak vdett vagy virtulis-8086 mdban hajthat vgre. A SYSRET ezen kvl csak CPL=0 esetn rvnyes. A SYSCALL s SYSRET utastsokhoz hasonl feladatot ltnak el az Intel Pentium II SYSENTER s SYSEXIT utastsai. 17.11.3 Vltozsok a kivtel-kezelsben 6-os kivtel (#UD) a kvetkez felttelek esetn is keletkezik: egy 3DNow! utastst prbltunk meg vgrehajtani egy olyan processzoron, ami nem tmogatja az AMD 3DNow! technolgit egy 3DNow! utastst prbltunk meg vgrehajtani gy, hogy a CR0 regiszter EM (2-es) bitje be volt lltva 7-es kivtel (#NM) a kvetkez felttel esetn is keletkezik: egy 3DNow! utastst hajtottunk vgre gy, hogy a CR0 regiszter TS (3-as) bitje be volt lltva 17.11.4 Vltozsok a regiszterkszletben Az MMX regiszterek (MM0..MM7) 3DNow! regiszterknt funkcionlnak a 3DNow! utastsok vgrehajtsakor. Ezek tartalmrl s hasznlatrl a kvetkez, a 3DNow! technolgirl szl fejezetben lesz sz.

375

17.11.5 j regiszterek Kivtelesen ismertetjk kt modell-specifikus regiszter (MSR) felptst, mivel ezek a SYSCALL s SYSRET utasts mkdst kzvetlenl befolysoljk. A 0C0000080h cm MSR neve EFER (Extended Feature Enable Register). A regiszter felptse albb lthat: Bitpozci Jells Nv 0 SCE System Call/return Extension 1..63 Ha SCE=1, a SYSCALL s SYSRET utastsok hasznlata engedlyezett, klnben ezek vgrehajtsa 6-os (#UD) kivtelt vlt ki. A 0C0000081h cm MSR neve STAR (SYSCALL/ SYSRET Target Address Register). Tartalma a kvetkez tblzatban lthat: Bitpozci Nv 0..31 SYSCALL target ring 0 EIP address 32..47 SYSCALL CS and SS selector base 48..63 SYSRET CS and SS selector base A 0..31 biteken tallhat mez a SYSCALL utasts esetn az EIP j rtkt tartalmazza, ez lesz az opercis rendszer belpsi pontja. A 32..47 biteken tallhat rtket a SYSCALL utasts CS-be, mg ennek tartalmt plusz 8-at SS-be tlti. Ez a mez

376

jelli ki az opercis rendszer kdszegmenst s veremszegmenst. A 48..63 biteken tallhat rtket a SYSRET utasts CSbe, mg ennek tartalmt plusz 8-at SS-be tlti. Ez a mez jelli ki a felhasznli program kdszegmenst s veremszegmenst.

17.12 Az AMD 3DNow! technolgija


Az AMD 3DNow! nev technolgija az MMX ltal lerakott alapokra pl. Ezrt nem meglep, hogy elg sok kzs tulajdonsgot tallunk a kt utastskszletben. Rgtn itt vannak pldul a regiszterek: a 3DNow! technolgia szintn az MMX-ben bevezetett MM0..MM7 regisztereket hasznlja. Emltettk, hogy a 3DNow! legfbb jtsa az volt az MMX-szel szemben, hogy egsz (fixpontos) szmok helyett lebegpontos rtkekkel kpes SIMD-elven szmolni. Ezt tmogatja a 3DNow! sajt adattpusa, a pakolt lebegpontos tpus (packed floating-point type). Az albbi bra mutatja ennek felptst:

A 64 bites tpusban teht kt, egyszeres pontossg lebegpontos vals (single precision floating-point real) szm van bepakolva. A 0-s vals mantisszja a 0..22 biteken, exponense a 23..30 biteken, eljele pedig a 31-es biten tallhat. A msik vals a 64 bites szm fels duplaszavban helyezkedik el ugyanilyen mdon.
377

A fentebb emltettk, hogy a 3DNow! regiszterek megegyeznek az MMX regiszterekkel, amik viszont a koprocesszor adatregisztereire vannak rkpezve. Szinte mindegyik 3DNow! utasts vgrehajtsa utn rvnyesnek jelli be az FPU regisztereket a tag-regiszterben. Ezrt a 3DNow! technolgia alkalmazsa sorn is megjelenik a problma, hogy a 3DNow!/MMX utastsok blokkja utn trlni kell a tag-eket, azaz 0FFFFh-t kell a tag-regiszterbe rni. Erre az EMMS MMX utasts szolgl, de a 3DNow! technolgia is knl erre megoldst az FEMMS szemlyben. A PREFETCH s PREFETCHW utasts nem mdostja a tag-eket. A pakolt vals tpusban tallhat vals szmok formtuma megfelel az IEEE-754-es szabvny egyszeres pontossg vals lebegpontos szm-formtumnak. Az exponens 127-es eltolsi rtket hasznlva eltolva troldik (biased exponent). Minden szm normltknt kerl eltrolsra. Denormlt szmokat, NaNokat s vgtelen rtkeket nem tmogat a 3DNow! technolgia forrsoperandusknt. Alulcsorduls esetn nem kpzdik denormlt szm, s kivtel sem generldik, az eredmnyt pedig nullnak veszi a processzor. Tlcsorduls utn kt eset lehetsges: az eredmny vagy helyes eljel vgtelen lesz, vagy pedig a maximlis abszolt rtk pozitv vagy negatv szm (ahol az exponens s a mantissza is maximlis rtk). Az adott implementcitl fgg, hogy mi fog trtnni. Az AMD K6-2 processzor ez utbbi megoldst vlasztja, teht vgtelen rtket sosem kaphatunk eredmnynek. Az IEEE ajnlssal ellenttben a 3DNow! technolgia csak egyfle kerektsi mdot ismer. Ez implementcitl fggen a legkzelebbi rtkhez kerekts (round to nearest) vagy a csonkols (truncation, round to zero) lehet. Az AMD K6-2 processzor a legkzelebbi rtkhez kerektst tmogatja. A PF2ID s PI2FD konverzis utastsok mindig a csonkolst hasznljk.

378

Ha valamilyen nem tmogatott szmformtumot hasznlunk operandusknt (pl. NaN-t, vgtelent, denormlt szmot, rvnytelen rtket), a mveletek eredmnye kiszmthatatlan. Numerikus kivtelt egyik utasts sem vlt ki, a flag-eket sem lltja, gy a hibk elkerlsrl a felhasznlnak kell gondoskodnia. Az utastsok kt csoportra oszthatk: egy rszk valdi SIMD-elv utasts, ezeket vektor-utastsoknak (vector instructions) hvjuk, mivel egyszerre kt vals szmpron hajtjk vgre dolgukat. A msik trsasg a 64 bites tpusnak csak az als duplaszavt hasznlja forrsknt, ezek a skalrutastsok (scalar instructions). Nhny utasts operandusknt pakolt egsz tpusokat hasznl. Ezek a pakolt bjtok, szavak s duplaszavak, s formtumuk megfelel az MMX technolginl lertaknak. Prefixek tekintetben a 3DNow! megengedbb az MMXnl: a szegmensfellbrl s cmhossz prefixek befolysoljk a rkvetkez 3DNow! utastst, az operandushossz s a sztringutastst ismtl prefixeket figyelmen kvl hagyja a processzor. A buszlezr prefix viszont itt is 6-os kivtelt okoz a 3DNow! utastsok eltt. Ha egy 3DNow! utasts kiadsakor a CR0 regiszter EM bitje be van lltva, az MMX-hez hasonlan 6-os kivtel keletkezik. A ktoperandus utastsok esetn mindig igaz a kvetkez szably: a cloperandus egy 3DNow!/MMX regiszter kell legyen, mg a forrs lehet memriahivatkozs vagy 3DNow!/MMX regiszter is. Az albbiakban olvashat a 3DNow! utastsok listja: a mnemonik utn lthat az operandusok tpusa, a mnemonik jelentse angolul, majd az utasts mkdsnek lersa kvetkezik. A PREFETCH s PREFETCHW mnemonikokat leszmtva az els "P" bet utal arra, hogy az adott utasts pakolt tpus operandusokat hasznl.
379

A kvetkez jellseket alkalmaztuk: (no op) nincs operandus source forrs; 3DNow!/MMX regiszter vagy 64 bites memriaoperandus lehet dest cl (destination); 3DNow!/MMX regiszter lehet mem8 8 bites memriaoperandus 17.12.1 Teljestmny-nvel utastsok FEMMS (no op) (Faster Entry/Exit of the MMX or floating- point State) Az EMMS utastshoz hasonlan a tag-regiszterbe a 0FFFFh rtket tlti, ezzel mindegyik koprocesszor adatregisztert resnek jelli be. Az EMMS utastssal ellenttben viszont az adatregiszterek tartalmt nem felttlenl rzi meg, gy gyorsabban valstja meg ugyanazt a funkcit. PREFETCH mem8 PREFETCHW mem8 (PREFETCH processor cache line into L1 data cache) Az operandusban megadott memriacmtl beolvasnak egy cache-sort, aminek a hossza legalbb 32 bjt, s a ksbbi (t.i. K6-3 processzor utni) processzorokon vltozhat. A PREFETCHW utasts a beolvasott cache-sor MESI llapott (Modified, Exclusive, Shared, Invalid) mdostottra (modified) lltja be, a PREFETCH viszont ltalban a kizrlagos, egyedi (exclusive) belltst alkalmazza. Ha a beolvasand adaton vltoztatni is fogunk, akkor a PREFETCHW utasts gyorsabb mkdst garantl. Az AMD K6-2 processzor mindkt mnemonikot azonosan hajtja vgre, a ksbbi
380

processzorok viszont meg fogjk klnbztetni az egyes vltozatokat. Az utasts kdolsa a kvetkez: 0Fh 0Dh *r+i, ahol i=000b a PREFETCH, valamint i=001b a PREFETCHW utastsok esetn. A tbbi rtk fenntartott a ksbbi utasts-bvtsekre, de vgrehajtsuk nem okoz kivtelt. Ha az operandus nem memriahivatkozs, 6-os kivtel (#UD) keletkezik. 17.12.2 Egsz aritmetikai utastsok PAVGUSB dest,source (AVeraGe of UnSigned Bytes) A forrsban s a clban lev 8 db. eljeltelen elempr kerektett tlagt szmtja ki, az eredmnyeket egy 64 bites tpusba belepakolja, majd a vgleges rtket a cl regiszterbe eltrolja. Az tlagols a szoksos mdon trtnik: pldul az eredmny 0..7 bitjeit gy kapjuk meg, hogy a forrs s a cl ugyanezen bitjein lev bjtokat sszeadja, a 9 bites rtkhez hozzad 001h-t, majd a kpzd sszeget eggyel jobbra lpteti eljeltelenl (logikai lptets). PMULHRW dest,source (MULtiply signed Words with Rounding, and store High-order words of results) sszeszorozza a forrsban s a clban lev eljeles szavakat, a 32 bites szorzatokhoz hozzad 00008000h-t (kerekts), az eredmnyek fels szavt bepakolja egy 64 bites tpusba, majd azt eltrolja a clba. Pontosabb eredmnyt szolgltat a kerekts miatt mint a PMULHW MMX utasts, ami csonkolja a szorzatokat.

381

17.12.3 Lebegpontos aritmetikai utastsok PFADD dest,source (Floating-point ADDition) A forrsban s a clban lev vals elemprokat sszeadja, az sszegeket bepakolja az eredmnybe, amit a cl terletre eltrol. PFSUB dest,source (Floating-point SUBtraction) A clban lev elemekbl kivonja a forrsban lev megfelel elemet, a klnbsgeket bepakolja az eredmnybe, amit a cl terletre eltrol. PFSUBR dest,source (Floating-point Reversed SUBtraction) A forrsban lev elemekbl kivonja a clban lev megfelel elemet, a klnbsgeket bepakolja az eredmnybe, amit a cl terletre eltrol. PFACC dest,source (Floating-point ACCumulate) Az eredmny als felbe a clban lev kt lebegpontos vals szm sszege kerl, mg a fels duplasz a forrsban lev kt vals rtk sszegt fogja tartalmazni. Vgl az eredmnyt eltrolja a cl helyn. PFRCP dest,source (Floating-point ReCiProcal approximation) Ez a skalr-utasts a forrs als duplaszavban tallhat vals szm reciproknak 14 bitre pontos kzeltst tlti be a cl als s fels duplaszavba is. A teljes, 24 bitre pontos reciprok rtkhez a PFRCPIT1 s PFRCPIT2 utastsokat is hasznlni kell. PFRSQRT dest,source

382

(Floating-point Reciprocal SQuare Root approximation) Ez a skalr-utasts a forrs als duplaszavban tallhat vals szm reciprok ngyzetgyknek 15 bitre pontos kzeltst tlti be a cl als s fels duplaszavba is. A negatv operandusokat gy kezeli, mintha azok pozitvak lennnek. Az eredmny eljele megegyezik a forrs eljelvel. A teljes, 24 bitre pontos reciprok rtkhez a PFRSQIT1 s PFRCPIT2 utastsokat is hasznlni kell. PFRCPIT1 dest,source (Floating-point ReCiProcal, first ITeration step) Ez az utasts az elzleg PFRCP utastssal meghatrozott reciprok kzeltst finomtja tovbb egy Newton-Raphson itercis lps vgrehajtsval. A clnak meg kell egyeznie a PFRCP utasts forrsval, a forrsoperandusnak pedig az elbbi PFRCP utasts eredmnynek kell lennie. Egyb operandus-kombincik esetn az utasts hatsa, eredmnye definilatlan. A PFRCPIT1 eredmnyt a PFRCPIT2 utastsnak kell tovbbadni, hogy a 24 bit pontossg kzeltst megkaphassuk. Az utasts vektor-elven zemel, teht az operandusok mindkt feln elvgzi a szmolst. PFRSQIT1 dest,source (Floating-point Reciprocal SQuare root, first ITeration step) Ez az utasts az elzleg PFRSQRT utastssal meghatrozott reciprok ngyzetgyk kzeltst finomtja tovbb egy Newton-Raphson itercis lps vgrehajtsval. A clnak meg kell egyeznie a PFRSQRT utasts forrsval, a forrs383

operandusnak pedig az elbbi PFRSQRT utasts eredmnye ngyzetnek kell lennie. Egyb operandus-kombincik esetn az utasts hatsa, eredmnye definilatlan. A PFRSQIT1 eredmnyt a PFRCPIT2 utastsnak kell tovbbadni, hogy a 24 bit pontossg kzeltst megkaphassuk. Az utasts vektor-elven zemel, teht az operandusok mindkt feln elvgzi a szmolst. PFRCPIT2 dest,source (Floating-point ReCiProcal/reciprocal square root, second ITeration step) Ez az utasts az elzleg PFRSQIT1 utastssal meghatrozott reciprok ngyzetgyk, vagy a PFRCPIT1 utastssal kiszmolt reciprok kzeltst finomtja tovbb a msodik NewtonRaphson itercis lps vgrehajtsval. A clnak meg kell egyeznie a PFRCPIT1 vagy a PFRSQIT1 utasts eredmnyvel, a forrsoperandusnak pedig az elbbieket megelz PFRCP vagy PFRSQRT utasts eredmnynek kell lennie. Egyb operandus-kombincik esetn az utasts hatsa, eredmnye definilatlan. Az utasts hatsra a clban elll a kvnt reciprok vagy reciprok ngyzetgyk rtk 24 bit pontos kzeltse. Az utasts vektor-elven zemel, teht az operandusok mindkt feln elvgzi a szmolst. PFMUL dest,source (Floating-point MULtiplication) A forrsban s a clban lev vals elemprokat sszeszorozza, a szorzatokat bepakolja az eredmnybe, amit a cl terletre eltrol. PFMAX dest,source (Floating-point MAXimum)
384

A forrsban s a clban lev megfelel elemek kzl kivlasztja a nagyobbat, azokat bepakolja az eredmnybe, amit a cl terletre eltrol. Nulla s egy negatv szm esetn, vagy ha mindkt elem nulla, akkor pozitv nullt ad vissza. PFMIN dest,source (Floating-point MINimum) A forrsban s a clban lev megfelel elemek kzl kivlasztja a kisebbet, azokat bepakolja az eredmnybe, amit a cl terletre eltrol. Nulla s egy pozitv szm esetn, vagy ha mindkt elem nulla, akkor pozitv nullt ad vissza.

17.12.4 sszehasonlt utastsok PFCMPGE dest,source (Floating-point CoMParision for Greater or Equal) PFCMPGT dest,source (Floating-point CoMParision for Greater Than) PFCMPEQ dest,source (Floating-point CoMParision for EQual) A forrsban lev elemeket sszehasonltja a clban lev megfelel elemmel. Ha a megadott felttel teljesl, akkor az eredmnybe 0FFFFFFFFh-t rak be, klnben pedig 00000000h kerl az eredmny duplaszavba. Ezutn a pakolt eredmnyt visszarakja a cl regiszterbe.

17.12.5 Konverzis utastsok PI2FD dest,source (Doubleword Integer To Floating-point conversion) A forrst pakolt duplaszavaknak tekintve tkonvertlja a benne lev kt binris egsz
385

eljeles szmot lebegpontos rtkk, azokat bepakolja az eredmnybe, amit azutn a cl regiszterben eltrol. Ha a konvertlt rtk nem frne el az egyszeres pontossg vals tpusban, csonkolst hajt vgre. PF2ID dest,source (Floating-point To Doubleword Integer conversion) A clt pakolt lebegpontos tpusnak tekintve tkonvertlja a kt vals szmot eljeles duplaszavakk, azokat bepakolja az eredmnybe, amit azutn a cl regiszterben eltrol. A konverzit csonkolssal vgzi el, azaz nulla fel kerektssel. Az 1-nel kisebb abszolt rtk szmokbl nulla lesz. Ha a szm kisebb mint -2147483648.0, akkor a konverzi eredmnye 80000000h lesz, mg ha a forrs rtk nagyobb mint +2147483647.0, akkor a 7FFFFFFFh rtkre teltdik az adott elem.

A kvetkez algoritmus s programrszlet mutatja, hogy lehet gyorsan meghatrozni 1/b s a/b rtkt a 3DNow! technolgival:
X0=PFRCP(b) X1=PFRCPIT1(b, X0) X2=PFRCPIT2(X1,X0) q=PFMUL(a,X2) MOVD PFRCP PFRCPIT1 MOVD PFRCPIT2 PFMUL MOVD MM0,[b] MM1,MM0 MM0,MM1 MM2,[a] MM0,MM1 MM2,MM0 [q],MM2

;MM0=1/b ;MM2=a/b

Az albbi pszeudokd s programrszlet azt szemllteti, milyen mdon hatrozhat meg 1/ b s b rtke egyszerre:
386

X0=PFRSQRT(b) X1=PFMUL(X0,X0) X2=PFRSQIT1(b,X1) X3=PFRCPIT2(X2,X0) X4=PFMUL(b,X3) MOVD MOVQ PFRSQRT MOVQ PFMUL PFRSQIT1 PFRCPIT2 PFMUL MM0,[b] MM3,MM0 MM1,MM0 MM2,MM1 MM1,MM1 MM0,MM1 MM0,MM2 MM3,MM0

;MM0=1/ b ;MM3= b

17.13 Az Intel Pentium III-n megjelent jdonsgok


17.13.1 j prefixek 0F3h (SSE instruction prefix) Az SSE utastsok kztt sok olyan utastspr van, amelyek egyik tagja skalron, msik tagja pedig pakolt lebegpontos tpus (SIMD single-FP) operandusokon vgzi el ugyanazt a mveletet. Ilyen utastsprt kpeznek pl. az ADDPSADDSS, CMPPS-CMPSS utastsok. A prok mindkt tagjnak minden tekintetben megegyezik a mveleti kdja, de a skalrral dolgoz utasts opcode-jt egy REP/REPE/REPZ prefix elzi meg. Mivel a sztringutastst ismtl prefixet ilyen
387

utastsra nem lehetne alkalmazni, ezrt az 0F3h bjt itt a mveleti kd els bjtjaknt funkcionl. A pldnl maradva, az ADDPS utasts kdolsi formja 0Fh, 58h, *r, mg az ADDSS utasts 0F3h, 0Fh, 58h, *r. Nem igazi prefix, bvebb lersa pedig megtallhat az "Utastsok kdolsa" c. fejezetben. 17.13.2 j utastsok LDMXCSR mem32 (LoaD SIMD Control/Status Register) A megadott cmrl betlti az MXCSR regiszter j tartalmt. Ha valamelyik fenntartott bitpozciban 1 ll, 13-as kivtel (#GP) keletkezik. STMXCSR mem32 (STore SIMD Control/Status Register) A megadott cmre eltrolja az MXCSR regiszter tartalmt, a fenntartott bitek helyre 0-t rva.

17.13.3 Vltozsok a kivtel-kezelsben 6-os kivtel (#UD) a kvetkez felttelek esetn is keletkezik: egy SSE utastst prbltunk meg vgrehajtani egy olyan processzoron, ami nem tmogatja az Intel SSE technolgit, azaz a CPUID kimenetben az XMM (25s) bit trlve van egy SSE utastst prbltunk meg vgrehajtani gy, hogy a CR0 regiszter EM (2-es) bitje be volt lltva (ez a PREFETCHT0, PREFETCHT1, PREFETCHT2, PREFETCHNTA s SFENCE utastsokra nem vonatkozik)
388

egy SSE utastst prbltunk meg vgrehajtani gy, hogy a CR4 regiszter OSXMMEXCPT (10-es) bitje trlve volt, s a krdses utasts numerikus kivtelt okozott egy SSE utastst prbltunk meg vgrehajtani gy, hogy a CR4 regiszter OSFXSR (9-es) bitje trlve volt (ez az j MMX utastsokra, tovbb a PREFETCHccc, SFENCE, MASKMOVQ, MOVNTQ, FXRSTOR s FXSAVE utastsokra nem vonatkozik) 7-es kivtel (#NM) a kvetkez felttel esetn is keletkezik: egy SSE utastst hajtottunk vgre gy, hogy a CR0 regiszter TS (3-as) bitje be volt lltva Az SFENCE, PREFETCHT0, PREFETCHT1, PREFETCHT2 s PREFETCHNTA utastsok a TS bit 1-es llapota mellett sem generlnak 7-es kivtelt. A 17-es kivtel (#AC) az illeszkeds-ellenrzs engedlyezse s a szoksos felttelek teljeslse esetn akkor is keletkezik, ha a kvetkez tblzatban felsorolt adattpusok nem illeszkednek megfelelen: Adat tpusa Illeszkeds bjtokban SIMD pakolt lebegpontos 16 32 bites skalr egyszeres vals 16 16 bites MMX pakolt egsz 16 32 bites MMX pakolt egsz 16 64 bites MMX pakolt egsz 16 Ezek a tpusok az j SSE utastsok (SIMD lebegpontos s SIMD MMX utastsok) hasznlata esetn rvnyesek. Nhny utasts (mint pl. a MOVUPS, FXSAVE, FXRSTOR) kivtelesen kezeli az illeszkedsek ilyen fajtjt, errl az adott utasts ismertetsnl s az Intel dokumentcijban lehet tbbet tallni.

389

17.13.4 j kivtelek Szm Mnemo 19 #XF Tpu Kivlt felttelek s SSE FP Error Fault SIMD lebegpontos ut. Nv

19-es kivtel akkor keletkezik, ha a processzor egy SSE lebegpontos utasts vgrehajtsa kzben numerikus hibt szlel, az adott kivtel nincs maszkolva az MXCSR regiszterben, valamint a CR4 regiszter OSXMMEXCPT (10-es) bitje is be van lltva. Ha keletkezik numerikus hiba, de az adott kivtel maszkolva van, a processzor kijavtja a hibt, nem generl kivtelt, s folytatja a vgrehajtst. Ha az adott numerikus kivtel nincs maszkolva, de OSXMMEXCPT=0, 6-os kivtel (#UD) keletkezik 19-es helyett. Hibakd nem kerl a verembe, az MXCSR regiszter ill. az XMM0..XMM7 regiszterek tartalma bsges informcit szolgltat a hibval kapcsolatban. A veremben lev CS:IP/EIP msolat mindig a hibt okoz SSE utastsra mutat. 17.13.5 Vltozsok a regiszterkszletben A CR4 regiszterben egyetlen j bit lett bevezetve: Bitpozci Nv 10 OSXMMEXCPT Az OSXMMEXCPT (Operating System supports SIMD floating-point unMasked EXCePTions) bit az SSE utastsok ltal kivltott numerikus hibk lekezelst befolysolja. Ha egy maszkolatlan numerikus kivtel keletkezik, akkor a processzor ennek a bitnek az llsa alapjn cselekszik. Ha OSXMMEXCPT=1, akkor 19-es kivtelt (#XF), egybknt pedig 6-os kivtelt (#UD) generl.

390

17.13.6 j regiszterek Az SSE utastsok tmogatsra nhny j regisztert kapott a processzor. A SIMD vezrl-/sttuszregiszter (SIMD Floating-point Control/Status Register) olyan 32 bites regiszter, ami az SSE utastsok mkdst vezrli, tovbb az azok vgrehajtsa utni llapotot tartalmazza. A regiszter neve MXCSR. A SIMD lebegpontos adatregiszterek az SSE utastsok operandusaknt szolglnak. A 8 regisztert az XMM0, XMM1, , XMM7 neveken rhetjk el. Az emltett regiszterekrl bvebb lers tallhat a kvetkez fejezetben, ami az SSE utastsokat is bemutatja.

17.14 Az Intel SSE technolgija


Az Intel Pentium III (Katmai) processzorral egytt jelentette meg az Intel a msodik nagy utastskszlet-bvtst. Az els ilyen vltoztats az Intel x86-os architektrban az MMX technolgia s annak j utastsai voltak, ami azonban nem bizonyult elg sikeresnek, mivel csak egsz (fixpontos) szmokkal tudott SIMD-elven mveletet vgezni. Ezt a hinyossgot igyekszik kijavtani a 70 j utastsbl ll kszlet. A technolgia 3 elnevezs alatt ismeretes: kezdetben MMX2-nek hvtk, ezzel utalva eldjre. Ksbb tkereszteltk KNI-re (Katmai New Instructions), amely nv magban hordozza a szl processzor fednevt. A vgleges nv mgis az SSE (Streaming SIMD Extensions) lett. Ez a nv ugyanis jobban kifejezi ennek a technolginak a fbb jellemzit: vele kpesek
391

lesznk hatkonyan dolgozni adatfolyamokkal, valamint SIMD vgrehajtsi modell alapjn egyszerre tbb fggetlen elemen vgezhetjk el prhuzamosan ugyanazt a tevkenysget. A hatkonyabb szmols rdekben j adattpust definil az SSE technolgia. Ez a tpus ugyancsak pakolt lebegpontos adattpus (packed floating-point data type Packed FP), de ennek mrete a 3DNow! technolgia hasonl tpustl eltren nem 64 hanem 128 bit. Az j tpust ezentl SIMD lebegpontos tpusknt emlegetjk, hogy elkerljk a 3DNow!-val val sszetvesztst. A 128 bites adatba ngy darab egyszeres pontossg lebegpontos vals rtk (Single-FP) van bepakolva:

A lebegpontos valsok formtuma teljesen megfelel az IEEE754 szabvnynak. Ebbe a kerektsi mdokat, a NaN-ok s denormalizlt rtkek kezelst, numerikus kivtelek generlst is bele kell rteni. Az j adattpus trolsra 8 db. j, 128 bites adatregisztert vezettek be. A SIMD lebegpontos regiszterek neve XMM0..XMM7. Ezek a regiszterek az alap regiszterkszlettl teljesen fggetlenl helyezkednek el, teht az MMX regiszterekkel ellenttben NEM a koprocesszor adatregisztereit foglaljk el. Ez a megolds egyrszt nagy programozsi szabadsgot ad, mivel az MMX s SSE kd knnyedn keverhetk egymssal. Msrszt viszont az opercis rendszernek tmogatnia kell ezeket az j regisztereket, mivel a taszkvlts esetn szksges regiszter-elments s -visszallts folyamata sorn az FSAVE, FNSAVE, FRSTOR utastsok elmentik ugyan az FPU regisztereket, s azzal egytt az MMX regisztereket is, a SIMD regisztereket viszont nem.
392

Szintn j a SIMD vezrl-/sttuszregiszter (SIMD Floating-point Control/Status Register). Ennek a 32 bites regiszternek a neve MXCSR, felptse pedig a kvetkez brn lthat:

Az MXCSR 6-os s 16..31 szm bitjei fenntartottak, ami annyit jelent, hogy tartalmuk nulla, s ha brmelyiket megprbljuk belltani, 13-as kivtel (#GP) keletkezik. A regisztert memriba trolni az STMXCSR, belltani pedig az LDMXCSR utastssal lehet. A SIMD lebegpontos llapotot elment ill. visszallt FXSAVE s FXRSTOR utastsokkal szintn manipullhat az MXCSR tartalma. A 0..5 bitek az SSE utastsok vgrehajtsa sorn keletkez numerikus kivteleket jelzik. A kivtelek fajti megegyeznek az FPU ltal felismert/generlt kivtelekkel, ezrt lersukat lsd a numerikus koprocesszort trgyal fejezetben. Eltrst az rvnytelen mvelet (Invalid operation#I) kivtel jelent, ami csak az operandus hibs voltt jelzi, mivel veremhiba nem keletkezik SSE utastsok esetn (gy nincs #IS kivtel sem). Ez a hat bit "ragads" (sticky), mivel llsukat egszen addig megrzik, amg ki nem trljk ket az FXRSTOR vagy LDMXCSR utastssal. A 7..12 bitek ezeket a kivteleket maszkoljk (tiltjk) le egyenknt, ha be vannak lltva. Mkdsk az FPU vezrlregiszterben tallhat hasonl bitek mkdsvel egyezik meg. Alapllapotban az sszes kivtel maszkolva van. A 13, 14 biteken tallhat RC (Rounding Control) mez hatrozza meg a szmtsok sorn alkalmazand kerekts
393

fajtjt. A mez jelentse megegyezik az FPU vezrlregiszternek azonos mezjnek funkcijval. Az alapbellts a 00b, teht a legkzelebbi rtkhez kerekt a processzor. A 15-s bit neve FZ (Flush-to-Zero). Ha egy SSE utasts vgrehajtsa sorn alulcsorduls (underflow) trtnik, akkor kt eset lehetsges: ha az MXCSR 11-es UM bitje 0 rtk, akkor alulcsorduls numerikus kivtel (#U) keletkezik. Ha az #U kivtel tiltva van, akkor ismt kt eset lehetsges: ha FZ=0, akkor denormalizlt eredmnyt kapunk, aminek kvetkezmnye lehet a pontossg elvesztse is (#P kivtel). Ha azonban FZ=1 s UM=1, akkor eredmnyknt helyes eljel nullt kapunk, s UE s PE rtke is 1 lesz. A prefixek hasznlhatsga megegyezik az MMX utastsoknl lertakkal, teht a szegmensfellbrl s a cmhossz prefixek megengedettek, az operandushossz s a sztringutastst ismtl prefixek fenntartottak, mg a buszlezr prefix minden esetben 6-os kivtelt (#UD) generl. Fontos tudni, hogy nhny SSE utasts gpi kdja implicite tartalmazza a REP/REPE/REPZ prefixet (0F3h), ezrt vatosan bnjunk ezzel a prefixszel! Az SSE utastsok vgrehajthatsgnak alapfelttele, hogy a CPUID utasts EAX=00000001h rtkvel val kiadsa utn EDX 25-s bitje (XMM) 1-es rtk legyen. Ez a felttel mr elegend, hogy az SFENCE, PREFETCHT0, PREFETCHT1, PREFETCHT2 s PREFETCHNTA utastsokat hasznlhassuk. Az j MMX utastsok (SIMD integer instructions) akkor hajthatk vgre, ha a CR0 regiszter EM (2es) bitje trlve van (ez vonatkozik a MASKMOVQ, MOVNTQ, FXRSTOR s FXSAVE utastsokra is). Az sszes tbbi SIMD lebegpontos utasts lefutshoz a CR4 regiszter OSFXSR (9-es) bitjnek 1-es rtknek kell lennie. Ha ezek a felttelek nem teljeslnek, 6-os kivtel keletkezik. A kvetkez tblzat ezeket a feltteleket foglalja ssze:

394

Utasts CPUID.XMM CR0.EM CR4.OSFXSR SFENCE 1 PREFETCHccc 1 MASKMOVQ 1 0 MOVNTQ 1 0 FXRSTOR, FXSAVE 1 0 SIMD MMX 1 0 Tbbi SSE 1 0 1 Szintn fontos, hogy azok az SSE utastsok, amelyek numerikus kivtelt kpesek kivltani, rzkenyek a CR4 regiszter OSXMMEXCPT (10-es) bitjnek llsra. Ha egy SIMD lebegpontos kivtel keletkezik, akkor OSXMMEXCPT=1 esetn 19-es (#XF), klnben pedig 6-os (#UD) kivtel generldik. A 3DNow! technolgihoz hasonlan itt is kt nagy csoportba sorolhatk az SSE utastsai. A skalr-utastsok (scalar instructions) az operandusok als duplaszavban lev lebegpontos rtkekkel dolgoznak, s a fels hrom duplasz rtkt a forrsbl az eredmnybe trjk. A msik csoportot a 3DNow! esetben a vektor-utasts alkotjk, itt pedig pakoltutastsoknak (packed instructions) hvjk ket. A pakoltutastsok mind a 4 lebegpontos szmpron vgrehajtanak valamilyen mveletet, a ngy eredmnyt bepakoljk a 128 bites tpusba, majd ezt a pakolt vgeredmnyt a cl helyre rjk. A ktoperandus utastsokra fennll az a mr megszokott tulajdonsg, hogy az els operandus a cl (nhny esetben forrs is), mg a msodik operandus a forrs. Az adatmozgat, konverzis, cache-selst befolysol s az j MMX utastsokat leszmtva minden ms esetben teljeslnie kell az operandusokra, hogy a cl csak egy SIMD lebegpontos regiszter lehet, mg a forrs helyre SIMD regiszter vagy memriahivatkozs kerlhet.

395

Ha az operandusok valamelyike NaN, s SNaN esetn IM=1 is teljesl (az MXCSR regiszterben), akkor az eredmny ngy esetet kivve mindig QNaN lesz. A kivteleket a MINPS, MINSS, MAXPS s MAXSS SSE utastsok jelentik: ha csak az egyik operandus NaN, akkor ez a kt utasts a forrs tartalmt (teht a msodik operandust) adja vissza eredmnyknt, ami normlt vagy denormlt vges szm, nulla, vgtelen, QNaN vagy SNaN lehet. Az SSE utastsok az FPU utastsoktl eltren figyelmen kvl hagyjk a CR0 regiszter NE (5-s) bitjnek llst, s maszkolatlan numerikus kivtel keletkezse esetn mindig 19-es (#XF) kivtelt generlnak (s persze belltjk az MXCSR regiszterben a megfelel biteket). Ehhez az is szksges, hogy a CR4 regiszter OSXMMEXCPT (10-es) bitje be legyen lltva. Az albbiakban olvashat az SSE utastsok jellemzse: a mnemonik utn lthat az operandusok tpusa, a mnemonik jelentse angolul, majd az utasts mkdsnek lersa kvetkezik. A mnemonikban a "PS" betcsoport a "Packed Single-FP", mg az "SS" betk a "Scalar Single-FP" kifejezsekre utalnak. A kvetkez jellseket alkalmaztuk: (no op) nincs operandus source forrs; xmmreg/mem128 lehet dest cl (destination); xmmreg lehet mem memriaoperandus imm8 bjt mret kzvetlen operandus mem8 bjt mret memriaoperandus reg32 32 bites ltalnos cl regiszter reg32/mem16 32 bites ltalnos cl regiszter vagy sz mret memriaoperandus mem32 duplasz mret memriaoperandus
396

reg/mem32 32 bites ltalnos cl regiszter vagy memriaoperandus mmreg az MM0, MM1, , MM7 regiszterek valamelyike mem64 64 bites memriaoperandus mmreg/mem64 MMX regiszter vagy 64 bites memriaoperandus xmmreg az XMM0, XMM1, , XMM7 regiszterek valamelyike mem128 128 bites memriaoperandus xmmreg/mem32 SIMD lebegpontos regiszter vagy 32 bites memriaoperandus xmmreg/mem64 SIMD lebegpontos regiszter vagy 64 bites memriaoperandus xmmreg/mem128 SIMD lebegpontos regiszter vagy 128 bites memriaoperandus 17.14.1 Adatmozgat utastsok MOVAPS xmmreg,xmmreg/mem128 MOVAPS xmmreg/mem128,xmmreg (MOVe Aligned four Packed Single-FP) MOVUPS xmmreg,xmmreg/mem128 MOVUPS xmmreg/mem128,xmmreg (MOVe Unaligned four Packed Single-FP) A forrs 128 bites tartalmt a cl regiszterbe vagy memriaterletre rjk. Ha a memriaoperandus offszetcme nem oszthat 16-tal (teht nem illeszkedik paragrafushatrra), akkor a MOVAPS 13as kivtelt (#GP) generl. A MOVUPS nem veszi figyelembe ezt az illeszkedst, de 17-es kivtelt (#AC) ettl fggetlenl kivlthat, ha az adott operandus nem illeszkedik duplaszhatrra (s
397

persze engedlyeztk az illeszkeds-ellenrzs kivtel keletkezst a CR0 regiszter AM (18-as) s az EFlags regiszter AC (szintn 18-as) bitjnek belltsval, valamint CPL=3). MOVHPS xmmreg,mem64 MOVHPS mem64,xmmreg (MOVe two Packed Single-FP to/from High-order quadword of a SIMD FP register) Ha a forrs a memriaoperandus, akkor annak tartalmt berja a cl SIMD lebegpontos regiszter fels felbe, az als 64 bitet bkn hagyja. Egybknt a forrs SIMD regiszter fels 64 bitjt eltrolja a cl memriaterleten. MOVLPS xmmreg,mem64 MOVLPS mem64,xmmreg (MOVe two Packed Single-FP to/from Low-order quadword of a SIMD FP register) Ha a forrs a memriaoperandus, akkor annak tartalmt berja a cl SIMD lebegpontos regiszter als felbe, a fels 64 bitet bkn hagyja. Egybknt a forrs SIMD regiszter als 64 bitjt eltrolja a cl memriaterleten. MOVHLPS dest xmmreg,xmmreg (MOVe two Packed Single-FP from High-order 64-bits of source to Lower half of destination) A forrs fels kvadraszavt berja a cl als felbe, a fels 64 bit pedig rintetlen marad. MOVLHPS dest xmmreg,xmmreg (MOVe two Packed Single-FP from Lower half of source to High-order 64-bits of destination) A forrs als kvadraszavt berja a cl fels felbe, az als 64 bit pedig rintetlen marad. MOVMSKPS reg32,xmmreg (MOVe MaSK of four Packed Single-FP)
398

A forrsban lev ngy egyszeres vals szm legfels bitjbl (eljelbit) kpez egy ngybites binris szmot, majd azt zrkiterjesztetten berja a cl 32 bites ltalnos regiszterbe. Ez azt eredmnyezi, hogy a forrs 31, 63, 95 s 127 szm bitjei sorban a cl regiszter 0, 1, 2 s 3 szm bitjeibe kerlnek, s a cl 4..31 bitjei mind nullk lesznek. MOVSS xmmreg,xmmreg/mem32 MOVSS xmmreg/mem32,xmmreg (MOVe Scalar Single-FP) Ha a forrs memriaoperandus, akkor annak tartalmt a cl als duplaszavba tlti, majd a tbbi bitet kinullzza. Ha a cl memriaoperandus, akkor a forrs SIMD regiszter als 32 bitjt a clban eltrolja. Ha mindkt operandus SIMD lebegpontos regiszter, akkor a forrs als 32 bitjt a cl als 32 bitjbe rja, a fels bitek pedig vltozatlanok maradnak.

17.14.2 Konverzis utastsok CVTPI2PS xmmreg,mmreg/mem64 (ConVerT Packed signed Integer To Packed SingleFP) A forrsban lev kt eljeles binris egsz duplaszt az MXCSR-nek megfelel kerektssel egyszeres lebegpontos valss konvertlja, ezeket eltrolja a cl SIMD regiszter als felben, a fels 64 bitet pedig bkn hagyja. CVTPS2PI mmreg,xmmreg/mem64 (ConVerT Packed Single-FP To Packed signed Integer) A forrs SIMD regiszterben vagy 64 bites memriaterleten lev kt egyszeres vals szmot
399

az MXCSR-nek megfelel kerektssel eljeles binris egsz duplaszv konvertlja, majd azokat eltrolja a cl MMX regiszterben. Ha a kerektett rtk nem brzolhat 32 biten (azaz tlcsordul), a binris egsz meghatrozatlan rtk (integer indefinite), azaz 80000000h lesz eltrolva. CVTTPS2PI mmreg,xmmreg/mem64 (ConVerT Packed Single-FP To Packed signed Integer using Truncation) A forrs SIMD regiszterben vagy 64 bites memriaterleten lev kt egyszeres vals szmot csonkolssal binris egsz duplaszv konvertlja, majd azokat eltrolja a cl MMX regiszterben. Ha a csonkolt rtk nem brzolhat 32 biten, a binris egsz meghatrozatlan rtk lesz eltrolva. CVTSI2SS xmmreg,reg/mem32 (ConVerT Scalar signed Integer To Scalar Single-FP) A forrsban lev eljeles binris egsz duplaszt az MXCSR-nek megfelel kerektssel egyszeres lebegpontos valss konvertlja, azt eltrolja a cl SIMD regiszter als 32 bitjben, a tbbi bitet pedig bkn hagyja. CVTSS2SI reg32,xmmreg/mem32 (ConVerT Scalar Single-FP To Scalar signed Integer) A forrs SIMD regiszterben vagy 32 bites memriaterleten lev egyszeres vals szmot az MXCSR-nek megfelel kerektssel eljeles binris egsz duplaszv konvertlja, majd azt eltrolja a cl ltalnos regiszterben. Ha a kerektett rtk nem brzolhat 32 biten (azaz tlcsordul), a binris egsz meghatrozatlan rtk lesz eltrolva. CVTTSS2SI reg32,xmmreg/mem32

400

(ConVerT Scalar Single-FP To Scalar signed Integer using Truncation) A forrs SIMD regiszterben vagy 32 bites memriaterleten lev egyszeres pontossg vals szmot csonkolssal binris egsz duplaszv konvertlja, majd azt eltrolja a cl ltalnos regiszterben. Ha a csonkolt rtk nem brzolhat 32 biten, a binris egsz meghatrozatlan rtk lesz eltrolva. 17.14.3 Lebegpontos aritmetikai utastsok ADDPS dest,source (ADD Packed Single-FP) A forrsban lev elemeket hozzadja a clban levkhz, majd az eredmnyeket pakoltan a clban eltrolja. ADDSS dest,source (ADD Scalar Single-FP) A forrs als elemt hozzadja a cl als elemhez, majd az eredmnyt visszarja a clba. A clban a tbbi bit rtke vltozatlan marad. SUBPS dest,source (SUBtract Packed Single-FP) A forrsban lev elemeket kivonja a clban levkbl, majd az eredmnyeket pakoltan a clban eltrolja. SUBSS dest,source (SUBtract Scalar Single-FP) A forrs als elemt kivonja a cl als elembl, majd az eredmnyt visszarja a clba. A clban a tbbi bit rtke vltozatlan marad. MULPS dest,source (MULtiply Packed Single-FP)
401

A forrsban lev elemeket megszorozza a clban levkkel, majd az eredmnyeket pakoltan a clban eltrolja. MULSS dest,source (MULtiply Scalar Single-FP) A forrs als elemt megszorozza a cl als elemvel, majd az eredmnyt visszarja a clba. A clban a tbbi bit rtke vltozatlan marad. DIVPS dest,source (DIVide Packed Single-FP) A clban lev elemeket elosztja a forrsban levkkel, majd az eredmnyeket pakoltan a clban eltrolja. DIVSS dest,source (DIVide Scalar Single-FP) A cl als elemt elosztja a forrs als elemvel, majd az eredmnyt visszarja a clba. A clban a tbbi bit rtke vltozatlan marad. SQRTPS dest,source (SQuare RooT of Packed Single-FP) A forrsban lev elemek ngyzetgykt pakoltan eltrolja a clban. SQRTSS dest,source (SQuare RooT of Scalar Single-FP) A forrs als elemnek ngyzetgykt a cl als elemben eltrolja. A clban a tbbi bit rtke vltozatlan marad. RCPPS dest,source (ReCiProcal approximation of Packed Single-FP) A forrsban lev elemek reciproknak 12 bitre pontos kzeltst pakolva eltrolja a clban. RCPSS dest,source (ReCiProcal approximation of Scalar Single-FP)

402

A forrs als eleme reciproknak 12 bitre pontos kzeltst eltrolja a cl als elemben. A clban a tbbi bit rtke vltozatlan marad. RSQRTPS dest,source (ReCiProcal SQuare RooT approximation of Packed Single-FP) A forrsban lev elemek reciprok ngyzetgyknek 12 bitre pontos kzeltst pakolva eltrolja a clban. RSQRTSS dest,source (ReCiProcal SQuare RooT approximation of Scalar Single-FP) A forrs als eleme reciprok ngyzetgyknek 12 bitre pontos kzeltst eltrolja a cl als elemben. A clban a tbbi bit rtke vltozatlan marad. MAXPS dest,source (Maximum of Packed Single-FP) A forrsban s clban lev elemprok nagyobbik tagjait pakoltan a clban eltrolja. Ha csak az egyik tag NaN, akkor mindig a forrsban lev rtket adja vissza vltozatlanul. MAXSS dest,source (Maximum of Scalar Single-FP) A forrs s a cl als elemei kzl a nagyobbat a cl als elemben eltrolja. A clban a tbbi bit rtke vltozatlan marad. Ha csak az egyik tag NaN, akkor mindig a forrsban lev rtket adja vissza vltozatlanul. MINPS dest,source (Minimum of Packed Single-FP) A forrsban s clban lev elemprok kisebbik tagjait pakoltan a clban eltrolja. Ha csak az egyik tag NaN, akkor mindig a forrsban lev rtket adja vissza vltozatlanul. MINSS dest,source
403

(Minimum of Scalar Single-FP) A forrs s a cl als elemei kzl a kisebbet a cl als elemben eltrolja. A clban a tbbi bit rtke vltozatlan marad. Ha csak az egyik tag NaN, akkor mindig a forrsban lev rtket adja vissza vltozatlanul. 17.14.4 sszehasonlt utastsok CMPPS dest,source,0 CMPEQPS dest,source (CoMPare Packed Single-FP for EQual) CMPPS dest,source,1 CMPLTPS dest,source (CoMPare Packed Single-FP for Less Than) CMPPS dest,source,2 CMPLEPS dest,source (CoMPare Packed Single-FP for Less or Equal) CMPPS dest,source,3 CMPUNORDPS dest,source (CoMPare Packed Single-FP for UNORDered) CMPPS dest,source,4 CMPNEQPS dest,source (CoMPare Packed Single-FP for Not EQual) CMPPS dest,source,5 CMPNLTPS dest,source (CoMPare Packed Single-FP for Not Less Than) CMPPS dest,source,6 CMPNLEPS dest,source (CoMPare Packed Single-FP for Not Less or Equal) CMPPS dest,source,7 CMPORDPS dest,source (CoMPare Packed Single-FP for ORDered)

404

A hromoperandus CMPPS utasts a forrsban lev elemeket hasonltja ssze a clban levkkel, s ha a harmadik operandus (kzvetlen bjt) ltal mutatott felttel teljesl, akkor csupa 1-es, klnben csupa 0-s bitbl ll rtket trol el pakolva a clban. A kzvetlen operandus csak a 0..7 rtkek valamelyike lehet. A ktoperandus mnemonikok a CMPPS utastst kdoljk le egy adott kzvetlen operandussal. CMPSS dest xmmreg,xmmreg/mem32,0 CMPEQSS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for EQual) CMPSS dest xmmreg,xmmreg/mem32,1 CMPLTSS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for Less Than) CMPSS dest xmmreg,xmmreg/mem32,2 CMPLESS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for Less or Equal) CMPSS dest xmmreg,xmmreg/mem32,3 CMPUNORDSS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for UNORDered) CMPSS dest xmmreg,xmmreg/mem32,4 CMPNEQSS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for Not EQual) CMPSS dest xmmreg,xmmreg/mem32,5 CMPNLTSS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for Not Less Than) CMPSS dest xmmreg,xmmreg/mem32,6 CMPNLESS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for Not Less or Equal) CMPSS dest xmmreg,xmmreg/mem32,7 CMPORDSS dest xmmreg,xmmreg/mem32 (CoMPare Scalar Single-FP for ORDered)

405

A hromoperandus CMPSS utasts a forrs als elemt hasonltja ssze a cl als elemvel, s ha a harmadik operandus (kzvetlen bjt) ltal mutatott felttel teljesl, akkor csupa 1-es, klnben csupa 0-s bitbl ll rtket trol el a cl als elemben. A kzvetlen operandus csak a 0..7 rtkek valamelyike lehet. A ktoperandus mnemonikok a CMPSS utastst kdoljk le egy adott kzvetlen operandussal. COMISS dest xmmreg,xmmreg/mem32 (COMpare Scalar Single-FP and set EFlags) A forrs als elemt sszehasonltja a cl als elemvel, majd az eredmnynek megfelelen belltja a CF, PF s ZF flag-eket. Az AF, SF s OF flag-eket minden esetben trli. Az unordered felttel teljeslsekor rvnytelen operandus numerikus kivtel (#IA) keletkezik. Ha ezt el akarjuk kerlni, hasznljuk inkbb az UCOMISS utastst. Az eredmnyt az albbi tblzat alapjn rtelmezhetjk: Eredmny CF PF ZF cl>forrs 0 0 0 cl<forrs 1 0 0 cl=forrs 0 0 1 Unordered 1 1 1

UCOMISS dest xmmreg,xmmreg/mem32 (COMpare Scalar Single-FP Unordered and set EFlags) A forrs als elemt sszehasonltja a cl als elemvel, majd az eredmnynek megfelelen belltja a CF, PF s ZF flag-eket. Az AF, SF s OF flag-eket minden esetben trli. Az unordered felttel
406

teljeslsekor csak akkor keletkezik rvnytelen operandus numerikus kivtel (#IA), ha valamelyik tag SNaN volt. Az eredmny rtelmezst lsd a COMISS utasts lersnl. 17.14.5 Logikai utastsok ANDPS dest,source (bitwise logical AND) ANDNPS dest,source (bitwise logical AND plus NOT) ORPS dest,source (bitwise logical OR) XORPS dest,source (bitwise logical eXclusive OR) A forrs s a cl mint 128 bites szmok kztt vgeznek valamilyen logikai mveletet bitenknt, majd az eredmnyt a clban eltroljk. Az ANDNPS utasts a clnak veszi az egyes komplemenst, s ezt az rtket hozza logikai S kapcsolatba a forrssal.

17.14.6 Kever utastsok (Data shuffle instructions) SHUFPS dest,source,imm8 (SHUFfle Packed Single-FP) Az eredmny als kt duplaszavba a cl, mg a fels kt duplaszavba a forrs meghatrozott sorszm elemeit pakolja be, majd azt a cl regiszterben eltrolja. A harmadik, bjt mret kzvetlen operandus hatrozza meg, mely elemeket vlassza ki az utasts: a 0..1 bitek rtke adja meg, a cl hnyadik eleme kerljn az als duplaszba (0..31 bitek); a 2..3 bitek tartalmazzk
407

a cl azon elemnek sorszmt, amely az eredmny msodik duplaszavba (32..63 bitek) fog kerlni. A 4..5 s a 6..7 bitek hasonl mdon a forrs ngy eleme kzl hatrozzk meg azt a kettt, amelyeket az eredmny harmadik ill. negyedik duplaszavba (64..95 s 96..127 bitek) kell rni. Termszetesen a forrs s a cl lehet azonos SIMD regiszter is, s brmelyik operandusbl vlaszthatjuk ugyanazt az elemet tbbszr is. UNPCKHPS dest,source (UNPaCK Packed Single-FP from High-order 64-bits of source and destination) A cl s a forrs fels felbl felvltva ber egy-egy elemet az eredmnybe, majd azt a cl SIMD regiszterbe trolja. Mkdse: az eredmny 0..31 bitjei a cl 64..95 bitjeit, 32..63 bitjei a forrs 64..95 bitjeit, 64..95 bitjei a cl 96..127 bitjeit, mg 96..127 bitjei a forrs 96..127 bitjeit fogjk tartalmazni. UNPCKLPS dest,source (UNPaCK Packed Single-FP from Low-order 64-bits of source and destination) A cl s a forrs als felbl felvltva ber egy-egy elemet az eredmnybe, majd azt a cl SIMD regiszterbe trolja. Mkdse: az eredmny 0..31 bitjei a cl 0..31 bitjeit, 32..63 bitjei a forrs 0..31 bitjeit, 64..95 bitjei a cl 32..63 bitjeit, mg 96..127 bitjei a forrs 32..63 bitjeit fogjk tartalmazni.

17.14.7 Tovbbi MMX utastsok PAVGB mmreg,mmreg/mem64 (AVeraGe of unsigned Bytes)


408

Mkdse megegyezik a PAVGUSB 3DNow! utastsval, teht a forrsban s a clban lev 8 db. eljeltelen, bjt mret elempr kerektett tlagt szmtja ki, majd az eredmnyeket pakolva eltrolja a cl regiszterben. PAVGW mmreg,mmreg/mem64 (AVeraGe of unsigned Bytes) A forrsban s a clban lev 4 db. eljeltelen, sz mret elempr kerektett tlagt szmtja ki, majd az eredmnyeket pakolva eltrolja a cl regiszterben. PMAXUB mmreg,mmreg/mem64 (MAXimum of Unsigned Bytes) A forrsban s clban lev 8 db. eljeltelen, bjt mret elempr nagyobbik tagjait pakolva eltrolja a cl regiszterben. PMAXSW mmreg,mmreg/mem64 (MAXimum of Signed Words) A forrsban s clban lev 4 db. eljeles, sz mret elempr nagyobbik tagjait pakolva eltrolja a cl regiszterben. PMINUB mmreg,mmreg/mem64 (MINimum of Unsigned Bytes) A forrsban s clban lev 8 db. eljeltelen, bjt mret elempr kisebbik tagjait pakolva eltrolja a cl regiszterben. PMINSW mmreg,mmreg/mem64 (MINimum of Signed Words) A forrsban s clban lev 4 db. eljeles, sz mret elempr kisebbik tagjait pakolva eltrolja a cl regiszterben. PSADBW mmreg,mmreg/mem64 (Word Sum of Absolute Differences of unsigned Bytes)

409

Veszi a forrsban s a clban lev eljeltelen, bjt mret elemprok klnbsgnek abszolt rtkt, ezeket a szmokat sszegzi, majd a vgeredmnyt a cl regiszter als szavban eltrolja. A tovbbi biteket a clban kinullzza. PMULHUW mmreg,mmreg/mem64 (MULtiply Unsigned Words, and store High-order words of results) sszeszorozza a forrsban s a clban lev eljeltelen szavakat, majd az eredmnyek fels szavt pakolva eltrolja a clba. PMOVMSKB reg32,mmreg (MOVe MaSK of Packed Bytes) A forrsban lev nyolc bjt legfels bitjbl (eljelbit) kpez egy nyolcbites binris szmot, majd azt zrkiterjesztetten berja a cl 32 bites ltalnos regiszterbe. Ez azt eredmnyezi, hogy a forrs 7, 15, 23, 31, 39, 47, 55 s 63 szm bitjei sorban a cl regiszter 0, 1, 2, 3, 4, 5, 6 s 7 szm bitjeibe kerlnek, s a cl 8..31 bitjei mind nullk lesznek. PEXTRW reg32,mmreg,imm8 (EXTRact Word) A forrs adott sorszm szavt a cl ltalnos regiszterbe rja zrkiterjesztetten. A harmadik, bjt mret kzvetlen operandus als kt bitje hatrozza meg a kivlasztott sz sorszmt. PINSRW mmreg,reg32/mem16,imm8 (INSeRt Word) A forrs als szavt a cl MMX regiszter adott sorszm szavba rja, a tbbi bitet viszont nem bntja. A harmadik, bjt mret kzvetlen operandus als kt bitje hatrozza meg a kivlasztott sz sorszmt. PSHUFW mmreg,mmreg/mem64,imm8
410

(SHUFfle Packed Words) A forrs megadott sorszm szavait sorban bepakolja az eredmnybe, amit a cl MMX regiszterben trol el. A harmadik, bjt mret kzvetlen operandus tartalmazza a ngy sz sorszmt: a 0..1 bitek az eredmny als szavba (0..15 bitek), a 2..3 bitek a msodik szba (16..31 bitek), a 4..5 bitek a harmadik szba (32..47 bitek), mg a 6..7 bitek a fels szba (48..63 bitek) kerl forrssz sorszmt jellik ki. 17.14.8 Cache-selst vezrl utastsok (Cacheability control instructions) MASKMOVQ mmreg,mmreg (MOVe bytes of Quadword according to MASK) A cl MMX regiszter maszkolt rtkt berja a DS:DI vagy DS:EDI cmre. A maszkols annyit jelent, hogy a forrs MMX regiszter mindegyik bjtjnak fels bitje (eljelbit) hatrozza meg, hogy a cl regiszter megfelel bjtjt ki kell-e rni. Ha az adott bit 1 rtk, akkor a megfelel bjt kirsra kerl, klnben 00000000b lesz helyette eltrolva. Az utasts kifejezetten arra a clra kszlt a MOVNTQ s MOVNTPS utastshoz hasonlan, hogy az ilyen "egyszer hasznlatos" (non-temporal) adatok memriba trolsakor a cache lehetleg ne "szennyezdjn", azaz feleslegesen ne kerljn be a cache-be olyan adat, aminek gyors elrhetsge szmunkra nem fontos. MOVNTQ mem64,mmreg (MOVe Quadword Non-Temporal)

411

forrs MMX regiszter tartalmt a cl memriaterletre rja, s kzben a cache "szennyezdst" minimlisra cskkenti. MOVNTPS mem128,xmmreg (MOVe aligned Packed Single-FP Non-Temporal) A forrs SIMD lebegpontos regiszter tartalmt a cl memriaterletre rja, s kzben a cache "szennyezdst" minimlisra cskkenti. A MOVAPS utastshoz hasonlan, ha a memriaoperandus offszetcme nem oszthat 16-tal (teht nem illeszkedik paragrafushatrra), akkor 13-as kivtelt (#GP) generl. PREFETCHT0 mem8 (PREFETCH data using the T0 hint) PREFETCHT1 mem8 (PREFETCH data using the T1 hint) PREFETCHT2 mem8 (PREFETCH data using the T2 hint) PREFETCHNTA mem8 (PREFETCH data using the NTA hint) A megadott memriacmet tartalmaz cache-sort (aminek mrete legalbb 32 bjt) a processzorhoz "kzelebb" hozzk, azaz valamelyik cache-be beolvassk. Hogy melyik cache lesz ez, azt a elreolvass tpusa hatrozza meg: T0 esetn brmelyik lehet, T1 esetn az elsszint (L1) cache, mg T2 esetn a msodszint (L2) cache tartalmtl fgg, hogy mit vlaszt a processzor. Az NTA mdszer a ritkn hasznlatos (nontemporal) adatok olvassakor lehet hasznos. Az utasts gpi kd alakja 0Fh 18h *r+i, ahol "i" rtke vlasztja ki a hasznlni kvnt mdszert: a 000b, 001b, 010b s 011b rtkek sorban az NTA, T0, T1 s T2 tpus elreolvasst jelentik, s a
412

mnemonikok is az ennek megfelel kdot generljk. Az ezektl eltr "i" rtk a ksbbi j utastsok szmra fenntartott, vgrehajtsuk pedig kiszmthatatlan kvetkezmnnyel jr. SFENCE (no op) (Store FENCE) Addig vrakozik, amg az sszes korbban kiadott memriamdost trolsi mvelet be nem fejezdik. Garantlja, hogy a fogyaszt (consumer) minden adatot pontosan ugyangy s egyszerre kapjon meg, ahogy azokat a termel (producer) folyamat szolgltatja.

17.14.9 llapot-kezel utastsok (State management instructions) LDMXCSR mem32 (LoaD SIMD Control/Status Register) A megadott cmrl betlti az MXCSR regiszter j tartalmt. Ha valamelyik fenntartott bitpozciban 1 ll, 13-as kivtel (#GP) keletkezik. STMXCSR mem32 (STore SIMD Control/Status Register) A megadott cmre eltrolja az MXCSR regiszter tartalmt, a fenntartott bitek helyre 0-t rva. FXRSTOR mem (ReSTORe Floating-Point and MMX state, and SSE state) A megadott memriacmen elhelyezked 512 bjtos terletrl betlti az FPU/MMX llapotot, valamint az SSE llapotot. Ezt az informcit az FXSAVE utastssal trolhatjuk el. Ha a cm nem oszthat 16-tal (teht nem illeszkedik paragrafushatrra), 13-as (#GP) vagy 17-es (#AC) kivtel
413

keletkezik. Hogy melyik, az implementci-fgg. Ha a CR4 regiszter OSFXSR (9-es) bitje 0 rtk, akkor az MXCSR s XMM0..XMM7 regiszterek rtkt nem lltja vissza. FXSAVE mem (SAVE Floating-Point and MMX state, and SSE state) A megadott memriacmen elhelyezked 512 bjt nagysg terletre eltrolja az FPU/MMX llapotot, valamint az SSE llapotot. Ha a cm nem oszthat 16-tal (teht nem illeszkedik paragrafushatrra), 13-as (#GP) vagy 17-es (#AC) kivtel keletkezik. Hogy melyik, az implementci-fgg. Az FSAVE FPU utastssal ellenttben nem inicializlja jra a koprocesszort. Ha a CR4 regiszter OSFXSR (9-es) bitje 0 rtk, akkor az MXCSR s XMM0..XMM7 regiszterek rtkt nem trolja el.

Az albbi tblzat mutatja a terlet felptst: Bjtpozci Nv Tartalom 0..1 FCW FPU vezrlregiszter (Control Word) 2..3 FSW FPU sttuszregiszter (Status Word) 4..5 FTW FPU tag-regiszter (Tag Word) 6..7 FOP FPU mveleti kd reg. (Opcode Reg.) 8..11 IP FPU Instruction Pointer reg. offszet 12..13 CS FPU Instruction Pointer reg. szelektor 14..15 16..19 DP FPU Operand Pointer regiszter offszet 20..21 DS FPU Operand Pointer reg. szelektor 22..23 24..27 MXCSR SIMD vezrl-/sttuszregiszter 28..31 32..41 ST(0)/MM0 ST(0) FPU verem/MM0 MMX reg. 42..47
414

48..57 58..63 64..73 74..79 80..89 90..95 96..105 106..111 112..121 122..127 128..137 138..143 144..153 154..159 160..175 176..191 192..207 208..223 224..239 240..255 256..271 272..287 288..511

ST(1)/MM1 ST(2)/MM2 ST(3)/MM3 ST(4)/MM4 ST(5)/MM5 ST(6)/MM6 ST(7)/MM7 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7

ST(1) FPU verem/MM1 MMX reg. ST(2) FPU verem/MM2 MMX reg. ST(3) FPU verem/MM3 MMX reg. ST(4) FPU verem/MM4 MMX reg. ST(5) FPU verem/MM5 MMX reg. ST(6) FPU verem/MM6 MMX reg. ST(7) FPU verem/MM7 MMX reg. XMM0 SIMD lebegpontos regiszter XMM1 SIMD lebegpontos regiszter XMM2 SIMD lebegpontos regiszter XMM3 SIMD lebegpontos regiszter XMM4 SIMD lebegpontos regiszter XMM5 SIMD lebegpontos regiszter XMM6 SIMD lebegpontos regiszter XMM7 SIMD lebegpontos regiszter

Ahol nincs feltntetve tartalom, akkor azok a bjtok fenntartottak. Az FPU tag-regiszter nem a megszokott formban troldik el. Az FSAVE utasts ltal hasznlt formtummal ellenttben csak azt tartalmazza az FTW mez, hogy az adott FPU adatregiszter rvnyes-e avagy nem. Az FTW sz als bjtjban minden bit egy-egy fizikai FPU adatregiszterhez tartozik, a bitek sorrendje teht TOS-tl fggetlen. Ha az adott bit rtke 1, akkor a
415

regiszter rvnyes (valid, zero vagy special), mg 0 esetn res (empty). A fels bjt rtke fenntartott. A mveleti kd regisztert tartalmaz sznak a fels 5 bitje nincs kihasznlva (a 7-es bjt 3..7 bitjei), ezek rtke nulla. Az utastsmutat s operandusmutat regiszterek offszetje 32 bites kdszegmens esetn duplasz nagysg, mg 16 bites kdszegmens hasznlatakor csak az als sz rvnyes, s a fels kt bjt fenntartott (10, 11, 18 s 19 bjtok). Szintn erre a kt regiszterre vonatkozik, hogy vdett mdban szelektor, mg vals mdban rtelemszeren szegmens rtk lesz eltrolva. Az MXCSR regiszter fenntartott bitjei helyn 0 kerl eltrolsra.

17.15 sszefoglals
Ebben a fejezetben sszefoglaljuk a processzor ltal biztostott programozsi krnyezet minden fontosabb elemt. Az itt kzlt adatok az aktulis legfrissebb processzorokra (Intel Pentium III, AMD K6-2 s AMD K6-III) vonatkoznak. Ahol szksges, a kt gyrt termkei kzti klnbsgeket is kiemeljk. 17.15.1 ltalnos cl regiszterek (General purpose registers) 32 bites EAX EBX 16 bites AX BX 8 bites fels AH BH 8 bites als AL BL
416

ECX EDX ESI EDI ESP EBP

CX DX SI DI SP BP

CH DH

CL DL

17.15.2 Szegmensregiszterek (Segment selector registers) Kdszegmens (code segment): CS Adatszegmens (data segment): DS, ES, FS, GS Veremszegmens (stack segment): SS Mindegyik szegmensregiszter 16 bites. A regiszterek tartalmt azonban mskpp kell rtelmezni a processzor zemmdjtl fggen. Vals s virtulis-8086 mdban szegmenscmet tartalmaznak ezek a regiszterek: Bitpozci Tartalom 0..15 Szegmenscm (Segment address) Vdett mdban mindegyik szegmensregiszter egy szelektorregiszterknt funkcionl: Bitpozci Jells Nv 0..1 RPL Requested Privilege Level 2 TI Table Indicator 3..15 Index
417

17.15.3 Utastsmutat regiszter (Instruction pointer register) 32 bites EIP 16 bites IP

17.15.4 FPU utastsmutat s operandusmutat regiszterek (FPU instruction pointer and operand pointer registers) A 48 bites FPU IP s OP regiszterek tartalmt mskppen kell rtelmezni a processzor zemmdjtl fggen. Vals s virtulis-8086 mdban 16 bites szegmenset s 16 bites offszetet tartalmaz mindkt regiszter. Vdett mdban a kdszegmens cmmrettl fggen 16 bites szelektor s 16 bites offszet, vagy pedig 16 bites szelektor s 32 bites offszet troldik a regiszterekben. Az IP regiszter a legutols, nem vezrl FPU utastsra mutat, OP pedig a legutoljra hasznlt memriaoperandus cmt tartalmazza. Az IP s OP regiszterek felptse megegyezik: Bitpozci Tartalom 0..31 16 vagy 32 bites offszet 32..47 Szegmens vagy szelektor rtk

17.15.5 FPU mveleti kd regiszter (FPU opcode register)

418

Ebben a regiszterben a legutols, nem vezrl FPU utasts mveleti kdja tallhat meg. A mveleti kd els bjtjnak fels 5 bitje (3..7 bitek) mindegyik FPU utastsnl llandak (11011b), ezrt ezeket nem troljk el. Bitpozci Tartalom 0..7 Mveleti kd 2. bjtja 8..10 Mveleti kd 1. bjtjnak 0..2 bitjei

17.15.6 FPU adatregiszterek (FPU data registers) A fizikai regiszterek neve FPR0, FPR1, , FPR7. Azt a szmot, ami a verem tetejt tartalmaz adatregiszter sorszma, TOS-nak (Top Of Stack) nevezzk. A verem tetejt ST ill. ST(0) jelli, mg a verem tetejhez kpesti i-edik regisztert ST(i). ST(i) rtelmezsekor figyelembe kell venni, hogy a hivatkozott fizikai regiszter szma (TOS+i) mod 8 lesz. gy ha mondjuk TOS=3, ST s ST(0) az FPR3, ST(1) az FPR4, ST(4) az FPR7, ST(7) pedig az FPR2 regisztert fogja kijellni. Mindegyik koprocesszor adatregiszter 80 bites. A regiszterek felptse: Bitpozci 0..62 63 64..78 79 Tartalom Mantissza trtrsz (Significand fractional part) Mantissza egszrsz (Significand integer part) Eltolt exponens (Biased exponent) Eljel (Sign)

17.15.7 MMX regiszterek (MMX registers)

419

Az MMX regiszterek neve MM0, MM1, , MM7. Ezek a regiszterek a fizikai koprocesszor adatregiszterekre vannak rkpezve, mghozz azok mantissza rszre (0..63 bitek). Eszerint MM0 az FPR0, MM1 az FPR1, stb., MM7 az FPR7 regiszter als 64 bitjn helyezkedik el. Az MMX regiszterek mrete 64 bit.

17.15.8 3DNow! regiszterek (3DNow! registers) A 3DNow! regiszterek megegyeznek az MMX regiszterekkel, de tartalmukat a 3DNow! lebegpontos utastsok az MMX utastsoktl eltr mdon rtelmezik. Az Intel Pentium III processzor nem tmogatja a 3DNow! technolgit, s gy a 3DNow! regisztereket sem.

17.15.9 SIMD lebegpontos regiszterek (SIMD floatingpoint registers) A SIMD lebegpontos regiszterek neve XMM0, XMM1, , XMM7. Ezek a regiszterek fizikailag fggetlenek a processzor tbbi regisztertl, gy a koprocesszor adatregisztereitl is. Mindegyik regiszter 128 bites. Az AMD K6-2 s K6-III processzorok nem tmogatjk az SSE technolgit, s gy a SIMD lebegpontos regisztereket sem.

17.15.10 Sttuszregiszter (Status register)

420

A 32 bites EFlags regiszter als 16 bitje Flags nven rhet el. A regiszter bitjeinek funkcijt, a flag-ek nevt mutatja a kvetkez tblzat: Bitpozci Jells Nv 0 CF Carry Flag 1 2 PF Parity Flag 3 4 AF Auxilliary/Adjust Flag 5 6 ZF Zero Flag 7 SF Sign Flag 8 TF Trap Flag 9 IF Interrupt Flag 10 DF Direction Flag 11 OF Overflow Flag 12..13 IOPL Input/Output Privilege Level 14 NT Nested Task 15 16 RF Resume Flag 17 VM Virtual-8086 Mode 18 AC Alignment Check enable 19 VIF Virtual Interrupt Flag 20 VIP Virtual Interrupt Pending 21 ID processor IDentification 22..31

17.15.11 FPU sttuszregiszter (FPU status word/register) Bitpozci Jells Nv 0 IE Invalid operation Exception 1 DE Denormalized operand Exception
421

2 3 4 5 6 7 8 9 10 11..13 14 15

ZE OE UE PE SF ES C0 C1 C2 TOS C3 B

division by Zero Exception Overflow Exception Underflow Exception Precision loss Exception Stack Fault Error Summary status Condition code 0 Condition code 1 Condition code 2 Top Of Stack pointer Condition code 3 FPU Busy

17.15.12 FPU tag-regiszter (FPU tag word/register) Az FPU tag-regiszter mezinek rtke utal a koprocesszor adatregiszterek tartalmra. Az egyes mezk a megfelel fizikai adatregiszterhez tartoznak, gy pl. Tag0 FPR0, Tag1 FPR1 stb. tartalmra utal. Bitpozci 0..1 2..3 4..5 6..7 8..9 10..11 12..13 14..15 Tartalom Tag0 Tag1 Tag2 Tag3 Tag4 Tag5 Tag6 Tag7

A tag-ek rtkt gy kell rtelmezni:

422

Tag rtke 00 01 10 11

Tartalom rvnyes szm (Valid) Nulla (Zero) Klnleges (Special) res (Empty)

17.15.13 FPU vezrlregiszter (FPU control word/register) Bitpozci Jells Nv 0 IM Invalid operation excpt. Mask 1 DM Denormalized operand excpt. Mask 2 ZM division by Zero excpt. Mask 3 OM Overflow excpt. Mask 4 UM Underflow excpt. Mask 5 PM Precision loss excpt. Mask 6 7 I Interrupt enable mask 8..9 PC Precision Control 10..11 RC Rounding Control 12 IC Interrupt Control 13..15 Az I bit csak a 8087-es koprocesszoron ltezik. Az IC bitnek csak a 8087, 80187 s 80287 koprocesszorok esetn van jelentsge, de a ksbbi koprocesszorok (a 80287xl-t is belertve) s processzorok is tmogatjk (de nem hasznljk) ezt a bitet a kompatibilits miatt. A PC s RC mezk rtelmezse pedig gy trtnik: PC rtke Pontossg 00 Egyszeres 01
423

10 11 RC rtke 00 01 10 11

Dupla Kiterjesztett Kerekts mdja Legkzelebbi rtkhez Lefel (-Inf fel) Felfel (+Inf fel) Nulla fel (csonkts)

17.15.14 SIMD vezrl-/sttuszregiszter (SIMD floatingpoint control/status register) Az MXCSR regiszter felptse: Bitpozci Jells Nv 0 IE Invalid operation Exception 1 DE Denormalized operand Exception 2 ZE division by Zero Exception 3 OE Overflow Exception 4 UE Underflow Exception 5 PE Precision loss Exception 6 7 IM Invalid operation excpt. Mask 8 DM Denormalized operand excpt. Mask 9 ZM division by Zero excpt. Mask 10 OM Overflow excpt. Mask 11 UM Underflow excpt. Mask 12 PM Precision loss excpt. Mask 13..14 RC Rounding Control 15 FZ Flush-to-Zero 16..31

424

Az RC mez rtelmezse megegyezik az FPU vezrlregiszternek hasonl mezjnek rtelmezsvel. A fenntartott bitek rtke mindig 0. Ez a regiszter nem ltezik AMD processzorokon.

17.15.15 Vezrlregiszterek (Control registers) A CR0 regiszter felptse: Bitpozci Jells Nv 0 PE Protection Enable 1 MP Monitor coProcessor/Math Present 2 EM EMulation 3 TS Task Switched 4 ET Extension Type 5 NE Numeric Error handling 6..15 16 WP Write Protect 17 18 AM Alignment check Mask 19..28 29 NW cache Not Write-through 30 CD Cache Disable 31 PG PaGing A CR2 regiszter a laphiba lineris cmt tartalmazza: Bitpozci Tartalom 0..31 Laphiba lin. cme (Page fault linear address)

425

A CR3 regiszter felptse, ha a CR4 regiszterben PAE=0: Bitpozci Jells Nv 0..2 3 PWT Page-level Write-Through 4 PCD Page-level Cache Disable 5..11 12..31 PDB Page-Directory Base A CR3 regiszter tartalma, ha a CR4 regiszterben PAE=1: Bitpozci Jells Nv 0..2 3 PWT Page-level Write-Through 4 PCD Page-level Cache Disable 5..31 PDPTB Page-Directory Pointer Table Base A CR4 regiszter felptse: Bitpozci 0 1 2 3 4 5 6 7 Jells VME PVI TSD DE PSE PAE MCE PGE Nv Virtual Mode virtual int. Extension Protected mode Virtual Interrupts Time-Stamp instruction Disable Debugging Extensions Page Size Extension Physical Address Extension enable Machine Check exception Enable Page Global Enable

426

Performance-Monitoring Counter instruction Enable 9 OSFXSR Operating System supports FXRSTOR/FXSAVE 10 OSXMMEXCP Operating System supports SIMD T floating-point unMasked EXCePTions 11..31 Az AMD K6-2 s K6-III processzorok a PAE, PGE, PCE, OSFXSR s OSXMMEXCPT biteket nem tmogatjk. A fenntartott bitek rtke mindig 0.

PCE

17.15.16 Nyomkvet regiszterek (Debug registers) A DR0..DR3 regiszterek felptse: Bitpozci Tartalom 0..31 Trspont lin. cme (Breakpoint linear address) A DR6 regiszter felptse: Bitpozci Jells Nv 0 B0 Breakpoint 0 condition detected 1 B1 Breakpoint 1 condition detected 2 B2 Breakpoint 2 condition detected 3 B3 Breakpoint 3 condition detected 4..11 12 13 BD general Detect Breakpoint
427

14 15 16..31

BS BT

Single-step Breakpoint Task switch Breakpoint

A 4..11 s 16..31 bitek rtke mindig 1, a 12-es bit pedig mindig trlve van. A DR7 regiszter felptse: Bitpozci 0 1 2 3 4 5 6 7 8 9 10 11..12 13 14..15 16..17 18..19 20..21 22..23 24..25 26..27 28..29 30..31 Jells L0 G0 L1 G1 L2 G2 L3 G3 LE GE GD R/W0 LEN0 R/W1 LEN1 R/W2 LEN2 R/W3 LEN3 Nv breakpoint 0 Local enable breakpoint 0 Global enable breakpoint 1 Local enable breakpoint 1 Global enable breakpoint 2 Local enable breakpoint 2 Global enable breakpoint 3 Local enable breakpoint 3 Global enable Local Exact breakpoint enable Global Exact breakpoint enable General Detect enable breakpoint 0 Read/Write condition breakpoint 0 LENgth condition breakpoint 1 Read/Write condition breakpoint 1 LENgth condition breakpoint 2 Read/Write condition breakpoint 2 LENgth condition breakpoint 3 Read/Write condition breakpoint 3 LENgth condition

428

A 11-es, 12-es, 14-es s 15-s bitek rtke mindig 0. A 10-es bitnek mindig 1-et kell tartalmaznia.

17.15.17 Memria-kezel regiszterek (Memorymanagement registers) A GDTR (Global Descriptor Table Register) s IDTR (Interrupt Descriptor Table Register) regiszterek felptse megegyezik: Bitpozci Tartalom 0..15 Hatr (Limit) 16..47 Lineris bziscm (Linear base address) Az LDTR (Local Descriptor Table Register) s TR (Task Register) regiszterekbl csak a 16 bites szelektort tartalmaz rsz rhet el kzvetlenl, a hatrt, a lineris bziscmet s az attribtumokat tartalmaz mezk rejtettek.

17.15.18 Modell-specifikus regiszterek (Model-specific registersMSRs) Az Intel Pentium III processzor 79, az AMD K6-2 processzor 7, az AMD K6-III pedig 11 db. dokumentlt MSR-t tartalmaz. Ezeket mr felsorolni is sok lenne, ezrt csak 3-at ismertetnk kzlk. A gyrtk dokumentcijban tbbkevesebb rszletessggel megtallhat mindegyik lersa.

429

A Time-Stamp Counter (TSC) mindhrom processzoron megtallhat, cme 10h. Felptse nem tl sszetett, a regiszter sszes bitje a szmll aktulis rtkt tartalmazza: Bitpozci Tartalom 0..63 TSC aktulis rtke Az Extended Feature Enable Register (EFER) regiszter csak AMD processzorokon ltezik, cme 0C0000080h. Felptse processzortpustl fggen vltozik. A K6-2 processzoron csak egyetlen bitnek van szerepe az EFER regiszterben: Bitpozci Jells Nv 0 SCE System Call/return Extension 1..63 A K6-III processzor hrom j mezt vezetett be az EFER regiszterben: Bitpozci Jells 0 SCE 1 DPE 2..3 EWBEC 4 L2D 5..63 Nv System Call/return Extension Data Prefetch Enable EWBE Control L2 cache Disable

A SYSCALL/SYSRET Target Address Register (STAR) regiszter szintn csak AMD processzorokon hasznlhat. A regiszter a 0C0000081h cmen tallhat. Felptse a K6-2 s K6-III processzorokon megegyezik:

430

Bitpozci Nv 0..31 SYSCALL target ring 0 EIP address 32..47 SYSCALL CS and SS selector base 48..63 SYSRET CS and SS selector base

17.15.19 Regiszterek kezdeti rtke (Initial value of registers) Az eddig emltett regiszterek reset utni rtkt mutatja a kvetkez tblzat: Regiszter EAX EDX EBX,ECX,ESI,EDI,ESP,EBP CS szelektor CS bzis CS hatr CS attribtum DS,ES,FS,GS,SS szelektor DS,ES,FS,GS,SS bzis DS,ES,FS,GS,SS hatr DS,ES,FS,GS,SS attribtum EIP FPU IP s OP FPU Opcode FPR0..FPR7 MM0..MM7 XMM0..XMM7 EFlags FPU Status Word FPU Tag Word FPU Control Word rtk 00000000h/? processzortl fgg 00000000h 0F000h 0FFFF0000h 0FFFFh jelenlev, rhat/olvashat, elrt 0000h 00000000h 0FFFFh jelenlev, rhat/olvashat, elrt 0000FFF0h 000000000000h 00000000000b +0.0 0000000000000000h 00000h 00000002h 0000h 5555h 0040h
431

MXCSR CR0 CR2,CR3,CR4 DR0,DR1,DR2,DR3 DR6 DR7 GDTR,IDTR bzis GDTR,IDTR hatr GDTR,IDTR attribtum LDTR,TR szelektor LDTR,TR bzis LDTR,TR hatr LDTR,TR attribtum TSC PMCs,Event Select Registers MTRRs EFER STAR

00001F80h 60000010h 00000000h 00000000h 0FFFF0FF0h 00000400h 00000000h 0FFFFh jelenlev, rhat/olvashat 0000h 00000000h 0FFFFh jelenlev, rhat/olvashat 0000000000000000h 0000000000000000h mindegyik tartomny letiltva lsd megjegyzs 0000000000000000h

Ha a reset sorn a hardver megkrte a processzort a beptett nteszt (Built-In Self-TestBIST) elvgzsre, akkor EAX tartalmazza ennek eredmnyt. Ha EAX=00000000h, a teszt sikeres volt. Klnben EAX rtke nemzr s meghatrozatlan. A processzor tpust (csald, modell, stepping) meghatroz informcikat tartalmazza az EDX regiszter. Ez processzoronknt s gyrtnknt vltoz tartalm. Lerst lsd a "Processzorok detektlsa" c. fejezetben. Intel Pentium III esetn rtke 0000067xh, AMD K6-2 esetn 0000058xh, mg AMD K6-III esetn 0000059xh. "x" a stepping-et jelenti. Az EFlags fels 10 bitjnek (22..31 bitek) llapota reset utn definilatlan. Az EFER regiszter tartalma AMD K6-2 processzoron 0h, mg AMD K6-III processzoron 0000000000000002h.
432

Az Intel Pentium III processzoron az itt megemltett TSC, PMC, Event Select Register s MTRR MSR-eken kvl az sszes tbbi MSR tartalma definilatlan. Az AMD K6-2 s K6-III processzorokon az sszes MSR jl meghatrozott rtket kap resetelskor, ami ltalban az adott regiszter kinullzst jelenti. A kt kivtelt az EFER (Extended Feature Enable Register) s PSOR (Processor State Observability Register) MSR-ek jelentik, ezek a K6-2 processzoron trldnek, a K6-III processzoron viszont ms rtket kapnak.

17.15.20 Kivtelek (Exceptions) A tmogatott kivteleket s azok jellemzit sorolja fel a kvetkez tblzat: Szm Mnemo Nv 0 #DE Divide Error 1 #DB Debug 2 NMI NonMaskable Interrupt 3 #BP Breakpoint 4 #OF Overflow 5 #BR Bound Range 6 #UD Undefined Opcode 7 #NM No Math Coprocessor 8 #DF Double Fault 9 10 #TS Invalid TSS 11 #NP Segment Not Present Tpus Hibak. Vals m. Fault N I Fault/Trap N I I Trap Trap Fault Fault Fault Abort Fault Fault N N N N N I (0) I I I I I I I I N N
433

12 13 14 16 17 18 19

Stack-Segment Fault #GP General Protection #PF Page Fault #MF Math Fault #AC Alignment Check #MC Machine Check #XF SSE FP Error

#SS

Fault Fault Fault Fault Fault Abort Fault

I I I N I (0) N N

I I N I N I I

Az els oszlop mutatja a kivtel sorszmt, a msodik a kivtelt azonost jellst (mnemonikot), a harmadik tartalmazza a kivtel nevt, a negyedik pedig a kivtel tpust. Az tdik oszlop mutatja, vdett s virtulis mdban kerl-e hibakd a verembe. Vgl az utols oszlop azt tartalmazza, vals mdban is keletkezhet-e az adott kivtel. Az NMI megszakts is megtallhat a fenti tblzatban, br nem kivtel. Igaz, hogy korbban mr lertuk, de azrt jra elmondjuk, mit is jelez pontosan a kivtel tpusa. A hiba (fault) tpus kivtelek olyan hibt jeleznek, amik lehetetlenn teszik a kivtelt kivlt utasts vgrehajtst, de a hiba kijavthat, s a program vagy taszk futsa folytathat. A veremben lev CS:IP/EIP-msolat mindig a hibt kivlt utastsra mutat. Vdett mdban, taszkvlts sorn keletkez hibknl azonban megtrtnhet, hogy nem a hibz utastsra, hanem az j taszk legels utastsra fog mutatni a msolat. Tovbb, a kivtel-kezelbe belpve a processzor llapota a hibs utasts vgrehajtsa eltti helyzetet tkrzi (kivve nhny specilis helyzetet, amikor a korbbi llapot csak rszlegesen lesz visszalltva). A csapda (trap) kivtelek inkbb tjkoztat jellegek, a program folytatshoz nem szksges kln lpseket tenni (de pldul a 3-as, trspont kivtel esetben nincs is mit kijavtani).
434

A CS:IP/EIP-msolat mindig a kivtelt kivlt utastst kvet utastsra fog mutatni. A processzor llapota az adott utasts vgrehajtsa utni helyzetet tkrzi. Az abort kivtelek olyan slyos hibkat jeleznek, amelyek kijavtsa nem mindig lehetsges, st nha lehetetlen is. A CS:IP/EIP msolat ezrt sokszor nem tudja pontosan meghatrozni a hiba helyt, fleg ha egy hardverhiba miatt keletkezett a kivtel. A processzor llapota definilatlan, a program vagy taszk futsa nem folytathat. A 80286-os s 80386-os processzorokon ltez hajdani 9-es kivtelt mr nem tmogatjk az jabb processzorok. Az AMD K6-2 s K6-III processzorok nem ismerik a 18-as s 19-es kivteleket.

17.15.21 FPU kivtelek (FPU exceptions) A kvetkez tblzat mutatja a koprocesszor utasts hasznlatakor keletkez numerikus kivteleket: Mnemonik #IS #IA #D #Z #O #U #P Nv Invalid operation (Stack fault) invalid operation (Invalid Arithmetic operand) Denormalized operand division by Zero Overflow Underflow Precision loss

Az FPU maszkolatlan numerikus kivtel esetn 2-es megszaktst (NMI) vagy 16-os kivtelt (#MF) vlt ki, ezt a CR0 regiszter NE (5-s) bitje szablyozza.

435

17.15.22 SIMD lebegpontos kivtelek (SIMD floatingpoint exceptions) Az SSE utastsok vgrehajtsa sorn keletkez numerikus kivteleket foglalja ssze a kvetkez tblzat: Mnemonik Tpus Nv #I Pre Invalid operation #D Pre Denormalized operand #Z Pre division by Zero #O Post Overflow #U Post Underflow #P Post Precision loss Az #I, #D s #Z kivteleket az utastsok vgrehajtsa eltt rzkeli a processzor, tpusuk ezrt pre-computation. Az #O, #U s #P kivtelek ezzel szemben az utastsok vgrehajtst kveten keletkeznek, tpusuk ezrt post-computation. Maszkolatlan numerikus kivtel esetn a processzor 6-os (#UD) vagy 19-es (#XF) kivtellel reagl, ezt a CR4 regiszter OSXMMEXCPT (10-es) bitje befolysolja. A fentebb emltett numerikus kivteleken kvl szmos ms hiba is keletkezhet SSE utastsok vgrehajtsakor. A 12-es (#SS), 13-as (#GP) s 14-es (#PF) kivtelek a memria elrse kzben bekvetkez hibkat jelzik. Ha az illeszkeds-ellenrzs aktivlva van, a nem megfelelen illeszked operandusok 17-es (#AC) kivtelhez vezetnek. 128-bites operandusok esetn, ha azok nem illeszkednek paragrafushatrra (16 bjtos hatrra), szintn 13-as kivtel keletkezik (kivtel a MOVUPS utasts). Ha a kvetkez tblzatban mutatott felttelek nem teljeslnek, 6-os kivtel keletkezik:
436

Utasts CPUID.XMM CR0.EM CR4.OSFXSR SFENCE 1 PREFETCHccc 1 MASKMOVQ 1 0 MOVNTQ 1 0 FXRSTOR, FXSAVE 1 0 SIMD MMX 1 0 Tbbi SSE 1 0 1 Vgl, ha egy SSE utasts vgrehajtsakor a fenti felttelek fennllnak, tovbb a CR0 regiszter TS (3-as) bitje 1es rtk, 7-es (#NM) kivtel keletkezik. Ez a felttel az SFENCE, PREFETCHT0, PREFETCHT1, PREFETCHT2 s PREFETCHNTA utastsokra nem vonatkozik.

17.15.23 Prefixek (Prefixes) A processzorok ltal ismert prefixeket sorolja fel a kvetkez tblzat: Gpi kd Mnemonik 66h 67h 26h ES:,SEGES 2Eh CS:,SEGCS 36h SS:,SEGSS 3Eh DS:,SEGDS 64h FS:,SEGFS 65h GS:,SEGGS 0F0h LOCK 0F2h REPNE,REPNZ Nv Operand size Address size ES: SEGment override CS: SEGment override SS: SEGment override DS: SEGment override FS: SEGment override GS: SEGment override Bus LOCK REPeat while Not Equal/Zero
437

0F3h REP,REPE,REP Z 0Fh 0Fh 0Fh 0F3h

REPeat (while Equal/Zero) Extended instruction prefix 3DNow! instruction prefix SSE instruction prefix

Az utols hrom utasts "prefixek" nem szmtanak valdi prefixnek, az elnevezs csak elhelyezkedsk hasonlatossgra utal. Velk bvebben az "Utastsok kdolsa" c. fejezetben foglalkozunk. Az Intel Pentium III processzoron a 0Fh 0Fh prefix rvnytelen. Az AMD K6-2 s K6-III processzorok nem tmogatjk az SSE technolgit, s gy az utols prefixet sem.

18 UTASTSOK KDOLSA
Ebben a fejezetben azt mutatjuk meg, az assembler hogyan fordtja le az egyes mnemonikokat, cmzsi mdokat, operandusokat stb. a processzor nyelvre, azaz a gpi kdra. Fontos megjegyezni, hogy a 80386-ostl kezdve az utastsok maximlis hossza 15 bjt lehet, az ennl hosszabb kdok 6-os (#UD) kivtelt vltanak ki. Ennek megdntsre momentn az egyetlen mdszer az, hogy tbb azonos kategrij prefixet alkalmazunk az adott utasts eltt.

18.1 A gpi kd alak felptse


A gpi kd utastsok tbb rszbl llnak, s ezek a rszek meghatrozott sorrendben kvetkeznek egyms utn:
438

prefixek mveleti kd (operation codeopcode) cmzsi md/operandus info paramter (addressing mode/operand info specifier) abszolt offszet (absolute offset) vagy eltols (displacement) kzvetlen rtkek Mindegyik gpi kd utastst vagy egy prefixszel, vagy egy mveleti kddal kell kezdeni. Prefixbl tbb is lehet, de mindegyik prefixnek klnbz csoportba kell tartoznia. gy pl. 2 szegmensfellbrl prefix vagy 2 cmhossz prefix megadsa hibt fog okozni, hatsuk pedig definilatlan lesz. Mveleti kdnak ktelezen szerepelnie kell, hiszen mskppen honnan tudn szegny processzor, hogy mit is kell csinlnia. Szintn trivilis, hogy egyetlen utastsban csak 1 mveleti kd szerepelhet. Egyetlen kivtelt a 3DNow! utastsok kpzshez hasznlt 0Fh 0Fh prefix kpez, ami utn mr nem szabad mveleti kd bjtot rni. A cmzsi md/operandus info paramter s a kzvetlen rtkek csak akkor kvetkezhetnek, ha azokat az adott mveleti kd megkveteli (ignyli). Az abszolt offszet ill. eltols jelenlte a hasznlt cmzsi mdtl fgg. Ha szksg van cmzsi md/operandus info paramterre, akkor annak bjtja(i) a mveleti kd utn fog(nak) kvetkezni. Ha a cmzsi mdhoz abszolt offszet/eltols is kell, az mindenkppen a cmzsi md/operandus info paramter bjtja (i) utn helyezkedik el. Vgl az esetleges kzvetlen adatbjtok zrjk a sort. Az egyes rszek maximlis hossza szintn korltozva van: prefixek: 5 bjt mveleti kd: 1 bjt
439

cmzsi md/operandus info: 2 bjt abszolt offszet vagy eltols: 4 bjt kzvetlen rtkek: 4 bjt Ha ezeket sszeadjuk, akkor 16-ot kapunk. Az eredmny azonban nem mond ellent az elbb emltett 15 bjtos korltnak, mivel egyszerre nem lehet mindegyik tag maximlis hossz, azaz nincs olyan gpi kd utasts, ami thgn ezt a korltot. Br a mveleti kd hossznak 1 bjtot rtunk, a prefixek miatt 2 s 3 bjtra is megnhet ennek hossza.

18.2 Prefixek
A hasznlhat prefixek listjt s azok gpi kd alakjt mr korbban kzltk. Ezek a prefixek 5 kategriba (csoportba, osztlyba) sorolhatk funkci s hasznlhatsg szerint: operandushossz prefix (66h) cmhossz prefix (67h) szegmensfellbrl prefixek (26h, 2Eh, 36h, 3Eh, 64h, 65h) buszlezr prefix (0F0h) s sztringutastst ismtl prefixek (0F2h, 0F3h) mveleti kd/utasts prefixek (0Fh, 0Fh 0Fh, 0F3h) Operandushossz s cmhossz prefixet elg sok utasts eltt megadhatunk, gyakorlatilag minden olyan utasts esetn, ami implicit vagy explicit regiszter- vagy memriaoperandust hasznl. Az MMX s SSE utastsok esetn az operandushossz prefix fenntartott, a 3DNow! utastsok viszont figyelmen kvl hagyjk ezt.

440

Szegmensfellbrl prefixet csak olyan utasts el rhatunk, aminek egyik operandusa memriahivatkozs. Ha az alaprtelmezett szegmenst kivlaszt prefixet kirjuk (pl. az ADD AX,[BX] utasts esetn a DS: prefixet), az nem szmt hibnak, de feleslegesen elfoglal egy bjtot. A buszlezr prefixet a 80386-os processzortl kezdve csak bizonyos utastsokkal hasznlhatjuk, s azokkal is csak akkor, ha az egyik operandus memriahivatkozs. Ha ezt nem tartjuk be, 6-os (#UD) kivtel lesz a jutalom. A sztringutastst ismtl prefixeket a sztringfeldolgoz utastsokkal val hasznlatra terveztk. sznlkli alkalmazsuk ltalban 6-os kivtelhez vezet, de az is elfordulhat, hogy a processzor ms utastsnak fogja rtelmezni a kdot. A 3DNow! utastsok figyelmen kvl hagyjk ket. Az MMX s SSE utastsok esetn viszont ezek a prefixek fenntartottnak szmtanak, ami az Intel dokumentcija szerint annyit jelent, hogy elkpzelhet, hogy egy ilyen fenntartott kombinci a mostani (rtsd: Intel Pentium III s AMD K6-III) processzorokon rvnytelen, de esetleg a jvbeni processzorok j utastsok kdolshoz fogjk ezt felhasznlni. Az elrefel kompatibilits miatt teht csak a sztringutastsok eltt hasznljuk ezeket a prefixeket! Br azt mondtuk korbban, hogy a REPE/REPZ s REPNE/REPNZ mnemonikokat a CMPS s SCAS utastsokkal, mg a REP mnemonikot a fennmarad INS, LODS, MOVS, OUTS s STOS utastsok eltt illik alkalmazni, azrt nem ennyire szigor a processzor. Elszr is a REP s a REPE/REPZ mnemonikokhoz ugyanaz a kd tartozik (0F3h), s a processzor fogja eldnteni, az adott mveleti kd esetn hogy kell a prefixet rtelmezni (teht figyelembe kell-e vennie a ZF flag llst). Msrszt pedig a REPNE/REPNZ prefix (kdja 0F2h) az utbbi 5 utasts esetn a REP-pel megegyez mdon
441

viselkedik, azaz figyelmen kvl hagyja ZF tartalmt. Egyszval, brmely prefixet megadhatjuk az emltett 7 utasts eltt. Lthat, hogy a buszlezr prefix s a sztringutastst ismtl prefixek egy csoportba kerltek, gy egyszerre val hasznlatuk eleve kizrt. Az utols kategria kicsit kilg a sorbl, mivel ezek inkbb "lprefixek". Erre utal eltr hasznlatuk is. A 0Fh bjt hajdann mg POP CS utastsknt futott (a 8086-os s 8088-as processzorokon), azutn egy idre illegalitsba vonult (80186-os s 80188-as procik), majd nneplyesen megvlasztottk prefixnek. Hasznlata felttelezi, hogy a programot futtat szmtgpben legalbb egy 80286-os processzor van. Ha ez teljesl, mg akkor sem biztos, hogy sikeresen megbirkzik a processzor a 0Fh-mveleti kd kombincival. A prefix azt jelzi, hogy az utasts mveleti kdjt a 0Fh rtk s az utna kvetkez bjt adja meg, teht 2 bjtos lesz az opcode. Az ilyen mveleti kdok msodik bjtjt kiterjesztett mveleti kdnak (extended operation code) hvjuk. A 0Fh 0Fh bjtsorozat mg egzotikusabb. A 8086-os/8088as processzorokon kt POP CS -nek felel meg, a 80186os/80188-as procikon pedig dupla 6-os (#UD) kivtelt okoz. A 80286-ostl kezdve szinte mindenhol fenntartott kombincinak szmt, s ugyancsak 6-os kivtel a vgrehajts eredmnye. Az AMD K6-2 processzortl kezdve s ltalban minden olyan processzoron, ami tmogatja az AMD 3DNow! technolgit, ez a kt bjt a 3DNow! utastsok mveleti kdjnak egy darabjaknt szolgl. Ebben az esetben a prefix azt jelzi, hogy az esetleges cmzsi md/operandus info paramter utn egy bjt mret kzvetlen rtk fog kvetkezni. Ez utbbi bjtot szuffixnak (suffix) hvjk. Az utasts mveleti kdjt a 0Fh 0Fh bjtok s a szuffix egytt alkotjk, teht 3 bjtos lesz a mveleti
442

kd. Fontos, hogy a 0Fh 0Fh "prefix" utn mr nem szabad semmilyen hagyomnyos (1 bjtos) vagy kiterjesztett mveleti kdot rni, csak szuffixot. Az 0F3h bjt a kezdetektl fogva REP/REPE/REPZ prefixknt szolgl. Azt emltettk, hogy csak a sztringutastsok eltt mkdik ismtl prefixknt, egyb utasts eltt mkdse definilatlan. Az Intel SSE technolgijban nhny utasts (a pakolt-skalr utastsprok skalr tagjai esetn) mveleti kdjt ez a bjt elzi meg, teht tekinthet akr a mveleti kd rsznek is. A 0Fh s 0Fh 0Fh prefixek kzl legfeljebb az egyik fordulhat el egy adott utastsban, mg a 0F3h SSE-prefix a 0Fh kddal egytt tallhat meg. A 0Fh s 0Fh 0Fh mveleti kd prefixeknek a prefixek sorban ktelezen az utols helyen kell llniuk. Tovbb, a 0Fh prefixet ktelezen egy kiterjesztett mveleti kdnak kell kvetnie. Mivel az utasts/mveleti kd "prefixek" a mveleti kd kpzsben jtszanak szerepet, lersuk a kvetkez, "Mveleti kd" c. fejezetben is megtallhat. Azt azrt fontos megjegyezni, hogy sem az Intel, sem az AMD nem nevezi ezeket a kdokat prefixnek, mi is csak azrt hvjuk ennek ket, hogy vilgosabbak legyenek az sszefggsek. Akrhogyan is vlasztjuk ki a prefixeket az els 4 kategribl, azokat tetszleges sorrendben odarhatjuk a mveleti kd (vagy a 0Fh ill. 0Fh 0Fh "prefixek") el, a processzor helyesen fogja ket rtelmezni. A maximlis 5 bjtos hossz elrhet, teht van olyan utasts, amelyik mindegyik kategribl hasznl egy-egy prefixet.

443

18.3 Mveleti kd
Azt rtuk nemrgen, hogy a mveleti kd hossza 1 bjt. Ez azonban nem teljesen gy van. Vannak ugyanis 1 bjtos, 2 bjtos s 3 bjtos mveleti kddal rendelkez utastsok. St, ha egszen korrektek akarunk lenni, akkor tovbbi 2 kategria is ltezik, ezek a "msfl bjtos" s "kt s fl bjtos" utastsok. A 8086-os/8088-as s 80186-os/80188-as processzorok legelemibb utastsai egyetlen bjtbl ll mveleti kdot hasznlnak. Ebbe a csoportba a nulla-, hrom- s ngyoperandus utastsok, tovbb az egys ktoperandusak egy rsze tartozik. Az egyoperandus utastsok esetn az operandus a kvetkez lehet: kzvetlen rtk (imm), relatv cm (rel address), teljes tvoli pointer (sel:offs far pointer), 16 vagy 32 bites ltalnos cl regiszter (reg16/32), szegmensregiszter (sreg). Azok a ktoperandus utastsok esnek ebbe a csoportba, amelyek operandusai a kvetkezek: ltalnos cl regiszter s ltalnos cl regiszter/memriahivatkozs (reg s reg/mem), szegmensregiszter s ltalnos regiszter/memriahivatkozs (sreg s reg/mem), specilis regiszter s 32 bites ltalnos cl regiszter (CRx/DRx/TRx s reg32), ltalnos cl regiszter s kzvetlen rtk (reg s imm), valamint dupla kzvetlen rtk (imm s imm). Az IN s OUT utastsok, valamint az sszes sztringkezel utasts szintn 1 bjtos mveleti kdot hasznl. Az 1 bjtos s 2 bjtos kategria kztt tmenetet kpeznek a "msfl" bjtos utastsok. Ezt gy kell rteni, hogy az adott utasts mveleti kdja 1 bjt, ami utn mindig a cmzsi md/operandus info paramter ll. Ez utbbinak a kzps, 'Reg' jelzs 3 bites mezje viszont nem egy regisztert hatroz meg, hanem a mveleti kdnak egy darabjt, egyfajta indexet kpez. Ez gyakorlatilag annyit jelent, hogy egyetlen 1
444

bjtos mveleti kd alatt sszesen 8 klnbz utastst rhetnk el. Ebbe a csoportba tartoznak az ltalnos cl regisztert/memriahivatkozst (reg/mem) hasznl egyoperandus, a kzvetlen rtket s ltalnos cl regisztert/ memriahivatkozst (imm s reg/mem) hasznl ktoperandus utastsok, tovbb a RCL, RCR, ROL, ROR, SAL, SAR, SHL s SHR utastsok. Az elbb emltett kt kategria utastsai (no meg a prefixek) az egsz 1 bjtos tartomnyt lefedik, azaz 00h-tl 0FFh-ig mindenhol van legalbb 1 utasts vagy prefix. A 80286-oson bevezetett utastsok kpzshez ezrt azt tallta ki az Intel, hogy egy korbban hasznlhat utasts kdjt ezentl az j utastsok kpzshez hasznlja fel. A vlaszts a POP CS utastsra esett, mivel egyrszt ez "tiszta" 1 bjtos kd utasts (teht nincs cmzsi md/op. info paramter, sem 'Reg' mez), msrszt gyis nem tl szablyos a mkdse (hiszen a felttel nlkli vezrlstads ezen formjban csak CS vltozna meg). Ezrt a 80286-ostl kezdve a 0Fh bjt egyfajta "prefixknt" viselkedik. Nem teljes rtk prefix, mivel nem mindegy, hol helyezkedik el, s nem rhat oda egyetlen rgi utasts el sem. Ha a processzor ezzel a bjttal tallkozik, akkor a 0Fh utn kvetkez bjtot beolvassa. Ezutn ez utbbi bjtot prblja utastsknt rtelmezni, de gy, hogy a rgi utastsoktl eltr tblzatot hasznl az utasts meghatrozsra. Ezzel azt rtk el, hogy a rgi utastsok s a prefixek a 00h-0Eh s 10h-0FFh tartomnyokban helyezkednek el, mg az j utastsok kpzsre a 0Fh 00h s 0Fh 0FFh kztti bjtok szolglnak. sszesen teht 256 db. j utasts kdolhat le ezzel a mdszerrel. Mivel a 0Fh bjt vgl is kiterjeszti a mveleti kdok tartomnyt, mveleti kd prefixnek vagy utasts prefixnek is nevezik. A 0Fh utn ll bjt hatrozza meg tnylegesen az utastst, ezrt ennek neve kiterjesztett mveleti kd (extended operation code/opcode). A 0Fh rtket az t
445

kvet bjttal egytt tekintve kapjuk meg az j utasts 2 bjtos mveleti kdjt. A "msfl bjtos" kategrihoz hasonlan a 2 bjtos (teht 0Fh kezdet) mveleti kd utastsok kdolsa sorn is megszokott dolog, hogy a tartomny jobb kihasznlsa rdekben a cmzsi md/operandus info bjt 'Reg' mezje hozzjrul az utasts meghatrozshoz. Ezrt hvhatjuk ezt a csapatot "kt s fl bjtos" utastsoknak is. Mivel a kiterjesztett mveleti kdok tartomnya is elgg tele volt, az AMD vezeti gy dntttek, hogy az FEMMS s PREFETCH/PREFETCHW utastsok kivtelvel az sszes tbbi 3DNow! utastst egyetlen kzs kiterjesztett mveleti kddal fogjk jellni. A knny megjegyezhetsg kedvrt (vagy ms miatt?) a vlaszts a 0Fh 0Fh bjtkombincira esett. Ezt a kdot az AMD K6-2 megjelensig egyik gyrt sem hasznlta mg fel, a clra gy pont megfelelt. Ha egy 3DNow!-t tmogat processzor ezzel a kt bjttal tallkozik, akkor szpen beolvassa az utnuk ktelezen ll cmzsi md/operandus info bjtot, valamint ha szksges, az S-I-B s abszolt offszet vagy eltols bjtokat is. Ezek utn egy bjt mret kzvetlen rtknek kell kvetkeznie. Ennek a bjtnak hasonl a szerepe, mint a 'Reg' meznek a "msfeles" s "kt s feles" kategrikban. A szuffixnak vagy uttagnak (suffix) nevezett bjtot ugyanis ismt mveleti kdknt fogja rtelmezni a processzor, persze az 1 bjtos s 2 bjtos utastsoktl eltr tblzatot hasznlva ehhez. Br a 0Fh 0Fh bjtok nem alkotnak valdi prefixet, elhelyezkedsk s a 0Fh bjthoz hasonl funkcijuk miatt hvhatjuk mondjuk 3DNow! utasts prefixnek ket. Mkdse kt lnyeges ponton tr el a 0Fh "prefix" mkdstl, mgpedig abban, hogy egyrszt ktelezen szerepelnie kell cmzsi md/operandus info paramternek, msrszt a mveleti kd 3. bjtja az utasts kdjnak vgn
446

helyezkedik el. Mondani sem kell, hogy egyetlen ms utasts eltt sem alkalmazhat prefixknt ez a kt bjt. Az elbb emltett megoldst az Intel is tvette a CMPPS s CMPSS SSE utastsok kdolsakor. A szuffix bjt itt az sszehasonlts felttelt adja meg. Szintn az SSE utastsokhoz kapcsoldik, hogy szmos utasts rendhagy mdon kerl lekdolsra. J nhny pakoltskalr SSE utastspr van, melyek ugyanazt a mveletet vgzik el, de az egyik utasts pakolt lebegpontos tpus, mg a msik skalr lebegpontos operandusokkal dolgozik. Ilyenek pl. az aritmetikai utastsok (ADDPS-ADDSS, SUBPS-SUBSS stb.), vagy a CMPPS-CMPSS pros is. A prok mindkt tagja ugyanazt a kiterjesztett mveleti kdot hasznlja, de a skalr utastst egy implicit, ktelez REP/REPE/REPZ prefix (0F3h) elzi meg. Mivel a sztringutastst ismtl prefixeket nem hasznlhatnnk ezekkel az utastsokkal, ebben az esetben a 0F3h bjtnak ms jelentse van, nevezetesen a skalr utastst klnbzteti meg pakolt prjtl. Br ennek a valdi prefixnek mr van neve, az eltr funkci miatt hvhatjuk SSE utasts prefixnek is. Lttuk, hogy milyen mdon s hny bjton troldik a mveleti kd a klnfle utastsok esetn. Most az elsdleges mveleti kd bjt finomszerkezett (szp szval mikrostruktrjt:) nzzk meg. Elsdleges mveleti kdon (primary opcode) 1 s "msfl" bjtos esetben magt a mveleti kdot, klnben pedig a kiterjesztett mveleti kd bjtot (teht a 0Fh utn ll rtket) rtjk. Sok utastst tbbfle operandussal is lehet hasznlni. Nzzk pldul az ADD utastst! Az operandusok tpusai lehetnek: kt ltalnos regiszter, ltalnos regiszter s memriahivatkozs, kzvetlen rtk s ltalnos regiszter/mem447

riahivatkozs. Mindkt operandus mrete lehet 8, 16 vagy 32 bjt. Most tekintsk az ADC, SUB, SBB utastsokat. Az emltett 4 utastsnak (s mg msoknak is) kzs jellemzje, hogy azonos feltteleket szabnak az operandusok tpust ill. mrett illeten. Hogy valami logikt vigyenek a dologba, az elsdleges mveleti kdban nhny bit szlessg mezket vezettek be. Az azonos jells mezk funkcija azonos, brhol is helyezkedjenek el. A kvetkezetessg cljbl radsul sok mez helye rgztett, teht klnbz utastsok mveleti kdjban ugyanazon a bitpozcin tallhat. A pldkhoz visszatrve, mind a 4 utastsra igaz, hogy az azonos fajta operandusokhoz tartoz mveleti kdjaik felptse teljesen megegyezik. (St, kicsit elreugorva, mind a 4 utastsnak van "msfl bjtos" kategrij mveleti kdja is, s ez a kzs 80h/81h/82h/83h *r+n alakhoz vezet. Ebben az esetben teht nemcsak a felpts, de maga az elsdleges mveleti kd is kzs.) Persze nem minden elsdleges mveleti kd tartalmaz ilyen mezket, ez fgg az operandusok szmtl, tpustl is. Pldul a CLI, HLT s PUSHF utastsok mindegyiknek egyetlen mveleti kdja van, s egyikben sincsenek mezk. A mezk hossza 1, 2, 3 s 4 bit lehet. Az albbi tblzat felsorolja az egyes mezket, azok szlessgt, jellst s nevt megadva:

19 PROCESSZOROK DETEKTLSA
(Extra)

448

EFlags POP CS MOV CS,?? shift/rotate EDX BIOS INT 15h, AX=0C910h CPUID ("GenuineIntel","AuthenticAMD","CyrixInstead","RiseRiseR ise","CentaurHauls","UMC UMC UMC ","NexGenDriven")

20 VDETT MD ASSEMBLY
(DG)

21 FELHASZNLT IRODALOM
21.1 Nyomtatott segdeszkzk
21.1.1 Knyvek 1)Dr. Kovcs Magda: 32 bites mikroprocesszorok 80386/ 80486 I./II., LSI, Budapest 21.1.2 Folyiratok

449

1)CHIP Szmtgp Magazin, Vogel Publishing Kft., Budapest, 1998 oktberi s decemberi, 1999 mrciusi, prilisi, mjusi s szeptemberi szmok

21.2 Elektronikus forrsok


21.2.1 Segdprogramok
1)

2) 3)

4)

5)

Tech Help! 4.0 written by Dan Rollins, Copyright 1985, 1990 Flambeaux Software, Inc. HelpPC 2.10, Copyright 1991 David Jurgens Ralf Brown's Interrupt List Release 52, Copyright 1989, 1996 Ralf Brown Expert Help Hypertext System v1.09, Copyright 1990, 1992 SofSolutions Hacker's view (HIEW) v6.10, Copyright 1991, 1999 SEN, Kemerovo

21.2.2 Norton Guide adatbzisok The Interrupts and Ports database v1.01, Copyright 1988 Nobody 2) Borland's Turbo Assembler v4.0 Ideal mode syntax, Copyright 1995 Morten Elling 3) The Assembly Language database, Copyright 1987 Peter Norton Computing, Inc. 4) The Programmers Reference v0.02b, Copyright P.H.Rankin Hansen (Ping) 5)Intel iAPx86 instruction set, 1996
1)

450

21.2.3 Szveges formtum dokumentumok


1)

Intel 80386 Programmer's Reference Manual 1986, Copyright 1987 Intel Corporation

21.2.4 PDF (Adobe Portable Document Format) kziknyvek


1)

2)

3)

4)

5)

6)

7)

Intel Architecture Software Developer's Manual Volume 1, 2 and 3 (Order Number 243190, 243191 and 243192), Copyright 1999 Intel Corporation AMD K6-III Processor Data Sheet (Order Number 21918), Copyright 1999 Advanced Micro Devices, Inc. AMD K6-2 Processor Data Sheet (Order Number 21850d), Copyright 1998 Advanced Micro Devices, Inc. AMD K6 Processor Multimedia Technology (Order Number 20726c), Copyright 1997 Advanced Micro Devices, Inc. 3DNow! Technology Manual (Order Number 21928d), Copyright 1998 Advanced Micro Devices, Inc. SYSCALL and SYSRET Instruction Specification (Order Number 21086c), Copyright 1998 Advanced Micro Devices, Inc. AMD Processor Recognition Application Note (Order Number 20734i), Copyright 1998 Advanced Micro Devices, Inc.

TRGYMUTAT

451

452

Vous aimerez peut-être aussi