Руководство по языку B.Pascal 7

         

Автоматическое определение размера перехода


Если не указывается противное, встроенный ассемблер оптими- зирует инструкции перехода, автоматически выбирая наиболее корот- кую, и, следовательно, наиболее эффективную форму инструкции пе- рехода. Такое автоматическое определение размера перехода применяется к инструкции безусловного перехода (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 можно перейти с помощью короткого перехода.



Содержание раздела