64-разрядные функции в 32-разрядном приложении?

#c #visual-studio-2010 #64-bit #x86-64 #sse

#c #visual-studio-2010 #64-разрядный #x86-64 #sse

Вопрос:

У меня есть 32-разрядное приложение, которое я планирую запустить на 64-разрядной Windows 7.

На данном этапе я не могу преобразовать все приложение в 64-разрядное из-за зависимостей от сторонних функций.

Тем не менее, я хотел бы иметь доступ к регистрам xmm9-xmm15 в моих оптимизациях SSE, а также использовать дополнительные регистры, которые 64-разрядные процессоры предоставляют в целом при выполнении моего приложения.

Возможно ли этого достичь с помощью какого-либо флага компилятора?

Комментарии:

1. Приставал к упомянутой третьей стороне по поводу 64-разрядных компонентов.

2. Я не понимаю вашего комментария.

Ответ №1:

Мне кажется, что лучшим способом было бы разделить вашу программу на более чем один исполняемый файл. EXE-файл, скомпилированный как 64-разрядный, может взаимодействовать с другим 32-разрядным EXE-файлом, использующим 32-разрядную стороннюю библиотеку DLL, которая вам нужна. У вас будут некоторые накладные расходы на обмен данными, и вам придется реализовать запуск / остановку зависимого процесса, но у вас будет понятная архитектура программы.

Если вы разрабатываете собственное приложение на C , вы можете реализовать второй EXE-файл, например, как объект вне процесса COM (LocalServer или даже LocalService). Вы можете рассмотреть способ реализации COM-сервера на C # (смотрите здесь). Иногда такой способ может упростить реализацию, и вы можете использовать преимущества обоих .Сетевое и собственное программирование.

Комментарии:

1. То есть вы, по сути, говорите «не надо» 🙂

2. @Дружелюбный Кларк Кант: Что вы имеете в виду, говоря «не»? В реальном времени есть не только черное и белое. У Ронага возникла проблема, и он попросил совета по вопросу «что ему следует делать в данной ситуации?» Я ответил, какой способ я предпочитаю.

3. Конечно, я просто шучу с вами. И я бы предположил, что ваше решение в большинстве ситуаций является лучшим. Зачем делать что-то странное, когда можно решить проблему чем-то обычным. (Но иногда мне нравятся странные решения, просто потому, что они разные.)

4. @Дружелюбный Кларк Кант: ХОРОШО! Я вас абсолютно понимаю.

Ответ №2:

Да, вы можете. Смотрите этот пример, как это сделать.

Как указал Кристофер, этот метод не всегда будет работать, но для этой конкретной цели, чтобы перейти к нескольким строкам ручной сборки и использовать больше регистров, затем поместить результат куда-нибудь, а затем вернуться к 32-разрядному режиму, это должно сработать просто отлично.

Комментарии:

1. Спасибо. Этот пример, похоже, предназначен для Linux? И я не совсем понимаю этот синтаксис встроенной сборки. Не могли бы вы очистить?

2. Введение в синтаксис AT / T: sig9.com/articles/att-syntax Кроме того, я предположил, что тот же метод будет работать и в Windows, но, конечно, я могу ошибаться. @ronag

3. Это может частично работать в Windows. Но вы не можете выполнить произвольный код, который не знает ограничений. У вас возникнут проблемы с обработкой исключений, SEH и C . У вас возникнут проблемы с вызовом кода режима ядра, потому что код режима ядра будет просматривать процесс, чтобы выяснить, как использовать переданные данные.

4. Насколько я знаю, WOW64 обнуляет некоторые регистры SSE в системных вызовах (в то время как Win32 игнорирует их). Кроме того, Win32, конечно же, не сохраняет их содержимое во время переключения задач (просто потому, что на 32-разрядном процессоре такого официально не существует). Вы уверены, что это вообще может работать?

5. @Damon, я думаю, если бы регистры сохранялись вручную между системными вызовами.