我有一个非常简单的问题。我想编写一些直接在单个寄存器上操作的汇编代码(对于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,以便可以在控制台上打印。
答案 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;