Регистр процессора - Ассоциация переменных приложения - PullRequest
1 голос
/ 10 марта 2011

У меня очень простая проблема. Я хочу написать некоторый ассемблерный код (для SPARC), который напрямую работает с одним регистром, называемым% o1. Все, что я хочу сделать, это инициализировать этот регистр с нуля, а затем увеличить его с некоторыми непосредственными значениями. Проблема в том, как вывести результат в% o1 из C-приложения. У меня скелет выглядит так:

  void main()
  {
    int a;  

    asm volatile (
        ".text\n\t"
          "mov 0, %o1                   \n\t"
        "add %o1, 1,  %o1             \n\t"
        "add %o1, 2,  %o1             \n\t"
        "add %o1, 3,  %o1             \n\t"
    );    

    // assign content of register %o1 somehow to variable a (a = %o1);

    printf("%i\n", a);
  }

Так что вопрос в том, как мне присвоить значение% o1 (которое должно быть 6 к концу расчет) в переменную а, чтобы ее можно было распечатать на консоли.

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Это зависит от компилятора.Для gcc: http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

void main()
{
  int a;  

  asm(
    "mov 0, %0                   \n\t"
    "add %0, 1,  %0             \n\t"
    "add %0, 2,  %0             \n\t"
    "add %0, 3,  %0             \n\t"
    : "=r"(a)
  );    

  printf("%i\n", a);
}

Обновление: похоже, что gcc не позволяет выбирать определенные регистры в SPARC.Для этого есть другое расширение: http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html

register int a asm ("o1");
0 голосов
/ 10 марта 2011

Это сильно зависит от вашего компилятора (который вы нам не сказали), посмотрите его документацию.Для gcc синтаксис будет примерно таким:

int a __asm("%o1")__ = 78;
...