Недостатки функций
Для сравнительной оценки процедур и макросов сначала составим главную программу и функцию для простой задачи, а затем определим недостатки и покажем возможности использования макросов вместо процедур. Определим область применения функций и макросов.
Пример . Составить главную программу и функцию для обмена местами двух целых чисел длиной 32 бита.
; Главная программа
IDEAL
p586
model flat
extrn ExitProcess:proc
dataseg
first dd 1
second dd 2
codeseg
begin:
push offset first
push offset second
call swap
call ExitProcess
; Функция
proc swap
arg a:dword, b:dword=s
push ebp
mov ebp, esp
push esi edi eax ebx
mov esi, [a]
mov edi, [b]
mov eax, [esi]
mov ebx, [edi]
mov [esi], ebx
mov [edi], eax
pop ebx eax esi edi
pop ebp
ret s
endp swap
end begin
Анализ программы показывает, что для обращения к функции необходимо:
* передать параметры или их адреса (число команд не меньше числа передаваемых параметров);
* обратиться к функции (занесение адреса возврата и передача управления - сброс конвейера и декодирование команд заново - фактически 2 команды + сброс конвейера, что соответствует потере не менее 4 тактов).
В самой функии необходимо:
* обеспечить доступ к параметрам (2 команды);
* восстановить стек и передать управление вызывающей программе (2 команды + сброс конвейера).
Таким образом, суммарные «накладные расходы» вызова функциии составляют N + 6 + 2 сброса конвейера, где N - число параметров. Дополнительные расходы по одной команде для параметров-результатов, т.к. необходимо использовать косвенные адреса. В данной программе исполняемая часть функции содержит всего 4 команды и использовать функцию с 10 (N = 2) дополнительными командами и 2 сбросами процессора очень плохо как с точки зрения времени выполнения, так и с точки зрения памяти! Лучше вставить требуемые команды для обмена прямо в программу.
Таким образом, если число команд функции невелико, или если функция используется однократно, лучше функцию не применять!
Для обеспечения вставки в требуемое место участка программы с настройкой с учетом списка параметров используются макросы