| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Windows/Dos > Как создать консольное приложение Windows x64? |
| Автор: ТарасАтавин 3.9.2013, 09:49 | ||
Я начинающий компиляторописака. С чего начинать создание приложения на ASM и в опкоде и изучение вопроса? Надо ли вообще раскладывать регистры по сегментам и как? Как это выглядит в коде исполняемого файла? Каким образом возвращается значение при завершении приложения? Как получить доступ к параметрам функции
|
| Автор: _zorn_ 3.9.2013, 10:08 |
Начнем с того что это не так. main - это библиотечная функция, которая вызывается после всяких инициализаций. Консольный ввод/вывод так же выполняется библиотечными функциями обертками, которые в свою очередь могут использовать WinAPi. С такими вопросами тебе рановато "компиляторописательством" заниматься ИМХО. Добавлено через 9 минут и 43 секунды http://board.flatassembler.net/topic.php?t=3437 |
| Автор: ТарасАтавин 4.9.2013, 08:09 |
| Бред. Автор консольной проги функцию main пишет сам. |
| Автор: _zorn_ 4.9.2013, 08:18 | ||
Бред. Автор консольной проги НА АСМЕ может назначить точку входа куда угодно, даже не на функцию. И почитайте про PE формат хотя бы. |
| Автор: ТарасАтавин 4.9.2013, 08:25 |
| Возможно это так на низком уровне c++-программы. Но если нет глобальных объектов, то первая явная (прописанная на высоком уровне) операция находится в main, отсюда иное понимание точки входа у крестанутых. Хорошо, пусть на самом деле это не так. А что отвечает за инициализации? Система? Или ещё одна подпрограмма приложения? В первом случае точка входа всё таки в main и к разрабатываемому компилятору это относится вне зависимости от наличия глобальных объектов, так как вызов глобальных конструкторов он, в отличие от компиляторов c++, должен неявно добавить в main. А во втором случае на что она вообще похожа? Добавлено через 3 минуты и 10 секунд А на уровне операций это как выглядит? Специфично ли это именно для c/c++? А на паскале как возвращается значение? |
| Автор: _zorn_ 4.9.2013, 08:30 |
| В прошлый раз не правильно выразился. main - функция вызываемая ИЗ библиотечных функций инициализации. Которые в свою очередь и подготавливают параметры для main. |
| Автор: ТарасАтавин 4.9.2013, 08:32 | ||||
Добавлено через 1 минуту и 46 секунд
|
| Автор: _zorn_ 4.9.2013, 08:35 | ||||
Компилятор. Вернее скорее линкер - это типа стаба. На что это похоже можешь посмотреть в той же IDA перейдя на entrypoint
|
| Автор: ТарасАтавин 4.9.2013, 08:37 | ||
Добавлено через 46 секунд А где бы почитать описание формата заголовка PE? Добавлено через 1 минуту и 54 секунды Что это? |
| Автор: _zorn_ 4.9.2013, 08:40 | ||
Всякие библиотечные функи/рантаймы/пёс с горы. На что фантазии хватит у разработчика языка/компилятора В твоем примере это STL |
| Автор: ТарасАтавин 4.9.2013, 08:41 |
| И регистры по сегментам надо раскладывать? |
| Автор: _zorn_ 4.9.2013, 08:51 |
Что что ? Начни с простого http://ru.wikipedia.org/wiki/Portable_Executable IDA - https://www.hex-rays.com/products/ida/support/download_demo.shtml Понадобится для х64 (полная), сам найдёш. |
| Автор: ТарасАтавин 4.9.2013, 08:52 |
| Разрабатываемый компилятор не может, встретив перегруженный оператор, в том числе оператор потокового вывода, или потокового ввода, поставить вызов библиотечной функции, а должен встроить копию её тела по месту, вызов же должен быть сразу в API. Это требование, можете считать, что стандарта. К тому же её ещё надо написать. Какой именно нужен вызов API? Дан адрес нуль-терминальной строки в кодировке ANSI, требуется вывести её на экран. Что следует вызвать? Как зовут функцию? Где мне взять её адрес и как вызвать? Какие у неё параметры? Как они передаются? Через стек? Или через регистры? Какой параметр через какой регистр передаётся? Какова семантика каждого параметра? |
| Автор: _zorn_ 4.9.2013, 08:58 |
| Батенька, да вам пока еще из msdn рано вылазить. А так на вскидку первое что пришло в голову. http://msdn.microsoft.com/en-us/library/windows/desktop/ms687401%28v=vs.85%29.aspx Добавлено через 9 минут и 26 секунд Для вызова функции есть секция импорта (читай про PE формат, БЛДЖАД) А на остальные вопросы, есть такое страшное словосочетание - http://ru.wikipedia.org/wiki/%D1%EE%E3%EB%E0%F8%E5%ED%E8%E5_%E2%FB%E7%EE%E2%E0 |
| Автор: bems 4.9.2013, 10:35 | ||||
как на уровне oпераций выглядит передача параметра в функцию зависит от конвенции вызова. на х64 используется регистр, место в стеке всё равно резервируется (с выравниванием) и делается call
и на паскале ExitProcess потому что win api един
http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx ты бы для начала написал компилятор какого-нить простого языка, хоть бы бейсика, для опыта. а то с плюсами ты завязнешь на 15 лет, и так ничего и не сделаешь |
| Автор: LeonidPr 5.9.2013, 12:43 | ||
Разложу ваши вопросы, которые вы задали в первом посте в куче по пунктам и попробую ответить
1. Начинать с написания кода на языке ассемблер как ни странно. В опкодах писать не советую- ибо тяжко (на то компиляторы/ассемблеры и нужны). Изучение начинать с курса по компиляторам (на Intuit вроде есть), книг по компиляторам, этапов компиляции (Лексический анализ, синтаксический анализ, кодогенерация+оптимизация) книга Дракона вам в руки + статьи по этому делу 2. Регистры по сегментам??? вы о чем? адресное пространство вроде как плоское... 3. Читайте доки по формату PE, там все разжевано (книжка есть http://www.ozon.ru/context/detail/id/1696616/ 4. Отвечали уже - в параметре ExitProcess 5. В стеке лежат 6. В ассемблере end <точка входа> в конце .asm файла, в коде - см п.3 7. для Win 64 не программировал, но думаю, что вряд ли сильно отличается от Win32 - ESP и push/pop 8. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx 9.Нет. Если вы создаете DLL там есть секция экспорта |
| Автор: bems 5.9.2013, 15:18 | ||
ну там нет "цепочки ebp" ввод-вывод может быть перенаправлен, нельзя предполагать что стандартный вывод это всегда консоль |
| Автор: LeonidPr 5.9.2013, 15:51 | ||
Буду знать, спасибо.
Согласен. Просто вопрос был именно про консоль. |
| Автор: ТарасАтавин 7.9.2013, 13:38 | ||
| Ну как в досе: сегмент, зовут его так то, регистр у него такой то. Добавлено через 5 минут и 44 секунды
|
| Автор: bems 7.9.2013, 13:44 |
| В винде плоское адресное пространство. Исполняемый файл организован не в сегменты а в секции, адреса которых не должны быть в регистрах. Сегментные регистры используются, но подругому |
| Автор: ТарасАтавин 7.9.2013, 13:44 |
| Она системная? |
| Автор: bems 7.9.2013, 13:46 |
| да http://msdn.microsoft.com/en-us/library/windows/desktop/ms682658%28v=vs.85%29.aspx и push на х32, а на х64 другая конвенция вызова http://blogs.msdn.com/b/oldnewthing/archive/2004/01/14/58579.aspx |
| Автор: ТарасАтавин 7.9.2013, 13:47 | ||
|
| Автор: bems 7.9.2013, 13:48 | ||
|
| Автор: ТарасАтавин 7.9.2013, 13:48 |
| Я вообще не собираюсь писать ещё один компилятор плюсов. |
| Автор: bems 7.9.2013, 13:49 | ||
ну напиши Паскаля Добавлено через 16 секунд окей |
| Автор: ТарасАтавин 7.9.2013, 13:53 |
| я одним даже компилил. Но почему то в отличие от паскаля/C/C++ для него всё таки исконно преобладали интерпретаторы. Не потому ли, что сложно компилить язык, с объявлением переменной при первом присваивании, чудным присваиванием через LET, с зависимостью типа переменной от её имени и тому подобными дебрями? Добавлено @ 13:54 Я на Вирата похож? Добавлено через 3 минуты Как? И надо ли их куда то назначать и что то в них загружать? |
| Автор: bems 7.9.2013, 14:00 | ||
это не влияет на то как это компилировать, просто особенности синтаксиса
на самом деле ты похож на излишне деятельного подростка. вопросы которые ты задаешь ясно показывают что гонору у тебя больше чем знаний. Добавлено через 6 минут и 40 секунд например в х32 регистр FS указывает на TIB, соответственно используется при установке SEH-фреймов, работе с tls и тд |
| Автор: ТарасАтавин 7.9.2013, 14:34 | ||
|
| Автор: bems 7.9.2013, 14:45 |
профильных - да вот что на предложение про гонор ты ответишь у меня сомнений небыло. ты бы так рьяно отвечал в тематическом диалоге. например о том что stdout != консоль. или вот в этой теме http://forum.vingrad.ru/forum/topic-371647.html |
| Автор: ТарасАтавин 7.9.2013, 14:47 |
| А ничего, что по теме я сам назвался новичком? Но у меня достаточно знаний, чтоб самостоятельно сочинить хотябы задачу, в том числе, по теме. А способность разобраться, чтоб сделать хоть что то, у к.т.н. вряд ли может отсутствовать. Вот во времени может быть вопрос. Но я где то называл сроки? |
| Автор: bems 7.9.2013, 14:48 |
| Тарас, это снова ответ не на профильную реплику ЧТД |