Программирование на Ассемблере

       

Недостатки функций


Для сравнительной оценки процедур и макросов сначала составим главную программу и функцию для простой задачи, а затем определим недостатки и покажем возможности использования макросов вместо процедур. Определим область применения функций и макросов.

Пример . Составить главную программу и функцию для обмена местами двух целых чисел длиной 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 сбросами процессора очень плохо как с точки зрения времени выполнения, так и с точки зрения памяти! Лучше вставить требуемые команды для обмена прямо в программу.

Таким образом, если число команд функции невелико, или если функция используется однократно, лучше функцию не применять!

Для обеспечения вставки в требуемое место участка программы с настройкой с учетом списка параметров используются макросы



Содержание раздела