This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Ways to fill the stack
- From: Ian Lance Taylor <iant at google dot com>
- To: sztfg at yandex dot ru
- Cc: gcc-help at gcc dot gnu dot org
- Date: Sat, 9 Feb 2013 22:13:19 -0800
- Subject: Re: Ways to fill the stack
- References: <1638441360467696@web21d.yandex.ru>
On Sat, Feb 9, 2013 at 7:41 PM, <sztfg@yandex.ru> wrote:
> In this function:
> void foo(void)
> {
> const char a1[6] = {'t','e','s','t','1','2'};
> bar(a1);
> const char a2[6] = ("test12");
> bar(a2);
> return;
> }
> In case of bar(a1) it stores string in this way:
> movb $116, -16(%rbp)
> movb $101, -15(%rbp)
> movb $115, -14(%rbp)
> movb $116, -13(%rbp)
> movb $49, -12(%rbp)
> movb $50, -11(%rbp)
> But in case of bar(a2):
> movl $1953719668, -32(%rbp)
> movw $12849, -28(%rbp)
> leaq -32(%rbp), %rax
> Can somebody explain me this?
Bad optimization for a1, I guess. We could do better.
> Why not use push instruction?
I don't see why this would ever use a push instruction. Arguments are
passed in registers on x86_64. For each call the local array is built
on the stack, then the address of the array is passed in a register.
Ian