Thread View: pl.comp.lang.asm
5 messages
5 total messages
Started by Jedrzej Dudkiewicz
Fri, 06 Jul 2007 14:52
gcc - wyrownanie esp w main?
Author: Jedrzej Dudkiewicz
Date: Fri, 06 Jul 2007 14:52
Date: Fri, 06 Jul 2007 14:52
28 lines
1770 bytes
1770 bytes
Program w C w pliku x.c:
int main() { }
po gcc -S -O3 x.c daje taki fragment:
6 main:
7 pushl %ebp
8 movl %esp, %ebp
9 subl $8, %esp
10 andl $-16, %esp
11 subl $16, %esp
12 leave
13 ret
Ja to rozumiem tak, że linie 9 - 11 to jest wyrównanie stosu do potęgi 4.
Tylko po co te odejmowania? Skoro stos rośnie w dół, to samo andl przesuwa
adres nie wyżej niż andl. Nie jest to raczej rezerwowanie miejsca na żadne
zmienne - nigdy nie widziałem, aby to miejsce było wykorzystane (pewnie mało
widziałem). Szukałem jakichś informacji po sieci, ale nie znalazłem nic
prócz tego, że to jest wyrównanie, raz tylko określone jako "strange".
Z góry dzięki za odpowiedź,
JD
PS. Próbuję szukać czegoś w źródłach gcc, ale... Tonący może i chwyta się
brzytwy, ale wcześniej niż źródeł gcc. Tak mi się wydaje :)
Re: gcc - wyrownanie esp w main?
Author: Lopez
Date: Fri, 06 Jul 2007 19:49
Date: Fri, 06 Jul 2007 19:49
59 lines
2391 bytes
2391 bytes
Jedrzej Dudkiewicz napisał(a):
> Program w C w pliku x.c:
>
> int main() { }
>
> po gcc -S -O3 x.c daje taki fragment:
>
> 6 main:
> 7 pushl %ebp
> 8 movl %esp, %ebp
> 9 subl $8, %esp
> 10 andl $-16, %esp
> 11 subl $16, %esp
> 12 leave
> 13 ret
>
> Ja to rozumiem tak, że linie 9 - 11 to jest wyrównanie stosu do potęgi 4.
> Tylko po co te odejmowania? Skoro stos rośnie w dół, to samo andl przesuwa
> adres nie wyżej niż andl. Nie jest to raczej rezerwowanie miejsca na żadne
> zmienne - nigdy nie widziałem, aby to miejsce było wykorzystane (pewnie mało
> widziałem). Szukałem jakichś informacji po sieci, ale nie znalazłem nic
> prócz tego, że to jest wyrównanie, raz tylko określone jako "strange".
>
Ktora wersja gcc?
w 4.1.3
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
a z flaga -fomit-frame-pointer
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ecx
popl %ecx
leal -4(%ecx), %esp
ret
>
> PS. Próbuję szukać czegoś w źródłach gcc, ale... Tonący może i chwyta się
> brzytwy, ale wcześniej niż źródeł gcc. Tak mi się wydaje :)
>
A moze to tylko nadgorliwosc twórców?
Natomiast nie rozumiem jakie to moze miec znaczenie.
--
Pozdrawiam
Lopez
Re: gcc - wyrownanie esp w main?
Author: Wiktor S.
Date: Fri, 06 Jul 2007 22:47
Date: Fri, 06 Jul 2007 22:47
9 lines
1058 bytes
1058 bytes
> Nie jest to raczej rezerwowanie miejsca na żadne zmienne - nigdy > nie widziałem, aby to miejsce było wykorzystane (pewnie mało widziałem). mało widziałeś :-) -- Azarien
Re: gcc - wyrownanie esp w main?
Author: Bogdan (bogdro)
Date: Sat, 07 Jul 2007 08:08
Date: Sat, 07 Jul 2007 08:08
43 lines
2431 bytes
2431 bytes
Jedrzej Dudkiewicz pisze:
> Program w C w pliku x.c:
>
> int main() { }
>
> po gcc -S -O3 x.c daje taki fragment:
>
> 6 main:
> 7 pushl %ebp
> 8 movl %esp, %ebp
> 9 subl $8, %esp
> 10 andl $-16, %esp
> 11 subl $16, %esp
> 12 leave
> 13 ret
>
> Ja to rozumiem tak, że linie 9 - 11 to jest wyrównanie stosu do potęgi 4.
> Tylko po co te odejmowania? Skoro stos rośnie w dół, to samo andl przesuwa
> adres nie wyżej niż andl. Nie jest to raczej rezerwowanie miejsca na żadne
> zmienne - nigdy nie widziałem, aby to miejsce było wykorzystane (pewnie mało
> widziałem). Szukałem jakichś informacji po sieci, ale nie znalazłem nic
> prócz tego, że to jest wyrównanie, raz tylko określone jako "strange".
>
> Z góry dzięki za odpowiedź,
>
> JD
>
> PS. Próbuję szukać czegoś w źródłach gcc, ale... Tonący może i chwyta się
> brzytwy, ale wcześniej niż źródeł gcc. Tak mi się wydaje :)
Instrukcja AND obniży ESP o wartość od 0 do 15. Poprzedzające SUB
upewnia się, że ESP łącznie obniży się co najmniej o 8. Ostatnie SUB
rzeczywiście jest tutaj zbędne, jeśli chodzi o wyrównanie stosu, ale
może ma inny cel. Wypróbuj:
gcc -S -Os -fomit-frame-pointer x.c
gcc -S -mpreferred-stack-boundary=2 x.c
--
Pozdrawiam/Regards - Bogdan (Linux & FreeDOS)
Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: gcc - wyrownanie esp w main?
Author: Jedrzej Dudkiewicz
Date: Tue, 10 Jul 2007 09:24
Date: Tue, 10 Jul 2007 09:24
8 lines
1163 bytes
1163 bytes
> > Nie jest to raczej rezerwowanie miejsca na żadne zmienne - nigdy > > nie widziałem, aby to miejsce było wykorzystane (pewnie mało widziałem). > > mało widziałeś :-) A do czego np. jest wykorzystywane? JD
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