компиляторы x64 не поддерживают _ _ asm?!
Всем Привет :)
Эта тема предназначена для всех разработчиков Visual C++, которые любят ставить встроенную сборку (__asm) везде, где это уместно (и везде, где это не так :D)
Недавно я попытался портировать свои программы на x64. И я нашел хорошую статью, в которой объясняется, как включить возможности построения x64 в VS2003.
Я установил все и успешно построил приложение на основе диалога. (Что VS генерирует изначально, без изменений)
Большая проблема заключается в том, что компилятор x64 не поддерживает встроенную сборку... И у меня есть много встроенных сборок, и многие из них помещаются во встроенные функции.
Я не знаю, как это сделать, и не хочу возиться с файлами *.asm и пользовательскими сборками. Я бы хотел, чтобы мой код оставался таким, как есть. (Конечно, красиво модифицированный для платформы x64)
Я не знаю, как код, помещенный в ASM-файл, может быть встроенным. Многие из моих функций невелики, и ассемблерный код в них хорошо встроен.
Если весь этот код должен быть вызван через инструкцию вызова со всеми операциями стека, то производительность идет на .. очень жаркое место, полное дьяволов: D (не знаю, уместно ли произносить это слово :D)
А теперь у меня появилась странная идея:
- Восстановить встроенные возможности сборки Visual C++!
- Как?
Вот он метод:
1) cl.exe это компилятор x64 (Да, он имеет то же имя, что и 32-битная версия). Я переименовываю его в cl64.exe и поставил свое собственное консольное приложение под этим названием cl.exe - что это значит?
2) Мой cl.exe будет вызван IDE вместо оригинала (я очень надеюсь, что IDE сделает это легко), и IDE передаст ему параметры командной строки вместе с текущим CPP-файлом. (параметры будут переданы cl64.exe без изменений)
- Просто чтобы уточнить: насколько я знаю, IDE вызывает cl.exe для каждого CPP-файла передаем его в виде командной строки вместе с настройками. (Который вы используете для настройки в свойствах проектов)
- В свою очередь cl.exe отправляет обратную связь в IDE через поток ввода-вывода, и это то, что вы видите в окне вывода. (Ошибки, предупреждения, какой файл компилируется и т. д.) (пожалуйста, поправьте меня, если я ошибаюсь в этом).
3) Перед моим cl.exe передает файл CPP в оригинал cl64.exe для обработки он будет искать блоки _ _ asm и:
4) он сохранит ассемблерный код;
5) он сделает копию CPP-файла, где блок __asm заменяется действительным кодом C, который ничего не делает, но достаточно для того, чтобы оптимизатор не игнорировал его.
- что-то в этом роде:
int a = 0x01a2b3cd; int b = 0x432adcbf; //... int s = a + b + ... ;
Одна такая строка для каждой инструкции. Эти константы будут использованы позже. Они необходимы.
6) мой cl.exe делает допустимым ASM-файл с ассемблерным кодом, взятым из блока _ _ asm, и вызывает ml64.exe (стандартная часть платформы SDK);
7) ml64.exe переводит код и создает OBJ-файл;
8) Мой cl.exe звонки cl64.exe с копией исходного CPP-файла с замененным кодом.
9) Cl64.exe компилирует файл и создает другой OBJ-файл;
10) Мой cl.exe открывает OBJ, скомпилированный cl64.exe и находит константы, о которых я упоминал выше, в двоичном коде;
11) Мой cl.exe открывает объект, созданный ml64.exe и берет оттуда двоичный код;
12) cl.exe заменяет блок кода, содержащий константы, двоичным кодом, взятым из файла ml-OBJ
После этого файл OBJ будет готов к связыванию.
Проблемы, с которыми я сейчас сталкиваюсь, таковы:
- Я не знаю формата OBJ-файла C++. Мне это нужно для поиска констант. Это неоднозначная задача. (Я нашел кое-какую информацию об этом, но лучше всего будет обсудить ее и здесь)
- Формат инструкций x64. Мне нужно знать, что такое двоичный формат инструкции, такой как mov REG, constant.
- Кроме того, если вы можете получить некоторые другие вещи, которые могут быть проблематичными, пожалуйста, обсудите их здесь :)
Спасибо за ваше внимание :)
Если я сделаю это, я опубликую статью здесь, в CodeProject, со всем включенным проектом и тестовыми заметками о том, как он работает с VS2003 и VS2008, а также объяснением, как сделать VS2003 для сборки x64-приложений.
Пожалуйста, Не стреляйте в меня, если эта идея покажется вам слишком нелепой! :D (Если вы думаете, что это невозможно, я был бы рад, если бы вы сказали мне, почему :) )
И извините за пролонгацию ТК!!