此问题在此处已有答案:
Is it safe or portable in any way (across compilers, platforms, libc implementations etc.) to PUSH extra args in inline asm before a C function call?(2个答案)
21天前关闭。
我有一个非常奇怪的问题。我的目标是用C语言编写面向对象的程序。为此,一个常见的方法是在一个结构体中定义函数指针,并将对调用结构体的显式引用定义为第一个参数:
struct Point {
int x;
int y;
int (*sum)(struct Point* p);
};
int sum(struct Point* p) {
return p->x + p->y;
}
int main() {
struct Point p;
p.sum = ∑
p.sum(&p);
}
但是,我想知道是否可以在没有额外的struct Point*
参数的情况下执行此操作。
为此,我需要操作堆栈(可能通过内联汇编)以获得对p
的引用,然后可以在sum
内部访问该引用。
我目前的想法是在函数调用之前声明一个附加的局部变量,该变量包含对结构的引用
void* ptr = &p;
然后将此值压入堆栈
__asm__("push %rax\n");
但是我不知道如何访问sum函数中的pushed值。我在x86上使用GCC。
1条答案
按热度按时间xkrw2x1b1#
感谢您的意见。经过一点
gdb
调试,我能够弄清楚:我需要将偏移量
16
添加到我的rbp
中,以获得存储在我的pr
变量中的地址。对于那些想知道我为什么要这样做的人:这只是出于好奇,也是一个大学项目的一部分。我从来没有在生产代码中这样做过,因为它真的很脆弱,本质上是无用的。我只是想实现一个“真正的”面向对象的机制,就像Python中的
self
参数被隐式地传递给函数一样。