Project

General

Profile

Обзор работы со стеком » History » Version 8

krufter_multiclet, 04/02/2013 04:52 PM

1 1 krufter_multiclet
h1. Обзор работы со стеком
2 1 krufter_multiclet
3 1 krufter_multiclet
Стек необходим прежде всего для взаимодействия Си компилятора и ассемблера: передача аргументов функций,
4 1 krufter_multiclet
передача параметров, сохранение значений возврата в функцию, возврата в Си результатов и т.п.
5 1 krufter_multiclet
6 1 krufter_multiclet
Стек в мультиклеточном процессоре организован при помощи индексных регистров 38,39.
7 1 krufter_multiclet
Регистр 38 имеет имя BP (база стека), регистр 39 называется SP(вершиной стека).
8 1 krufter_multiclet
9 1 krufter_multiclet
Стек растёт от конца памяти данных и структурируется по кадрам. Один кадр состоит из группы элементов, находящихся
10 2 krufter_multiclet
между SP и BP (между вершиной и базой стека). Один элемент кадра является 32-х битной ячейкой памяти.
11 5 krufter_multiclet
Рассмотрим структуру стека при вызове на Си ассемблерной функции типа void, которая не возвращает результат и 
12 6 krufter_multiclet
имеет два аргумента, например *void MDIO_WR(int phy_addr, int reg_num)*:
13 3 krufter_multiclet
14 4 krufter_multiclet
!Stack_void.jpg!
15 5 krufter_multiclet
16 1 krufter_multiclet
Рис 1. Структура стека функции void
17 6 krufter_multiclet
18 6 krufter_multiclet
+Адрес возврата+ - адрес для возвращения обратно в Си программу
19 6 krufter_multiclet
+Аргумент1+ - значение переменной phy_addr
20 6 krufter_multiclet
+Аргумент2+ - значение переменной reg_num
21 6 krufter_multiclet
+Адрес BP+ - значение адреса, по которому располагалась база предыдущего кадра 
22 7 krufter_multiclet
23 7 krufter_multiclet
Вершина стека (SP) находится на 3 позиции выше базы стека (BP).
24 7 krufter_multiclet
25 7 krufter_multiclet
Для функции типа int, которая возвращает результат структура кадра немного изменится(появится поле для возвращаемого).
26 8 krufter_multiclet
Например, рассмотрим следующую функцию *int MDIO_RD(int phy_addr, int reg_num)*:
27 8 krufter_multiclet
28 8 krufter_multiclet
!Stack_int.jpg!
29 8 krufter_multiclet
30 8 krufter_multiclet
Рис 1. Структура стека функции int