На этом шаге мы рассмотрим выполнение команд переходов.
Инструкции переходов в ассемблере, такие как 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
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
На следующем шаге мы рассмотрим доступ к переменным.