Турбо Ассемблер распознает все стандартные мнемоники инструкций Intel, применимые к текущему выбранному процессору. Данная глава представляет собой обзор этих инструкций. Подробный перечень данных инструкций вы можете найти в кратком справочном руководстве.
Эффективная генерация кода: директивы SMART и NOSMART
Эффективная генерация кода означает, что Турбо Ассемблер может определить, что можно использовать различные инструкции более эффективно, чем вы это делаете. Например, в некоторых случаях можно заменить инструкцию LEA более короткой и быстрой инструкцией MOV:
LEA AX,lval
можно заменить на:
MOV AX,OFFSET lval
Турбо Ассемблер предусматривает директивы, которые позволяют вам использовать эффективную генерацию кода. Эти директивы описаны в следующей таблице:
Директивы эффективной генерации кода Директива | Значение |
---|
SMART | Разрешает генерацию эффективного кода. | NOSMART | Запрещает генерацию эффективного кода. |
По умолчанию генерация эффективного кода разрешена. Однако на генерацию эффективного кода влияют не только директивы SMART и NOSMART, но и директива VERSION.
Примечание: О директиве VERSION подробнее рассказывается в этом разделе.
Генерация эффективного кода влияет на следующие ситуации генерации кода:
Замена инструкции LEA инструкцией MOV, если операндом инструкции LEA является простой адрес.
Где это возможно, выполняется генерация булевских инструкций со знаком,. Например, AND AX,+02 вместо AND AX,0002.
Замена инструкции CALL FAR xxxx комбинацией инструкций PUSH CS, CALL NEAR xxxx, где целевой адрес xxxx использует тот же регистр CS.
Использование эффективных инструкций облегчает написание эффективного кода. Некоторые стандартные инструкции Intel также расширены таким образом, чтобы расширить их возможности и облегчить использование. Они обсуждаются в следующих разделах.
Расширенные инструкции перехода
Условные переходы, такие как JC или JE в процессорах 8086, 80186 и 80286 могут быть только ближними (NAER), то есть переход выполняется в границах сегмента и на расстояние -128 байт +127 байт относительно текущего адреса. Это ограничение действует и для условных инструкций цикла, таких как JCXZ или LOOP (на всех процессорах фирмы Intel).
Там, где это необходимо, Турбо Ассемблер может генерировать дополнительные последовательности переходов и обходить это ограничение. Например, Турбо Ассемблер может преобразовать инструкцию:
JC xxx
в инструкции:
JNC temptag JMP xxx
Вы можете разрешить данную дополнительную последовательность переходов в помощью директивы JUMPS, и запретить ее директивой NOJUMPS. По умолчанию Турбо Ассемблер не генерирует это средство.
Когда вы указывает директиву JUMPS, Турбо Ассемблер резервирует достаточно места для дополнительных последовательностей перехода во всех условных переходах вперед. Когда определяется фактическое расстояние перехода вперед, дополнительная последовательность может не понадобиться. Когда это происходит, Турбо Ассемблер для заполнения лишнего пространства генерирует инструкции NOP.
Чтобы избежать дополнительных инструкций NOP, вы можете:
использовать переопределение условных переходов, диапазон которых вам известен, например:
JC SHORT abc ADD ax,ax abc:
задать параметр командной строки /m (подробнее о нем рассказывается в здесь ).
1 2 3 4 5 6
8 8 8
| |