![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |||
Пользователь
Регистрация: 10.12.2011
Сообщений: 26
|
![]()
Доброго дня.
Хотелось бы поделиться одним замечанием, мыслью, наблюдением, моей непоняткой ( нужное подчеркнуть). Касается вопроса о Соглашении вызова функций (в том числе вызов функций API) при 64 программировании. А именно Выравнивание стека. Относится к коду примера из книги «Программирование на ассемблере на платформе х86-64» автор Руслан Аблязов. К коду примера 64 битной программы в теме «Особенности кодинга под x64» по адресу FAQ для раздела Assembler, MASM, TASM И одному утверждению murderer в теме «Особенности кодинга под x64» по адресу FAQ для раздела Assembler, MASM, TASM Пара отступлений: 1. Долгое время меня этот вопрос волновал слабо в виду того что пользовал программу FASM Editor 2.0 где были забиты основные болванки под прожки (64/32/16, окна/консоль-мансоль) от которых я собственно отталкивался не напрягая себя знаниями по поводу того зачем все эти закорючки вначале и в конце. А тут вдруг решил углубиться. Ну и углубился... 2. Изучение мною ассемблера носит бессистемный характер и протекает под девизом Быдлокодерство как высшая форма рукоблудства. Поэтому на истину не претендую. 3. Отсылка к примеру из книги Аблязова носит условный характер в виду того что скачена была мной в интернетах под этим названием. Является ли она таковой на самом деле ручаться не берусь. 4. Рассматриваемые мной примеры условно считались как примеры программ под Windows и проверялись на Windows 7. Компилировались при помощи FASM Теперь к сути Цитата:
Цитата:
Код:
А это место навеяло грусть Цитата:
В коде исходника тоже всё как то для меня сложилось уныло. Фрагменты Аблязов Код:
Продолжение ниже (не влезло в 5000 символов)
Меня постоянно преследуют умные мысли, но я быстрее!
|
|||
![]() |
![]() |
![]() |
#2 | |
Пользователь
Регистрация: 10.12.2011
Сообщений: 26
|
![]()
Mikl___
Код:
Отчаялся бы я совершенно на ниве самообразования если бы не два обстоятельства - Гугл и Пирогов. Захожу я через первы в ЖЖ ко второму и что я вижу?! А вижу я рабочий код, внятное пояснение почему он рабочий, а так же понимание того почему всё что сверху мной приведено нихрена не работало. Цитирую Пирогова Цитата:
Код:
Обратите внимание, что в нашем случае стек с учетом адреса возврата при вызове функции оказывается выровненным на величину кратную 16 (48 байт). После этого собственно так же появилось понимание того за каким хреном в болванке программы на 64 бита от FASM Editor стоит строчка sub rsp,8 Потому что если верить IDA pro макрос invoke FASMa не равняет стек под 16 байтовую кратность с учётом адреса возврата вызываемой функции. Срезюмирую. Выравнивать стек с кратностью 16 нужно не перед вызовом функции, а с учётом вызова, т.е. перед вызовом он как раз таки не должен быть кратен 16, но кратен 8. Тогда при вызове функции адрес возврата в аккурат его подравняет. З.Ы. Столпы апологеты, сильно не пинайте. Хотел внести ясность прежде всего для себя. В чём не прав укажите. Если конечно кто то это кирпич текста осилит.
Меня постоянно преследуют умные мысли, но я быстрее!
|
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Полный 30h,
алаверды! У меня 64-разрядная профессиональная Windows 7 и Intel Pentium CPU G860 3.00GHz пакет masm64 с набором lib- и inc-файлов для создания 64-разрядных приложений на ассемблере скачан с сайта http://dsmhelp.narod.ru/environment.htm, ml64 и link выдернуты из Windows Driver Kits Version 7.1.0 (WDK), содержимое папки masm64\bin Код:
Код:
Код:
внутренности msgbox.ехе через hiew32 Код:
P.P.S. Лучше читать не меня (Криса Касперски/Руслана Аблязова/ murderer'a), а статью Мэтта Питрека "Everything You Need To Know To Start Programming 64-Bit Windows Systems" ("Все, что нужно знать, чтобы начать программировать для 64-разрядных версий Windows") и msdn (Программные соглашения x64) Последний раз редактировалось Mikl___; 19.12.2014 в 11:38. |
![]() |
![]() |
![]() |
#4 | |
Пользователь
Регистрация: 10.12.2011
Сообщений: 26
|
![]()
Вопрос снят.
1. У меня с головой всё в порядке. По ссылке из твоей ссылки нашёл Цитата:
![]() 3. MASM макрос invoce для 64 бит не выделяет сам стек и не возвращает его после функции - фи!
Меня постоянно преследуют умные мысли, но я быстрее!
Последний раз редактировалось Полный 30h; 19.12.2014 в 12:16. |
|
![]() |
![]() |
![]() |
#5 | ||
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Полный 30h,
Цитата:
Цитата:
![]() |
||
![]() |
![]() |
![]() |
#6 | |
Пользователь
Регистрация: 10.12.2011
Сообщений: 26
|
![]()
Mikl___
Цитата:
Лучше ответь мне на вот такой вопрос. Макросы (конкретно для FASM) это вообще к чему в плане программирования относится? В MASM смотрю вообще с ними уныло, даже стек самому выделять приходится. Реально вообще написать следующее. Ставлю макрос условно Start и Stop а он во всех функциях между ними ищет функцию с самым большим кол-вом параметров, соответственно вместо Start просаживает на это число стек (с учётом 16n+8), а в самих включённых invoke только параметры распихивает, а стек не просаживает и не возвращает?
Меня постоянно преследуют умные мысли, но я быстрее!
|
|
![]() |
![]() |
![]() |
#7 | |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]() Цитата:
Код:
Код:
Код:
Код:
Для упрощения использования операций в файле ksamd64.inc определен набор макросов, которые можно использовать для создания типичных прологов и эпилогов процедур. Код:
Код:
Последний раз редактировалось Mikl___; 19.12.2014 в 15:38. |
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
дурацкое ограничение в 5000 символов
![]() Вывод: хочешь нормальную программу -- пиши макросы самостоятельно ![]() |
![]() |
![]() |
![]() |
#9 | ||
Пользователь
Регистрация: 10.12.2011
Сообщений: 26
|
![]() Цитата:
Цитата:
Меня постоянно преследуют умные мысли, но я быстрее!
|
||
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Полный 30h,
в моём учебнике целая глава, будет здорово, если еще и на вопросы в конце главы ответишь... |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Delphi: аппроксимация функций методом базиса из финитных функций | Denna | Помощь студентам | 1 | 12.03.2012 19:23 |
Лицензионное соглашение Photoshop CS4 | VistaSV30 | Софт | 5 | 13.12.2009 10:21 |
Соглашение о кодировании .NET | SunKnight | Общие вопросы .NET | 3 | 08.11.2009 19:01 |
Лицензионное соглашение... | Jupiter | Свободное общение | 18 | 03.05.2009 10:39 |
использование функций в качестве параметров других функций | mono | Помощь студентам | 0 | 20.04.2009 18:25 |