Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 23:27   #1
Don7
 
Регистрация: 20.12.2011
Сообщений: 4
По умолчанию Стек и процедуры.

В общем то как функционирует стек мне ясно,непонятна вся его физическая часть.Как он работает с ячейками памяти,если есть несколько вложенных процедур?Ну допустим есть 3 процедуры,1-я вызывает 2-ю,в свою очередь вторая вызывает 3-ю,но как я понял стек должен вернуться в исходное состояние,только вот каким образом?Если используются 2 процедуры,то понятно что можно сохранить ячейку выхода во "флаге",и когда вторая процедура выполниться,стек вернется на ту позицию первой процедуры,где было завершение и продолжит выполняться первая.Но как быть с 3-мя и более вложенными процедурами,ведь флажок каждый раз будет "затираться".В общем,пожалуйста "разжуйте" по-подробнее,если можно на примере с ячейками.
Заранее спасибо.
Don7 вне форума Ответить с цитированием
Старый 21.12.2011, 00:38   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
как я понял стек должен вернуться в исходное состояние,только вот каким образом?
если Вы про push/pop - то
эта забота лежит исключительно на программисте.

А если про CALL / RET то всё просто - любой вызов подпрограммы помещает адрес следущей после call команды в стек. При этом регистр - указатель стека SP сдигается. процедура RET вытягивает точку возврата, указатель стека возвращается в состояние, в каком он был до call, управление передаётся по адресу, извлечённому из стека..


p.s. напишите простеньку программку на ассеблере и пройдитесь пошагово в отладчике, внимательно следя за указателем и содержимым стека. Вы всё поймёте..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.12.2011, 01:23   #3
Don7
 
Регистрация: 20.12.2011
Сообщений: 4
По умолчанию

Ага,то есть...
call
адрес процедуры
......[точка возврата]
...... ;следующие команды
......
Процедура
......
......
ret ;Возвращает к следующим коммандам

Я вас правильно понял?
Don7 вне форума Ответить с цитированием
Старый 21.12.2011, 04:11   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Don7
нет не правильно, и чтобы не гадать на кофейной гуще -- найди в сети книжку В.Н. Пильщиков "Assembler. Программирование на языке ассемблера IBM PC" и прочитай ее
Mikl___ вне форума Ответить с цитированием
Старый 21.12.2011, 23:17   #5
Don7
 
Регистрация: 20.12.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Don7
нет не правильно, и чтобы не гадать на кофейной гуще -- найди в сети книжку В.Н. Пильщиков "Assembler. Программирование на языке ассемблера IBM PC" и прочитай ее
Спасибо вам за помощь,кажется это то,что нужно.До этого читал Крупника,вроде у Пильщикова картина яснее.
Don7 вне форума Ответить с цитированием
Старый 22.12.2011, 00:24   #6
Don7
 
Регистрация: 20.12.2011
Сообщений: 4
По умолчанию

Еще раз перечитал.Вот что по этому поводу пишет Крупник.
"...Команда call помещает адрес следующей инструкции в стек,а затем переводит процессор к адресу первой инструкции процедуры.Инструкции,составляющие процедуру выполняются до тех пор,пока не встретиться инструкция ret,которая достает из стека адрес возврата,предъявляя его процессору и тот как ни в чем не бывало начинает выполнять инструкции с этого адреса."
Тогда почему я не прав?В приведенной схеме я это и имел ввиду.
Don7 вне форума Ответить с цитированием
Старый 22.12.2011, 10:27   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Don7
Потому что это разные области памяти, одна адресуется через CS:IP (область команд), другая через SS:SP (область стека)
грубо картинка такая
Код:
IP              |   SP
123: call 200   | mov [sp],125 ; точка возврата
200: Процедура  |
......
210: ret        |  mov [ip],125 ;jmp 125 
125: ...        |
Лучше повторить слова Serge_Bliznykov
Цитата:
напишите простеньку программку на ассеблере и пройдитесь пошагово в отладчике, внимательно следя за указателем и содержимым стека. Вы всё поймёте..

Последний раз редактировалось Mikl___; 22.12.2011 в 12:22.
Mikl___ вне форума Ответить с цитированием
Старый 22.12.2011, 11:24   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Тогда почему я не прав?В приведенной схеме я это и имел ввиду.
угу. правы, правы.
просто Вас, видимо, не точно поняли. в схеме Вы выделили "......[точка возврата]"
а фактически - это же просто адрес следующей команды (у вас на схеме: ";следующие команды"

ну, я считаю, что Вы разобрались, поэтому тему можно считать закрытой.

ДОБАВЛЕНО

Mikl___, приношу свои изменения, когда я писал свой комментарий, я Ваш пост не видел.
Прошу моё сообщение не рассценивать, как комментарий к вашему ответу.

Последний раз редактировалось Serge_Bliznykov; 22.12.2011 в 11:27.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
Стек на С oleg081 Помощь студентам 3 23.02.2011 16:18
закончить выполнение процедуры из тела другой процедуры Alaysor Общие вопросы Delphi 14 23.01.2011 05:26
Управляющие структуры, процедуры Function и процедуры Sub Natalo4ka Помощь студентам 0 17.05.2010 22:00
Запуск процедуры из процедуры с дополнением 1sal1 Общие вопросы Delphi 3 06.10.2008 21:54