我知道这是操纵堆栈的大事,但我认为这对我来说将是一个很好的教训。我搜索了互联网,我发现了调用约定。我知道它是如何工作的以及为什么。我想模拟一些“被调用者清理堆栈”可能是stdcall,fastcall没关系,重要的是谁清理堆栈,那么我将有更少的工作要做:)
例如。我在 C 中有函数
double __fastcall Add(int a, int b) {
return a + b;
}
会是凯莉
我有指向这个函数的指针,类型为 void*,
void* p = reinterpreted_cast<void*>(Add);
我有函数调用者
void Call(void* p, int a, int b) {
//some code about push and pop arg
//some code about save p into register
//some code about move 'p' into CPU to call this function manually
//some code about take of from stack/maybe register the output from function
}
就是这样,当我使用调用约定“Calle clean-up”时它很有帮助,因为我不需要
//some code about cleans-up this mess
我不知道该怎么做,我知道它可以用汇编程序来完成。但我害怕它,我从不“接触”这种语言。我会很高兴用 C 模拟那个调用,但是当任何人都可以用 ASM 做它时,我会很高兴 :)
我还告诉了我想用它做什么,当我知道如何手动调用函数时,我将能够使用多个参数(如果我知道它的数量和大小)和任何类型的函数来调用函数。因此,当该函数符合正确的调用约定时,我将能够以任何语言调用任何函数。
我正在使用 Windows OS x64 和 MinGw