Why gcc translate a c program into assemble as follow



A C function is like below:
void echo()
{
char buf[4];
gets(buf);
}
I use gcc compile it with the option -O2 -S, and get the following
assemble program:
echo:
pushl %ebp
movl %esp,%ebp
leal -4(%ebp),%eax
subl $20,%esp ##why allocate 20 bytes on stack? The variable in C
function is only 4 bytes
pushl %eax
call gets
leave
ret

.