Article View: pl.comp.lang.asm
Article #93Re: [x86] problem z przełączaniem zadań przez CALL/IRET
From: Bogdan (bogdro)
Date: Tue, 31 Jan 2006 10:31
Date: Tue, 31 Jan 2006 10:31
40 lines
3020 bytes
3020 bytes
steensh napisał(a): > > Użytkownik "Wiktor S." <wswiktorSP@Mpoczta.fm> napisał w wiadomości > news:drjd1e$95k$1@news.onet.pl... >> Mam problem z przełączaniem zadań za pomocą instrukcji CALL i IRET. >> Przełączanie poprzez JMP działa prawidłowo, tak samo wywołanie zadania >> instrukcją CALL. Niestety, próba powrotu przez IRET kończy się wyjątkiem. > > jestem poczatkujacy w ASM i mam pytanie w zwiazku z tematem > dlaczego w procedurze uzywasz IRET, a nie samo RET? czym sie roznia te > dwa powroty? moze jest to zalezne od asemblera? ja uzywam TASM. W normalnym świecie normalnych programów RET powraca do 16- lub 32-bitowego adresu zachowanego na stosie przez instrukcję CALL. RETF powraca do adresu zachowanego przez instrukcję CALL FAR, tj. segment i adres w tymże segmencie. IRET (interrupt return) działa jak RETF, ale dodatkowo zdejmuje ze stosu flagi procesora (EFLAGS), wkładane np. przez instrukcję INT (lub przez procesor, gdy otrzyma przerwanie sprzętowe). Spójrz tu: http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs02.htm - pod koniec strony jest opisany stos oraz działanie instrukcji CALL, INT oraz krótko RET, RETF, IRET. Natomiast w świecie trybu chronionego, o którym mowa w tym wątku, wszystko się strasznie komplikuje. To, co robią te instrukcje nieco się zmienia, bo wszystko zależy od tego, dokąd chcemy wrócić. Sprawdzane są uprawnienia, typ "segmentu", do którego się odwołujemy. Procedura w tym kodzie to nie jest zwykła procedura, tylko inne "zadanie" (task), tak jak w wielozadaniowych, nowoczesnych systemach operacyjnych. Jej wywołanie poprzez CALL może wyglądać normalnie, ale procesor wykonuje wtedy o wiele więcej niż w normalnych CALLach w normalnych programach. A powrót z innego zadania realizuje się właśnie przez IRET. -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Forum o programowaniu: http://programista.xorg.pl
Technical Details
Message-ID:
<drneae$hmt$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<drjd1e$95k$1@news.onet.pl> <drn3vd$1nc$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@bogdan.pl> Newsgroups: pl.comp.lang.asm Subject: Re: [x86] problem z przełączaniem zadań przez CALL/IRET Date: Tue, 31 Jan 2006 11:31:30 +0100 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 40 Message-ID: <drneae$hmt$1@inews.gazeta.pl> References: <drjd1e$95k$1@news.onet.pl> <drn3vd$1nc$1@inews.gazeta.pl> NNTP-Posting-Host: acsx167.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1138703503 18141 83.11.51.167 (31 Jan 2006 10:31:43 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Tue, 31 Jan 2006 10:31:43 +0000 (UTC) X-User: bog.d In-Reply-To: <drn3vd$1nc$1@inews.gazeta.pl> User-Agent: Thunderbird 1.5 (X11/20051201) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit