🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#83
From: Lopez
Date: Mon, 30 Jan 2006 17:07
64 lines
3429 bytes
Wiktor S. napisał(a):
>>> 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.
> 
> 
>> I prawidlowo, instrukcja iret sluzy do powrotu z procedury obslugi
>> przerwania, w twoim przypadku powinno byc chyba po prostu ret.
> 
> 
> Nie, Zgodnie z dokumentacją, jeśli przez call wywołano zadanie, iret 
> powróci do poprzedniego.

Instrukcja ret spowoduje powrot do poprzedniego TSS tylko
wtedy gdy jest to zadanie zagniezdzone, czyli jest ustawiony
bit NT rejestru eflags. W przeciwnym wypadku adres powrotu
jest pobierany ze stosu. Nalezy wiedziec ze przy JMP/CALL do
TSS adres powrotu nie jest zachowywany na stosie zadania.
Podobnie dziala iret z ta roznica ze przywraca takze stan
rejestru flag, i jest przeznaczony do powrotu z procedur
wywolanych przez tablice IDT, czyli przerwania i wyjatki.


>> To napisz chociaz konkretnie co wyswietla, jak masz podany
>> cs:ip to mozesz pokusic sie o deasemblacje kodu i sprawdzenie
>> na jakiej instrukcji sie wyklada.
> 
> 
> Wyjątek 0D na instrukcji iret.

W twoim przypadku nie wiadomo co sie znajduje na szczycie
stosu wiec powrot nastepuje w 'kosmos', stad wyjatek #GP.
W tym wypadku proponuje Ci zamiast iret, call do dowolnie
wybranego TSS, tak jak to rozwiazales z JMP.

>> Po co robic takie obejscia w stylu db 9ah...,
> 
> Bo tasm (w przeciwieństwie do nasma) jest porąbany i wszelkie kombinacje 
> z "call 64:0", call [64:0], call far ..., call dword ptr ...
> itd. kończą się albo komunikatem "illegal immediate", albo "near call to 
> different cs", albo inną instrukcją, niż o którą chodzi.
> Niestety, jestem tu skazany na tasma.

Ja juz dawno porzucilem tasma, glownie dlatego, ze praktycznie
nie jest tam mozliwe legalne mieszanie kodu 16 i 32 bitowego.
Poczatkowo na rzecz nasm'a, potem byl fasm, a obecnie at&t.

>> a do testowania bardziej sie chyba nada bochs,
>> http://bochs.sourceforge.net/
> 
> Dlaczego bardziej? Bochs jest dużo wolniejszy, bo emuluje procka 
> programowo.

Przy takim przykladzie raczej nie zauwazysz wplywu emulacji
na szybkosc dzialania twojego programu. A na dodatek
masz tam wbudowany debugger, ktory pozwoli Ci obejrzec
stan procesora w dowolnie wybranym momencie.
No i w przeciwinstwie do M$ VirtualPC jest darmowy.


-- 
Pozdrawiam
Lopez
Technical Details
Message-ID: <drlh45$mo6$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> <drkctm$2s2$1@inews.gazeta.pl> <drkso7$81k$1@news.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Lopez <rtlopezREMOVE@gazeta.pl>
Newsgroups: pl.comp.lang.asm
Subject: Re: [x86] problem z przełączaniem zadań
 przez CALL/IRET
Date: Mon, 30 Jan 2006 18:07:21 +0100
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 64
Message-ID: <drlh45$mo6$1@inews.gazeta.pl>
References: <drjd1e$95k$1@news.onet.pl> <drkctm$2s2$1@inews.gazeta.pl> <drkso7$81k$1@news.onet.pl>
NNTP-Posting-Host: user10.53.udn.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1138640838 23302 82.139.10.53 (30 Jan 2006 17:07:18 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Mon, 30 Jan 2006 17:07:18 +0000 (UTC)
In-Reply-To: <drkso7$81k$1@news.onet.pl>
X-Accept-Language: pl, en-us, en
X-User: rtlopez
User-Agent: Mozilla Thunderbird 1.0.2 (X11/20051002)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit