繁体   English   中英

Sparc过程调用约定

[英]Sparc Procedure Call Conventions

我想在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语句中。

非常感谢您的投入!

调用约定可能取决于OS。 我认为是Solaris。 Google for system v application binary interface sparc ,很容易找到PDF。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM