1

我有一个非常简单的问题。我想编写一些直接在单个寄存器上运行的汇编代码(用于 SPARC),称为 %o1。我想做的就是用零初始化这个寄存器,然后用一些立即数递增它。问题是,如何从 C 应用程序以 %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 以便它可以打印在控制台上。

4

2 回答 2

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");
于 2011-03-10T13:52:16.020 回答
0

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

int a __asm("%o1")__ = 78;
于 2011-03-10T16:02:06.180 回答