Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Передача параметров 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
2-1151480704
wasserman
2006-06-28 11:45
2006.07.16
Delphi и Proxy


15-1150465354
Polevi
2006-06-16 17:42
2006.07.16
смешно


15-1150445972
worldmen
2006-06-16 12:19
2006.07.16
Библиотека bordbk70.dll.


2-1151413170
Vovanchik
2006-06-27 16:59
2006.07.16
Работа с микрофоном (передача данных по сети)


2-1151252255
JTAG
2006-06-25 20:17
2006.07.16
Сделал иконку в Image Editor, подскажите плз, как сделать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский