11. ЗАМЕНА СЛОЖНЫХ ИНСТРУКЦИЙ НА БОЛЕЕ ПРОСТЫЕ
==============================================
Вы можете заменять инструкции чтения/модифицирования и
чтения/модифицирования/записи, что бы достигнуть спаривания. Пример:
ADD [mem1],EAX / ADD [mem2],EBX ; 5 тактов
Этот код можно заменить на последовательность, выполняющуюся за 3 такта:
MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
MOV [mem1],ECX / MOV [mem2],EDX
Подобным образом вы можете заменять не спаривающиеся инструкции:
PUSH [mem1] / PUSH [mem2] ; не спаривающиеся
Заменяем на:
MOV EAX,[mem1] / MOV EBX,[mem2] / PUSH EAX / PUSH EBX ; всегда спариваются
Другие примеры неспариваемых инструкций, которые можно заменить более
простыми:
CDQ разбивается на: MOV EDX,EAX / SAR EDX,31
NOT EAX заменяется на XOR EAX,-1
NEG EAX разбивается на XOR EAX,-1 / INC EAX
MOVZX EAX,BYTE PTR [mem] разбивается на XOR EAX,EAX / MOV AL,BYTE PTR [mem]
JECXZ разбивается на TEST ECX,ECX / JZ
LOOP разбивается на DEC ECX / JNZ
XLAT заменяется на MOV AL,[EBX+EAX]
Если при разбивании инструкций не увеличивается скорость, то вы можете
сохранить сложные, не спаривающиеся инструкции, для сокращения длины кода.
Дальше
|