Обзор работы со стеком » History » Version 11
  krufter_multiclet, 04/02/2013 05:05 PM 
  
| 1 | 1 | krufter_multiclet | h1. Обзор работы со стеком  | 
|---|---|---|---|
| 2 | 1 | krufter_multiclet | |
| 3 | 1 | krufter_multiclet | Стек необходим прежде всего для взаимодействия Си компилятора и ассемблера: передача аргументов функций,  | 
| 4 | 11 | 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 | 10 | 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  | 
| 31 | 9 | krufter_multiclet | |
| 32 | 9 | krufter_multiclet | +Адрес возврата+ - адрес для возвращения обратно в Си программу  | 
| 33 | 9 | krufter_multiclet | +Результат+ - значение возвращаемое функцией в Си  | 
| 34 | 9 | krufter_multiclet | +Аргумент1+ - значение переменной phy_addr  | 
| 35 | 9 | krufter_multiclet | +Аргумент2+ - значение переменной reg_num  | 
| 36 | 9 | krufter_multiclet | +Адрес BP+ - значение адреса, по которому располагалась база предыдущего кадра  | 
| 37 | 9 | krufter_multiclet | |
| 38 | 9 | krufter_multiclet | Вершина стека (SP) находится на 4 позиции выше базы стека (BP).  |