Шаг 7.
Оптимизация с помощью ассемблера.
Написание встраиваемого кода BASM. Написание операторов asm

    На этом шаге мы рассмотрим написание операторов asm.

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

  asm мнемоника[операнды] [;]

    Первым идет ключевое слово asm, за ним следует оператор ассемблера мнемоника, подобный mov или shl. Затем следуют операнды, например одно или несколько имен регистров или адрес для ссылки. Завершает оператор необязательный символ точки с запятой. Оператор также может завершаться символом новой строки. В отличие от языка автономного ассемблера, точка с запятой не начинает комментарий. В модуле TASM комментарий, следующий за оператором, выглядит следующим образом:

  mov ax, cx   ;Задать ax равным cx.

    Эквивалентный оператор BASM выглядит несколько иначе. Для документирования оператора asm следует использовать комментарии C или C++:

  asm mov ax, cx   /*Задать ax равным cx. */
Или
  asm mov ax, cx   //Задать ax равным cx. 

    Несколько операторов asm следует заключать в фигурные скобки. Каждый оператор asm - это оператор C, и правила, касающиеся составных операторов, относится к asm в такой же степени, как и к if, while и другим конструкциям:

asm {
   push bp         //Запомнить bp в стеке 
   mov bp, sp      //Задать bp равным sp
   ...             //Вставить другие операторы 
   pop bp          //Восстановить bp
}

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

asm {
   push bx ; push ax ; push cx ; push dx ;
     ...        //Вставить другие операторы   
   pop dx; pop cx; pop ax; pop bx;
}

    Глобальные операторы asm, не принадлежащие ни одной из функций, ассемблируются в сегмент данных программы. Существует не так уж много ситуаций, в которых данный прием по-настоящему необходим, однако, если вы хотите вставить участок кода в сегмент данных, вы можете это сделать. Просто пишите ваши операторы asm вне реализации функции.

   Локальные операторы asm, которые располагаются внутри функции, ассемблируются BASM в поток кода в той же позиции. Компилятор предотвращает большинство конфликтов, возникающих между результатами BASM и ближайшими операторами C++, однако, чтобы быть уверенным в успехе, имеет смысл сравнивать исходный текст и результаты компиляции с помощью опции -S.

    На следующем шаге мы рассмотрим оптимизацию функций.




Предыдущий шаг Содержание Следующий шаг