Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая 3 курс.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
100 Кб
Скачать
☆
    1. Организация подпрограмм в языке Ассемблер

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

Описание подпрограммы в языке ассемблер имеет следующую структуру:

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

. . .

операторы тела подпрограммы

. . .

ret [<выражение>]

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

<тип процедуры> - определяет тип перехода: near (близкий), far (дальний).

Если тип не задан, по умолчанию принимается near. Тип перехода near показывает, что тело процедуры описано в том же сегменте, что и её вызов. Тип перехода far обеспечивает вызов процедуры из других сегментов, с другим значением регистра CS. Такие процедуры обычно используются как отдельные объектные модули или в составе библиотек. ret [<выражение>] - выполняет возврат из процедуры в вызывающую программу. В зависимости от типа процедуры, эта команда восстанавливает из стека значение IP (ближний вызов) или CS:IP (дальний вызов). Эта команда не обязана быть последней по тексту процедуры, но является последней по порядку выполнения. Значение <выражение> указывает размер стека в байтах, восстанавливаемого при возврате из процедуры. Восстановление стека необходимо производить при передаче параметров процедуры через стек. Так как работа со стеком выполняется словами, значение <выражение> всегда должно быть кратным двум. Допускается вложение описания подпрограммы внутрь описания другой подпрограммы.

Вызов подпрограммы выполняется командой call [<тип вызова> ptr] <адрес процедуры> < тип вызова > - near (word) или far (dword). Если тип не задан, по умолчанию принимается near. < адрес процедуры > - имя или адрес процедуры. При ближнем вызове в стеке запоминается текущее значение регистра IP. При дальнем вызове в стеке запоминаются значения CS:IP. Если тип вызова не указан явно, он определяется типом, на который указывает <адрес процедуры>, аналогично команде безусловного перехода jmp. Пример. Пусть в сегменте данных описаны переменные:

FADDR dd ?

NADDR dw ?

в сегменте кода описаны подпрограммы:

FPROC proc far

. . .

FPROC endp

NPROC proc

. . .

NPROC endp

Рассмотрим различные примеры команд вызова:

call FPROC ;дальний вызов п/п FPROC

call FPROC ;дальний вызов п/п FPROC

call FADDR ;дальний вызов п/п, чей адрес в FADDR

call NADDR ;ближний вызов п/п, чей адрес в NADDR

call dx ; ближний вызов п/п, чей адрес в DX

call word ptr [BX] ; косвенный ближний вызов п/п

call dword ptr [BX] ; косвенный дальний вызов п/п

    1. Способы передачи параметров в подпрограммах

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

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

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

mov ax, value ; сохраняем значение нашей переменной в регистре ах

call procedure ; вызываем процедуру