реклама на сайте
подробности

 
 
> Что такое СТЕК и с чем его едят?, Знающим просьба пояснить простые истины......
Potter
сообщение Feb 23 2007, 01:13
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Пять лет успешно программля на С. Пришло время.... Пришлось сталкнуться с ассеблером. Все понятно... Вот только не пойму я что такое СТЕК? Поясните пожалуйста особо популярно что это такое? Как он работает? И что в нем по обыкновению храниться? И почему без операций:

ldi r16, high(RAMEND)
out SPH, r16

ldi r16, low(RAMEND)
out SPL, r16

Конроллер МЕГА128 нормально не работает?

Заранее огромное спасибо.......
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Feb 23 2007, 03:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Стек (Stack) в переводе "палка". В применении к аппаратно-программной части микроконтроллеров это линейная часть ОЗУ, выделенная для хранения данных по принципу LIFO (Last In - First Out) Последним Вошел - Первым Вышел. Стек нужен для организации работы прерываний и подпрограмм/функций. В стеке могут хранится, как уже указал Alex B._, адреса возврата из функции/прерывания, данные для передачи параметров в/из функцию, буфер(а) для локальных переменных. Прерывания используют стек на аппаратном уровне как минимум для записи текущего адреса выполняемой программы (некоторые сохраняют в стек еще и слово состояния АЛУ ядра МК и пр.), чтобы после обработки прерывания, можно было вернуться и продолжить ее выполнение. Поэтому. если вы заранее не установили указатель стека на свободную часть ОЗУ, то при вызове прерываний последовательность выполнения программы может быть нарушена. В отличие от счетчика команд, который работает с автоинкрементом, то указатель стека работает с автодекрементом. Поэтому указателю стека обычно присваивают значение адреса не начала, а конца ОЗУ. Напротив, глобальные переменные и "куча", используемые в Си, располагаются с начала ОЗУ. Поэтому эти две области данных "растут" навстречу друг другу. Переполнение стека, при котором содержимое стека "наползает" на область глобальных переменных и/или "кучи", это одна из самых типичных и в то же время весьма трудно обнаруживаемая ошибка, возникающих при программировании МК.
Есть еще другие понятия стека, например, "стек протоколов". За разъяснениями можно обратиться к Википедии, например.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 23 2007, 03:35
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(rezident @ Feb 23 2007, 00:08) *
Стек (Stack) в переводе "палка"

Отличное объяснение. Перевод только немного надо подправить: стек (stack) в переводе означает "скирда, стог; кипа" (а палка это stick).

Для образности ещё добавлю, что стек можно представить себе в виде автоматного магазина, патроны вставляются последовательно 1-2-3-4-5..., а вынимаются ...5-4-3-2-1.

А вот в нижеприведенном фрагменте теряется безвозвратно один байт ОЗУ.
Код
     ldi   r16,high(RAMEND)
     out   SPH,r16
     ldi   r16,low(RAMEND)
     out   SPL,r16


Надо бы писать так
Код
     ldi   r16,high(RAMEND+1)
     out   SPH,r16
     ldi   r16,low(RAMEND+1)
     out   SPL,r16

Кто бы мне объяснил, почему так не делают? Инерция мышления?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Potter   Что такое СТЕК и с чем его едят?   Feb 23 2007, 01:13
- - Alex B._   >> Пять лет успешно программля на С успешно?...   Feb 23 2007, 01:43
|- - Potter   Цитата(Alex B._ @ Feb 23 2007, 02:43) усп...   Feb 23 2007, 09:39
|- - Dog Pawlowa   Цитата(Potter @ Feb 23 2007, 10:39) Я про...   Feb 23 2007, 09:54
|- - aleksey_g   Цитата(Potter @ Feb 23 2007, 08:39) Я про...   Feb 23 2007, 12:28
|- - defunct   Цитата(Potter @ Feb 23 2007, 08:39) Цитат...   Feb 23 2007, 13:32
|- - Dopler   Цитата(=GM= @ Feb 23 2007, 03:35) Цитата(...   Feb 23 2007, 12:02
|- - =GM=   Цитата(Dopler @ Feb 23 2007, 09:02) Госпо...   Feb 23 2007, 13:56
|- - osnwt   Цитата(=GM= @ Feb 23 2007, 12:56) А пошло...   Feb 23 2007, 16:56
||- - defunct   Цитата(osnwt @ Feb 23 2007, 15:56) Но это...   Feb 23 2007, 17:15
||- - osnwt   Цитата(defunct @ Feb 23 2007, 16:15) Цита...   Feb 23 2007, 17:50
||- - defunct   Цитата(osnwt @ Feb 23 2007, 16:50) участк...   Feb 23 2007, 18:39
||- - osnwt   Цитата(defunct @ Feb 23 2007, 17:39) Плох...   Feb 24 2007, 00:04
|- - Dopler   Цитата(=GM= @ Feb 23 2007, 13:56) Прошу п...   Feb 23 2007, 23:06
- - SasaVitebsk   Если быть более точным, то направление куда ...   Feb 23 2007, 03:37
- - beer_warrior   Еще вдогонку - через стек передаються в функцию ...   Feb 23 2007, 09:49
- - SasaVitebsk   Соглашусь с defunct. Ошибки в компиляторах и опер...   Feb 23 2007, 22:20


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016