Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.031 c
15-1150602927
guard_gg
2006-06-18 07:55
2006.07.16
Microsoft Visual C++ and Borland C++ Builder


2-1151240219
Gizza
2006-06-25 16:56
2006.07.16
Панель управления


10-1121847387
serjufa
2005-07-20 12:16
2006.07.16
в листе excel нарисовать стрелки


2-1148732482
inri13666
2006-05-27 16:21
2006.07.16
Кнопка Пуск


2-1151406821
novill
2006-06-27 15:13
2006.07.16
Как проще всего узнать время создания исполняемого файла ?