ПЕРЕДАЧА ДАННЫХ ПРОЦЕДУРЕ


Для передачи данных процедуре могут быть использованы следующие сред­ства:

1) стек: перед вызовом процедуры в стек помещаются данные в требуемой последовательности (рис.4.4); доступ к этим данным из процедуры осуществляется через базовый относительный способ адресации с использованием регистра ВР (см. пп. 2.1.2 и 2.1.3); после возврата из процедуры вызы­вающая программа или перед возвратом сама процедура уда­ляет эти данные из стека;

2) регистры процессора: перед вызовом процедуры в оп­ределенные регистры заносятся данные, которые используются внутри процедуры;

3) область памяти: перед вызовом процедуры в специальнo выделенную область памяти помещаются необходимые данные; процедура “знает” о месте расположения данных и использует их при вычислениях.

Стек

clip_image001Программа

PUSH P2

PUSH P1

CALL PROC

POP DX

POP DX

Процедура PROC

PUSH BP

MOV BP, SP

POP BP

RET

а)

clip_image002в)SS:SP

CS:IP в в)

а)SS:SP(во

clip_image003время вызова)

б)

б)SS:SP (до и

после вызова)

Доступ к аргументам внутри процедуры

осуществляется к Р1— как [ВР+6], к Р2 — как [ВР+8].

Например, «MOV SI, [ВР+6]» заносит в SI значение Р1.

Рис. 4.4. Передача данных через стек

В команде RET (рис. 4.5) допускается необязательный 16-битовый непосредственный операнд, который прибавляете к содержимому указателя стека SP после извлечения из стека адреса возврата. Это обеспечивает удаление из стека тех дан­ных, которые передаются процедуре путем их включения в стек перед вызовом для удовлетворения второго требования вызова процедуры. Например, для удаления из стека данных Р1 и Р2 вместо двух команд “POP DX” и команды “RET” (рис. 4,4) можно использовать команду возврата из процедуры “RET 4”, которая удалит из стека два слова (четыре байта] после восстановления содержимого CS:1P.

Стек может использоваться и для возврата в вызывающую программу из процедуры результатов обработки пере данных. В этом случае вызывающая программа сам; должна удалить эти данные из стека после их использования.

Так как вызывающая программа и процедура используют (разделяют) одни и те же регистры процессора, в процедур необходимо предусмотреть сохранение используемых ею регистров и восстановление их содержимого перед выполнение команды возврата. Для сохранения и восстановления содержимого регистров, модифицируемых процедурой, используете стек. В начале процедуры содержимое изменяемых регистре включается в стек, а перед возвратом извлекается, но уже обратном порядке. Возможны также передача данных процедуре и возврат результата через регистры процессора. Пример: кодирования и использования команд вызова CALL и возврат RET приведены на рис. 4.6.

Адрес Содержимое Команда Комментарий

CS:0100 E87404 CALL 57Ah ;Внутрисегментный прямой

CS:0103 FFD0 CALL AX ;Внутрисегментный косвенный

CS:0105 9A00011000 CALL 10h:100h ;Межсегментный прямой

CS:010A 26FF1E0402 CALL FAR ES:[204h] ;Межсегментный косвенный

СS:010F C20200 RET 2 ;Внутрисегментный с очисткой

CS:0112 C3 RET ;Внутрисегментный CS:0113 CB

Рис. 4.5. Примеры кодирования и использование команд

вызова CALL и возврата RET

Загрузка...