Интернет-магазин православной литературы список всех интернет магазинов православных.
Для обращения к подпрограмме используется специальная команда вызова подпрограммы. В системе команд х86 она имеет мнемонику call.
Минимальный набор действий, которые выполняет такая команда, это:
Для возврата из ПП в системе команд есть специальная команда (в i*86 ее мнемоника ret). Эта команда загружает ранее сохраненный адрес возврата в счетчик команд.
В х86 имеются две разновидности команды call: ближний near вызов (внутри текущего сегмента кода) и дальний far вызов (в другой сегмент кода). В случае использования дальнего вызова в стеке сохраняется, наряду со счетчиком команд (e)ip, и сегментный регистр cs.
Соответственно имеются и две команды возврата ret near и ret far. Состояние стека при ближнем и дальнем вызовах иллюстрируется следующим рисунком (см. рисунок ниже).
Понятие контекста (вектора состояния): в каждой конкретной точке выполнения программы — содержимое всех переменных элементов (регистров, ячеек памяти), которое требуется установить/восстановить, чтобы стало возможным запустить выполнение программы с этой точки.
Подпрограмма при своей работе использует какие-либо ресурсы процессора (регистры), а, кроме того, меняет состояние отдельных ячеек памяти, флагов и т.п. — т.е. ПП изменяет контекст. Естественный способ исключить влияние изменения контекста — непосредственно перед вызовом ПП или сразу после входа в ПП сохранять текущий контекст, а при выходе из ПП все восстанавливать назад. Было бы удобно, если бы программисту не надо было задумываться о сохранении-восстановлении контекста. Проблема сохранения-восстановления контекста возникает и в других ситуациях (прерывания, переключение задач — это будет позже). Чаще всего для автоматического сохранении-восстановлении контекста используется стек.
Рассмотрим типовую последовательность команд, используемую при вызове подпрограммы. Пусть подпрограмма использует два входных параметра (два аргумента) типа int, возвращает значение тоже типа int и использует две локальные переменные. Две команды mov в вызывающей части помещают в стек параметры, после чего выполняется команда вызова подпрограммы call.
Первые две команды подпрограммы сохраняют старое значение ebp (элемент контекста) и устанавливают ebp на адрес внутри стекового кадра. Следующая команда (sub esp,8) занимает в стеке место под две локальные переменные.
Теперь подпрограмма может, используя адресацию косвенно-регистровую со смещением через регистр ebp, иметь доступ к параметрам, используя положительные значения смещения (в примере для доступа к первому параметру смещение должно быть равно 12), и к локальным переменным, используя отрицательные смещения (в примере смещение -8 позволяет обращаться к локальной переменной 2).
Результат, вычисляемый подпрограммой, можно передавать в вызывающую часть разными способами, но чаще всего это делают, помещая результата в регистр перед возвратом из подпрограммы, как сделано в примере. Для освобождения места, занятого локальными переменными, следует вернуть указателю стека то значение, которое он имел в начале подпрограммы (оно хранится в ebp). После этого выполняется команда возвврата ret, использующая сохраненный в стеке адрес возврата в вызывающую часть программы.
После возврата следует освободить место в стеке, занятое параметрами. В нашем примере это делает команда add esp, 8 , однако в архитектуре х86 это может быть сделано с помощью разновидности команды возварата из подпрограммы ret n, она не только осуществляет возварт, но и извлекает из стека (в "никуда") число байтов, указываемое параметром n.
Для облегчения сохранения-восстановления контекста в разных реализациях процессоров могут быть использованы:
1) Специальные команды:
2) Несколько экземпляров наборов регистров: