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

1 / МУ_ЭВМ+ПУ_ч1 / 9-МУ_ЭВМ+ПУ-подпрогр

.docx
Скачиваний:
22
Добавлен:
28.05.2015
Размер:
32.23 Кб
Скачать

Лабораторная работа 9

ПОДПРОГРАММЫ

    1. Цель работы

Программирование с использованием подпрограмм – создание и использование процедур и макросов.

    1. Подпрограммы-процедуры

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

Подпрограммы-процедуры размещают в сегменте команд до первой исполняемой команды, либо после команды, возвращающей управление операционной системе.

9.2.2 Подпрограммы – процедуры описываются следующим образом:

<имя процедуры> PROC <параметры>

<тело процедуры>

ret ; возврат из процедуры

<имя процедуры> ENDP

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

Вызов процедуры: CALL <имя процедуры>

По этой команде адрес следующей за процедурой команды (из регистра IP) записывается в стек и управление передается процедуре.

Возврат из процедуры (return): RET

По команде из вершины стека считывается адрес возврата (IP) и выполняет переход по нему.

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

ПРИМЕР

Разработать программу суммирования чисел от 1 до 10 (тип переменных - слово) и продемонстрировать различные варианты расположения описания процедур.

model small

.stack 100h

.data

s dw ? ; сумма

.code

; Процедура суммирования десяти чисел от 1 до 10

; Выход: значение суммы в регистре АХ

SUM PROC

mov ax, 0 ; начальное значение суммы

mov bx, 1 ; первое слагаемое

mov cx, 10 ; загрузка счетчика

cycl: add ax, bx ; суммирование

inc bx ; следующее число на 1 больше

loop cycl

ret ; выход, сумма - в ax

SUM ENDP ; описание процедуры завершено

start:

mov ax, @data

mov ds, ax

сall abc ; вызов процедуры abc (описана позже)

сall sum ; вызов процедуры sum

mov s, ax ; пересылка суммы из ax в s

mov aх, 4С00h

int 21h

; Описание процедуры abc

ABC PROC

ret

ABC ENDP ; описание процедуры завершено

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

    1. Макросредства ассемблера

9.3.1 Макросредства ассемблера включают три составляющие.

1. Макроопределение (макрос) – набор команд, содержащий описание алгоритма. Макрос имеет структуру:

<имя_макроса> MACRO <[формальные_параметры]>

<тело макроопределения>

ENDM

Варианты расположения макросов:

  • в начале программы до определения сегментов - работают в этой программе;

  • в отдельном файле; для использования в других программах используют директиву:

include <имя_файла>;

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

2. Макрокоманда (вызов макроса):

<имя_макроса> <[фактические параметры]>

3. Макрорасширение (макроподстановка) – вставка вместо макрокоманды макроса с заменой формальных параметров фактическими.

ПРИМЕР

Разработать программу вывода символов с использованием макроса.

model small

; макрос vivod

; simv – выводимый символ (формальный параметр)

vivod macro simv

mov dl, simv

mov ah, 2h

int 21h

endm

; описание сегментов памяти

. stack 100h

.data

.code

vivod al ; вызов макроса, al – фактический параметр

    1. Сравнение процедур и макросов

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

При обращении к процедуре выполняются засылки параметров в регистры, стек, по окончании – возврат из нее, это приводит к дополнительным затратам времени.

Итог: большие фрагменты лучше описывать как процедуры, маленькие – как макросы.

    1. Общие замечания

9.5.1 При использовании подпрограмм необходимо позаботиться о том, чтобы при их вызове не «портились» значения регистров и переменных, если они необходимы далее в программе. Для этого прежние значения регистров, задействованных в подпрограмме, в ее начале обычно сохраняют в стеке, а перед выходом из подпрограммы возвращают из стека.

ПРИМЕР

Процедура STROKA выводит строку на экран.

Вход: dx – начальный адрес строки.

В процедуре задействованы регистры:

  • ah – для указания номера функции;

  • al – изменяет свое значение при использовании int 21h.

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

stroka proc

push ax ; сохранение ах (ah, al) в стеке

mov ah, 9 ; функция вывода строки c начальным адресом в dx

int 21h ; вызов DOS

pop ax ; восстановление ах из стека

ret

stroka endp ; описание процедуры завершено

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

ПРИМЕР

Макрос выводит заданный символ simv заданное число раз count.

vivod macro simv, count

local t

mov cx, count

t: mov ah, 2

mov dl, simv

int 21h

loop t

endm

91

Соседние файлы в папке МУ_ЭВМ+ПУ_ч1