2

我想在 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 指定哪个寄存器,以便随后将结果与 assemly 例程之后的最后一个 printf 语句一起打印。

非常感谢您的意见!

4

2 回答 2

0

调用约定可能取决于操作系统。我认为是 Solaris。谷歌搜索system v application binary interface sparc,PDF 很容易找到。

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

于 2010-07-15T14:51:49.870 回答
0

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

于 2010-08-04T10:33:09.890 回答