Организация подпрограмм в языке Ассемблер

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

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

<имя процедуры> 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]; косвенный дальний вызов п/п

Для передачи входных параметров в подпрограмму и выходных в программу существует несколько способов. Чаше всего передача параметров осуществляется через регистры или через стек. При передаче через регистры перед вызовом подпрограммы параметры заносятся в регистры процессора, а после возврата вызывающая программа забирает из регистров значения результатов. При передаче через стек, параметры перед вызовом подпрограммы заносятся в стек командой push src. Для обращения к параметрам, хранящимся в стеке, обычно используется регистр bp: mov bp, sp. Необходимо помнить, что поверх параметров, передаваемых в подпрограмму, в стек записываются командой call одно или два слова адреса возврата. Каждая процедура «знает» свой тип вызова (одно или два слова) и отступив от верхушки стека на +2 или на +4 читает параметры. mov ax, bp+2; первый параметр при ближнем вызове mov ax, bp+4; первый параметр при дальнем вызове.

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

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: