![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 12.05.2010
Сообщений: 10
|
![]()
Доброго времени суток))
Подскажи что деалть если я с помощью CALL (из главной процедуры, процедуры №1) вызываю процедуру №2 из которой вызываю процедуру №3. И какогда я в процедуре №3 я использую RET то я попадаю в процедуру №2 (все отлично), НО вот когда в процедуре №2 использую RET то вылетает ошибка.. Я почитал что при исопльзовании команды CALL в стек записываются данные из стеков, которые снова востанавливаются перед использованием RET чтобы вернутся. Но что конкретно мне надо сохранить?)) Я методом тыка сделал так - как только я попадаю из №1 в процедуру №2 я сохранил в память значение SP и перед RET (в процедуре №2, который должен возвращать нас из №2 в №1) положил в SP из памяти сохраненное значение, и таким образом вернулся в №1)) Вроде все работает, но вот что я сделал? И праивльно ли так делать?)) |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
может быть вы сбиваете стек в своих процедурах?
процессор сам записывает адрес возврата по call. и по ret сам его берет. может быть у вас есть локальные стековые переменные? покажите код, будет проще ![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 26.04.2009
Сообщений: 270
|
![]()
И еще, обнуляй флаги когда выходиш с процедуры
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 12.05.2010
Сообщений: 10
|
![]()
ага, спасибо))
вот с сохранением SP вышло, у знакомых такяже проблема была. посоветовал во второй процидуре сохранить SP перед вызовом третий процедуры, а потом перед RET во второй процедуре в SP загрузить сохраненный СП и все вышло) |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,821
|
![]()
Может забыли из стека параметры функции убрать?
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 04.06.2010
Сообщений: 212
|
![]()
я знаю, что команда call перед выполнением сохраняет данные о адресе следующей команды в стёке, а ret вытаскивает из стёка адрес за писаный командой call и переводит выполнение этой программы на этот адрес.
адрес может состоять из сегмента:смещения или из смещения в зависимости от типа памяти используемой программой. Для Windows приложений адрес памяти состоит из смещения seg возращает сегмент offset смещение
мой сайт http://wanes101.16mb.com/myblog
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,821
|
![]()
2 wanes101
К чему ваш пост? |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 04.06.2010
Сообщений: 212
|
![]()
мой сайт http://wanes101.16mb.com/myblog
|
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Наверное человек передавал в процедуру параметры через стек а потом при выходе из процедуры не очистил стек от параметров, поэтому при выходе из процедуры его и умесло черти-знает куда...
|
![]() |
![]() |
![]() |
#10 |
Новичок
Джуниор
Регистрация: 10.06.2013
Сообщений: 2
|
![]()
Пепел Феникса
у меня такая же проблема, но стек адреса SP показывает что двигается нормально, но кидает в пустую часть кода... Смотрю через Turbo Debager, вроде как я понял в процедуре FindNextParam есть исключение(только вот не могу его найти) вот сама процедура: Код:
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Иерархия из CheckBox'ов | minarett | JavaScript, Ajax | 1 | 22.02.2010 13:42 |
организация системных вызовов в ос windows | Lora05 | Помощь студентам | 1 | 28.09.2009 02:29 |
Иерархия | skyline_skyline | Microsoft Office Excel | 3 | 04.09.2009 13:00 |
Перехват системных вызовов Windows | Irat | Помощь студентам | 1 | 04.02.2008 16:30 |
Способы вызовов функций | MultIfleX | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 16.10.2007 06:07 |