Межсегментный вызов процедур

Процедуры расположенные в одном сегменте называются «ближними» 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