Page 1 of 1

Стандарт передачи параметров в процедуры и функции

Posted: Tue Sep 12, 2006 5:49 pm
by YELLOW
Лично мне нравится как реализована передача параметров в Windows. Конечно передача через стек больших обьемов данных невозможна, но я думаю что в стандарте надо обговорить передачу внутрь процедуры и возврат из нее только указателей. Также надо подумать над организацией локального стека внутри процедур так как это положительно влияет на автономность кода, что важно, например, для внешних DLL-ок. Я опишу общий каркас: параметры передаются в процедуру по стандарту STDCALL, максимальная длина одного параметра - DWORD, количество параметров не ограничено (точнее ограничено, но достаточно большим числом). Насчет локального стека: я знаю примерный алгоритм его функционирования в Windows, когда указатель стека вышестоящей процедуры сохраняется в EBP и относительно EBP считываются все параметры процедуры, а ESP начинает указывать на локальную область данных. Параметры процедуры очищаются самой процедурой. Если в чем-то ошибся - поправьте. Надо раз и навсегда установить один стандарт и STDCALL не кажется мне таким уж плохим выбором. :wink:

Posted: Tue Sep 12, 2006 8:22 pm
by diamond
Стандартизация нужна только при передаче параметров из одного модуля в другой, "модуль" в широком смысле слова - библиотека KDL/COFF, кодер/декодер/движок/плагин для какой-нибудь программы и т.п. Внутри одной программы (особенно на ассемблере) параметры надо передавать как удобно в зависимости от текущей реализации.
Стиль вызова STDCALL удобен хотя бы уже тем, что его поддерживают все компиляторы ЯВУ (ну по крайней мере все, поддерживающие связь с внешним миром на стадии компиляции).

Posted: Tue Sep 12, 2006 8:35 pm
by Serge
FASM поддерживает stdcall достаточно включить файл proc32.inc. Как пример

Code: Select all

proc my_proc stdcall, param_1:dword, param_2:dword
   locals
      var_1  dd ?
      var_2  dd ?
   endl

      mov eax, [param_1]
      add eax, [param_2]
      mov [val_1], eax
      и т.д
      ret
endp       
вызов функции stdcall my_proc, [val_1], [val_2]
FASM сам сгенерирует код пролога и эпилога в функции my_proc. Никиких проблем использования файла proc32.inc и макросов proc и stdcall с нынешним кодом ядра нет.

Posted: Wed Sep 13, 2006 8:33 am
by YELLOW
diamond
Не обязательно, ведь кто-то может использовать часть моего исходника для своих разработок и единый стандарт вызова процедур просто облегчить его задачу.
Serge
Спасибо за информацию.