我想简单地将一个变量从汇编传递到C和C到汇编。
问题是我不想使用固定内存寻址(IE。将值放在特定位置,然后使用指针访问该特定位置)。
我最初认为我可以使用寄存器,但总共只有16个!我可能有超过16个值,我想要传递。
所以我能想到的下一件事就是将值推到堆栈上。但这是否意味着我必须使用内联汇编来访问它?像这样的东西:
asm ( assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
还有其他方法可以解决这个问题吗?任何人都可以给我一个非常简单的例子,把东西放在堆栈上,然后用C代码访问它吗?
装配Noob!
答案 0 :(得分:4)
你能声明一个普通的C函数,从C调用它,并允许编译器自动处理参数(根据你的本地约定)?
如果是这样,你只需使用asm
实现该函数,并直接引用命名的C参数列表变量。
例如,使用68881的fsinx指令:
float my_fsinx(float angle)
{
float result;
asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
return result;
}
此示例基于GCC Extended Asm文档,您可以在其中找到更多示例。
现在根据评论扩展,通过一个简单的指针处理可变数量的参数。伯爵...
float my_fsinx_sum(float *angles, int num_angles)
{
float result, sum;
int i;
for (i=0, sum=0; i < num_angles; ++i)
{
asm ("fsinx %1,%0" : "=f" (result) : "f" (angles[i]));
sum += result;
}
return sum;
}
不,我不确定你为什么要总结一堆角度的正弦,但希望你能得到这个想法。我没有试过这个,所以有可能需要在asm之前将angles[i]
值复制到本地float变量中 - 尝试并查看。
您也可以使用变量参数列表函数,但这有点复杂。如果没有关于你想要完成什么的更多细节和你已经尝试过的东西,我无法猜测哪个更好。
编辑 - 好的,现在我已经看到你上面的评论,你绝对不想要一个变量参数列表函数:那些仍然在调用站点硬编码的参数。