Вопрос № 20692: Здравствуйте Господа Эксперты.
У меня возникла такая проблема. Хочу в программе на Delphi вызывать функции из dll, написанной мной же на ассемблере. Ни как не могу разобраться с типами вызовов(stdcall,pascal и т.д.) Подскажите пожалуйста как долж...
Вопрос № 20692
Здравствуйте Господа Эксперты.
У меня возникла такая проблема. Хочу в программе на Delphi вызывать функции из dll, написанной мной же на ассемблере. Ни как не могу разобраться с типами вызовов(stdcall,pascal и т.д.) Подскажите пожалуйста как должен быть оформлен код dll, чтобы реализовывался, например, stdcall.
Спасибо.
Отправлен: 11.05.2005, 20:01
Вопрос задал: the_white (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Ayl
Здравствуйте, the_white!
В общем, типы вызовов сообщают компилятору информацию о передаче параметров через стек и кто будет чистить этот самый стек после отработки процедуры.
Передача параметров с типом вызова pascal осуществляется слева направо (т.е. в том же порядке, как они и записаны в прототипе подпрограммы). В результате самый первый параметр подпрограммы будет самым последним в стеке. Кстати, именно поэтому довольно затруднительно написать подпрограмму с переменным числом параметров с этим типом вызова.
Прибирает за собой вызванная подпрограмма. Делается это обычно с помощью команды ret N, где N - число, на которое нужно увеличить регистр SP.
При использовании stdcall параметры помещаются в стек справа налево, т.е. первый параметр в описании подпрограммы будет последним в стеке (не считая точки возврата).
За удаление параметров из стека отвечает вызвавшая программа. Для этого выполняется команда add SP, N.
Соответственно, для оформления п/программы с типом вызова stdcall тебе нужно писать что-то типа этого (см. Приложение).
Замечание по возврату значений.
Все целые значения возвращаются через регистры:
1 байт: AL
2 байта: AX
4 байта: EAX
8 байт: EDX:EAX
Указатели: EAX
Символьные: AL
Логические: AL (0 или -1=255)
Вещественные: обычно через стек сопроцессора
Все остальные структуры - через указатель.
Приложение:
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 12.05.2005, 12:39
Отвечает: Евгений Иванов
Здравствуйте, the_white!
proc Name stdcall
или
Model NearStack use32 NT Flat,Normal StdCall
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 12.05.2005, 17:16