Создание класса C++ в сборке x86 (32-битной) (передача класса C++ путем копирования в метод в сборке)
В моем проекте, помимо прочего, я должен вызывать метод C++ из сборки и передавать класс путем копирования. Было бы довольно просто, если бы я мог передать это по ссылке, но я не могу.
Я предполагаю, что это будет выглядеть примерно так: создайте новый экземпляр указанного класса; скопировать атрибуты класса в атрибуты нового класса; поместите указатель на новый класс в стек; вызвать метод; вызвать деструктор класса, который является копией другого класса.
Таким образом, реальный вопрос заключается в том, как создать экземпляр класса, созданного в C++ в сборке?
Спасибо всем большое заранее.
Изменить: я работаю с GCC на ПК x86 Fedora 14.
2 ответа
Создание объекта класса мало чем отличается от создания обычной переменной стека. Вам просто нужно вызвать (copy-) конструктор.
Вы создаете пространство в стеке для объекта локального класса, помещаете объект в стек для создания копии (в качестве аргумента для копии ctor), передаете адрес локального пространства1) и, наконец, вызываете конструктор копирования класс, который вы хотите создать.
Затем просто поместите этот локальный объект в стек и вызовите вашу функцию. После этого вы снова передаете адрес локального объекта1) и вызываете деструктор.
Как именно кодировать, что зависит от вашей платформы / архитектуры.
1) ecx
регистр используется для передачи this
указатель на MSVC. GCC проходит this
как скрытый первый параметр. Различия суммируются здесь. Знайте это только для архитектуры x86, но не для других, извините.
Все, что связано со сборкой, зависит от процессора и платформы, для которой вы пишете.
Самый безопасный способ сделать то, что вы просите, - это выделить место в стеке для нового объекта класса и сгенерировать вызов конструктора копирования класса.
Общий ответ: создание экземпляра класса C++ включает генерацию вызова конструктора.
Это не самое практичное упражнение… обычно сборка используется в C++, а не наоборот, через asm
ключевое слово. В редких исключениях используется простой интерфейсный слой C (через extern "C"
), а не двоичный интерфейс приложения C++.