Доступ к члену класса C ++ во встроенной сборке - PullRequest
1 голос
/ 03 января 2011

Вопрос: Как получить доступ к переменной-члену в сборке из класса, отличного от POD?


Разработка:

Я написал несколько встроенных ассемблерных кодов для функции-члена класса, но мне не хватает того, как получить доступ к переменным-членам класса.Я пробовал макрос offsetof , но это не POD класс.

Текущее решение, которое я использую, заключается в назначении указателя из глобальной области видимости переменной-члену, но этогрязное решение, и я надеялся, что есть что-то лучшее, о чем я не знаю.

note: Я использую компилятор G ++.Решение с синтаксисом Intel Asm было бы неплохо, но я возьму что угодно.

пример того, что я хочу сделать (синтаксис Intel):

class SomeClass
{
  int* var_j;
  void set4(void)
  {
    asm("mov var_j, 4"); // sets pointer SomeClass::var_j to address "4"
  }
};

текущее хакерское решение:

int* global_j;
class SomeClass
{
  int* var_j;
  void set4(void)
  {
    asm("mov global_j, 4"); // sets pointer global_j to address "4"
    var_j = global_j;       // copy it back to member variable :(
  }
};

Это грубые примеры, но я думаю, что они понимают суть.

Ответы [ 2 ]

6 голосов
/ 03 января 2011

Это все, что вам нужно:

__asm__ __volatile__ ("movl $4,%[v]" : [v] "+m" (var_j)) ;

Отредактировано, чтобы добавить: Ассемблер принимает синтаксис Intel, но компилятор не знает его, поэтому этот прием не будет работать с использованием синтаксиса Intel (в любом случае, не с g ++ 4.4.0).

3 голосов
/ 03 января 2011
class SomeClass
{
  int* var_j;
  void set4(void)
  {
    __asm__ __volatile__("movl $4, (%0,%1)"
:
: "r"(this), "r"((char*)&var_j-(char*)this)
:
);
  }
};

Это может также работать, сохраняя вам один регистр:

    __asm__ __volatile__("movl $4, %1(%0)"
:
: "r"(this), "i"((char*)&var_j-(char*)this)
:
);

Фактически, поскольку смещение var_j относительно.this должен быть известен во время компиляции, второй вариант - путь, даже если для его работы требуется некоторая настройка.(У меня сейчас нет доступа к системе g ++, поэтому я оставлю это на ваше усмотрение.)

И никогда не стоит недооценивать важность __volatile__.Я потратил больше времени на то, чтобы отследить ошибки, которые появились из-за того, что я пропустил ключевое слово volatile, и компилятор взял на себя обязанность делать странные вещи с моей сборкой.

...