Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lectures / 12-13

.pdf
Скачиваний:
43
Добавлен:
16.04.2013
Размер:
172.87 Кб
Скачать

Директивы PUBLIC и EXTRN

PUBLIC имя, …, имя

Объявляет имя видимым вне данного модуля

EXTRN имя:тип, …, имя:тип

Объявляет имя внешним по отношению к данному модулю

тип для переменной: byte, word, dword, qword, ...

тип для процедуры: near, far тип для константы: abs

Директивы PUBLIC и EXTRN: Пример

Модуль 1

Модуль 2

code1 segment main proc

extrn p1:far st: …………

call p1 main endp code1 ends

end st

code2 segment p1 proc far public p1

……………

retf p1 endp code2 ends

end

Компоновка EXE из нескольких

объектных модулей

TLINK obj1 obj2 obj3

Именем EXE файла будет OBJ1.EXE

TLINK obj1 obj2 obj3, exefile

Именем EXE файла будет EXEFILE.EXE

Сохранение регистров

Ввызывающей программе

push ax push cx call P1 pop cx pop ax

P1 proc

ret P1 endp

В процедуре

call P1

P1 proc push ax push cx

pop cx pop ax ret

P1 endp

Передача параметров в регистрах

Для передачи одного параметра:

байт

слово двойное слово

вещественное число

al ax

dx:ax (eax) st(0)

Для передачи нескольких параметров:

ax dx si di bx cx

Передача в регистрах: Пример

; Заполнить строку, чей адрес в es:di, символом из al

strfill proc

 

pushf

; Сохранить флаг df

cld

; Установить флаг df=0

push di

; Сохранить di, т.к. он изменится

jmp sfStart

sfLoop: stosb

;es:[di] := al, di := di + 1

sfStart: cmp byte ptr es:[di], 0 ; Конец строки?

jne sfLoop

 

pop di

; Восстановить di

popf

; Восстановить флаг df

ret

 

strfill endp

 

Передача параметров в глобальных

переменных: Пример

mov ax, xxxx ; Передать по значению mov Val1, ax

mov ax, offset yyyy ; Передать по ссылке mov word ptr Ref1, ax

mov ax, seg yyyy

mov word ptr Ref1+2, ax call ThisProc

ThisProc proc near

 

les bx, Ref1

; es=seg, bx=offset

mov ax, Val1

 

mov es:[bx], ax

; yyyy = xxxx

...

 

Передача в глобальных переменных

(через общую область памяти)

 

 

 

 

 

 

 

 

 

 

 

Модуль 1

 

 

 

 

Модуль 2

 

 

com

 

 

 

com

segment common

 

segment common

 

 

 

buf dw 1,2,3,…,99

 

 

buffer dw 100 dup(?)

 

com ends

 

 

com ends

 

code1 segment

 

 

code2 segment

 

main proc

 

 

p1

proc far

 

 

extrn p1:far

 

 

 

public p1

 

st: …………

 

 

 

……………

 

 

call p1

 

 

 

retf

 

main endp

 

 

p1

endp

 

code1 ends

 

 

code2 ends

 

 

end st

 

 

 

end

 

 

 

 

 

 

 

 

 

Передача параметров в стеке: Пример

ProcA(i,j,k+4);

near

Предыдыдущее содержимое стека

i

j

k+4

Адрес возврата sp

push i push j mov ax, k add ax, 4 push ax

call ProcA

……….

Младшие адреса ОП

Код пролога и эпилога процедуры

StdProc proc near

 

push

bp

пролог

mov

bp, sp

 

.

 

 

.

 

 

.

 

 

pop

bp

эпилог

ret

ParmSize

StdProc endp

Соседние файлы в папке Lectures