D7:在使用 asm 32 位 stdcall 调用 proc 后读取可变参数
D7: Read var-arguments after call proc with asm 32-bit stdcall
您好,使用下面的代码通过 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 个整数,然后在通话后读取它们。结果 只是将指针 传递给在这种情况下实际工作的数据。
结论:所以不存在变量参数,只有指向值或记录的指针。感谢任何有助于得出这个结论的意见
如果按值传递参数,则 list.fList^[i]
包含指向该值的指针。
只需取消引用并使用它,例如 PInteger(list.fList^[i])^
用于通过引用传递的整数参数(如 var
)。
但是请注意,您的代码非常糟糕,在循环中使用 push 是非常危险的。它还需要遵循调用约定——使用默认 Delphi 寄存器定义的 proc
函数将其第一个参数传递给 eax/ecx/edx。检查 this reference material - 你的问题似乎表明你对它的工作原理有点困惑。
您好,使用下面的代码通过 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 个整数,然后在通话后读取它们。结果 只是将指针 传递给在这种情况下实际工作的数据。
结论:所以不存在变量参数,只有指向值或记录的指针。感谢任何有助于得出这个结论的意见
如果按值传递参数,则 list.fList^[i]
包含指向该值的指针。
只需取消引用并使用它,例如 PInteger(list.fList^[i])^
用于通过引用传递的整数参数(如 var
)。
但是请注意,您的代码非常糟糕,在循环中使用 push 是非常危险的。它还需要遵循调用约定——使用默认 Delphi 寄存器定义的 proc
函数将其第一个参数传递给 eax/ecx/edx。检查 this reference material - 你的问题似乎表明你对它的工作原理有点困惑。