|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037 |