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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2016, 19:22   #1
tilbakekomst
 
Регистрация: 05.01.2016
Сообщений: 5
По умолчанию Как выйти из подпрограммы?

программирование на языке асемблер. как выйти из подпрограммы, и вернутся не туда, откуда вошел в подпрограмму, а в другое место?


Последний раз редактировалось tilbakekomst; 05.01.2016 в 19:24.
tilbakekomst вне форума Ответить с цитированием
Старый 05.01.2016, 19:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

выкинуть из стека адрес возврата и сделать JMP в любую нужную точку кода
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2016, 20:11   #3
tilbakekomst
 
Регистрация: 05.01.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
выкинуть из стека адрес возврата и сделать JMP в любую нужную точку кода
т.е. завершать подпрограмму(RET) не обязательно? можно просто перескочить куда надо и все?
tilbakekomst вне форума Ответить с цитированием
Старый 05.01.2016, 21:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
завершать подпрограмму(RET) не обязательно?
Тогда у тебя в стеке будет лишнее значение. Если есть вызов call, то должен быть для него ret. Иначе в стеке будут лишние данные, переполняющие стек.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.01.2016, 23:56   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Если есть вызов call, то должен быть для него ret.
По моему, не обязательно. значение из стека можно просто выкинуть, без ret.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.01.2016, 07:17   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от tilbakekomst Посмотреть сообщение
как выйти из подпрограммы, и вернутся не туда, откуда вошел в подпрограмму, а в другое место?
Можно выйти и в другое место убрав из стека все сохранённые регистры и точку возврата. Но зачем? Подпрограммы для того и сделаны, что их можно вызывать из любого места основной программы. Если есть такая необходимость, подпрограмма должна возвращать какой-то флаг. После её отработки проверяется значение этого флага и делается соответствующий переход.
Допустим так:

Код:
PPR00:
    ...........
    RZ
    ...........
    RC
    ...........
    RET

    CALL PPR00;
    JZ  MET1
    JC  MET2
    JMP MET3
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 06.01.2016 в 07:25.
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.01.2016, 10:22   #7
tilbakekomst
 
Регистрация: 05.01.2016
Сообщений: 5
По умолчанию

[/QUOTE]
Цитата:
Сообщение от Smitt&Wesson
Можно выйти и в другое место убрав из стека все сохранённые регистры и точку возврата
а если не вызывать подпрограмму, а просто перейти к коду, который написан уже после основного кода программы, например


0801 JZ 0807
0802 --------
0803 --------
0804 JMP ST
0805
0806
0807 --------
0808 JMP 0803
0809
tilbakekomst вне форума Ответить с цитированием
Старый 06.01.2016, 11:48   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
значение из стека можно просто выкинуть, без ret.
Ну это как-то чревато грабельками
Так то вообще можно сделать все что угодно. Только вот стоит ли...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2016, 12:49   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от tilbakekomst Посмотреть сообщение
а если не вызывать подпрограмму, а просто перейти к коду, который написан уже после основного кода программы, например
А если не заниматься глупостями, то в дальнейшем будет меньше голова болеть.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.01.2016, 12:55   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а если не вызывать подпрограмму, а просто перейти к коду, который написан уже после основного кода программы, например
да почему нет, можно. Но это будет просто переход к куску кода, но не вызов подпрограммы.
Вы подумайте на досуге, чем отличается кусок кода (пусть лежащий где-то в стороне от основного кода) от кода, являющегося подпрограммой.
Подсказка: код получает управление и после выполенения передаёт его в определённое место.
Код в подпрограмме получает управление и после выполенения передаёт его в то место, откуда произошёл вызов подпрограммы. Грубо говоря, RET - это тот же JUMP, только не на заданный адрес, а на адрес, который находится в стеке.
Вот и всё отличие.
Как организовать выполнение программы, помещать ли адрес возврата в стек или не помещать - зависит от программиста, который разрабатывает алгоритм и программу.
Например, достаточно CALL PP1 заменить на JMP PP1, чтобы произошла передача управления БЕЗ помещения адреса возврата в стек. Ну тогда RET в подпрограмме использовать нельзя - ведь в стеке не будет адреса, на который надо вернуться.
Так понятней?


Цитата:
Сообщение от Stilet
Ну это как-то чревато грабельками
Так то вообще можно сделать все что угодно. Только вот стоит ли...
Этот вопрос не ко мне. Это Вы автора темы спросите, что он мутит и зачем.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массив, как выйти? Евгения Е Общие вопросы C/C++ 2 03.06.2014 22:10
Как выйти из полноэкранного режима??? ser70 Общие вопросы C/C++ 4 23.04.2013 07:53
Как выйти из поиска по достижению конца листа? ИгорьБ Microsoft Office Excel 16 30.03.2013 01:34
Как выйти с процедуры? Andrey770 Паскаль, Turbo Pascal, PascalABC.NET 3 04.06.2011 22:26
Как выйти из бесконечного цикла! Эдуард Общие вопросы C/C++ 11 02.03.2008 19:15