как загрузить (переместить) переменную класса в регистр процессора - PullRequest
0 голосов
/ 18 апреля 2011

Я хотел бы загрузить значение типа int, определенное как член класса, в регистр eax cpu.smt как это:

class x
{
    int a;

    x() { a=5; }

    do_stuff()
    {
        __asm
        {
            mov eax, a; // mov a varbiale content into register
        };
    }
};

как я могу сделать это с любой переменной в любом классе?спасибо ...

Ответы [ 3 ]

1 голос
/ 18 апреля 2011

Если вы используете gcc или icc, это именно то, что вы хотите:

class x
{
    int a;

    x() { a=5; }

    do_stuff()
    {
        asm("mov %0, %%eax; // mov a varbiale content into register \n"
            :
            : "r" (a)
            : "%eax"
           );


    }
};

Объяснение ограничений rgister и списков клоббера в http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html, если вы все еще заинтересованы. На MS VC я бы не рекомендовал использовать встроенную сборку, потому что компилятор MS плохо умеет смешивать встроенные и сгенерированные ассемблеры и приводит к большим накладным расходам.

1 голос
/ 18 апреля 2011

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

Поскольку компилятор всегда должен предполагать худшее, когда дело доходит до чтения данных из памяти, онможет быть вынужден прочитать значение из члена класса несколько раз, несмотря на то, что вы знаете, что значение не изменилось.

Например, в приведенном ниже коде функции do_stuff, компилятор не может предположить, что значение mX остается неизменным по вызову foo().Следовательно, нельзя помещать его в регистр процессора.

int glob;
int glob2;
void foo();

class Test
{
public:
  Test(int x) : mX(x) { }
  void do_stuff();
private:
  int mX;
};


void Test::do_stuff()
{
  glob = mX;
  foo();
  glob2 = mX;
}

С другой стороны, в следующем случае исходный код записывается так, что tmp не может изменить функциювызовите, так что компилятор может безопасно поместить его в регистр.

void Test::do_stuff()
{
  int tmp = mX;
  glob = tmp;
  foo();
  glob2 = tmp;
}

Когда дело доходит до встроенного ассемблера, я настоятельно рекомендую вам не использовать его.При внедрении C ++ ситуация еще хуже, поскольку базовое представление объекта класса не так просто, как представление структуры C (которое должно быть размещено в памяти точно так, как объявлено).Это означает, что небольшое изменение в классе или переход на более новый компилятор может нарушить ваш код.

0 голосов
/ 21 апреля 2011

Вам необходимо получить адрес экземпляра класса «x», с которым вы работаете (mov eax, this), и смещение «a» относительно начала «x» (смещение макроса).

Намного проще, если вы просто добавите «a» или «& a» в качестве параметра функции do_stuff ().

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