Lectures / 12-13
.pdfДирективы 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