🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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?
#1306
Author: Jedrzej Dudkiewicz
Date: Fri, 06 Jul 2007 14:52
28 lines
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?
#1307
Author: Lopez
Date: Fri, 06 Jul 2007 19:49
59 lines
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?
#1308
Author: Wiktor S.
Date: Fri, 06 Jul 2007 22:47
9 lines
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?
#1310
Author: Bogdan (bogdro)
Date: Sat, 07 Jul 2007 08:08
43 lines
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?
#1309
Author: Jedrzej Dudkiewicz
Date: Tue, 10 Jul 2007 09:24
8 lines
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