0

我想简单地将一个变量从程序集传递给 C 并将 C 传递给程序集。

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

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

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

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

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

组装菜鸟!

4

1 回答 1

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;
}

不,我不确定你为什么要对一堆角度的正弦求和,但希望你明白这一点。我还没有尝试过,所以可能angles[i]需要在 asm 之前将值复制到本地浮点变量中 - 试试看。


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

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

于 2012-07-18T15:12:30.677 回答