Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将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 - Fatal编程技术网

将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可能不会被关闭。