Re[5]: Calling Convention - IT и всем...
От: Mobster  
Дата: 31.05.01 04:00
Оценка:
Здравствуйте 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, которые движутся вверх по стеку.

Я правильно вас понял?
Если да, то я похоже понял что к чему.

Заранее спасибо за ответ :-))))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.