Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

3.4. Использование подпрограмм

Общая идея использования подпрограмм очевидна: если в программе требуется многократно выполнять один и тот же фрагмент, его можно офор­мить в виде подпрограммы и вызвать по мере необходимости. Если под­программа не требует для своего выполнения никаких параметров и не должна возвращать в основную программу результат своей работы, то дело ограничивается оформлением текста подпрограммы в виде процедуры, за­вершающейся командой ret, и вызовом этой процедуры с помощью ко­манды call. Как уже отмечалось ранее, подпрограмма может и не образовы­вать процедуру, а быть просто частью основной программы. Важно только, чтобы у нее была входная метка, и чтобы она завершалась командой call.

В следующем примере подпрограмма delay используется для включе­ния в основной текст программы программных задержек фиксированной величины.

;Примср 3-8. Вызов

code segment assume

delay proc

push CX mov CX,2000

dell: push CX mov CX,0

de!2: loop de!2 pop CX loop dell pop CX ret

delay endp

main proc

подпрограммы баз параметров

cs: code, ds: data ;Процсдура-подпрограмма ;Сохраним СХ основной программы ;Счетчик внешнего цикла ;Сохраним его ;Счетчик внутреннего цикла ;Внутрснний цикл (64К шагов) ;Восстановим внешний счетчик ;Внешний цикл (2000 шагов) восстановим СХ программы ;Возврат в программу

; Настроим DS

;на сегмент данных

;Функция вывода на экран

;Адрес первой строки

;Будем выводить строки в цикле

;Вызов DOS

;Вызов подпрограммы задержки

;Прибавим к смещению длину строки

;Цикл вызовов DOS

;3авершение программы

mov AX,data

mov DS,AX

mov AH,09h

mov DX,offset nisgl

mov CX,3 cntrl: hit 2 Hi

call delay

add DX,msg_len

loop cntrl

mov AX,4COOh

hit 21h main endp code ends data segment

msgl db "Процесс стартовал ",13,10,"$' msg_len=S-msgl

msg2 db "Процесс идет ",13,10,"$' msg3 db "Процесс завершается", 13,10,'$' data nds stk segment stack

dw 128 dup О stk ends

end main

В тексте программы сначала описана процедура-подпрограмма, затем основная программа. Как уже отмечалось, порядок их описания роли не играет; важно только, чтобы в завершающей директиве окончания транс­ляции end был указан в качестве точки входа адрес основной программы (main в нашем примере).

Подпрограмма реализует задержку с помощью вложенных циклов с командой loop, использующей в качестве счетчика шагов регистр СХ. В ос­новной программе этот регистр используется для организации цикла выво­да трех строк. Поэтому первое, что должна сделать подпрограмма — это сохранить содержимое регистра СХ, для чего естественно использовать стек. Перед завершающей командой ret регистр СХ должен быть восстановлен. Фрагмент, реализующий задержку, был описан ранее, в разделе 3.2.

Основная программа выводит на экран с помощью функции 09п три строки текста. Для упрощения программы, а также чтобы продемонстри­ровать некоторые приемы программирования, вывод строк реализован в цикле. Строки сделаны одной длины, и модификация смещения к очеред­ной строке выполняется прибаачением к содержимому регистра DX дли­ны строки. Полезно обратить внимание на организацию цикла в основной программе. В цикл, помимо команды вызова подпрограммы задержки и предложения, модифицирующего регистр DX, включена лишь команда int 2lh. Регистр АН с номером функции заново не настраивается. Это и не нужно, так как DOS, выполняя затребованную операцию, первым делом

ы^Як.

136