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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2010, 21:10   #1
Livores
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 10
Смущение CALL и RET (иерархия вызовов процедур)

Доброго времени суток))

Подскажи что деалть если я с помощью CALL (из главной процедуры, процедуры №1) вызываю процедуру №2 из которой вызываю процедуру №3. И какогда я в процедуре №3 я использую RET то я попадаю в процедуру №2 (все отлично), НО вот когда в процедуре №2 использую RET то вылетает ошибка..

Я почитал что при исопльзовании команды CALL в стек записываются данные из стеков, которые снова востанавливаются перед использованием RET чтобы вернутся. Но что конкретно мне надо сохранить?))

Я методом тыка сделал так - как только я попадаю из №1 в процедуру №2 я сохранил в память значение SP и перед RET (в процедуре №2, который должен возвращать нас из №2 в №1) положил в SP из памяти сохраненное значение, и таким образом вернулся в №1))

Вроде все работает, но вот что я сделал? И праивльно ли так делать?))
Livores вне форума Ответить с цитированием
Старый 27.05.2010, 21:42   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может быть вы сбиваете стек в своих процедурах?
процессор сам записывает адрес возврата по call. и по ret сам его берет.
может быть у вас есть локальные стековые переменные?

покажите код, будет проще
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2010, 11:53   #3
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

И еще, обнуляй флаги когда выходиш с процедуры
Doholyan вне форума Ответить с цитированием
Старый 30.05.2010, 23:35   #4
Livores
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 10
По умолчанию

ага, спасибо))

вот с сохранением SP вышло, у знакомых такяже проблема была. посоветовал во второй процидуре сохранить SP перед вызовом третий процедуры, а потом перед RET во второй процедуре в SP загрузить сохраненный СП и все вышло)
Livores вне форума Ответить с цитированием
Старый 31.05.2010, 00:47   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Может забыли из стека параметры функции убрать?
p51x вне форума Ответить с цитированием
Старый 08.06.2010, 07:02   #6
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
Сообщение

я знаю, что команда call перед выполнением сохраняет данные о адресе следующей команды в стёке, а ret вытаскивает из стёка адрес за писаный командой call и переводит выполнение этой программы на этот адрес.

адрес может состоять из сегмента:смещения или из смещения
в зависимости от типа памяти используемой программой.
Для Windows приложений адрес памяти состоит из смещения

seg возращает сегмент
offset смещение
wanes101 вне форума Ответить с цитированием
Старый 08.06.2010, 08:51   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

2 wanes101
К чему ваш пост?
p51x вне форума Ответить с цитированием
Старый 09.06.2010, 10:22   #8
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
Сообщение

Цитата:
Сообщение от p51x Посмотреть сообщение
2 wanes101
К чему ваш пост?
в смысле "что за пост"?
wanes101 вне форума Ответить с цитированием
Старый 09.06.2010, 13:16   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Наверное человек передавал в процедуру параметры через стек а потом при выходе из процедуры не очистил стек от параметров, поэтому при выходе из процедуры его и умесло черти-знает куда...
Mikl___ вне форума Ответить с цитированием
Старый 11.07.2013, 15:59   #10
Bobibu
Новичок
Джуниор
 
Регистрация: 10.06.2013
Сообщений: 2
По умолчанию

Пепел Феникса
у меня такая же проблема, но стек адреса SP показывает что двигается нормально, но кидает в пустую часть кода...
Смотрю через Turbo Debager, вроде как я понял в процедуре FindNextParam есть исключение(только вот не могу его найти)
вот сама процедура:
Код:
FindNextParam   PROC    NEAR
;помещает в буфеp следующий паpаметp командной стpоки, и пеpедает его адpес
;в pегистpах DS:SI. Все кpайние пpобелы исключаются из стpоки. Паpаметp
;заканчивается символом 00h. Если паpаметp найден, то AL=1, если нет, то AL=0.
                PUSH    DS
                POP     ES
                LEA     DI, CmdLineBuffer
                MOV     CX, 32
                XOR     EAX, EAX
                REP  STOSD
                MOV     AH, 51h
                INT     21h
                MOV     FS, BX
                PUSH    DS
                POP     ES
                MOV     ParamFound, 0
                MOV     SI, CmdLinePointer
                DEC     SI
GetNext_1:      INC     SI
                CMP     SI, CmdLineEnd
                JZ      GetNext_3
                CMP     BYTE PTR FS:[SI], 32
                JZ      GetNext_1
                MOV     ParamFound, 1
                LEA     DI, CmdLineBuffer ;начинаем пеpедавать паpаметp в буфеp
GetNext_2:      MOV     AL, FS:[SI]
                CMP     AL, 32
                JZ      GetNext_3
                MOV     [DI], AL
                INC     DI
                INC     SI
                CMP     SI, CmdLineEnd
                JNZ     GetNext_2
GetNext_3:      MOV     CmdLinePointer, SI
                MOV     AL, ParamFound
                LEA     SI, CmdLineBuffer
                OR      AL, AL
                RET
FindNextParam   ENDP
Вложения
Тип файла: zip HUFFMAN.zip (6.3 Кб, 10 просмотров)
Bobibu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Иерархия из 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