Это верно для push
инструкций, но это не единственный способ использовать стек. В x86 также есть регистр esp для хранения указателя на текущую позицию стека.
Аргументы функции помещаются в стек, если вы проверите некоторые разборки, вы увидите, как компилятор их туда выводит. В обычном соглашении о вызовах для x86 char
аргументы занимают 4 байта каждый. Массивы не могут быть переданы по значению, поэтому не возникает вопроса о том, как массив символов будет сохранен, если они смогут.
Автоматические переменные также занимают стек, но элементы массива не сохраняются в стеке по отдельности с помощью «push». Обычно функция освобождает место для всех своих автоматических переменных в начале - ищите инструкцию «sub», включающую «esp». Тогда начало массива находится с известным смещением от esp, как любая автоматическая переменная, и компилятор будет использовать это смещение для генерации доступа к массиву. Нет необходимости в заполнении элементов, хотя после конца массива могут быть некоторые, чтобы правильно выровнять указатель стека.