Архитектура ЭВМ6.ppt
- Количество слайдов: 17
Организация подпрограмм Подпрограмма — поименованная или иным образом идентифицированная часть программы, содержащая описание определённого набора действий. Преимущества подпрограмм: 1. Возможность повторного использования программного кода. 2. Структуризация программы с целью удобства её понимания и сопровождения.
Организация подпрограмм Особенности использования функций: 1. Функции могут вызывать друга. 2. Как правило заранее нельзя предсказать, какие функции будут вызваны, и в какой последовательности. 3. Возможен рекурсивный вызов функций, причем необязательно напрямую: 1 -я функция может вызвать 2 -ю, а та, в свою очередь – 1 -ю.
Организация подпрограмм function func 1 (Param: integer): integer var x, y; begin if … then begin func 1(x); end; … end; function func 2 (Param: real): integer var z, y; begin func 1(y); func 2(z); … end;
Организация подпрограмм Проблемы: 1. Каждый раз при вызове функции необходимо хранить адрес возврата. Таким образом, может оказаться, что в некоторый момент времени необходимо хранить множество таких адресов. func 1() func 2() func 3() func 2()… После окончания работы функции такой адрес необходим, чтобы вернуться в предыдущую функцию.
Организация подпрограмм Проблемы: 2. Для каждой вызванной функции необходимо отдельно хранить ее локальные переменные и передаваемые параметры. Это связано с тем, что возможен рекурсивный вызов функции, т. е. в один момент времени могут выполняться несколько экземпляров функции, каждый со своими параметрами.
Организация подпрограмм Решение: Адреса возврата, передаваемые параметры и локальные переменные хранятся в стеке. Таким образом, последними загружаются в стек значения последней вызванной функции, а при их извлечении из стека, следующими будут значения предыдущей, и т. д.
Организация подпрограмм Обобщенный алгоритм вызова функции: • Поместить в стек параметры, передаваемые функции • Поместить в стек адрес возврата (адрес следующая команды, после вызова функции). • Функция работает. При необходимости, локальные переменные также размещаются в стеке. • Извлечь из стека все значения и перейти по адресу возврата, который находится в стеке.
Организация подпрограмм Поддержка на уровне ЦП: Команды процессора Intel: CALL <имя подпрограммы(метка)> Помещает адрес возврата в стек, передает управление подпрограмме RET Извлекает из стека адрес и передает управление по этому адресу.
Организация подпрограмм … mov ax, 2 mov bx, 3 call proc 1 … proc 1 PROC add ax, bx ret proc 1 ENDP ; ax=5
Организация подпрограмм Регистры Intel 8086: SS – хранит границу стека (начало сегмента стека) SP – хранит вершину стека (адрес элемента, записанного в стек последним) BP – регистр для манипуляций со стеком. Позволяет получить доступ к предпоследнему, и т. д. элементу. mov BP, SP inc [BP] add BP, 2 inc [BP] ; получаем доступ к последнему ; можем изменить последний ; получаем доступ к предпоследнему ; можем изменить предпоследний
Организация подпрограмм … push 2 push 3 call proc 1 ; ax=5 add sp, 4 … proc 1 PROC mov bp, sp add bp, 2 mov ax, [bp] add bp, 2 add ax, [bp] ret proc 1 ENDP
Организация подпрограмм Соглашение вызова определяет следующие особенности процесса использования подпрограмм: • Расположение входных параметров подпрограммы и возвращаемых ею значений. • Порядок передачи параметров. Кто возвращает указатель стека на исходную позицию. • Какой командой вызывать подпрограмму и какой — возвращаться в основную программу. Например, в стандартном режиме x 86 подпрограмму можно вызвать через call near, call far и pushf/call far (для возврата применяются соответственно retn, retf, iret). • Содержимое каких регистров процессора подпрограмма обязана восстановить перед возвратом.
Организация подпрограмм Соглашение вызова cdecl Основной способ вызова для Си (отсюда название, сокращение от «c-declaration» ). Аргументы передаются через стек, справа налево. Очистку стека производит вызывающая программа. Возвращаемое значение записывается в регистр ax (eax).
Организация подпрограмм Соглашение вызова cdecl int function_name(int, int); int a, b, c, x; . . . x = function_name(a, b, c); Будет сгенерирован следующий код: push c ; arg 3 push b ; arg 2 push a ; arg 1 call function_name add esp, 12 mov x, eax ; jump to function_name's code ; pop function args (a, b, c) off the stack ; fetch function return value
Организация подпрограмм Соглашение вызова pascal Основной способ вызова для Паскаля. Аргументы передаются через стек, слева направо. Указатель стека на исходную позицию возвращает подпрограмма. У функций неявно создаётся дополнительный первый изменяемый параметр Result, через который и возвращается значение.
Организация подпрограмм Соглашение вызова stdcall/winapi Применяется при вызове функций Win. API. Аргументы передаются через стек, справа налево. Очистку стека производит вызываемая подпрограмма.
Организация подпрограмм Соглашение вызова fastcall Передача параметров через регистры. Если все параметры и промежуточные результаты умещаются в регистрах, манипуляции со стеком вообще не нужны. Fastcall не стандартизирован, поэтому используется только в функциях, которые программа не экспортирует наружу.
Архитектура ЭВМ6.ppt