Здравствуйте Mobster, вы писали:
M>Насчет того, что обратная передача аргументов в стек, позволяет передавать переменное количество параметров — это не совсем так. Если вы пользовались функциями с переменным числом параметров (в stdarg.h находятся; va_arg, va_start, va_end) то там обработка параметров идет именно СЛЕВА НАПРАВО (то есть то, в каком порядке аргументы передались в функцию вообще не имеет никакого занчения), причем Вы должны в функцию в качестве аргумента передавать переменную, которая указывает количество аргументов или реализовывать обработку списка параметров до какого-то параметра, который у вас используется в качестве terminator'а. Так вот весь УЖАС в том, что это все идеально подходит и для паскалеобразных языков, хотя в последнем нет (насколько я знаю) такой возможности. Именно поэтому меня этот вопрос так заинтересовал :-)))))
Итак, если функция имеет переменное число параметров и первый параметр кладется в стек последним, как это делается в C, то вызываемая функция может легко найти его по адресу
[ebp + 8] (я предполагаю наличие вполне конкретного стекового фрейма, принятого в Win32
flat модели; в других случаях будет не так, но давайте пока не будем придираться к деталям).
Макрос va_arg соответствует движению выше по стеку.
Если параметры передаются в другом порядке, то по адресу [ebp + 8] окажется последний параметр, а первый параметр окажется где-то выше по стеку, причем неизвестно где (параметров ведь переменное число).
Представь себе printf. Чтобы определить число параметров ему нужно знать форматную строку. Если параметры передаются как они передаются, то форматная строка берется из [ebp + 8] и дальше никаких проблем нет. Но если параметры передать в другом порядке, то printf просто не сможет найти эту форматную строку, так как для этого нужно знать число фактически переданных параметров, а оно определяется только из форматной строки.
Поэтому порядок укладки аргументов в стек имеет значение, когда используется переменное число аргументов.
M>А насчет ответа, что пришлось бы в качестве первого параметра передавать многоточие — так это вообще уже непонятно что :-))))