【发布时间】:2013-08-09 12:22:46
【问题描述】:
我知道这是操纵堆栈的大事,但我认为这对我来说将是一个很好的教训。 我搜索了互联网,我发现了调用约定。我知道它是如何工作的以及为什么。我想模拟一些“Callee clean-up stack”也许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
【问题讨论】:
-
在你的
Call函数的情况下,你有什么理由不能定义一个像typedef double (__fastcall *binaryop)(int, int);这样的新类型并将其用于p? -
Win64 甚至有
fastcall吗?我的印象是只有一个 Windows 64 位调用约定,这是“一种”fastcall,因为它在寄存器中传递 args 1..4,但它绝对不同于传统的 32 位 Windowsfastcall。你是说你试图从 64 位代码中调用 32 位代码,即实现你自己的“thunking”?