Стандарт передачи параметров в процедуры и функции
-
Лично мне нравится как реализована передача параметров в Windows. Конечно передача через стек больших обьемов данных невозможна, но я думаю что в стандарте надо обговорить передачу внутрь процедуры и возврат из нее только указателей. Также надо подумать над организацией локального стека внутри процедур так как это положительно влияет на автономность кода, что важно, например, для внешних DLL-ок. Я опишу общий каркас: параметры передаются в процедуру по стандарту STDCALL, максимальная длина одного параметра - DWORD, количество параметров не ограничено (точнее ограничено, но достаточно большим числом). Насчет локального стека: я знаю примерный алгоритм его функционирования в Windows, когда указатель стека вышестоящей процедуры сохраняется в EBP и относительно EBP считываются все параметры процедуры, а ESP начинает указывать на локальную область данных. Параметры процедуры очищаются самой процедурой. Если в чем-то ошибся - поправьте. Надо раз и навсегда установить один стандарт и STDCALL не кажется мне таким уж плохим выбором.
Стандартизация нужна только при передаче параметров из одного модуля в другой, "модуль" в широком смысле слова - библиотека KDL/COFF, кодер/декодер/движок/плагин для какой-нибудь программы и т.п. Внутри одной программы (особенно на ассемблере) параметры надо передавать как удобно в зависимости от текущей реализации.
Стиль вызова STDCALL удобен хотя бы уже тем, что его поддерживают все компиляторы ЯВУ (ну по крайней мере все, поддерживающие связь с внешним миром на стадии компиляции).
Стиль вызова STDCALL удобен хотя бы уже тем, что его поддерживают все компиляторы ЯВУ (ну по крайней мере все, поддерживающие связь с внешним миром на стадии компиляции).
Ушёл к умным, знающим и культурным людям.
FASM поддерживает stdcall достаточно включить файл proc32.inc. Как пример
вызов функции stdcall my_proc, [val_1], [val_2]
FASM сам сгенерирует код пролога и эпилога в функции my_proc. Никиких проблем использования файла proc32.inc и макросов proc и stdcall с нынешним кодом ядра нет.
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
FASM сам сгенерирует код пролога и эпилога в функции my_proc. Никиких проблем использования файла proc32.inc и макросов proc и stdcall с нынешним кодом ядра нет.
diamond
Не обязательно, ведь кто-то может использовать часть моего исходника для своих разработок и единый стандарт вызова процедур просто облегчить его задачу.
Serge
Спасибо за информацию.
Не обязательно, ведь кто-то может использовать часть моего исходника для своих разработок и единый стандарт вызова процедур просто облегчить его задачу.
Serge
Спасибо за информацию.
Who is online
Users browsing this forum: No registered users and 3 guests