Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизПередача параметров asm, Delphi. Найти похожие ветки
← →
boalse © (2006-06-02 11:38) [0]По правилам параметры для функции передаются следующим образом:
Первый в eax, второй в edx, третий в ecx, все остальные - в стек. Интересует, всегда ли эти правила выполняются для функций в библиотеках dll?
Допустим, я знаю адрес некой функции, загруженной из некой длл, знаю количество параметров, знаю типы параметров. Всё это мне указал пользователь, т.е. известно мне это всё становится в ран-тайме. Могу ли я быть уверен в том, что передавая функции эти параметры по правилам, указанным выше, функция их все примет? Или возможны исключения из правил? Если так, то как тогда делфи при компиляции программы, узнаёт в какой регистр процессора для конкретной функции передавать конкретный параметр?
Иными словами, как (по каким правилам) для любой функции из любой длл передать 100% правильно все необходимые ей параметры, если известен адрес функции, количество параметров и их типы?
Всегда ли результат (или ссылка на результат) функции записывается в eax?
← →
boalse © (2006-06-02 11:40) [1]
> если известен адрес функции, количество параметров и их
> типы?
Ну и, само-собой, значения самих параметров.
← →
han_malign © (2006-06-02 12:05) [2]
> в библиотеках dll
- обычно используется соглашение вызовов stdcall или cdecl, в которых ВСЕ параметры передаются через стек, причем, в зависимости от соглашения, в разном порядке...
← →
han_malign © (2006-06-02 12:08) [3]Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
← →
boalse © (2006-06-02 12:58) [4]так stdcall и т.п. это и есть правила по которым передаются параметры?
А я то думаю, что это за фигня такая...
Большое спасибо!
Ещё парочка дурацких вопросов:
Что означает Clean-up: Caller, Routine?
Если Passes parameters in registers=Yes, то правила такие, как написал я в [0]?
← →
boalse © (2006-06-02 13:01) [5]F(A1,A2,A3) stdcall
Это значит, что функция примет сначала A3, потом A2, потом A1?
А если
F(A1,A2,A3) pascal
, то наоборот?
← →
Чапаев © (2006-06-02 13:07) [6]
> Что означает Clean-up: Caller, Routine?
Очищает ли стек тот, кто вызвал подпрограмму, или сама подпрограмма.
В первом случае можно немного выиграть, если следующая подпрограмма использует те же параметры. В таком случае параметры помещаются в стек однажды перед вызовом первой подпрограммы и однажды же вынимаются из стека после выполнения второй подрограммы.
← →
Чапаев © (2006-06-02 13:09) [7]
> F(A1,A2,A3) stdcall
> Это значит, что функция примет сначала A3, потом A2, потом
> A1?
> А если
> F(A1,A2,A3) pascal
> , то наоборот?
Нет. Не "функция примет", а на вершине стека в первом случае будет лежать А1, а во втором -- А3.
← →
boalse © (2006-06-02 14:31) [8]Понятно, спасибо.
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c