![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
|
![]()
Доброго времени суток Уважаемы ассемблеристы, объясните пожалуйста как можно вернуть какую либо локальную переменную?
Разницу между RET, RET4, RETX, RETN (X - в смысле 8, 12, ...). За ранее очень благодарен. Ассемблер знаю не очень хорошо, книжки не читаю но изучаю его в процессе дизассемблирования. Так что прошу понять и простить ![]() Последний раз редактировалось coNsept; 08.12.2011 в 22:30. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
в этом отношении асм мало отличается от языков высокого уровня: локальную переменную возвращать нельзя. Если смогли вернуть, получите, естественно, мусор, т.к. локальные переменные перестают существовать после выхода из процедуры.
Есть два способа вернуть вобще что-либо: через регистры, и через указатели. Через регистры (обычно EAX/RAX) возвращают результат, который помещается в 4/8 байт. Всё остальное обычно возращается путём заполнения полей структуры, адрес которой явно был передан в процедуру, или же путём выделения памяти и возращением указателя на эту память. > RET, RET4, RETX циферь показывает, на сколько увеличить указатель стека перед возвратом. Используется, чтобы "освободить" память, выделенную под локальные переменные.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#3 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
я думаю ТС это тоже интересно. Цитата:
локальные переменные обычно стирают уничтожая стековый фрейм(LEAVE) а в RET уничтожают аргументы. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
|
![]()
В принципе все понял, а на счет возврата локальной переменной не правильно выразился ну да ладно не суть, теперь все стало понятнее. Большое спасибо
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> в ЯПВУ можно спокойно вернуть саму структуру, а не указатель на нее
при этом реально в процедуру передаётся неявный указатель на структуру, выделенную в стеке у вызывающей стороны. Хранить-то её где-то надо, как ни крути. > RET уничтожают аргументы а, точно, попутал. Следует читать так: "циферь показывает, на сколько увеличить указатель стека после возврата".
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
|
![]()
Ну понятно, то есть если поступает один DWORD/ский аргумент, тогда возвращаем RET4, а с RETN как быть? Какие его действия?
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
RETN==RET NEAR==в винде обычно RET [0]
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
мониторинг трафика локальных и интернет сетей | 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 |