Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Aug 2001 15:44:27 +0300
From:      Valentin Nechayev <netch@iv.nn.kiev.ua>
To:        John Baldwin <jhb@FreeBSD.ORG>
Cc:        "David O'Brien" <obrien@FreeBSD.ORG>, freebsd-hackers@FreeBSD.ORG, Steve Roome <stephen_roome@yahoo.com>
Subject:   Re: function calls/rets in assembly
Message-ID:  <20010825154427.B761@iv.nn.kiev.ua>
In-Reply-To: <XFMail.010824113645.jhb@FreeBSD.org>; from jhb@FreeBSD.ORG on Fri, Aug 24, 2001 at 11:36:45AM -0700
References:  <20010824110805.C88259@dragon.nuxi.com> <XFMail.010824113645.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
 Fri, Aug 24, 2001 at 11:36:45, jhb (John Baldwin) wrote about "Re: function calls/rets in assembly": 

> > printasint:
> >       pushl %ebp
> >       movl %esp,%ebp
> >       subl $8,%esp
> >       addl $-8,%esp
[...]

> Because this code is broken and obfuscated? :)
> 
> We save %esp in %ebp (the only thing that keeps it from breaking) then
> for some
> reason allocate two quadwords on the stack unnecessarily, one using an add
> instruction, one using a sub.

Because gcc has `-mpreferred-stack-boundary=4' default.
Please read info gcc to realize what this option means.
If you want to avoid this, compile with `-mpreferred-stack-boundary=2',
as FreeBSD kernel is compiled. The only illogical thing here is
that it doesn't gather two %esp moving instructions (one for frame of
this function, one for frame for called function) to single one.

> printasint:
>         pushl %ebp
>         movl %ebp, %esp
>         pushl 8(%ebp)
>         pushl $.LC0
>         call printf
>         addl $8,%esp
>         leave
>         ret

After reducing preferred stack boundary to 2**2:

printasint:
        pushl %ebp
        movl %esp,%ebp
        movl 8(%ebp),%eax
        pushl %eax
        pushl $.LC0
        call printf
        addl $8,%esp
.L6:
        leave
        ret

Well, unnesesary stack pointer shiftings disappeared.
After calling with additional -O1:

printasint:
        pushl %ebp
        movl %esp,%ebp
        pushl 8(%ebp)
        pushl $.LC0
        call printf
        leave
        ret

You can simply see that this assembly output is fully identical
to one you requested.

Well, now you should add wanted options to /etc/make.conf and avoid
seeing of such nightmares.

> Note that with hand optimizing, you could axe the addl after the call since
> leave will clean up after that anyways.  Also, you don't really need a frame
> here anyways.  In that case, you could just push 8(%esp) as your first
> instruction and axe the leave (but leave the addl).


/netch

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010825154427.B761>