Mic*_*ine 3 c++ delphi assembly visual-studio visual-c++
我有一个用Visual C++ 2012编写的程序,我试图调用用Delphi编写的函数(我没有源代码).这是Visual C++中的代码:
int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D;
test((void *)0x12345678);
Run Code Online (Sandbox Code Playgroud)
但在编译的代码中它实际上是:
.text:1000113B mov eax, 489A7Dh
.text:10001140 mov ecx, 12345678h
.text:10001145 call eax
Run Code Online (Sandbox Code Playgroud)
我除外的是:
.text:1000113B mov ebx, 489A7Dh
.text:10001140 mov eax, 12345678h
.text:10001145 call ebx
Run Code Online (Sandbox Code Playgroud)
我知道'fastcall'使用EAX,ECX,EDX作为参数,但我不知道为什么Visual C++编译器使用EAX作为入口点.EAX不应该是第一个参数(12345678h)吗?
我试图在汇编代码中调用delphi函数并且它可以工作,但我真的想知道如何在不使用汇编的情况下执行此操作.
那么可以让Visual C++编译器生成代码,就像我说的那样吗?如果是的话,怎么做?
Dav*_*nan 12
在x86上,Delphi的寄存器调用约定(也称为Borland fastcall)按顺序使用EAX,EDX和ECX寄存器.
但是,Microsoft的fastcall调用约定使用不同的寄存器.它根本不使用EAX.相反,它使用ECX和EDX寄存器作为前两个参数,如文档所述.
因此,使用该信息,您可以编写一些汇编register程序,通过将参数移动到EAX寄存器中来从C++ 进行Delphi 函数调用.但是,让Delphi编译器更容易实现这一点.特别是当我想象你的真正问题涉及多个功能而不仅仅是一个参数.
我建议你写一些Pascal代码来适应stdcall和register.
function FuncRegister(param: Pointer): Integer; register; external '...';
function FuncStdcall(param: Pointer): Integer; stdcall;
begin
Result := FuncRegister(param);
end;
exports
FuncStdcall;
Run Code Online (Sandbox Code Playgroud)
然后你可以FuncStdcall从你的C++代码调用,让Delphi编译器处理参数传递.
| 归档时间: |
|
| 查看次数: |
3648 次 |
| 最近记录: |