>>en valahogy igy gondolom el a megszakitast:
>> push regs
>> pop regs
>> jmp far ptr cs:[oldintvec]
>>ahol az oldintvec a regi megszakitas vektor....
> En meg ugy, hogy
> push regs
> pop regs
> pushf
> call far ptr cs:[oldintvec]
> iret
>Na, akkor most mi van? (Az, hogy nincs igazad, mert mindket
>megoldas egyenerteku bizonyos esetekben, es neha - amikor a hivas
>utan is akarsz valamit meg "matatni" - meg bizony csakis a
>masodik hasznalhato...) haat... abban igazad van, hogy mindket
>megoldas teljesen mukodokepes...
>abban viszont nem, hogy ezt ajanlod, mert a te megoldasod 6 byteal
>tobbet hagy a stacken mint az enyem....
Nem igazan ertelek. Miert hagyna 6 bajtot a stacken? (Akkor nem is
mukodhetne a dolog, nem?)
>az mondjuk igaz, hogy az enyemmel nem lehet vizsgalni
>a muvelet sikeresseget, de a kerdeses problema megoldasahoz /bizonyos
>irasi muveletek kepernyore tetele/ szerintem nem szukseges, tokeletes
>az iras bekovetkezte elott is...
En nem azt mondtam, hogy a te megoldasod rosszabb, csak azt, hogy van
eset amikor nem alkalmas a problema megoldasara.
>>kivalto ok, azaz a cli/sti blokk folosleges...
>HC> Megszakitasok eseten valoban folosleges - csak altalanossagban
>irtam a verem-valtasrol...
>1) ha a kerdezot altalanossagban erdekelte volna valami, akkor
>valoszinu nem egy igen konkret, jol definialt feladattal allt volna
>elo...
A fenti mondatommal azt akartam mondani, hogy valoban nem figyeltem
elegge, es a konkret esetben nem szukseges a dolog.
>2) 286- meg tenyleg volt ertelme a cli/sti koze tenni a dolgokat,
>viszont 386+ mar ket nagyszeru megoldas is van:
>lss sp,cs:[ujstackpointerek].... egy
>lepesben vegrehajtja, igy teljesen folosleges a szenvedes...
Ezzel csak egy baj van: a BP beepitett assemblere nem ismeri a 386+-os
utasitasokat (leven o maga max. 286-os kodot general), igy assembly
betetben a fenti utasitas nem alkalmazhato. DB-vel direktbe bekodolni
meg eleg csunya dolog.
>tovabba, a 386+nak van egy masik nagyon aranyos dolga is...
>nevezetesen az, hogy az ss regiszter irasa utan a egy utasitas
>erejeig cli allapotban van a gep... azaz:
>mov ss,cx ;itt vegrehajt egy bonusz cli-t a 386+ proci...
>mov sp,ax ;itt feloldodik a bonusz cli, visszaall az eredeti if flag...
Na latod, ezt viszont nem tudtam...
> Mivel az InDOS-flag bizony _nem_ feltetlenul 0 az INT21h-ban, igy
>ugye nem az veszti ervenyet amit en mondtam, hanem amit te...
>1) na akkor most keresd vissza az eredeti levelet, abban az iras
>funkcio hookolasarol van szo, ami igen erosen nem reentrans.. ha nem
>hiszed, probald ki: floopy iras, int1c, es abbol egy ujabb iras
>akarhova...
Es? Mi a problema vele? En azt mondtam, hogy reentrans, vagy mi?
>2) de ha neagyisten valamikor is megcsinalna a M$ reentransra a
>szobanforgo iras funkciot, akkor se lenne szukseg erre a buffer
>dologra mivel sem az irando adat vizsgalatahoz sem a kepernyore
>irashoz nem szukseges ujabb int21, tehat az indos flag vizsgalata es
>a buffereles is tokeletesen folosleges...
Idezet eredeti valaszombol: "Ja, es DOS eseteben arra is figyelj, hogy
a DOS nem re-entrans, tehat egy DOS funkciohivasbol nem lehet ujabb
hivast kezdemenyezni (magyarul az INT21 kezelodbol max. BIOS-szal -
int10h - tudsz a kepernyore irni)." Tehat vili, hogy INT10h-val tud
kepenyore irni, csak azert irtam le a fenti dolgokat neki, hogy ha
esetleg majd mast is akar csinalni vagy esetleg Pascal-fuggvenyekkel
szeretne a kepernyore irni (le mernem fogadni, hogy ha nem szolok
akkor ezzel probalta volna meg elsore!), akkor azt felejtse el,
legalabbis az InDOS flag vizsgalata nelkul mindenkeppen...
>tovabbiakban nem ertem, hogy mert akarsz a kolokkel esetlegesen
>64kb-nal tobbet is fogo es raadasul igen bonyolult proggyt iratni, ha
>azt a vizsgalat bonyolultsagatol fuggoen fel kb alatt is meg lehet
>valositani teljesen tokeletesen...
Azt hiszem te azt nem veszed figyelembe, hogy a kerdest nem egy
assembly guru tette fel, hanem egy alapvetoen Pascal-ban programozo
emberke, akinek meg nincs igazan tul nagy gyakorlata
megszakitas-kezelok irasaban. Neki nem az a szempont, hogy hol sporol
meg 2 orajelciklust, vagy eppen 10 bajtot a program mereteben, hanem
hogy hogyan lehet bizonyos problemakat a legegyszerubben es
legtisztabban megoldani. Te pedig allandoan olyan dolgokba kotsz bele,
amik a fentiek alapjan teljesen irrelevansak.
>3) az int21/34 reentrans, ha nem hiszed, jarj utana...
Kiprobaltad MSDOS3.3-tol 6.22-ig? DR-DOS, Novell DOS alatt is? Es
Windows DOS boxban?
Ralf Brown interrupt lista:
INT 21 - DOS 2+ - GET ADDRESS OF INDOS FLAG
AH = 34h
Return: ES:BX -> one-byte InDOS flag
Notes: this function executes on the DOS stack, and thus cannot be
called while another DOS function is already executing; you should use
this function once at the beginning of the program and store the
returned pointer rather than calling it when requiring DOS access
Gabor
|