[英]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.