2015-02-07 56 views
0
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; 

但是,清理时出现段错误。如果我不弹出堆栈中的参数,它不会出现段错误。CDECL中的组件清理堆栈导致崩溃

在这种情况下,我是否需要将参数从堆栈中弹出或者是否安全?

我试图做“ret 12”,但也失败了。

+0

但是你失去了我。这个函数是调用者。它“打电话给[地址]”,那么它必须正确清理它? – Brandon 2015-02-07 20:56:06

回答

1
  1. 你的edx在呼叫[地址]返回后包含垃圾,所以谁知道你在弹出什么。

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

+0

啊!没有注意到。试图弄清楚我做错了什么,正在破坏我的大脑。 Ahaha。谢谢一堆! – Brandon 2015-02-07 21:07:50

+0

很高兴能有所帮助,但请告诉我,这是否确实解决了问题? – 2015-02-07 21:09:43

+1

是的,它的工作原理。它修复了它。 – Brandon 2015-02-07 21:31:34