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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 22:21   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Возврат локальных переменных

Доброго времени суток Уважаемы ассемблеристы, объясните пожалуйста как можно вернуть какую либо локальную переменную?
Разницу между RET, RET4, RETX, RETN (X - в смысле 8, 12, ...).
За ранее очень благодарен.
Ассемблер знаю не очень хорошо, книжки не читаю но изучаю его в процессе дизассемблирования. Так что прошу понять и простить

Последний раз редактировалось coNsept; 08.12.2011 в 22:30.
coNsept вне форума Ответить с цитированием
Старый 09.12.2011, 01:27   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

в этом отношении асм мало отличается от языков высокого уровня: локальную переменную возвращать нельзя. Если смогли вернуть, получите, естественно, мусор, т.к. локальные переменные перестают существовать после выхода из процедуры.

Есть два способа вернуть вобще что-либо: через регистры, и через указатели. Через регистры (обычно EAX/RAX) возвращают результат, который помещается в 4/8 байт. Всё остальное обычно возращается путём заполнения полей структуры, адрес которой явно был передан в процедуру, или же путём выделения памяти и возращением указателя на эту память.

> RET, RET4, RETX

циферь показывает, на сколько увеличить указатель стека перед возвратом. Используется, чтобы "освободить" память, выделенную под локальные переменные.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 01:40   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в этом отношении асм мало отличается от языков высокого уровня: локальную переменную возвращать нельзя.
в ЯПВУ можно спокойно вернуть саму структуру, а не указатель на нее(тем более в куче).
я думаю ТС это тоже интересно.
Цитата:
выделенную под локальные переменные.
не.
локальные переменные обычно стирают уничтожая стековый фрейм(LEAVE) а в RET уничтожают аргументы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.12.2011, 01:41   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

В принципе все понял, а на счет возврата локальной переменной не правильно выразился ну да ладно не суть, теперь все стало понятнее. Большое спасибо
coNsept вне форума Ответить с цитированием
Старый 09.12.2011, 01:50   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> в ЯПВУ можно спокойно вернуть саму структуру, а не указатель на нее

при этом реально в процедуру передаётся неявный указатель на структуру, выделенную в стеке у вызывающей стороны. Хранить-то её где-то надо, как ни крути.

> RET уничтожают аргументы

а, точно, попутал. Следует читать так: "циферь показывает, на сколько увеличить указатель стека после возврата".
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 01:54   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ну понятно, то есть если поступает один DWORD/ский аргумент, тогда возвращаем RET4, а с RETN как быть? Какие его действия?
coNsept вне форума Ответить с цитированием
Старый 09.12.2011, 02:02   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

RETN==RET NEAR==в винде обычно RET [0]
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
мониторинг трафика локальных и интернет сетей rezvei Помощь студентам 3 15.02.2011 21:39
Jcl - получение локальных переменных AMaKc Компоненты Delphi 2 14.10.2010 08:36
Возврат переменных из цикла и функций %$PROregRAMi$t% PHP 8 31.08.2010 05:22
Как вместо статических локальных переменных использовать переменные объявленные в namespace? Oleg_SK Общие вопросы C/C++ 25 05.07.2010 18:46
Сравнительная оценка локальных СУБД Stilet Свободное общение 2 23.11.2008 15:33