Если не указывается противное, встроенный ассемблер оптими-
зирует инструкции перехода, автоматически выбирая наиболее корот-
кую, и, следовательно, наиболее эффективную форму инструкции пе-
рехода. Такое автоматическое определение размера перехода
применяется к инструкции безусловного перехода (JMP) и всем инс-
трукциям условного перехода, когда переход выполняется на метку,
а не процедуру или функцию.
Для инструкции безусловного перехода встроенный ассемблер
генерирует короткий переход (один байт кода операции, за которым
следует один байт смещения), если расстояние до целевой метки на-
ходится в границах от -128 до 127 байт. В противном случае гене-
рируется ближний переход (один байт кода операции, за которым
следую два байта смещения).
Для инструкций условного перехода короткий переход (один
байт кода операции, за которым следует один байт смещения) гене-
рируется, если расстояние до целевой метки находится в пределах
от -128 до 127 байт, в противном случае встроенный ассемблер ге-
нерирует короткий переход с обратным условием, который выполняет
переход на целевую метку через ближний переход (в общем случае 5
байт). Например, оператор ассемблера:
JC Stop
где Stop не находится в границах короткого перехода, преобразует-
ся в последовательность машинных кодов, соответствующих инструк-
циям:
jnc Skip
jmp Stop
Skip:
Переходы на точки входа в процедуру или функцию всегда имеют
ближний или дальний тип (но не короткий), а условные переходы на
процедуру или функцию не допускаются. Вы можете указать встроен-
ному ассемблеру, что нужно генерировать ближний или дальний пере-
ход, используя конструкцию NEAR PTR или FAR PTR. Например, опера-
торы ассемблера:
jmp NEAR PTR Stop
jmp FAR PTR Stop
будут всегда генерировать соответственно ближний и дальний пере-
ход, даже если на метку Stop можно перейти с помощью короткого
перехода.