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 [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to