🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #93

Re: [x86] problem z przełączaniem zadań przez CALL/IRET

#93
From: Bogdan (bogdro)
Date: Tue, 31 Jan 2006 10:31
40 lines
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-mail
References: <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