Все инструкции ЦП на 100% функциональны для достижения совместимости со старыми ЦП. Так почему бы избежать некоторых инструкций? Нет действительно устаревших инструкций x86! Но мы можем сказать:
1) Все операции со строками, такие как rep movsb, выполняются медленнее.
2) xlat работает медленно и очень редко используется.
3) Также медленно используются функции кадра стека ENTER и LEAVE.
4) В Windows (XP, Vista ...) устаревшие инструкции - IN и OUT, но только в кольце ЦП 2 (уровень приложения), а также int nn не рекомендуется, за исключением int3 (ловушка отладчика ).
РЕДАКТИРОВАТЬ: добавлен простой тест скорости для проверки строковых инструкций rep cmp
на разных версиях ЦП.
Тестирование выполняется в среде IDE Delphi, но часть 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: тики цикла: 158000; Количество тиков: 375000
person
GJ.
schedule
03.02.2011