我想在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语句一起打印出来。
非常感谢你的一些意见!
发布于 2010-07-15 22:51:50
调用约定可能取决于操作系统。我猜想是Solaris。谷歌system v application binary interface sparc,这是很容易找到的。
完整的内联汇编程序文档隐藏在SunStudio PDF中的某个地方,并不容易找到。官方上也可以通过man -s 1 inline访问,不过在我的系统上,我必须手动打开文件。在手册页中,查找“用于SPARC系统的编码约定”。
发布于 2010-08-04 18:33:10
在Solaris上,参数通过寄存器%o0传递到%o5,然后通过堆栈传递。如果被调用的函数是叶函数(即它不调用另一个函数),则寄存器窗口不会向前移动,并且该函数通过%o0到%o5直接访问它们。如果寄存器窗口移动,则函数可通过%i0至%i5寄存器访问参数。返回值通过被调用者中的%i0返回,在调用者中变为%o0。对于浮点参数,它们是通过FP寄存器处理的,但在那里,您必须读取Dummy00001指向的文档。
https://stackoverflow.com/questions/3256119
复制相似问题