Это причина, по которой аргументы выдвигаются в обратном порядке в соглашении о вызовах C, например:
Если вы позвоните:
printf("%s %s", foo, bar);
Стек заканчивается как:
...
+-------------------+
| bar |
+-------------------+
| foo |
+-------------------+
| "%s %s" |
+-------------------+
| return address |
+-------------------+
| old frame pointer | <- frame pointer
+-------------------+
...
Аргументы принимаются косвенно, используя его смещение от указателя кадра (указатель кадра может быть опущен умными компиляторами, которые знают, как вычислить вещи из указателя стека). Первый аргумент всегда находится по известному адресу в этой схеме, функция получает столько аргументов, сколько ей говорят ее первые аргументы.
Попробуйте следующее:
printf("%x %x %x %x %x %x\n");
Это сбросит часть стека.