处理器寄存器 - 应用变量关联

时间:2011-03-10 13:36:52

标签: c assembly inline-assembly sparc

我有一个非常简单的问题。我想编写一些直接在单个寄存器上操作的汇编代码(对于SPARC),称为%o1。我想做的就是用零初始化该寄存器,然后用一些立即值递增它。问题是,如何从C-application输出%o1中的结果。我看起来像这样的骨架:

  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) 计算)变量a,以便可以在控制台上打印。

2 个答案:

答案 0 :(得分:1)

它依赖于编译器。对于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");

答案 1 :(得分:0)

这很大程度上取决于您的编译器(您没有告诉我们),查看其文档。对于gcc,语法类似于

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