Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебн пособ по арх и прогр МП.doc
Скачиваний:
62
Добавлен:
10.12.2013
Размер:
1.59 Mб
Скачать

13.4 ДирективаArg

Директива ARG определяет аргументы, передаваемые в процедуру. Ее применение позволяет обращаться к аргументам по их именам, а не смещениям относительно содержимого bp. К примеру, если в начале рассматриваемой нами процедуры на ассемблере asmproc задать директиву ARG в виде arg kol:word,y:word,х:word,chr:byte, то к аргументам процедуры можно будет обращаться по их име­нам, без подсчета смещений. Ассемблер сам выполнит всю необходимую работу. В этом можно убедиться, запустив программу в отладчике. Обратите внимание: порядок следования аргументов в директиве arg является обратным порядку их следования в описании . процедуры (строка procedure asmproc(ch: char: x, у, kol: integer); external; в программе на Pascal). Процедура asmproc с использова­нием директивы arg представлена в листинге 3.

После того как решена проблема передачи аргументов в процедуру и выполнены все необходимые действия, возникает очередной вопрос - как правильно возвра­тить управление? При возврате управления в программу на Pascal нужно помнить, что соглашения этого языка требуют, чтобы вызываемые процедуры самостоя­тельно очищали за собой стек. Программа на ассемблере также должна удовлет­ворять этому требованию и заботиться об очистке стека перед своим завершени­ем. Для этого необходимо составить эпилог.

Действия, выполняемые, кодом эпилога для связи Pascal - ассемблер:

1. Записать содержимое bp в sp командой mov sp, bp. Это действие восстанавли­вает в sp значение, которое было на момент входа в процедуру. Необходимость в этом действии возникает в том случае, если в процедуре производилась ра­бота со стеком: В листинге 14.3 такой работы не было, поэтому код эпилога содержит только действия следующих пунктов.

2. Восстановить сохраненный в стеке регистр bp.

3. Удалить из стека переданные процедуре аргументы.

Для удаления из стека аргументов можно использовать различные способы:

 явно скорректировать значение sp, переместив указатель стека на необходи­мое количество байт в положительную сторону. Это - не универсальный способ, к тому же он чреват ошибками, особенно при частых модификациях программы;

использовать в директиве arg после записи последнего аргумента операнд, состоящий из символа равенства "=" и идентификатора, указанного за ним в следующей синтаксической конструкции:= идентификатор. В этом случае TASM при обработке директивы arg подсчитает количество байт, занятых всеми ар­гументами, и присвоит их значение идентификатору. В нашем случае директиву arg можно определить так: arg ch:byte;x:word;y:word;ko1:word=a_size. TASM после обработки данной директивы присвоит имени a_size значение 8 (байт). Это имя впоследствии нужно будет указать в качестве операнда команды ret:

ret a_size

Использование директивы arg (листинг 3).

{prg3.pas}

{Программа на Pascal, вызывающая процедуру на ассемблере, полностью совпадает с листингом 1}

;prg3.asm

MASM

MODEL small

STACK 256

.code

main:

asmproc proc near

;обьявление аргументов:

arg kol:WORD.y:WORD.x:WORD,chr:BYTE=a_size

PUBLIC asmproc

push bp ; сохранение, указателя базы

mov bp,sp ; настройка bp на стек через sp

mov dh,byte ptr у ; у в dh

mov dl,byte ptr x ; x в d1

mov ah,02h ; номер службы BIOS

int l0h ; вызов прерывания BIOS

mov ah,09h ; номер службы BIOS

mov al,chr ; символ - в а1

том b1,07h ; маска вывода символа

хог bh,bh

mov cx,kol ; ko1 в сх

int l0h ; вызов прерывания BIOS

pop bp ; эпилог

ret a_size ; будет ret 8 и выход из процедуры

asmproc endp ; конец процедуры

end main ; конец программы