Для передачи данных процедуре могут быть использованы следующие средства:
1) стек: перед вызовом процедуры в стек помещаются данные в требуемой последовательности (рис.4.4); доступ к этим данным из процедуры осуществляется через базовый относительный способ адресации с использованием регистра ВР (см. пп. 2.1.2 и 2.1.3); после возврата из процедуры вызывающая программа или перед возвратом сама процедура удаляет эти данные из стека;
2) регистры процессора: перед вызовом процедуры в определенные регистры заносятся данные, которые используются внутри процедуры;
3) область памяти: перед вызовом процедуры в специальнo выделенную область памяти помещаются необходимые данные; процедура “знает” о месте расположения данных и использует их при вычислениях.
Стек
|
Процедура PROC
|
а)
CS:IP в в)
а)SS:SP(во
б)
б)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
