TI DSP: сопряжение с C ++ и сборка - PullRequest
4 голосов
/ 11 января 2010

Я разместил этот вопрос на форуме DSP 28xx от 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
};

Ответы [ 3 ]

5 голосов
/ 11 января 2010

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

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

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

1 голос
/ 11 января 2010

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

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

0 голосов
/ 11 января 2010

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

...