Передача в списке параметров простых переменных
Параметры можно разделить на параметры - исходные данные и параметры-результаты. Для первых передаются значения, а для вторых - адреса. Чтобы уменьшить число передаваемых параметров, для массивов передаются адреса, а не значения элементов, даже для массивов исходных данных. Чтобы стек не переполнялся, после использования параметры должны быть извлечены из стека. Эту функцию, называемую очисткой стека, обычно выполняет функция . Для этого в команде ret задается количество байтов, используемых для параметров, т.е. используется формат команды ret <число>. В этом случае сначала очищается стек, а затем выполняется возврат в вызывающую программу.
Ниже рассмотрены примеры использования функций с передачей
параметров через стек. Примеры отражают приемы передачи простых переменных (исходных данных и результатов), массивов, структур, и адресов функций.
Пример 1. Составить функцию вычисления z=x+y и использовать ее для вычисления c=a+b; f=d+e.
;Функция для вычисления z=x+y и использовать ее для вычисления c=a+b; f=d+e
IDEAL
P586
MODEL FLAT
EXTRN ExitProcess:proc
DATASEG
a DD 5
b DD 3
c DD ?
d DD 4
e DD -5
f DD ?
CODESEG
begin:
push [a] ; запись в стек a, b
push [b]
lea eax, c ;Формирование & c
push eax ; и запись его в стек
call summa ; Вызов функции
push [d] ; запись в стек d, e
push [e]
lea eax, [f] ; Формирование & f
push eax
call summa ; Вызов функции
call ExitProcess
proc summa | 0 | EBP | |||||||
push ebp | 4 | EIP | |||||||
mov ebp, esp | 8 | &c | |||||||
Push eax ebx | 12 | B | |||||||
mov eax, [ebp+16] ; a | 16 | A | |||||||
Add eax, [ebp+12] ; a+b | |||||||||
mov ebx, [ebp+8] ; &c | |||||||||
mov [ebx], eax ; c=a+b | |||||||||
Pop ebx eax ebp | |||||||||
Ret 12 | |||||||||
Endp summa | |||||||||
End begin |
В примере показана передача простых переменных (исходных данных и результатов). Показано состояние стека после обращения к функции для вычисления c = a + b. Анализ программы показывает, что передача параметров с последующей очисткой стека, передача управления процедуре требует дополнительных команд. Эти же действия выполняются при программировании на языке высокого уровня. Поэтому, прежде чем писать функцию на любом языке, подумайте, эффективна ли она! Решение предыдущего примера без функции явно предпочтительней!