Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы по асм.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
257.02 Кб
Скачать

Работа команд ret и retf

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

  • для процедур ближнего типа — восстановить из стека содержимое ip;

  • для процедур дальнего типа — последовательно восстановить из стека содержимое ip и сегментного регистра cs.

  • если команда ret имеет операнд, то увеличить содержимое sp на величину операнда число;

Состояние флагов после выполнения команды не меняется.

Применение: Команду ret необходимо применять для возврата управления вызывающей программе из процедуры, управление которой было передано по команде call. На самом деле микропроцессор имеет три варианта команды возврата ret - это ret, ее синоним retn, а также команда retf. Они отличаются типами процедур, в которых используются. Команды ret и retn служат для возврата из процедур ближнего типа. Команда retf — команда возврата для процедур дальнего типа. Какая конкретно команда будет использоваться, определяется компилятором; программисту лучше использовать команду ret, и доверить транслятору самому сгенерировать ее ближний или дальний вариант. Количество команд ret в процедуре должно соответствовать количеству точек выхода из нее. Некоторые языки высокого уровня, к примеру Pascal, требуют, чтобы вызываемая процедура очищала стек от переданных ей параметров. Для этого команда ret содержит необязательный параметр число, который, в зависимости от установленного атрибута размера адреса, означает количество байт или слов, удаляемых из стека по окончании работы процедуры

Синтаксис директив ARG и LOCAL

Приведем синтаксис определения передаваемых процедуре аргументов:

ARG аргумент [,аргумент]... [=идентификатор]

[RETURNS аргумент] [,аргумент]]

При определении локальных переменных процедуры используется следующий синтаксис:

LOCAL аргумент [,аргумент]... [=идентификатор]

Отдельные аргументы имеют следующий синтаксис:

имя_аргумента [[выражение_счетчик_1]]

[: сложный_тип [:выражение_счетчик_2]]

где "сложный_тип" - это тип данных аргумента. Он может быть либо простым типом, либо сложным выражением-указателем.

"Выражение_счетчик_2" задает, сколько элементов данного типа определяет аргумент. Например, в определении аргумента:

ARG tmp:DWORD:4

определяется аргумент с именем "tmp", состоящий из 4 двойных слов.

По умолчанию "выражение_счетчик_2" имеет значение 1 (кроме аргументов типа BYTE). Так как вы не можете занести в стек байтовое значение, для аргументов типа BYTE значение счетчика по умолчанию равно 2, что обеспечивает для них в стеке размер в слово.

Аргументы и переменные определяются в процедуре как операнды в памяти относительно BP. Передаваемые аргументы, определенные с помощью директивы ARG, имеют положительное смещение относительно BP. Локальные переменные, определенные с помощью директивы LOCAL, имеют отрицательное смещение от BP. Приведем пример:

...

func1 PROC NEAR

ARG a:WORD,b:WORD:4,c:BYTE=d

LOCAL x:DWORD,y=WORD:2=z

...

Здесь a определяется, как [bp+4], b определяется, как [bp+6], c определяется, как [bp+14], а d - как 20. x - это [bp-2], y - [bp-6], а z - 8.