CALL

Синтаксис CALL операнд
Машинный
код
E8 cw — CALL rel16
E8 cd — CALL rel32
FF /2 — CALL r/m16
FF /2 — CALL r/m32
9A cd — CALL ptr16:16
9A cp — CALL ptr16:32
FF /3 — CALL m16:16
FF /3 — CALL m16:32
Описание Вызов процедуры или переключение задачи.
Действие Далее перечислены возможные варианты задания операнда:

  • rel16/32 — близкий относительный переход. Значение rel16/32 трактуется как знаковое и является смещением перехода относительно следующей за CALL команды в сегменте кода, то есть адрес перехода равен (EIP/IP) + (rel16/32). В стек заносится значение EIP/IP;
  • r16(32)/m16(32) — близкий абсолютный косвенный переход. Операнд — регистр г16(32) или ячейка памяти m16(32), содержащие адрес перехода в текущем сегменте кода. В EIP/IP загружается содержимое из r16(32) или m16(32). В стек заносится содержимое EIP/IP;
  • ptr16:16(32) — дальний абсолютный переход. Операнд — компоненты полного адреса в виде 4- или 6-разрядного указателя, по которому необходимо произвести переход;
  • m16:16(32) — дальний абсолютный косвенный переход. Операнд — адрес ячейки памяти размером 32(48) битов со структурой m16:16(32), содержащей компоненты адреса перехода.

Особенности выполнения команды CALL в двух последних вариантах определяются режимом работы процессора:

  • в реальном режиме или режиме виртуального процессора 8086 (PE = 0 или PE = 1 и VM = 1) в EIP/IP и CS загружаются значения смещения и адреса сегмента из указателя в памяти или команды CALL. В стек заносится содержимое EIP/IP и CS;
  • в защищенном режиме (РЕ = 1 и VM = 0) анализируется байт прав доступа AR в дескрипторе целевого сегмента. В зависимости от его значения производится пять типов перехода к цели: передача управления подчиненному сегменту кода, передача управления неподчиненному сегменту кода, передача управления через шлюз вызова, переключение задачи (селектор соответствует дескриптору — шлюзу задачи), переключение задачи (селектор соответствует дескриптору — сегменту TSS).
Флаги Изменяются только при переключении задачи.
При переключении задачи значения флагов изменяются содержимым регистра EFLAGS в сегменте состояния TSS задачи, на которую производится переключение.

К списку команд