If I have the following code:
struct bob{
int a;
char b[8];
int c;
};
struct bob barker;
...
void sub1(unsigned int size){
int someflag=0;
struct bob dole;
memcpy(&dole.b,&barker.b,size);
}
let's say I call the code as sub(8) (the code is intentionally written
to allow overflows).
and I compile it with just plain "gcc -o test test.c", I get the
following assembly
08048427 <sub1>:
8048427: 55 push %ebp
8048428: 89 e5 mov %esp,%ebp
804842a: 57 push %edi
804842b: 56 push %esi
804842c: 83 ec 20 sub $0x20,%esp
804842f: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)
8048436: 8d 45 e4 lea 0xffffffe4(%ebp),%eax
8048439: 83 c0 04 add $0x4,%eax
804843c: 8b 55 08 mov 0x8(%ebp),%edx
804843f: 89 c7 mov %eax,%edi
8048441: be ac 96 04 08 mov $0x80496ac,%esi
8048446: fc cld
8048447: 89 d1 mov %edx,%ecx
8048449: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
804844b: 83 c4 20 add $0x20,%esp
804844e: 5e pop %esi
804844f: 5f pop %edi
8048450: 5d pop %ebp
8048451: c3 ret
Now, the weird thing about this assembly to me, is that when I track
the usage of the stack, I can't help but notice that it seems like
about 3 words (0xC bytes) too many seem to get allocated with that sub
$0x20 instruction. That is to say, I have the someflag local variable,
which should take up 0x4 + the bob dole struct which is 0x10 = 0x14
bytes required for local variables. Further, we can see that the while
the address %ebp - 0x1C (start of dole) gets accessed, but %ebp -
0x20, 0x24, 0x28 also get allocated by that initial sub, but never get
touched.
I noticed also that when I replace the memcpy with a strcpy for
instance, while gdb will allocate space for the parameters to be
passed to strcpy, they're esp-relative accesses, rather than the
ebp-relative that one normally sees for local variables, BUT there is
still 3 extra words of data between the beginning of dole, and the
beginning of the stack parameters...so again, they never get touched!
(08048450 <sub1>:
8048450: 55 push %ebp
8048451: 89 e5 mov %esp,%ebp
8048453: 83 ec 28 sub $0x28,%esp
8048456: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)
804845d: c7 44 24 04 d0 96 04 movl $0x80496d0,0x4(%esp)
8048464: 08
8048465: 8d 45 ec lea 0xffffffec(%ebp),%eax
8048468: 83 c0 04 add $0x4,%eax
804846b: 89 04 24 mov %eax,(%esp)
804846e: e8 95 fe ff ff call 8048308 <[EMAIL PROTECTED]>
8048473: c9 leave
8048474: c3 ret)
Basically I'm just curious to understand why gcc adds this extra space.
Thanks
Gary Guy