D7:使用asm 32位stdcall调用proc后读取var参数

问题描述 投票:0回答:2

您好,使用下面的代码通过asm调用函数,并在调用后读取结果。很好现在,-如何阅读论点之后发生的变化,最好的问候

//push arguments:
  for i:=lst.cnt downto 0 do begin //reverse order
   ia:=longword(lst.fList^[i]);
   asm push ia end;   //push 32-Bit argument
  end;
  asm
   call proc     //call the routine
   mov ia, eax   //get result right after the call
  end;
//how to read variable arguments here ?

编辑:

即使使用循环,初始代码也已经运行了一段时间而没有任何问题。当我不得不像这样调用winapi例程时,出现了此问题的原因:

function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; stdcall;
external user32 name 'GetWindowRect';

它已声明了一个可变记录参数“ lpRect”(大小:16个字节)。我试图在调用之前(推送)这4个整数,然后在调用之后读取它们。将仅传递指针指向在这种情况下实际工作的数据。

delphi dll x86 inline-assembly function-call
2个回答
3
投票

如果按值传递参数,则list.fList^[i]包含指向该值的指针。

仅取消引用并使用它,例如PInteger(list.fList^[i])^表示通过引用传递的整数参数(作为var)。

但是请注意,您的代码非常糟糕,并且在循环中使用push的风险很大。它还需要遵循调用约定-使用默认Delphi寄存器定义的proc函数将其第一个参数传递给eax / ecx / edx。检查this reference material-您的问题似乎表明您对其工作方式有些困惑。


0
投票

结论:因此,没有这样的变量变量参数,只有指向值或记录的指针。感谢您的任何投入,帮助您得出了这一结论:)

© www.soinside.com 2019 - 2024. All rights reserved.