Обзор работы со стеком » History » Version 11
« Previous -
Version 11/21
(diff) -
Next » -
Current version
krufter_multiclet, 04/02/2013 05:05 PM
Обзор работы со стеком¶
Стек необходим прежде всего для взаимодействия Си компилятора и ассемблера: передача аргументов функций,
передача параметров, сохранение значений для возврата в функцию, возврат в Си результатов и т.п.
Стек в мультиклеточном процессоре организован при помощи индексных регистров 38,39.
Регистр 38 имеет имя BP (база стека), регистр 39 называется SP.
Стек растёт от конца памяти данных и структурируется по кадрам. Один кадр состоит из группы элементов, находящихся
между SP и BP (между вершиной и базой стека). Один элемент кадра является 32-х битной ячейкой памяти.
Рассмотрим структуру стека при вызове на Си ассемблерной функции типа void, которая не возвращает результат и
имеет два аргумента, например void MDIO_WR(int phy_addr, int reg_num):
Рис 1. Структура стека функции void
Адрес возврата - адрес для возвращения обратно в Си программу
Аргумент1 - значение переменной phy_addr
Аргумент2 - значение переменной reg_num
Адрес BP - значение адреса, по которому располагалась база предыдущего кадра
Вершина стека (SP) находится на 3 позиции выше базы стека (BP).
Для функции типа int, которая возвращает результат структура кадра немного изменится(появится поле для возвращаемого значения).
Например, рассмотрим следующую функцию int MDIO_RD(int phy_addr, int reg_num):
Рис 1. Структура стека функции int
Адрес возврата - адрес для возвращения обратно в Си программу
Результат - значение возвращаемое функцией в Си
Аргумент1 - значение переменной phy_addr
Аргумент2 - значение переменной reg_num
Адрес BP - значение адреса, по которому располагалась база предыдущего кадра
Вершина стека (SP) находится на 4 позиции выше базы стека (BP).