Except that in most cases that's not how it is done.
Instead, the stackframe is created in one go with a single change to the stack pointer and then the values are filled in in whatever order the compiler / language desires.
Here is a typical example using GCC:
movq %rsp, %rbp
subq $16, %rsp
movl $12, -4(%rbp)
addl $1, -4(%rbp)
movl -4(%rbp), %eax
movl $14, %edx
movl %eax, %esi
movl $12, %edi
call f
Which moves the parameters using registers (subject to availability) as a further optimization. The 'subq' reserves space for the stackframe with addresses relative to rbp being the parameters.