Веселье с push'ами
Почти то же, что и выше, но с push'ем. Давайте посмотрим, что надо и не надо делать:
mov eax,dword ptr [ebp+variable] ; 6 байтов push eax ; 1 байт
Мы можем сделать то же самое, но на 1 байт меньше. Смотрите.
push dword ptr [ebp+variable] ; 6 байтов
Круто, правда? ;) Ладно, если нам нужно push'ить много раз (если значение велико, более оптимизированно, будет более оптимизированно push'ить значение 2+ раза, а если значение мало, более оптимизированно будет push'ить его, когда вам нужно сделать это 3+ раза) одну и ту же переменную, более выгодно будет поместить ее в регистр и push'ить его. Например, если нам нужно заpushить он 3 раза, более правильным будет сксорить регистр сам с собой и затем заpushить регистр. Давайте посмотрим:
push 00000000h ; 2 байта push 00000000h ; 2 байта push 00000000h ; 2 байта
И давайте посмотрим, как прооптимизировать это:
xor eax,eax ; 2 bytes push eax ; 1 byte push eax ; 1 byte push eax ; 1 byte
Часто во время использования SEH нам бывает необходимо запушить fs:[0] и так далее: давайте посмотрим, как это можно оптимизировать:
push dword ptr fs:[00000000h] ; 6 байтов ; 666? Хахаха! mov fs:[00000000h],esp ; 6 байтов [...] pop dword ptr fs:[00000000h] ; 6 байтов
Вместо это нам следует сделать следующее:
xor eax,eax ; 2 байта push dword ptr fs:[eax] ; 3 байта mov fs:[eax],esp ; 3 байта [...] pop dword ptr fs:[eax] ; 3 байта
Кажется, что у нас на 7 байтов меньше! Вау!!!