Действие |
Далее перечислены возможные варианты задания операнда:
- 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).
|