Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 07.10.2023
Сообщений: 11

Коррекция стека с помощью RET вместо POP

07.10.2023, 15:49. Показов 1176. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем здравствуйте!
Ковыряю ассемблер под Windows, в качестве ассемблера использую MASM32
Вопрос по коррекции стека при выходе из оконной процедуры
В примере простейшего приложения из книги Пирогова при входе в оконную процедуру регистры EBP, EBX, ESI, EDI сохраняются в стек (инструкциями PUSH), а при выходе из неё - извлекаются из стека (инструкциями POP). Я решил сократить программу, и вместо POP использовать RET с коррекцией стека. Но это приводит к аварийному завершению программы.
Было:
Assembler
1
2
3
4
5
6
7
WMCREATE:
    MOV EAX, 0
    POP EBP
    POP EBX
    POP ESI
    POP EDI
    RET 16
Стало:
Assembler
1
2
3
WMCREATE:
    MOV EAX, 0
    RET 32
Ну, вроде бы при удалении 4-х инструкций POP в стеке остается лишние 4 слова, т.е. 16 байт. Вместо прежней коррекции на 16 байт (это аргументы оконной процедуры) делаю коррекцию на 32 байта (аргументы оконной процедуры и сохраненные в стеке четыре регистра). Но программа при запуске завершается аварийно.
Я проверил, при обработке конкретно этого сообщения WM_CREATE никаких действий с регистрами EBP, EBX, ESI и EDI не производится, т.е. никакие API-функции не вызываются управление возвращается с тем же содержимым. На всякий пожарный я даже пробовал при входе сохранять регистры в буферные переменные и перед выходом восстанавливать их (всё с помощью MOV). Но после сборки программы она перестаёт запускаться. Не могу понять, что не так.
Зато даже при замене RET 16 на RET 20 программа запускается нормально:
Assembler
1
2
3
4
5
6
7
WMCREATE:
    MOV EAX, 0
    POP EBP
    POP EBX
    POP ESI
    POP EDI
    RET 20
Не могу понять, что я делаю не так, и что вообще с коррекцией стека в Windows происходит, если даже при неправильной коррекции стека программа запускается нормально.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2023, 15:49
Ответы с готовыми решениями:

С помощью этих функций, а также функции Pop из задания Dynamic12, извлечь из исходного стека пять элементов и вывести их значения
помогите кто может и у кого есть эта програ))) Dynamic13. Дан указатель P1 на вершину стека. Используя тип TStack (см. задание...

Masm 32, как получить последнее значение записанное в стек с помощью esp, а не с помощью POP
Здравствуйте. В регистр esp вроде должен быть записан адрес последнего, что добавлено в стек. Я хочу извлечь значение из стека, по этому...

Реализация своего pop() для стека
#include <iostream> #include <cstdlib> namespace s21 { template <class T> class stack { public: ...

4
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16364 / 7677 / 1078
Регистрация: 11.11.2010
Сообщений: 13,743
07.10.2023, 16:10
BluntCoder,
сохранять EBP, EBX, ESI и EDI в стеке, а потом восстанавливать их из стека нужно лишь в том случае, если в процедуре используются EBP, EBX, ESI и EDI. Не используйте эти регистры, тогда не нужно будет их помещать в стек и извлекать их оттуда. Пользуйтесь глобальными или локальными процедурами
0
1 / 1 / 0
Регистрация: 07.10.2023
Сообщений: 11
07.10.2023, 16:31  [ТС]
Ну, вообще-то вопрос не в этом. А в логике работы ассемблера. Что не так? Почему RET 32 не срабатывает так, как ожидается?
А что такое локальные и глобальные процедуры? Имелись в виду переменные?
0
650 / 159 / 63
Регистрация: 08.04.2015
Сообщений: 402
07.10.2023, 16:31
Лучший ответ Сообщение было отмечено BluntCoder как решение

Решение

Цитата Сообщение от BluntCoder Посмотреть сообщение
программа при запуске завершается аварийно
ESP до и после вызова у вас один и тот же, но возвращаетесь не туда, откуда был вызов.


Цитата Сообщение от BluntCoder Посмотреть сообщение
при замене RET 16 на RET 20 программа запускается нормально
Возвращаетесь туда, откуда был вызов, но стек нарушен. Поведение программы зависит от того, что происходит после возврата. При определённых обстоятельствах ошибка нарушения стека может не проявиться.
1
1 / 1 / 0
Регистрация: 07.10.2023
Сообщений: 11
07.10.2023, 16:39  [ТС]
UnknownSoldier, ыыы, я понял! При вызове CALL в стек кладётся адрес возврата, он и оказывается в стеке после всех параметров, про него-то я и забыл. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2023, 16:39
Помогаю со студенческими работами здесь

Реализация стека процедур Push и Pop
Реализация стека процедур Push и Pop. help

Удалить последний элемент стека (pop). Динамическая память
Нужно сделать процедуру для удаления последнего элемента стека. Сколько ни пытался, не получается. Стек реализую на основе односвязного...

Реализовать операции добавления (push) и удаления (pop) элемента из стека
дать стек строковых значений, для реализации используя односвязные списки. Реализовать операции добавления (push) и удаления (pop) ...

Удалить из стека n элементов, начиная с k. Используя pop, push и временный стэк
Доброго времени суток. Имеется класс, описывающий стек на основе односвязного списка с головой. Всего две функции-члена: pop и push. ...

Создать стек целочисленных значений. Реализовать операции добавления (push) и удаления (pop) элемента из стека
Создать стек целочисленных значений. Реализовать операции добавления (push) и удаления (pop) элемента из стека. Добавьте в стек числа 4, 3,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
Dapper - лучший среди микроORM под C#
UnmanagedCoder 09.06.2025
Знаете, в мире ORM-инструментов для . NET существует негласная иерархия. На вершине массивных фреймворков возвышается Entity Framework - неповоротливый, но всемогущий. А в категории легковесных. . .
Сравнение GCC 14 и Clang 18 компиляторов C для HPC
bytestream 08.06.2025
В высокопроизводительных вычислениях (HPC) выбор компилятора - это ход, способный радикально изменить производительность всей системы. Работая последние 15 лет с критическими HPC-системами, я видел. . .
Всё о конфигурации ASP.NET Core
stackOverflow 08.06.2025
Старый добрый web. config, похоже, отправился на пенсию вместе с классическим ASP. NET. За годы работы с различными проектами я убедился, что хорошо организованная конфигурация – это половина успеха. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »