我想在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语句。
非常感谢您提供的一些意见!
答案 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文档。