Re[6]: Calling Convention - IT и всем...
От: Vitek  
Дата: 31.05.01 09:12
Оценка:
Здравствуйте 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>Заранее спасибо за ответ :-))))


Столько мудрости.
Что я чуть не запутался!

Может проще как объяснить?
Стек — первый вошёл, последний вышел.

Записывали в обратном порядке.
Сама функция получила их в НОРМАЛЬНОМ порядке!

Так что как знать ещё, что логичнее — Паскаль или Си?

Элементарно. И пусть благословенен тот кто придумал такую схему. По собственному опыту сужу — насколько
она мне в жизни помогла.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.