Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать

Косвенный дальний вызов процедуры

dseg segmentdata

subadr dd subr

dseg ends

cseg1 segment ‘code’

start proc far

……

call dword ptr subadr

……….

ret

start endp

cseg1 ends

cseg2 segment ‘code’

subr proc far

ret

subr endp

cseg2 ends

  1. Организация интерфейса между процедурами, расположенными в разных модулях

Используются директивы: EXTRN, PUBLIC, GLOBAL

Директива EXTRN объявляет некоторое имя внешним по отношению к данному модулю.

Это имя должно быть объявлено в другом модуле директивой PUBLIC.

EXTRN имя:тип [, имя:тип] ,[имя:тип] ….

Имя – идентификатор, определенный в другом модуле.

В качестве идентификаторов используются:

  • имена переменных, определенные директивами db, dw, dd и т.д. ,

  • имена процедур,

  • имена констант.

Для переменных тип может быть: byte, word, dword, pword, fword, qword, tbyte.

Тип процедуры far (дальняя) или near (ближняя).

Если имя – константа, то тип в директиве – abs.

Директива PUBLIC объявляет имена, определенные в этом модуле, видимыми из других модулей.

PUBLIC имя [,имя] [,имя]…

Директива GLOBAL, используемая применительно к передаваемому объекту, интерпретируется как директива PUBLIC, а используемая применительно к принимаемому объекту – как EXTRN

Директива GLOBAL имеет формат директивы EXTRN

GLOBAL имя:тип [, имя:тип]

Пример программы, использующей данные директивы:

;модуль1

GLOBAL res : byte, add : far

PUBLIC fix

data segment 'data' ; сегмент данных

fix db 12

data ends

code segment 'code'

start:

…….

……..

mov al, res ; res в другом модуле

call far ptr add ; запускается программа add

code ends

end start

;модуль2

GLOBAL res:byte , add:far

EXTRN fix:byte

dseg2 segment 'data'

res db ?

dseg2 ends

seg2 segment 'сode'

…….

add proc far

mov al, fix ; fix в другом модуле

mov res, al

add endp

ret

seg2 ends

Передачи параметров в процедуру через регистры

Через регистры целесообразно передавать в ближнюю процедуру. Необходимо заботиться о том, чтобы применять те регистры, которые не используются при передаче управления.

Процедура должна записать в стек содержимое регистров, которые будут использованы для передачи параметров, и в конце - восстановить их содержимое.

Пример.

.data

string db 'строка, $'

.code

main proc

mov ax,@data

mov ds,ax

lea si, string ;загрузка регистра

call count

mov ax, 4c00h

int 21h…

main endp

count proc near

push ax

push cx

mov ah, 9h

mov dx, si

int 21h

pop cx

pop ax

ret

count endp

end main

Передача параметров в процедуру через общую память

Модуль 1

EXTRN put: far

comdata segment common 'data'

buf db ‘ $’ ; в буфере пробелы

comdata ends

code segment

assume cs:code, ds:comdata

main

mov ax, comdata

mov ds, ax

call put

mov ah,9

mov dx, offset buf

int 21h

mov ax,4c00h ;выход

int21h

code ends

end main

Модуль 2

PUBLIC put

comdata segment common 'data'

buf db ‘ $’

comdata ends

code segment

assume cs:code, ds:comdata

put proc far

mov buf,’a’

mov buf+1,’s’

mov buf+2,’u’

ret

put endp

code ends

end

Передача параметров в дальнюю процедуру через стек

Пример

Модуль 1

extrn submul far

stk segment para stack

dw 64 dup(?)

stk ends

datasg segment para ‘data’

dat1 dw 10h

dat2 dw 2h

dat3 dw 5h

datasg ends

codesg segment para public

assume cs:codesg, ds:datasg, ss:stk

main proc far

mov ax, datasg

mov ds, ax

push dat1

push dat2

push dat3

call far ptr submul

mov ax,4c00h

int 21h

main endp

codesg ends

end main

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]