Здравствуйте Mobster, вы писали:
M>Здравствуйте Alex Fedotov, вы писали:
AF>>Итак, если функция имеет переменное число параметров и первый параметр кладется в стек последним, как это делается в C, то вызываемая функция может легко найти его по адресу AF>>[ebp + 8] (я предполагаю наличие вполне конкретного стекового фрейма, принятого в Win32 AF>>flat модели; в других случаях будет не так, но давайте пока не будем придираться к деталям). AF>>Макрос va_arg соответствует движению выше по стеку.
AF>>Если параметры передаются в другом порядке, то по адресу [ebp + 8] окажется последний параметр, а первый параметр окажется где-то выше по стеку, причем неизвестно где (параметров ведь переменное число).
AF>>Представь себе printf. Чтобы определить число параметров ему нужно знать форматную строку. Если параметры передаются как они передаются, то форматная строка берется из [ebp + 8] и дальше никаких проблем нет. Но если параметры передать в другом порядке, то printf просто не сможет найти эту форматную строку, так как для этого нужно знать число фактически переданных параметров, а оно определяется только из форматной строки.
AF>>Поэтому порядок укладки аргументов в стек имеет значение, когда используется переменное число аргументов.
M>Уважаемый Alex!!!
M>Насколько я понял их Вашего письма, параметры функции копируются в обратном порядке по УБЫВАНИЮ адресов и адрес самого последнего СКОПИРОВАННОГО параметра (то есть первого параметра функции) возвращается как адрес начала стекового фрейма. Так как они копировались по убыванию адресов, то возможны такие штучки как va_arg, которые движутся вверх по стеку.
M>Я правильно вас понял? M>Если да, то я похоже понял что к чему.
M>Заранее спасибо за ответ :-))))
Столько мудрости.
Что я чуть не запутался!
Может проще как объяснить?
Стек — первый вошёл, последний вышел.
Записывали в обратном порядке.
Сама функция получила их в НОРМАЛЬНОМ порядке!
Так что как знать ещё, что логичнее — Паскаль или Си?
Элементарно. И пусть благословенен тот кто придумал такую схему. По собственному опыту сужу — насколько
она мне в жизни помогла.