Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать консольное приложение Windows x64? 
:(
    Опции темы
ТарасАтавин
Дата 3.9.2013, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Я начинающий компиляторописака. С чего начинать создание приложения на ASM и в опкоде и изучение вопроса? Надо ли вообще раскладывать регистры по сегментам и как? Как это выглядит в коде исполняемого файла? Каким образом возвращается значение при завершении приложения? Как получить доступ к параметрам функции 
Код
int main (int argc, char *argv[])
 (содержащей точку входа)? Как указать точку входа на ассемблере и в коде исполняемого файла? Как организован стек в Windows-приложении x64? Как на низком уровне организован консольный ввод/вывод? Надо ли специально регистрировать экспортируемые функции в GetProcAdress? И как?


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 3.9.2013, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(ТарасАтавин @  3.9.2013,  17:49 Найти цитируемый пост)
(содержащей точку входа)? 

Начнем с того что это не так. main - это библиотечная функция, которая вызывается после всяких инициализаций.
Консольный ввод/вывод так же выполняется библиотечными функциями обертками, которые в свою очередь могут использовать WinAPi.

С такими вопросами тебе рановато "компиляторописательством" заниматься ИМХО.

Добавлено через 9 минут и 43 секунды
http://board.flatassembler.net/topic.php?t=3437

Это сообщение отредактировал(а) _zorn_ - 3.9.2013, 10:12
PM MAIL   Вверх
bems
Дата 3.9.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(ТарасАтавин @  3.9.2013,  09:49 Найти цитируемый пост)
Каким образом возвращается значение при завершении приложения?
передаётся параметром в ExitProcess, которую должен вызвать рантайм (не компилятор)

Цитата(ТарасАтавин @  3.9.2013,  09:49 Найти цитируемый пост)
Как указать точку входа на ассемблере и в коде исполняемого файла?
в экзешнике - поле AddressOfEntryPoint опционального заголовка РЕ

Цитата(ТарасАтавин @  3.9.2013,  09:49 Найти цитируемый пост)
Как на низком уровне организован консольный ввод/вывод?
с точки зрения прикладного процесса - вызовами API ReadFile/WriteFile

Цитата(ТарасАтавин @  3.9.2013,  09:49 Найти цитируемый пост)
Надо ли специально регистрировать экспортируемые функции в GetProcAdress? И как? 
создать секцию экспорта, в соответствии с описанием формата РЕ





--------------------
Обижено школьников: 8
PM MAIL   Вверх
ТарасАтавин
Дата 4.9.2013, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(_zorn_ @  3.9.2013,  10:08 Найти цитируемый пост)
Начнем с того что это не так. main - это библиотечная функция
Бред. Автор консольной проги функцию main пишет сам.


Это сообщение отредактировал(а) ТарасАтавин - 4.9.2013, 08:11


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 4.9.2013, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(ТарасАтавин @ 4.9.2013,  16:09)
Бред. Автор консольной проги функцию main пишет сам.

Бред. Автор консольной проги НА АСМЕ может назначить точку входа куда угодно, даже не на функцию.
И почитайте про PE формат хотя бы.
PM MAIL   Вверх
ТарасАтавин
Дата 4.9.2013, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(_zorn_ @  3.9.2013,  10:08 Найти цитируемый пост)
которая вызывается после всяких инициализаций.
Возможно это так на низком уровне c++-программы. Но если нет глобальных объектов, то первая явная (прописанная на высоком уровне) операция находится в main, отсюда иное понимание точки входа у крестанутых. Хорошо, пусть на самом деле это не так. А что отвечает за инициализации? Система? Или ещё одна подпрограмма приложения? В первом случае точка входа всё таки в main и к разрабатываемому компилятору это относится вне зависимости от наличия глобальных объектов, так как вызов глобальных конструкторов он, в отличие от компиляторов c++, должен неявно добавить в main. А во втором случае на что она вообще похожа?

Добавлено через 3 минуты и 10 секунд
Цитата(bems @  3.9.2013,  10:28 Найти цитируемый пост)
передаётся параметром в ExitProcess
А на уровне операций это как выглядит? 
Цитата(bems @  3.9.2013,  10:28 Найти цитируемый пост)
которую должен вызвать рантайм (не компилятор)
 Специфично ли это именно для c/c++? А на паскале как возвращается значение?


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 4.9.2013, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



В прошлый раз не правильно выразился. main - функция вызываемая ИЗ библиотечных функций инициализации. Которые в свою очередь и подготавливают параметры для main.
PM MAIL   Вверх
ТарасАтавин
Дата 4.9.2013, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(bems @  3.9.2013,  10:28 Найти цитируемый пост)
с точки зрения прикладного процесса - вызовами API ReadFile/WriteFile
А при чем здесь файлы? Клавиатурный ввод с командной строки и вывод на экран. Потоки std::cin и std::cout, а не std::ifstream s1 и std::ofstream s2. Или имеется ввиду фиктивный файл CON, или как его там ещё?

Добавлено через 1 минуту и 46 секунд
Цитата(_zorn_ @  4.9.2013,  08:18 Найти цитируемый пост)
Бред. Автор консольной проги НА АСМЕ может назначить точку входа куда угодно, даже не на функцию.
И почитайте про PE формат хотя бы. 
Речь о компилируемых программах и правилах языка высокого уровня.



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 4.9.2013, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(ТарасАтавин @  4.9.2013,  16:25 Найти цитируемый пост)
А что отвечает за инициализации? Система? Или ещё одна подпрограмма приложения?

Компилятор. Вернее скорее линкер - это типа стаба. 
На что это похоже можешь посмотреть в той же IDA перейдя на entrypoint

Цитата(ТарасАтавин @  4.9.2013,  16:25 Найти цитируемый пост)
А на уровне операций это как выглядит? 

Код

push 0
call ExitProccess

PM MAIL   Вверх
ТарасАтавин
Дата 4.9.2013, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(_zorn_ @  3.9.2013,  10:08 Найти цитируемый пост)
Консольный ввод/вывод так же выполняется библиотечными функциями обертками, которые в свою очередь могут использовать WinAPi.
Библиотечные функции для перегруженных операторов, о которых в языке явно сказано, что они инлайнятся? Однако. Ни каких библиотек, вызовы API требуется встроить по месту. Какие?

Добавлено через 46 секунд
Цитата(bems @  3.9.2013,  10:28 Найти цитируемый пост)
в экзешнике - поле AddressOfEntryPoint опционального заголовка РЕ
А где бы почитать описание формата заголовка PE?

Добавлено через 1 минуту и 54 секунды
Цитата(_zorn_ @  4.9.2013,  08:35 Найти цитируемый пост)
 IDA перейдя на entrypoint
Что это?



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 4.9.2013, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(ТарасАтавин @  4.9.2013,  16:32 Найти цитируемый пост)
Потоки std::cin и std::cout, а не std::ifstream s1 и std::ofstream s2.

Всякие библиотечные функи/рантаймы/пёс с горы. На что фантазии хватит у разработчика языка/компилятора
В твоем примере это STL

PM MAIL   Вверх
ТарасАтавин
Дата 4.9.2013, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



И регистры по сегментам надо раскладывать?


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 4.9.2013, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(ТарасАтавин @  4.9.2013,  16:41 Найти цитируемый пост)
И регистры по сегментам надо раскладывать? 

Что что ?

Начни с простого
http://ru.wikipedia.org/wiki/Portable_Executable

IDA - https://www.hex-rays.com/products/ida/suppo...load_demo.shtml
Понадобится для х64 (полная), сам найдёш.

PM MAIL   Вверх
ТарасАтавин
Дата 4.9.2013, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(_zorn_ @  4.9.2013,  08:40 Найти цитируемый пост)
Всякие библиотечные функи/рантаймы/пёс с горы. На что фантазии хватит у разработчика языка/компилятора В твоем примере это STL
Разрабатываемый компилятор не может, встретив перегруженный оператор, в том числе оператор потокового вывода, или потокового ввода, поставить вызов библиотечной функции, а должен встроить копию её тела по месту, вызов же должен быть сразу в API. Это требование, можете считать, что стандарта. К тому же её ещё надо написать. Какой именно нужен вызов API? Дан адрес нуль-терминальной строки в кодировке ANSI, требуется вывести её на экран. Что следует вызвать? Как зовут функцию? Где мне взять её адрес и как вызвать? Какие у неё параметры? Как они передаются? Через стек? Или через регистры? Какой параметр через какой регистр передаётся? Какова семантика каждого параметра?


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
_zorn_
Дата 4.9.2013, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Батенька, да вам пока еще из msdn рано вылазить.
А так на вскидку первое что пришло в голову.
http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

Добавлено через 9 минут и 26 секунд
Для вызова функции есть секция импорта (читай про PE формат, БЛДЖАД)
А на остальные вопросы, есть такое страшное словосочетание - конвенция вызовов  smile 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.1599 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.