Sparc程序调用约定

时间:2010-07-15 13:46:59

标签: c assembly sparc

我想在Sparc中进行一些“内联”汇编编程,我想知道如何通过寄存器传递来实现这一点。

最好用一个小例子解释我的问题

int main()
{
   int a = 5;
   int b = 6;
   int res;

   asm_addition(a,b);

   printf("Result: %d\n", res);
   return(0);
}
  // My assembler addition

.global asm_addition            

.align  4   

    add rs1, rs2, rd
    restore

有谁知道我必须使用哪些寄存器才能添加值a和b?最后,我需要为rd指定哪个寄存器,以便随后将结果打印到装配例程之后的最后一个printf语句。

非常感谢您提供的一些意见!

2 个答案:

答案 0 :(得分:0)

调用约定可能取决于操作系统。我推测Solaris。谷歌的system v application binary interface sparc,PDF很容易找到。

完整的内联汇编程序文档隐藏在SunStudio PDF文件中,并不容易找到。正式地它也可以通过man -s 1 inline访问,但在我的系统上我必须手动打开文件。在手册页中,查找“SPARC系统的编码约定”。

答案 1 :(得分:0)

在Solaris上,参数通过寄存器%o0传递到%o5然后通过堆栈传递。如果被调用函数是叶函数(即它不调用另一个函数),则寄存器窗口不会向前移动,函数会直接通过%o0到%o5访问它们。如果移动寄存器窗口,则该功能可以通过%i0至%i5寄存器访问参数。返回值通过被调用者中的%i0以相同的方式变为调用者中的%o0。 对于浮点参数,它们通过FP寄存器处理,但您必须阅读指向的Dummy00001文档。