End start
Результат работы программы:
Адрес возврата из функции (адрес команды ret) процессор запоминает в стеке, записывая в него содержимое счетчика команд (EIP). Затем в EIP заносится первая команда из процедуры, в нашем примере AddDigs. Как только процессор встречает в теле процедуры команду возврата ret, он обращается к стеку, извлекая из него адрес следующей выполняемой после call команды, в нашем случае команды возврата ret в тело основной программы. Если вызывается много процедур, при этом вызываемая процедура, вызывает следующую процедуру и т.д., то использование стека очень удобно. Использование стека при таких множественных вызовах представлено на рисунке представленном на следующей странице. На рисунке…. стек для удобства показан в виде стопки, куда помещаются адреса возвратов. Заметим, что стек растет в сторону уменьшения адресов. Команда call помещает адрес возврата в стек и уменьшает на 4 содержимое регистра esp (указателя вершины стека). Поэтому новый адрес возврата оказывается на вершине стека, что позволяет осуществить последовательное возвращение в тело основной программы.
Рис. Использование стека при вызове функций Пример передачи параметров через стек. .586
|