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