1 / 1 / 0
Регистрация: 07.10.2023
Сообщений: 11
|
||||||||||||||||
Коррекция стека с помощью RET вместо POP07.10.2023, 15:49. Показов 1176. Ответов 4
Всем здравствуйте!
Ковыряю ассемблер под Windows, в качестве ассемблера использую MASM32 Вопрос по коррекции стека при выходе из оконной процедуры В примере простейшего приложения из книги Пирогова при входе в оконную процедуру регистры EBP, EBX, ESI, EDI сохраняются в стек (инструкциями PUSH), а при выходе из неё - извлекаются из стека (инструкциями POP). Я решил сократить программу, и вместо POP использовать RET с коррекцией стека. Но это приводит к аварийному завершению программы. Было:
Я проверил, при обработке конкретно этого сообщения WM_CREATE никаких действий с регистрами EBP, EBX, ESI и EDI не производится, т.е. никакие API-функции не вызываются управление возвращается с тем же содержимым. На всякий пожарный я даже пробовал при входе сохранять регистры в буферные переменные и перед выходом восстанавливать их (всё с помощью MOV). Но после сборки программы она перестаёт запускаться. Не могу понять, что не так. Зато даже при замене RET 16 на RET 20 программа запускается нормально:
0
|
07.10.2023, 15:49 | |
Ответы с готовыми решениями:
4
С помощью этих функций, а также функции Pop из задания Dynamic12, извлечь из исходного стека пять элементов и вывести их значения Masm 32, как получить последнее значение записанное в стек с помощью esp, а не с помощью POP Реализация своего pop() для стека |
Ушел с форума
![]() ![]() 16364 / 7677 / 1078
Регистрация: 11.11.2010
Сообщений: 13,743
|
|
07.10.2023, 16:10 | |
BluntCoder,
сохранять EBP, EBX, ESI и EDI в стеке, а потом восстанавливать их из стека нужно лишь в том случае, если в процедуре используются EBP, EBX, ESI и EDI. Не используйте эти регистры, тогда не нужно будет их помещать в стек и извлекать их оттуда. Пользуйтесь глобальными или локальными процедурами
0
|
650 / 159 / 63
Регистрация: 08.04.2015
Сообщений: 402
|
|||
07.10.2023, 16:31 | |||
![]() Решение
1
|
1 / 1 / 0
Регистрация: 07.10.2023
Сообщений: 11
|
|
07.10.2023, 16:39 [ТС] | |
UnknownSoldier, ыыы, я понял! При вызове CALL в стек кладётся адрес возврата, он и оказывается в стеке после всех параметров, про него-то я и забыл. Спасибо!
0
|
07.10.2023, 16:39 | |
Помогаю со студенческими работами здесь
5
Реализация стека процедур Push и Pop Удалить последний элемент стека (pop). Динамическая память Реализовать операции добавления (push) и удаления (pop) элемента из стека Удалить из стека n элементов, начиная с k. Используя pop, push и временный стэк Создать стек целочисленных значений. Реализовать операции добавления (push) и удаления (pop) элемента из стека Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
![]() |
||||
Повышаем производительность игры на 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. За годы работы с различными проектами я убедился, что хорошо организованная конфигурация – это половина успеха. . .
|