Thread View: pl.comp.lang.asm
6 messages
6 total messages
Started by kuba
Wed, 15 Mar 2006 22:09
add esp,12
Author: kuba
Date: Wed, 15 Mar 2006 22:09
Date: Wed, 15 Mar 2006 22:09
11 lines
1023 bytes
1023 bytes
mam nast. fragment kodu: push 10 push offset lancuch_zn push 1 call _write add esp,12 ostatnia linia ponoc usuwa parametry ze stosu. Nie mam pojecia jak i dlaczego i generalnie o co chodzi z tym usuwaniem w ostatniej linii, dlaczego tzreba 12 dodac???
Re: add esp,12
Author: Stachu 'Dozzie' K.
Date: Wed, 15 Mar 2006 22:13
Date: Wed, 15 Mar 2006 22:13
18 lines
1226 bytes
1226 bytes
On 15.03.2006, kuba <kuba1@o2.pl> wrote: > mam nast. fragment kodu: > > push 10 > push offset lancuch_zn > push 1 > call _write > add esp,12 > > ostatnia linia ponoc usuwa parametry ze stosu. Nie mam pojecia jak i > dlaczego i generalnie o co chodzi z tym usuwaniem w ostatniej linii, > dlaczego tzreba 12 dodac??? A ile bajtów władowałeś na stos przed skokiem do _write? -- Feel free to correct my English Stanislaw Klekot
Re: add esp,12
Author: Daniel P.
Date: Wed, 15 Mar 2006 23:16
Date: Wed, 15 Mar 2006 23:16
34 lines
2345 bytes
2345 bytes
Użytkownik kuba <kuba1@o2.pl> w wiadomości <dva3ec$nkq$1@nemesis.news.tpi.pl> napisał: > mam nast. fragment kodu: > > push 10 ; -> 4[B] > push offset lancuch_zn ; -> 4[B] > push 1 ; -> 4[B] > call _write > add esp,12 > > ostatnia linia ponoc usuwa parametry ze stosu. Nie mam pojecia jak i > dlaczego i generalnie o co chodzi z tym usuwaniem w ostatniej linii, > dlaczego tzreba 12 dodac??? Dlaczego dodać 12? Bo odłożyłeś 12 bajtów danych. Każdy push odkłada 4 B (rozmiar rejestru 32 bitowego). O co chodzi z tym usuwaniem? Co robi komenda "pop eax"? Przesyła do rejestru eax cztery bajty ze stosu, po czym aktualizuje wskaźnik stosu (esp - sp od stack pointer). Gdy wysyłasz coś na stos wskaźnik ten zmniejsza się o ilość danych (stos rośnie w dół), które wysyłasz (najczęściej będą to 4B, lecz nie zawsze musi tak być). Gdy pobierasz dane ze stosu wskaźnik ten zwiększa się o ilość danych, które z niego pobierasz (4B). Jeżeli dane ze stosu nie są Ci potrzebne, wystarczy, że samodzielnie zwiększysz wskaźnik stosu o potrzebną wartość a będzie to adekwatne do pobrania ze stosu danych (pop) z tym, że nie będziesz tych danych miał. Dlaczego się to stosuje? To co odłożyłeś na stos _musisz_ z niego pobrać. Jeżeli nie jest Ci to potrzebne wystarczy, że zaktualizujesz sam wskaźnik - rezultat będzie ten sam. Aby lepiej to zrozumieć pobaw się jakimś debugerem - bez tego może być ciężko. Popatrz jak są wywoływane procedury i jak się wtedy zmienia esp.
Re: add esp,12
Author: fafek
Date: Wed, 15 Mar 2006 23:40
Date: Wed, 15 Mar 2006 23:40
44 lines
2246 bytes
2246 bytes
kuba wrote: > mam nast. fragment kodu: > > push 10 > push offset lancuch_zn > push 1 > call _write > add esp,12 > > ostatnia linia ponoc usuwa parametry ze stosu. Nie mam pojecia jak i > dlaczego i generalnie o co chodzi z tym usuwaniem w ostatniej linii, > dlaczego tzreba 12 dodac??? kuba wrote: > push 10 > push offset lancuch_zn > push 1 > call _write > add esp,12 > > ostatnia linia ponoc usuwa parametry ze stosu. Nie mam pojecia jak i > dlaczego i generalnie o co chodzi z tym usuwaniem w ostatniej linii, > dlaczego tzreba 12 dodac??? rejestr ESP wskazuje na miejsce w pamięci, gdzie leży stos (konkretnie jego wierzchołek); przykład: 1. ESP wskazuje na pozycję `n' 2. Robimy push eax (przykładowo - chodzi o to, że zrzucamy 4B) 3. Teraz ESP wskazuje na pozycję n-4, czyli, po polsku mówiąc, o 4 bajty niższą 4. Jeśli zrobimy pop eax, to ESP znów bedzie wskazywać na `n' Prosty wniosek, jeśli zwiększysz ESP o jakąś ilość bajtów, "obniżysz" wskaźnik wierzchołka stosu. Nie jest ważne, co się znajduje nad, ani pod wierzchołkiem, ważny jest sam wierzchołek. Gdybyś wykonał odwrotną instrukcję, czyli sub esp, 4 (przykładowo), to na szczycie stosu znajdowałaby się jakaś nieznana wartość (prawdopodobnie ta, która leżała (o ile leżała) tam wcześniej, ale została "zdjęta"). Uff, chyba troche namotałem. Pozdrawiam, fafek
Re: add esp,12
Author: Paweł Pawlak
Date: Thu, 16 Mar 2006 16:21
Date: Thu, 16 Mar 2006 16:21
22 lines
1520 bytes
1520 bytes
Dnia 3/15/2006 11:09 PM, kuba wrote: > mam nast. fragment kodu: > > push 10 > push offset lancuch_zn > push 1 > call _write > add esp,12 > > ostatnia linia ponoc usuwa parametry ze stosu. Nie mam pojecia jak i > dlaczego i generalnie o co chodzi z tym usuwaniem w ostatniej linii, > dlaczego tzreba 12 dodac??? Procedura (czy też funkcja, whatever) _write zapewne wykorzystuje konwencję wywołania cdecl, wedle której to program wywołujący usuwa parametry ze stosu (w przeciwieństwie do np. stdcall, gdzie to wywoływana funkcja czyści stos z przekazanych parametrów). A dlaczego akurat 12? Już Ci koledzy wytłumaczyli. Pozdrawiam, Morris
Re: add esp,12
Author: kuba
Date: Thu, 16 Mar 2006 17:51
Date: Thu, 16 Mar 2006 17:51
9 lines
1165 bytes
1165 bytes
Daniel P. napisał(a): > Dlaczego dodać 12? Bo odłożyłeś 12 bajtów danych. Każdy push odkłada > 4 B (rozmiar rejestru 32 bitowego). no jasne... ale ze mnie los :P dzieki pozdr. kuba
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads