将值从Assembly传递给C.

时间:2012-07-18 15:00:14

标签: c gcc assembly arm

我想简单地将一个变量从汇编传递到C和C到汇编。

问题是我不想使用固定内存寻址(IE。将值放在特定位置,然后使用指针访问该特定位置)。

我最初认为我可以使用寄存器,但总共只有16个!我可能有超过16个值,我想要传递。

所以我能想到的下一件事就是将值推到堆栈上。但这是否意味着我必须使用内联汇编来访问它?像这样的东西:

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );

还有其他方法可以解决这个问题吗?任何人都可以给我一个非常简单的例子,把东西放在堆栈上,然后用C代码访问它吗?

装配Noob!

1 个答案:

答案 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变量中 - 尝试并查看。


您也可以使用变量参数列表函数,但这有点复杂。如果没有关于你想要完成什么的更多细节你已经尝试过的东西,我无法猜测哪个更好。

编辑 - 好的,现在我已经看到你上面的评论,你绝对不想要一个变量参数列表函数:那些仍然在调用站点硬编码的参数。