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>