当用汇编代码编写函数时,通过结构中定义的指针调用 C 中的函数计算

Invoking a function calculation in C through a pointer defined in a structure, when function is written in assembly code

我有一段代码,我想了解它是如何工作的。 SGENT_1_calc 是一个信号发生器函数,在别处写成汇编代码。当在 C 中调用计算时,sgen.calc(&sgen) 需要它自己的结构地址作为参数。为什么 ? 提前感谢您的帮助!

typedef struct {   
    unsigned int freq;
    unsigned int step_max;
    unsigned int alpha;
    int gain;
    int offset;
    int out;
    void (*calc)(void *);
    }SGENT_1;

#define SGENT_1_DEFAULTS    { 5369,
    1000,
    0,
    0x7fff,
    0,
    0,
    (void (*)(void *))SGENT_1_calc}    // pointer casted here ???


    void SGENT_1_calc(void *);  //SGENT1_calc is a signal generator function


    SGENT_1 sgen = SGENT_1_DEFAULTS; // this is an instance 

    sgen.calc(&sgen);  //don't understand how the calculation is invoked, 
                       // why it has &sgen as an argument ???

sgen.calc 是一个指向函数的指针,该函数接受一个 void * 类型的参数并且不返回任何内容。指向函数的机器代码是如何生成的是无关紧要的。在任何情况下,sgen.calcvalue 不包含有关存储该值的变量的信息,因此如果 sgen 包含要提交给函数,那么它的 calc 成员指向该函数的事实并没有提供任何绕过(指向) struct.

的方法

如果没有关于 sgen.calc 指向的函数的其他信息,指向 sgen 的指针与任何其他对象指针一样适合作为它的参数。选择那个特定的参数而不是任何其他参数本身并没有什么特别之处。

然而,事实上,可以合理地假设该函数假定其参数指向具有特定布局的数据结构。 C 代码暗示 type SGENT_1 与该布局一致。从提供的代码中无法确定该函数是否使用 structcalc 成员,但它作为最后一个成员的位置与它没有这样做是一致的。在这种情况下,它可能仅出于组织目的而包含在 C struct 中。