Ответ 1
Лучше всего посоветоваться с Официальное руководство по оптимизации Intel.
Здесь можно найти другие руководства .
Я беру класс программирования на языке ассемблера x86 и знаю, что некоторые инструкции больше не должны использоваться, потому что они медленны на современных процессорах; например, инструкция цикла.
Мне не удалось найти список инструкций, которые считаются устаревшими и их следует избегать; любые рекомендации будут оценены.
Лучше всего посоветоваться с Официальное руководство по оптимизации Intel.
Здесь можно найти другие руководства .
О, но все же может быть веская причина использовать инструкцию loop
. Например, для loop label
требуется только два байта. В отличие от dec cx
, за которой следует jnz label
, требуется три байта. Иногда размер кода более важен, чем скорость.
Я бы предположил, однако, что если вы просто изучаете сборку x86, особенно если это ваш первый шаг на ассемблере, вы сначала концентрируетесь на том, как делать что-то. Как только вы лучше почувствуете, как все работает, тогда беспокойтесь о том, чтобы сделать их быстрее.
Все инструкции CPU на 100% функциональны, чтобы обеспечить совместимость со старыми процессорами. Так почему бы не избежать какой-либо инструкции? Нет настоящих устаревших инструкций x86! Но мы можем сказать:
1) Все строковые инструкции, такие как rep movsb, медленнее.
2) xlat работает медленно и очень редко используется.
3) Также использование функций фрейма стека ENTER и LEAVE выполняется медленно.
4) Uder Windows (XP, vista...) устаревшие инструкции являются IN и OUT, но только под процессором 2 (уровень аппликации), также int nn устарел, за исключением int3 (ловушка отладчика).
EDIT: добавлен простой тест скорости, чтобы проверить инструкцию строк rep cmp
на разных версиях процессоров.
Тест выполняется в среде Delphi IDE, но часть asm очень легко перевести в любую другую среду IDE.
program ProjectTest;
{$APPTYPE CONSOLE}
uses SysUtils, windows;
const
ArraySize = 50000;
var
StartTicks :int64;
EndTicks :int64;
arA :array [0..ArraySize - 1]of byte;
arB :array [0..ArraySize - 1]of byte;
begin
FillChar(ArA, SizeOf(ArA), 255); //Set all bytes to 0xFF
FillChar(ArB, SizeOf(ArB), 255); //Set all bytes to 0xFF
repeat
Sleep(100); //Calm down
asm
//Save StartTicks
rdtsc
mov dword ptr [StartTicks], eax
mov dword ptr [StartTicks + 4], edx
//Test LOOP
push edi
mov ecx, -ArraySize
mov edi, offset arA + ArraySize
mov esi, offset arB + ArraySize
@loop:
mov al,[esi + ecx]
cmp [edi + ecx], al
jnz @exit
inc ecx
jnz @loop
@exit:
pop edi
//Save EndTicks
rdtsc
mov dword ptr [EndTicks], eax
mov dword ptr [EndTicks + 4], edx
end;
WriteLn('Loop ticks : ' + IntToStr(EndTicks - StartTicks));
Sleep(100); //Calm down
asm
//Save StartTicks
rdtsc
mov dword ptr [StartTicks], eax
mov dword ptr [StartTicks + 4], edx
//Test REP
push edi
cld
mov ecx, ArraySize
mov edi, offset arA
mov esi, offset arB
repe cmpsb
pop edi
//Save EndTicks
rdtsc
mov dword ptr [EndTicks], eax
mov dword ptr [EndTicks + 4], edx
end;
WriteLn('Rep ticks : ' + IntToStr(EndTicks - StartTicks));
ReadLn //Wait keyboard
until false;
end.
ИСПЫТАНИЯ для ArraySize = 50000
Средние результаты...
1) Мой Intel одноядерный процессор Pentium 4: Циклические тики: 232000; Реп-тики: 233000
2) Результаты Intel Core 2 Quad CPU: Циклические тики: 158000; Репты: 375000
Если вам известно, чего следует избегать, перейдите непосредственно к производителям процессоров, у Intel и Amd есть инструкции для инструкций, которые устанавливают их процессоры, и в какой степени они их поддерживают, лучше всего, если, вероятно, объемы оптимизации, но если вы только начинаете, возьмите совет Джима, сначала начните работать, прежде чем беспокоиться о скорости.