Ivan Ivanov 83 Ответов: 1

компиляторы 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 (Если вы думаете, что это невозможно, я был бы рад, если бы вы сказали мне, почему :) )

И извините за пролонгацию ТК!!

1 Ответов

Рейтинг:
6

Dave Kreskowiak

Удачи!

Вы будете писать свой собственный x64 ASM-компилятор. Для всего, что вам нужно, я бы начал с запроса информации. Будьте готовы к 6-месячной работе только в области исследований и разработок.

Вы будете писать для этого не одну статью в CP,а целую серию.