Могу ли я сделать метод C ++ во внешней сборке (function.asm)? - PullRequest
0 голосов
/ 24 февраля 2019

Я пишу программу, которая требует одной функции в сборке.Было бы очень полезно инкапсулировать функцию ассемблера в класс C ++, поэтому его собственные данные изолированы, и я могу создать несколько экземпляров.

Если я создаю класс и вызываю внешнюю функцию из метода C ++,функция реентерабельна, даже если она имеет свой собственный стек и локальные «переменные» в кадре стека.

Есть ли какой-нибудь способ сделать функцию сборки методом C ++, возможно, с использованием искажения имен, поэтому функция реализована всборка, но прототип объявлен внутри класса C ++?

Если это невозможно, есть ли способ создать несколько (динамически) экземпляров функции сборки, хотя она не является частью класса?Что-то вроде клонирования функции в памяти и просто ее вызова, очевидно, с использованием перемещаемого кода (добавление дельта-смещения для переменных и данных, если требуется) ...

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я пишу программу, для которой требуется одна функция в сборке.

Тогда, по определению, ваша программа станет намного менее переносной .И зависит от соглашений о вызовах и ABI вашей реализации C ++ и вашей операционной системы.

Тогда было бы согласованно использовать некоторые специфические функции компилятора (которые не являютсяв переносном стандарте C ++ 11, например, в n3337 ).

Тогда я рекомендую воспользоваться расширенной сборкой GCC .Прочитайте главу о , используя язык ассемблера с C (это также, и, конечно, относится к C ++).

Путем непосредственного встраивания некоторых расширенных asm в функцию-член C ++, вы избегаетехлопоты , вызывающие некоторую функцию.Возможно, ваш ассемблерный код очень короткий и выполняется быстро.Поэтому лучше встраивать его в функции C или C ++, избегая затрат на пролог и эпилог вызова функций.

Примечание: в 2019 году нет экономического смысла тратить усилия на написание большого ассемблерного кода: большая часть оптимизациикомпиляторы производят лучший ассемблерный код, чем разумный программист (в разумные сроки).Таким образом, у вас есть стимул использовать маленькие фрагменты кода ассемблера в больших функциях C ++ или C.

0 голосов
/ 24 февраля 2019

Да, вы можете.Либо определите его как встроенную оболочку, которая передает все аргументы (включая неявный указатель this) во внешнюю функцию, либо определите распределение имен, чтобы определить правильный символ для точки входа функции в asm.

Пример способа обертки:

extern "C" int asm_function(myclass *p, int a, double b);

class myclass {

    int q, r, member_array[4];
    my_method(int a, double b) { return asm_function(this, a, b); }
 };

Автономное определение my_method для x86-64 будет просто jmp asm_function, tailcall, потому что аргументы идентичны.Таким образом, после встраивания у вас будет call asm_function вместо call _Zmyclass_mymethodZd или что-то еще из фактического искажения имени.(Я сделал это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...