从结构调用函数(C/汇编)

标签 c assembly struct

我正在尝试将一些代码从 C 语言移植到汇编语言,但我在这里遇到了一些麻烦。在 c 函数中,我传递了一个结构。在这个结构中保存了两个这样的函数:

typedef struct sort sort_t;
struct sort {
    void *data;
    cmpfunc_t cmpfunc;
    cpyfunc_t cpyfunc;
};

在 C 代码中,这些函数是这样调用的(m 是指向结构的指针):

m->cpyfunc(m->data, j, k);

现在我正尝试在汇编中执行此操作。我已经意识到结构是按顺序保存在内存中的。因此,如果 m 存储在 %ebx 中,那么将在 4(%ebx) 中找到 cmpfunc。但是我不知道如何从程序集中调用这个函数。我已经尝试通过以下方式直接从 4(%ebx) 运行:

call    *4(%ebx)

那行不通,所以我尝试了:

movl    4(%ebx),%edx
call    *%edx

但是没有用。我似乎找不到任何方法来执行此操作,而且我尝试过的任何搜索都没有结果。我将如何在 Assembly 中执行此操作?

最佳答案

我做了一个小测试程序:

typedef void (*cpyfunc_t)(void *, int, int);
typedef void (*cmpfunc_t)(void);
struct sort {
    void *data;
    cmpfunc_t cmpfunc;
    cpyfunc_t cpyfunc;
};


int main()
{
    struct sort *m;
    int k,j;

    m->cpyfunc(m->data, j, k);
}

并用 ELLCC demo 编译.我明白了:

    .file   "/tmp/webcompile/_31142_0.c"
    .text
    .globl  main
    .align  16, 0x90
    .type   main,@function
main:                                   # @main
# BB#0:                                 # %entry
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %edi
    pushl   %esi
    subl    $32, %esp
    movl    $0, %eax
    movl    -12(%ebp), %ecx
    movl    8(%ecx), %ecx
    movl    -12(%ebp), %edx
    movl    (%edx), %edx
    movl    -20(%ebp), %esi
    movl    -16(%ebp), %edi
    movl    %edx, (%esp)
    movl    %esi, 4(%esp)
    movl    %edi, 8(%esp)
    movl    %eax, -24(%ebp)         # 4-byte Spill
    calll   *%ecx
    movl    -24(%ebp), %eax         # 4-byte Reload
    addl    $32, %esp
    popl    %esi
    popl    %edi
    popl    %ebp
    ret
.Ltmp0:
    .size   main, .Ltmp0-main


    .section    ".note.GNU-stack","",@progbits

请注意,cpyfunc 元素位于结构中的偏移量 8 处。

编辑:我确实不得不关闭优化,因为 ELLCC 编译器(基于 clang)在打开优化的情况下将函数优化为空。

关于从结构调用函数(C/汇编),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18856719/

相关文章:

c - 通过 TCP 发送结构(C 编程)

c - 如何用 C 中的结构修复无限循环

c++ - 堆栈销毁期间自动堆​​清理

c - scanf() 将换行符保留在缓冲区中

assembly - 在引导加载程序中初始化单独的 CPU 内核

c# - 使答案类成为结构?

c++ - OpenMP:无法并行化嵌套的 for 循环

c++ - CPP_TEST.exe : 0xC00000FD: Stack overflow 中 0x7604c128 处未处理的异常

c - 为什么我会通过这种无条件跳转获得 SIGSEGV?

gcc - 是否可以找到 GCC 可以生成的所有汇编指令的列表?