装配清理CDECL中的堆栈会导致崩溃

时间:2015-02-07 20:47:56

标签: assembly freepascal

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”,但也失败了。

1 个答案:

答案 0 :(得分:1)

  1. 从调用[地址]返回后,您的edx包含垃圾,所以谁知道您正在弹出的内容。

  2. 您不需要弹入任何内存。只需弹出edx 3次。