Posted By: PePan (Petr Pan) on 'CZprogram' Title: Re: Preruseni Date: Wed Feb 25 15:04:11 1998 > > > > Potreboval bych napojit svuj program v C na preruseni, ale neznam > potrebny > > vektory (teda aspon doufam, ze se to dela pres vektory jako na Ami). > > Za kazdou radu dik. > > > > tWisT > Zdarec, takze k veci... Opravim jenom par chybicek a doplnim dalsi malinke detailky. Je to uplne jednoduche, takze k veci... > Je to uplne jednoduche - DOS ma 256 preruseni (00h..FFh), ktere slouzi DOS nema 256 preruseni, ale PC ma 256 vektoru hardwareovych preruseni (pozn. DOS z toho vyuziva jen nekolik vektoru preruseni, nejznamejsi je asi vektor 21h) navic vektory 00-20h jsou vyhrazeny Intelem pro jeho interni pouziti, napriklad int 00h se vola pri deleni 0 (nebo, kdyz je vysledek natolik velky, 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.). > pro obsluhu ruznych veci, nektere jsou dokonce volne. > Vektory preruseni jsou 4-bytove hodnoty (segment:offset),ktere ukazuji na > obsluhu daneho preruseni. Tabulka vektoru (onech 256 4-bytovych hodnot) > je ulozena v real modu uplne na zacatku pameti > (segment:=0,offset:=4*cislo_pr.) Vektory preruseni jsou ulozeny od zacatku pameti (tedy 0000:0000) pouze v PC 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 protected modu, ovsem to neznamena, ze by se hodnota registru IDT nedala v real modu menit). > Svoji obsluhu muzes na preruseni nainstalovat v zasade dvema zpusoby: > bud pomoci fci DOSu 25h a 35h nebo primym zapisem do pameti na prislusne > misto. > Fce DOSu jsou slouceny pod prerusenim 21h. Doporucuji sehnat SYSMANa nebo > jiny (temer jakykoliv) systemovy help. Kdyz instalujes obsluhu sveho > preruseni,je dobre uschovat puvodni vektor a pak ho volat (napr. jmp far > nebo pushf, call far) aby se vykonala puvodni obsluha. pokud se odinstalujes > z pameti,mel by's v ramci korektnosti (a pokud nechces, aby ti comp > zatuhl:-)) Pokud nechces volat na konci sve rutiny puvodni obsluhu preruseni (napriklad 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 neboli na port 20h posli hodnotu 20h, coz provede reset radice preruseni. > obnovit puvodni obsluhu. Dalsi vec, na kterou si musis davat pozor > (pokud vektory zapisujes primo) je to, ze intel pouziva pro zapis do pameti > little endian - tzn. vyssi byte(word) je na vyssi adrewse. > Tzn. v pameti je nejdrive offset (word s prehozenymi byty) a pak segment > (...taktez). Uff, z toho bych mel v hlave asi pekny chaos...:)) > Pokud jsi neco nepochopil, tak mi mejlni (treba tady nebo na floyda)... > Cafte > SpirIt Pokud jsi neco nepochopil, tak mu mejlni (treba tady nebo tam)... Petr Pan. Do you believe in Peter Pan, do you believe in Frankestein...