Posted By: shimi (the NEUROLOGiC member) on 'CZprogram' Title: Re: Preruseni Date: Wed Feb 25 16:08:03 1998 > > > Potreboval bych napojit svuj program v C na preruseni, ale neznam > Opravim jenom par chybicek a doplnim dalsi malinke detailky. Ja opravim chybicky, ktere zbyly > DOS nema 256 preruseni, ale PC ma 256 vektoru hardwareovych preruseni > DOS z toho vyuziva jen nekolik vektoru preruseni, nejznamejsi je asi vektor > 21h) navic vektory 00-20h jsou vyhrazeny Intelem pro jeho interni pouziti, > ze se nevejde do vysledneho registru), ovsem to konstrukteri IBM PC > nedodrzuji, takze nektere vektory mezi 00-20h jsou navic obsazeny vnejsimi > periferiemi (viz casovac, klavesnice, EGA, atd.). Vec nestoji tak, ze by to nedodrzovaly, ale processory 8088(6) na kterych bylo staveno 1 PC mely rezervovanych jen mekolik malo vektoru (preteceni pri deleni, krokovani, NMI). processor 186 pridal este preteceni mezi pri instrukci bound. Nikdo v te dobe nemohl tusit, ze i286 prinese asi 7 dalsich vektoru souvisejici se spravou systemu a i386 dalsi asi 3 > Vektory preruseni jsou ulozeny od zacatku pameti (tedy 0000:0000) pouze v > s procesory 086, 088, 186 a 286, ostatni procesory maji tuto tabulku vektoru > ulozenou v sestibytovem registru IDT (2 byty segment, 4 byty offset), ktera > je po resetu procesoru nastavena na 0000:00000000. (pozn. tento registr > zustava v real modu prakticky nezmenen a jeho vyznam se uplatni az v Tohle uz umoznovala plne 286, > > bud pomoci fci DOSu 25h a 35h nebo primym zapisem do pameti na prislusne > > Fce DOSu jsou slouceny pod prerusenim 21h. Doporucuji sehnat SYSMANa nebo > > jiny (temer jakykoliv) systemovy help. Kdyz instalujes obsluhu sveho SYSMAN to je nastroj !! > kvuli rychlosti ap.) staci na konci vlastni rutiny provest nasledujici > magickou sekvenci instrukci: (psano v assembleru pro Intel 0x86 IDEAL mode) > ... > mov ax, 020h > out 020h, ax > ;nasleduje iret tady je chybka, neni dobry posilat na 8mi bit port 16ti byt hodnotu, neni 100% zaruceno, ze by na to dany hardware musel reagovat (i kdyz to vsude slape), nehlede k tomu, ze je to codove dlouhy (jak v realu, tak v protected) pouzij : mov al,20h out 20h,al iret A neni to zadna magicka sekvence ani reset radice, je to zprava o ukonceni preruseni (pri vyvolani preruseni radic preruseni (8259A) rekurentni volani zablokuje v cetne pozadavku s nizzsi prioritou, dokud nedostane tuto zpravu). Pokud to neudelas zablokujes vyvolani preruseni s nizsi prioritou, pokud to udelas na vstupu IRQ 0 (za normalnich podminek vektor 8) zablokujes celej prerusovaci system, a PC tim padem nemuze reagovat na takove drobnost jako vstupy z klavesnice, mysi, sitovky ...) > neboli na port 20h posli hodnotu 20h, coz provede reset radice preruseni. > > (pokud vektory zapisujes primo) je to, ze intel pouziva pro zapis do > pameti > > little endian - tzn. vyssi byte(word) je na vyssi adrewse. no ja nevim, ale proc necist vektory najednou po 32dvou bitech ? takhle xor ax,ax mov gs,ax mov eax,gs:[4*vektor] a zapis takhle mov ax,cs shl eax,16 xor ax,ax mov gs,ax mov ax, offset novy_vektor mov gs:[4*vektor],eax uff, to jsem si zavzpominal na starsi casy :) > Petr Pan. > Do you believe in Peter Pan, do you believe in Frankestein... +-- | | | | /| | I was systemak, +--+ | | | | / | | I'm systemak | +---+ | | | | and I will be systemak --+ | | | | | | E-mail: tsimek@students.zcu.cz http://dione.zcu.cz/~tsimek