|
Эксперт быдлокодинга
2095 / 529 / 70
Регистрация: 04.11.2010
Сообщений: 1,314
|
||||||||||||||||||||||||||||||
Соглашение о вызове функций (выравнивание стека)13.12.2014, 19:08. Показов 28008. Ответов 30
Метки нет (Все метки)
Доброго дня.
Хотелось бы поделиться одним замечанием, мыслью, наблюдением, моей непоняткой ( нужное подчеркнуть). Касается вопроса о Соглашении вызова функций (в том числе вызов функций API) при 64 программировании. А именно Выравнивание стека. Относится к коду примера из книги «Программирование на ассемблере на платформе х86-64» автор Руслан Аблязов. К коду примера 64 битной программы в теме «Особенности кодинга под x64» по адресу https://www.cyberforum.ru/post5087633.html И одному утверждению murderer в теме «Особенности кодинга под x64» по адресу https://www.cyberforum.ru/post5083982.html Пара отступлений: 1. Долгое время меня этот вопрос волновал слабо в виду того что пользовал программу FASM Editor 2.0 где были забиты основные болванки под прожки (64/32/16, окна/консоль-мансоль) от которых я собственно отталкивался не напрягая себя знаниями по поводу того зачем все эти закорючки вначале и в конце. А тут вдруг решил углубиться. Ну и углубился... 2. Изучение мною ассемблера носит бессистемный характер и протекает под девизом Быдлокодерство как высшая форма рукоблудства. Поэтому на истину не претендую. 3. Отсылка к примеру из книги Аблязова носит условный характер в виду того что скачена была мной в интернетах под этим названием. Является ли она таковой на самом деле ручаться не берусь. 4. Рассматриваемые мной примеры условно считались как примеры программ под Windows и проверялись на Windows 7. Компилировались при помощи FASM Теперь к сути
А это место навеяло грусть
В коде исходника тоже всё как то для меня сложилось уныло. Фрагменты Аблязов
Mikl___
Отчаялся бы я совершенно на ниве самообразования если бы не два обстоятельства - Гугл и Пирогов. Захожу я через первы в ЖЖ ко второму и что я вижу?! А вижу я рабочий код, внятное пояснение почему он рабочий, а так же понимание того почему всё что сверху мной приведено нихрена не работало. Цитирую Пирогова
Обратите внимание, что в нашем случае стек с учетом адреса возврата при вызове функции оказывается выровненным на величину кратную 16 (48 байт). После этого собственно так же появилось понимание того за каким хреном в болванке программы на 64 бита от FASM Editor стоит строчка sub rsp,8 Потому что если верить IDA pro макрос invoke FASMa не равняет стек под 16 байтовую кратность
.code:0000000000402008 mov rcx, 0 ; hWnd .code:000000000040200F mov rdx, offset Text ; lpText .code:0000000000402016 mov r8, offset Text ; lpCaption .code:000000000040201D mov r9, 0 ; uType .code:0000000000402024 call cs:MessageBoxA .code:000000000040202A add rsp, 20h Срезюмирую. Выравнивать стек с кратностью 16 нужно не перед вызовом функции, а с учётом вызова, т.е. перед вызовом он как раз таки не должен быть кратен 16, но кратен 8. Тогда при вызове функции адрес возврата в аккурат его подравняет. З.Ы. Столпы апологеты, сильно не пинайте. Хотел внести ясность прежде всего для себя. В чём не прав укажите. Если конечно кто то это кирпич текста осилит.
4
|
||||||||||||||||||||||||||||||
| 13.12.2014, 19:08 | |
|
Ответы с готовыми решениями:
30
Соглашение о вызове фукции Calling convention (Соглашение о вызове) c# |
|
Эксперт быдлокодинга
2095 / 529 / 70
Регистрация: 04.11.2010
Сообщений: 1,314
|
||
| 27.03.2015, 00:51 [ТС] | ||
|
0
|
||
|
Модератор
2623 / 760 / 164
Регистрация: 10.06.2009
Сообщений: 2,989
|
|
| 27.03.2015, 01:50 | |
|
[SPOILER"offtop"]kernel32.dll, ntdll.dll в папке system32 все x64
kernel32.dll, ntdll.dll в папке SysWOW64 все x32 папка system для 16bit[/SPOILER] После выполнения программа проверяется на правильность завершения. Написано уже очень много в винде, а она всё толще и толще.
0
|
|
|
Ушел с форума
|
||||||||
| 27.03.2015, 09:19 | ||||||||
|
Windows 7 x64, консольное приложение:
то при запуске программа падает, до ExitProcess дело не доходит.
1
|
||||||||
|
Эксперт быдлокодинга
2095 / 529 / 70
Регистрация: 04.11.2010
Сообщений: 1,314
|
|
| 27.03.2015, 11:07 [ТС] | |
|
0
|
|
|
Ушел с форума
|
||
| 27.03.2015, 11:40 | ||
|
это "волшебство" проявляется. У меня, например, на 64-битной Windows Server 2003 R2 падает на CreateRemoteThread на невыровненном стеке (генерируется исключение в nt!ExRaiseDataTypeMisalignment), а тот же код на Windows 7 работает нормально.
0
|
||
|
Эксперт быдлокодинга
2095 / 529 / 70
Регистрация: 04.11.2010
Сообщений: 1,314
|
||
| 27.03.2015, 12:37 [ТС] | ||
|
0
|
||
|
Модератор
2623 / 760 / 164
Регистрация: 10.06.2009
Сообщений: 2,989
|
||||||
| 27.03.2015, 16:34 | ||||||
|
Данное шаманство работает если мы не обращаемся к стеку.
FASM WriteConsole+MessageBox WINDOWS_CUI/GUI
~enter 20h, 0h~ и ~leave~ И никакого шаманства нету)
0
|
||||||
|
Ушел с форума
|
|
| 27.03.2015, 16:57 | |
|
0
|
|
|
Модератор
2623 / 760 / 164
Регистрация: 10.06.2009
Сообщений: 2,989
|
|
| 27.03.2015, 18:20 | |
|
0
|
|
|
Ушел с форума
|
|
| 27.03.2015, 19:21 | |
|
Вот что значит долго не писать на ассемблере !
Я уже подумал, что enter/leave - это какие-то макросы FASM-а и хотел глянуть, какой ассемблерный код будет сгенерирован ![]() А так все верно, enter в данном случае ведь все равно выравнивает RSP по границе 16 байт. Так что шаманства действительно нету...
0
|
|
|
Модератор
2623 / 760 / 164
Регистрация: 10.06.2009
Сообщений: 2,989
|
||
| 31.03.2015, 10:36 | ||
0
|
||
| 31.03.2015, 10:36 | |
|
Переполнение стека при первом же вызове функции Переполнение стека при вызове функции из Dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|