Есть ли список устаревших инструкций x86?

Я беру класс программирования на языке ассемблера x86 и знаю, что некоторые инструкции больше не должны использоваться, потому что они медленны на современных процессорах; например, инструкция цикла.

Мне не удалось найти список инструкций, которые считаются устаревшими и их следует избегать; любые рекомендации будут оценены.

Ответ 2

О, но все же может быть веская причина использовать инструкцию loop. Например, для loop label требуется только два байта. В отличие от dec cx, за которой следует jnz label, требуется три байта. Иногда размер кода более важен, чем скорость.

Я бы предположил, однако, что если вы просто изучаете сборку x86, особенно если это ваш первый шаг на ассемблере, вы сначала концентрируетесь на том, как делать что-то. Как только вы лучше почувствуете, как все работает, тогда беспокойтесь о том, чтобы сделать их быстрее.

Ответ 3

Все инструкции 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

Ответ 4

Если вам известно, чего следует избегать, перейдите непосредственно к производителям процессоров, у Intel и Amd есть инструкции для инструкций, которые устанавливают их процессоры, и в какой степени они их поддерживают, лучше всего, если, вероятно, объемы оптимизации, но если вы только начинаете, возьмите совет Джима, сначала начните работать, прежде чем беспокоиться о скорости.