Нет способа кодировать инструкцию удаленного вызова, где сегмент и / или смещение находятся в регистрах.Инструкция дальнего вызова требует, чтобы адрес назначения был задан как непосредственный операнд, который предоставляет сегмент и смещение пункта назначения, или операнд памяти, который это делает.Таким образом, допустимы только примеры, подобные следующим инструкциям:
call 0x1234:0x5678 ; immediate operand
call FAR far_func ; immediate operand
call FAR [far_fnptr] ; memory operand
call FAR [bp - 8] ; memory operand
Так что, если у вас есть целевой сегмент и смещение в регистрах AX и BX, вам нужно будет сохранить значение в памяти, прежде чем вы сможете вызватьфункция, на которую указывают регистры.Например, вы можете сделать что-то вроде следующего:
push ax
push bx
mov bp, sp
call FAR [bp]
add sp, 4
Часто в тот день, когда для этого использовалась инструкция RETF:
push cs
push .return_here
push ax
push bx
retf
.return_here:
Однако на современных процессорах это имеетзначительное снижение производительности, так как это приведет к тому, что буфер стека возврата процессора будет генерировать неверные прогнозы ветвления.