Function CallFunc(Address: PtrUInt; Arg: Array of PtrUInt; isCDecl: Boolean = True): PtrUInt;
{$ASMMODE INTEL}
begin
if (isCDecl) then
asm
mov ecx, 3 //loop 3 times.
mov edx, Arg
@@start:
dec ecx
push dword ptr[edx + ecx * 4] //push 3 pointers onto the stack.
jnz @@start
call [Address]
//Do cleanup
mov ecx, 3
@@end:
dec ecx
pop dword ptr[edx + ecx * 4] //pop each pointer off the stack.
jnz @@end
mov @Result, eax
end;
end;
但是,清理时我遇到了段错误。如果我不从堆栈中弹出参数,则不会发生段错误。
在这种情况下,我是否需要从堆栈中弹出参数或者保留它是否安全?
我试图做“退12”,但也失败了。
答案 0 :(得分:1)
从调用[地址]返回后,您的edx包含垃圾,所以谁知道您正在弹出的内容。
您不需要弹入任何内存。只需弹出edx 3次。