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

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

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

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

Пример.

.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

Фрагмент модуля 2

push bp

mov bp,sp

mov ax,[bp+6]

mov bx,[bp+8]

mov cx,[bp+10]

add bx,ax

pop bp

ret6

BP

CS

IP

Dat3

Dat2

Dat1

sp

bp+6

bp+8

bp+10

  1. Возврат результата из процедуры

Способы возврата:

  1. Через свободный регистр.

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

  3. Через стек. Программист резервирует некоторую область стека с целью возврата в этой области результата работы процедуры.

На рисунке показан вариант резервирования стека для возврата двух параметров.

BP

CS

IP

Dat3

Dat2

Dat1

V

SP

AR2

VAR1

  1. Макрокоманды и макроопределения

Использование макрокоманд позволяет:

1) Упростить и сократить исходный текст программы.

2) Сделать программу более понятной.

3) Уменьшить количество ошибок.

4) Увеличить быстродействие за счет замены процедур макросами.

Примеры использования макрокоманд:

  • операции ввода/вывода,

  • инициализация регистров,

  • выполнение прерываний,

  • выполнение арифметических операций,

  • работа со строковыми переменными.

Структура макроопределения:

NAME MACRO [PAR1, PAR2, …]

;текст

ENDM

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

  1. Особенности трансляции при получении объектного модуля

1. Происходит вставка макрорасширений в то место программы, где находятся макрокоманды.

2. Формируется модуль с расширением .obj.

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