Процедуры расположенные в одном сегменте называются «ближними» near. Соответственно вызов такой процедуры – ближний. Если процедуры находятся в разных сегментах кода, то они считаются «дальними» far. Вызов такой процедуры выполняется с помощью команды:
call far ptr MyProc
Для возврата в исходную точку программу в стек процессором заносится адрес текущего сегмента – содержимое регистра CS и смещение к следующей команде – содержимое регистра IP. Два слова(4 байта). Процедура задается в сегменте кода с модификатором far.
Пример программы с двумя сегментами и дальним вызовом процедуры.
;EXE program
codesg1 segment 'CODE1'
assume CS:codesg1,DS:datasg,SS:stacksg
;------------------
begin:
;-------------------
mov ah,0
mov al,176 ;символ в стек
push ax
call far ptr getSym ;дальний вызов
;----------------------------
mov AX,4C00h
int 21h
;---------------------------
codesg1 ends
;второй сегмент кода программы
codesg2 segment 'CODE2'
assume cs:codesg2
;-----------------
getSym proc far
mov bp,sp
mov ah,02h
mov dx,[bp+4] ;извлечь код
;символа
int 21h
ret 2
getSym endp
codesg2 ends
datasg segment 'DATA'
mes db 128 dup(0)
datasg ends
stacksg segment stack 'STACK'
dw 128 dup(0)
stacksg ends
end begin
Для управления адресами вызываемых процедур может использоваться технология косвенного вызова. Ближний вызов имеет формат:
call DS:adrproc
Где:
adrproc dw MyProc
Дальний вызов выполняется командой:
call dword ptr DS:adrproc
Где:
adrproc dd MyProc