Вопрос

Я опубликовал этот вопрос на 28xx DSP-форуме TI но не услышал ответа и подумал, что, возможно, кто-то здесь может знать.


Я знаю, как писать функции в ассемблере, чтобы их можно было вызывать на C;если вызываемое на C имя равно foo() затем присваивается имя функции сборки _foo().

Что, если я хочу использовать C ++ и оптимизировать метод класса в сборке?Как мне это сделать?Я предполагаю, что единственными серьезными проблемами являются:

  • присвоение имен
  • доступ к указателю "this"
  • доступ к членам класса путем каким-то образом знания смещений

и если я не хочу беспокоиться о последних двух, то, возможно, я бы написал статическую функцию-член и сделал это:

class MyClass
{
  int x;
  static int _doSomething(int u); // implement this in assembly
public:
  inline void doSomething() { x = _doSomething(x); } 
  // lightweight C++ wrapper to handle the class member / "this" pointer stuff
};
Это было полезно?

Решение

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

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

Если вам действительно не нужно воспроизвести функцию C ++ in situ, я бы, вероятно, просто создал стандартную функцию C и выполнил обычное extern "C" { ... } вокруг его декларации.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top