将C++内联汇编函数转换为Delphi内联汇编函数 int To_Asm_Fnc(dword Amem, dword Al, dword Ac) { int b = 0; asm ("push %%ecx; \ call %%eax; \ pop %%ecx;" : "=Al" (b) /* output value */ : "Al" (mem), "Ac" (Al), "d" (Ac) /* input value */ ); return b; }
这是我的德尔菲尝试将C++内联汇编函数转换为Delphi内联汇编函数 int To_Asm_Fnc(dword Amem, dword Al, dword Ac) { int b = 0; asm ("push %%ecx; \ call %%eax; \ pop %%ecx;" : "=Al" (b) /* output value */ : "Al" (mem), "Ac" (Al), "d" (Ac) /* input value */ ); return b; },c++,c,delphi,assembly,C++,C,Delphi,Assembly,这是我的德尔菲尝试 Function To_Asm_Fnc(Amem,Al,Ac:dword):Integer; var b:Integer; begin Result:=0; b:=0; //******* { i really didn't get it as in the c++ code } //******* Result:=b; end; 非常感谢似乎此函数接受指向另一个函数的指针并设置参数 function To_Asm_Fnc(Amem: Pointer; _Al, _Ac:
Function To_Asm_Fnc(Amem,Al,Ac:dword):Integer;
var
b:Integer;
begin
Result:=0;
b:=0;
//*******
{ i really didn't get it as in the c++ code }
//*******
Result:=b;
end;
非常感谢似乎此函数接受指向另一个函数的指针并设置参数
function To_Asm_Fnc(Amem: Pointer; _Al, _Ac: cardinal): integer;
asm
// x68 only!; paramateres are passed differently in x64
// inputs : "Al" (mem), "Ac" (Al), "d" (Ac) /* input value */
// amem is already in eax
// _al is passed in edx and _ac in ecx; but the code expects them reversed
xchg edx, ecx
push ecx
call eax
pop ecx
// result is already in eax and delphi returns the result in eax
// outputs : "=Al" (b) /* output value */
end;
这不是C++,这是汇编。你的C++编译器是什么?你需要知道调用约定和注册保留规则,才能了解到底。在Delphi中,你也可以使用asm关键字。这个问题太狭隘,毫无用处,不值得在网站上使用。如果你努力问一个更聪明的问题,那么它可以帮助你和其他人。例如,为什么不使用C++代码,用编译器编译它,并转储ASM列表,然后使用裸露的ASM列表来显示疯狂的宏字符串汇编程序语法在C++编译器中实际做了什么?我投票决定重新打开。我不同意票数相近的观点。我看不出这个问题有什么不对。如果这个例程所做的只是颠倒参数的顺序,那么从长远来看,不使用汇编就可以做得更好。我必须说,我不太明白您是如何辨别原始asm反转了这两个参数的。原始asm没有反转参数。代码:Ac Al,d Ac表示:将Al变量放入ecx寄存器,将Ac变量放入edx寄存器。delphi按以下顺序传递参数:eax、edx、ecx、stack;因此,为了保持函数签名相同,我们交换传递的参数。函数调用由AAMM参数化指出的另一个函数,C++编译器接受这种格式的ASM。我不认识这种语法。哦,顺便说一下+1。这是GCC,这种参数传递/映射是扩展的ASM。谢谢。FWIW,我想你的答案会受益于包含关于编译器是什么、语法是什么、参数映射是什么以及原始代码和Pascal代码的一些细节的解释。我怀疑它会得到更多的选票,Q可能不会被关闭。