Замена сложных инструкций на более простые

<!--StartFragment -->
Вы можете заменять инструкции чтения/модифицирования и
чтения/модифицирования/записи, что бы достигнуть спаривания. Пример:
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]

Если при разбивании инструкций не увеличивается скорость, то вы можете
сохранить сложные, не спаривающиеся инструкции, для сокращения длины кода.
<!-- КОНЕЦ ТЕКСТА -->



Опубликовал admin
26 Мар, Пятница 2004г.



Программирование для чайников.