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>
