Дальние подпрограммы



Дальние подпрограммы

Дальняя (far) подпрограмма отличается от ближней тем, что она расположена не в том сегменте, в котором находится вызывающий модуль. Поэтому при обращении к удаленной подпрограмме изменяется содержимое не только счетчика команд (IP), но и кодового сегментного регистра (cs).

Мнемоническим именем команды вызова в любом случае является call, но ему могут соответствовать разные коды операций (машинных инструкций). Обнаружив в тексте команду call, Макроассемблер анализирует описание указанного в ней имени, и в зависимости от его типа (far или near) выбирает нужный код операции вызова подпрограммы. В частности, если имя соответствует удаленной процедуре, то будет выбран код операции, при выполнении которого в стек записывается сначала содержимое сегментного регистра cs, а затем счетчика команд IP. Таким образом, при входе в дальнюю подпрограмму в верхушке стека находится исходное значение IP, а перед ним — значение cs.

Последней выполняемой командой дальней подпрограммы является retf, она выталкивает из верхушки стека не одно, а два слова. Первое слово выталкивается в счетчик команд IP, а второе — в сегментный регистр cs. В результате в регистрах cs:ip оказывается полный адрес точки возврата.

Сегмент, содержащий дальнюю подпрограмму, может входить в тело задачи или располагаться во внешнем модуле. Во втором случае подпрограмма оказывается доступной не для одной, а для разных задач.



- Начало - - Назад - - Вперед -