Путеводитель по написанию вирусов под Win32

         

Проверка равен ли регистр нулю


Я устал видеть одно и тоже постоянно, особенно в среде Win32-кодеров, и это меня просто убивает, очень медленно и очень болезненно. Например, мой разум не может переварить идею 'CMP EAX, 0'. Давайте посмотрим, почему:

cmp eax,00000000h ; 5 байтов jz bribriblibli ; 2 байта (если jz короткий)

Хех, я знаю, что жизнь - дерьмо, и вы тратите очень много кода на отстойные сравнения. Ок, давайте посмотрим, как решить эту проблему с помощью кода, который делает то же самое, но с меньшим количеством байтов.

or eax,eax ; 2 байтов jz bribriblibli ; 2 байтов (если jz короткий)

Или эквивалент (но быстрее!):

test eax,eax ; 2 байта jz bribriblibli ; 2 байта (если jz короткий)

Есть способ, как оптимизировать это еще большим образом, если неважно содержимое, которое окажется в другом регистре). Вот он:

xchg eax,ecx ; 1 байт jecxz bribriblibli ; 2 байта (только если короткий)

Теперь вы видите? Никаких извинений, что "я не оптимизирую, потому что теряю стабильность", так как с помощью этих советов вы не будете терять ничего, кроме байтов кода :). Мы сделали процедуру на 4 байта короче (с 7 до 3)... Как? Что вы скажете об этом?



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