我正在尝试将一些代码从 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/