Rambler's
Top100

Оптимизация программ на ассемблере. Часть 2

Автор: lonesome TSH/Digital Daemons
Дата: .02.2003
Раздел: Ассемблер вне ОС

С-конвенция

По С-конвенции вызова функций очистку стека от параметров должна проводить вызывающая функция. Следовательно если нужно вызвать подряд несколько функций с одними и теми же параметрами, то стек очищать не нужно и помещать в него параметры второй функции - тоже. Если же совпадает только часть параметров, то, соотвественно ложить в стек можно только несовпадающую часть.

Вышесказанное относится только к вызову внешних функций, т.к. в любом случае передавать параметры внутри программы лучше с помощью регистров, - шести свободных регистров (EAX, EBX, ECX, EDX, EDI, ESI) обычно вполне хватает

Умножение и деление

Если один из операндов известен (т.е. производится умножение или деление на константу), то его можно реализовать с помощью команд сдвига и сложения/вычитания, - это займет меньше тактов процессора

Умножение или деление на степень двойки реализуется сдвигом влево или вправо на соответствующее число бит:
shl eax, 4 ; EAX = EAX*2^4 = EAX*16
shr eax, 2 ; EAX = EAX/4

Другие примеры:
;EAX=EAX*15:
mov ebx, eax
shl eax, 4
sub eax, ebx

;EAX=EAX*3:
lea eax, [eax+eax]

ENTER и LEAVE

Не используйте команды ENTER и LEAVE для создания стекового кадра, а используйте набор из push, mov, add. Команды ENTER и LEAVE требуют больше тактов, чем выполняющие те же действия последовательности простых команд

Выравнивание

Основное правило выравнивания - переменная в памяти должна быть выровнена на величину равную количеству в ней байт, т.е. двойное слово должно быть выровнено на 4 байта, слово - на 2 и т.д. Но 10-байтные данные должны быть выровнены по 16-байтным границам. Обращение к невыровненным данным требует больше тактов, чем обращение к выровненным.

Обработка строк

Как правило, команды LODS, SCAS и прочие команды обработки строк можно выполнить с меньшими затратами, заменив их последовательностью простых команд



Rambler's Top100