【发布时间】:2013-03-11 15:06:30
【问题描述】:
我有一个用 Visual C++ 2012 编写的程序,我试图调用一个用 Delphi 编写的函数(我没有源代码)。下面是 Visual C++ 中的代码:
int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D;
test((void *)0x12345678);
但在编译后的代码中它实际上是:
.text:1000113B mov eax, 489A7Dh
.text:10001140 mov ecx, 12345678h
.text:10001145 call eax
我所例外的是:
.text:1000113B mov ebx, 489A7Dh
.text:10001140 mov eax, 12345678h
.text:10001145 call ebx
我知道“fastcall”使用 EAX、ECX、EDX 作为参数,但我不知道为什么 Visual C++ 编译器使用 EAX 作为入口点。 EAX不应该是第一个参数(12345678h)吗?
我尝试在汇编代码中调用 delphi 函数并且它可以工作,但我真的很想知道如何在不使用汇编的情况下做到这一点。
那么是否可以让 Visual C++ 编译器生成我所例外的代码?如果是,该怎么做?
【问题讨论】:
-
我认为您需要将它与另一个封装原始但使用 _stdcall 公开的 Delphi 函数桥接。
-
@DavidHeffernan 我指的是 en.wikipedia.org/wiki/X86_calling_conventions ,我看到有多个约定称为“fastcall”,所以我称之为“pascal”。我修改了标题。很抱歉给您带来不便。
-
@PlasmaHH 是的,微软的 fastcall 与 EAX 无关。我想做的是 Borland/Embarcadero 的快速呼叫。不知道有没有可能
-
@MickeyShine:所以当你知道 ms fastcall 不是你想要的,你为什么期望它表现得像你想要的那样?
标签: c++ visual-studio delphi visual-c++ assembly