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

. code

main proc near ; ближняя процедура

…

…

ret

main endp

start:

…

…

mov ax, 4c00h

int 21h

end start

  1. Процедура в конце кодового сегмента

.code

start:

…

…

mov ax, 4c00h; выход в систему

int 21h

main proc near

…

ret

main endp

end start

  1. Процедура в теле сегмента

start:

…

…

jmp m1

main proc near

…

…

ret

main endp

m1:

…

…

mov ax, 4c00h

int 21h

end start

  1. Вызов процедуры

CALL [модификатор] имя

Здесь имя условно, чаще всего это адрес, точка входа в процедуру

Модификатор: near, far, ptr

По этой команде содержимое регистров cs, eip/ip загружается в стек (при дальнем переходе). Далее в регистры cs, eip/ip загружается сегментный адрес и смещение адреса точки входа в процедуру (при ближней адресации загружается только eip/ip).

Команда возврата из процедуры может содержать параметр – число.

Ret [число]

Число – это величина обхода стека при выходе из процедуры

чтение запись

ip

[cs]

dat1

dat2

По команде ret из стека читаются 2 слова (адрес возврата) и загружаются в соответствующие регистры. Если стоит команда ret 4, то указатель стека спускается вниз на 4 байта, чтобы обойти данные dat1 и dat2 (если стоит директива USE16 ) .

Если указано Use 32, то из указателя вершины стека вычитается 8 байт .

  1. Способы вызова процедуры

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

Прямой ближний вызов

Команда CALL помещает в стек содержимое IP и загружает в этот регистр адрес точки входа. В стеке будет задействовано только 2 байта.

Пример:

.code

start proc far

…

…

call sub

…

…

mov ax, 4c00h

int 21h

start endp

sub proc near

…

…

ret

sub endp

end start

Прямой дальний вызов

По команде CALL в стек заносится содержимое регистров cs и ip (4 байта).

Пример:

В программе объявлены 2 кодовых сегмента.

seg1 segment 'code'

start proc far

…

call far ptr sub

…

mov ax, 4c00h

int 21h

start endp

seg1 ends

seg2 segment 'code'

sub proc far

…

ret

sub endp

seg2 ends

Косвенный ближний вызов

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

Пример

.data

subadr dw subr ; по адресу subadr записан адрес метки sub

.code

start proc

… mov ax,@data

mov ds,ax

call word ptr subadr ; из памяти взять слово

…

mov ax, 4c00h ; выход

int 21h

start endp

…

subr proc near

…

ret

subr endp

end start

При косвенном запуске программы возможны другие варианты,

например:

mov bx, offset subr

call word ptr bx ; адрес процедуры в регистре bx