Создание класса c ++ в сборке x86 (32-битной) (передача класса c ++ путем копирования в метод в сборке) - PullRequest
2 голосов
/ 02 апреля 2011

В моем проекте, помимо прочего, я должен вызвать метод c ++ из сборки и передать класс путем копирования. Было бы довольно просто, если бы я мог передать это по ссылке, но я не могу.

Я предполагаю, что это будет выглядеть примерно так: создать новый экземпляр указанного класса; скопировать атрибуты класса в атрибуты нового класса; поместите указатель на новый класс в стек; вызвать метод; вызвать деструктор класса, который является копией другого класса.

Итак, реальный вопрос в том, как создать экземпляр класса, созданного в c ++ в сборке?

Большое спасибо всем заранее.

Редактировать: я работаю с gcc на ПК x86 с питанием от Fedora 14.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2011

Создание объекта класса мало чем отличается от создания обычной переменной стека.Вам просто нужно вызвать конструктор (copy-).
Вы создаете пространство в стеке для объекта локального класса, помещаете объект в стек для создания копии (в качестве аргумента для копии ctor), передаетеадрес локального пространства 1) и, наконец, вызовите конструктор копирования класса, который вы хотите создать.
Затем просто поместите этот локальный объект в стек и вызовите вашу функцию.После этого вы снова передаете адрес своего локального объекта 1) и вызываете деструктор.
Как точно написать код, который зависит от вашей платформы / архитектуры.

1) Регистр ecx используется для передачи указателя this на MSVC.GCC передает this как скрытый первый параметр.Различия суммируются здесь .Знайте это только для архитектуры x86, но не для других, извините.

4 голосов
/ 02 апреля 2011

Все, что связано со сборкой, зависит от процессора и платформы, для которой вы пишете.

Самый безопасный способ сделать то, что вы просите, - это выделить место в стеке для нового объекта класса и сгенерировать вызов конструктора копирования класса.

Общий ответ: создание экземпляра класса C ++ включает генерацию вызова конструктора.

Это не кажется самым практичным упражнением ... обычно сборка используется в C ++, а не наоборот, через ключевое слово asm. В редких исключениях используется простой уровень интерфейса C (через extern "C"), а не двоичный интерфейс приложения C ++.

...