🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
6 messages
6 total messages Started by kuba Wed, 15 Mar 2006 22:09
add esp,12
#156
Author: kuba
Date: Wed, 15 Mar 2006 22:09
11 lines
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
#157
Author: Stachu 'Dozzie' K.
Date: Wed, 15 Mar 2006 22:13
18 lines
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
#158
Author: Daniel P.
Date: Wed, 15 Mar 2006 23:16
34 lines
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
#160
Author: fafek
Date: Wed, 15 Mar 2006 23:40
44 lines
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
#161
Author: Paweł Pawlak
Date: Thu, 16 Mar 2006 16:21
22 lines
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
#159
Author: kuba
Date: Thu, 16 Mar 2006 17:51
9 lines
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