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