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

    На этом шаге мы рассмотрим выполнение команд переходов.

    Инструкции переходов в ассемблере, такие как jmp или jnl, приводят к продолжению выполнения программы, начиная с заданного адреса. В автономных программах TASM места переходов идентифицируются метками. В BASM инструкции перехода asm могут передавать управление только меткам C или C++, подобно тем, которые используются оператором goto. В действительности инструкции перехода в asm не что иное, как оператор goto.

    Поскольку адресные метки пишутся на C или C++, они должны существовать где-то вне операторов asm. Например, предположим, у вас возникла необходимость вставить авторскую подпись в поток кода вместо сегмента данных, где ее могут быстрее обнаружить и подделать компьютерные пираты. Вы можете закодировать команду перехода, минующую текстовое сообщение, следующим образом:


asm  {
         jmp L1
         db 13, 10 , ' 1992 by Tom Swan', 0
          }
  L1: 
asm {
        // ...Дополнительные инструкции
        }

    Инструкция jmp L1 пропускает директиву db (определение байта), вставляющую возврат каретки (13), перевод строки (10) и строку авторской подписи в коде (обратите внимание на апострофы и явное завершение строки нулем). Адресная метка L1 появляется после начального оператора asm, за ней могут следовать операторы C и C++ или еще один оператор asm, как в данном случае.

    Можно также использовать команды перехода по условию, например jnz, jl и др. Если адресные метки не достигаются этими "ближними" инструкциями перехода, они аварийно завершают выполнение программы. Например, если вы написали

asm jmp TARGET 
BASM ассемблирует эту инструкцию (перейти, если не равно) неизменной только в том случае, если расстояние от места перехода до TARGET находится в диапазоне от -128 до +127 байт. Если адресная метка размещается вне этого диапазона, BASM вставляет команду безусловного перехода в точку входа аварийного завершения программы. Эта проблема решается путем преобразования безусловного перехода следующим образом:
asm je TEMP
asm jmp TARGET 
TEMP:

    Идея заключается в пропуске безусловного перехода, если выполняется обратное условие. Инструкции jmp и je выполняют совместно те же самые действия, что и первоначальный переход jne, однако они "достают" гораздо дальше.

   BASM автоматически оптимизирует безусловные инструкции перехода. Если вы напишете

asm jmp LABEL 

и LABEL ссылается на адрес в пределах от -128 до +127 байт, BASM использует более эффективную 2-байтовую инструкцию перехода. Если же адресная метка не вписывается в это ограничение, тогда BASM воспользуется менее эффективной 3-байтовой инструкцией jmp.

    Вы можете отменить оптимизацию, передав метку ключевыми словами NEAR PTR или FAR PTR. Например, для задания дальнего перехода к ближней метке вы можете написать следующее:

asm jmp FAR PTR LABEL 

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




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