Рассмотрим, что происходит, когда программа вызывает процедуру dispatch.
После сохранения содержимого некоторых регистров и получения доступа по
считыванию из текущего сегмента TSS; процедура dispatch выполняет косвенный
переход JMP (фраза DWORD PTR заставляет ассемблер образовать косвенный
межсегментный переход) через виртуальный адрес, находящийся в поле связи
текущего сегмента состояния задачи. Так как этот виртуальный адрес показывает на
TSS, команда JMP осуществляет переключение задачи, а не переход.
Это вызывает приостановку текущей задачи и выполнение следующей.
Указатель команды приостановленной задачи, запомненной в ее TSS, будет
показывать на команду POP, находящуюся после команды JMP. Если каждая из
остальных задач в списке также вызывает процедуру dispatch в ходе своего
выполнения, то через некоторое время приостановленная задача окажется в начале
списка и будет возобновлена. Выполнение продолжается с команды POP, и процедура
dispatch осуществляет возврат.
Таким образом, вызов процедуры dispatch не оказывает побочных воздействий на
вызывающую ее задачу, но дает другим задачам шанс на выполнение. К сожалению, мы
не можем рассчитывать на то, что задачи достаточно "внимательны", чтобы вызывать
процедуру dispatch через регулярные интервалы времени. Вместо этого можно
использовать интервальный таймер (например, 8254) для генерирования сигнала
прерывания процессора 80286, например через каждую тысячную долю секунды.
Если превратить dispatch в процедуру прерывания (для этого нужно удалить
команды PUSHF и POPF, а также заменить команду RET на команду IRET) и
ассоциировать ее с прерыванием таймера, то она будет автоматически вызываться
через каждую тысячную долю секунды. Таким образом, каждая задача получает квант
времени (почти) в одну тысячную долю секунды и разделение задач во времени
реализовано