· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› StdCall или Pascal

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 11, 2003 20:24:07

Чем отличается тип Pascal от StdCall?
Как вызвать API-функцию посредством передачи параметров типа Pascal?(желательно пример)
Как проводить компиляцию, с какими параметрами?


Дата: Ноя 11, 2003 20:38:49

CDECL - Порядок вызова справа налево, за выгрузку стека отвечает вызывающая подпрограмма.

PASCAL - Порядок вызова слева направо, за выгрузку стека отвечает вызываемая подпрограмма.

STDCALL - Порядок вызова справа налево, за выгрузку стека отвечает вызываемая подпрограмма.

FASTCALL - Первые три параметра по возможности передаются через регистры процессора. Если аргументов три или меньше и при отсутствии локальных переменных вызываемая подпрограмма не создает кадров стека.

STDCALL был добавлен Microsoft для Win32. В нем скомбинированы лучшие черты Pascal (очистка стека вызываемой подпрограммой) и CDECL (аргументы выталкиваются слева направа - первый аргумент находится на вершине стека - делает простым использование счетчика переменного количества аргументов). Перед STDCALL Windows всегда использовался PASCAL, а для вызовов всех переменных аргументов использовался CDECL. Теперь для всего этого всегда используется STDCALL.

FASTCALL реально доступен в 16-битных BC, но его используют не так много программистов. Тем не менее, для вызова небольших быстрых подпрограмм, не организующих выталкивание и помещение аргументов и не строящих кадры стека, кадры могут быть расширены. Для примера, подпрограмма MIN/MAX выполняющая около 15 инструкций, выполняет 5, плюс дополнительные инструкции, по большей части для работы с регистрами, где старые инструкции работали с памятью. Это не дало бы такого эффекта в C поскольку: (a) такие простые программы реализовываются на уровне макросов, и/или (b) компилятор имел тенденцию работать во всяком случае с inline.


Дата: Ноя 12, 2003 04:41:55

volodya
FASTCALL - Первые три параметра по возможности передаются через регистры процессора
Э... FASTCALL - там же вроде как только ДВА параметра через ECX и EDX, остальное - через стек.


Дата: Ноя 12, 2003 05:04:44

Grenader
Это я спер с Delphi World. Лень было вспоминать. Так что - не виноватая я :)
А что до fastcall - да. А еще правильнее - проверить! Взять и написать программульку из двух строк. Всего делов :) А потом дизасмить.


Дата: Ноя 12, 2003 06:42:41 · Поправил: Grenader

Да, можно и дизасмить :)
Однако именно 2 параметра через регистры - это точно :)))

ЗЫ Это они там, на "Мире Дельфи", ленивые! :)


Дата: Ноя 12, 2003 12:48:11

Grenader
ЗЫ Это они там, на "Мире Дельфи", ленивые! :)

Не правда, самые линивые ЭТО МЫ!!!

Если бы програмист не был ленивым, он бы не программировал :))))


Дата: Ноя 12, 2003 13:27:41

Edmond
Ага, и от великой лени изобретаете вы сотни способов копирования бедных трудолюбивых байтиков :)))


Дата: Ноя 12, 2003 14:06:47

> Это я спер с Delphi World. Лень было вспоминать. Так
> что - не виноватая я :)

Никто не виноватая :) Просто есть как минимум два fastcall'a - у борланда юзаются 3 регистра (eax, ecx, edx), а у мелкомягких - два (ecx, edx)


Дата: Ноя 12, 2003 14:28:17

Dr.Golova
Да уж... :) Страшный сон - "а какой именно stdcall вы имели в виду ?"


Дата: Ноя 12, 2003 14:28:42

Ага, и от великой лени изобретаете вы сотни способов копирования бедных трудолюбивых байтиков :)))

Не путайте лень и любознательность :)


Дата: Ноя 12, 2003 14:30:19

Grenader
Во первых давайте всё таки скажем, что fastcall более внутренний формат чем внешний (для DLL и плагинов)


Дата: Ноя 12, 2003 14:30:36

Edmond
;o)


Дата: Ноя 12, 2003 17:15:06

Да, кстати, Grenader, а fastcall для AMD64 не хо?


Дата: Ноя 12, 2003 17:32:20

volodya
ЧТО???


Дата: Ноя 12, 2003 20:13:27 · Поправил: volodya

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037