"ret"指令访问冲突

iDo*_*omo 1 c++ assembly inline-assembly access-violation

我有这个功能,主要由内联asm组成.

long *toarrayl(int members, ...){
    __asm{
        push esp

        mov eax, members
        imul eax, 4
        push eax
        call malloc
        mov edx, eax
        mov edi, eax

        xor ecx, ecx
        xor esi, esi
loopx:
        cmp ecx, members
        je done
        mov esi, 4

        imul esi, ecx
        add esi, ebp
        mov eax, [esi+0xC]
        mov [edi], eax
        inc ecx
        add edi, 4
        jmp loopx
done:
        mov eax, edx
        pop esp
        ret
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,我在返回指令上遇到访问冲突.

我正在使用VC++ 6,它有时可能意味着指向上面的行,所以可能在'pop esp'上.如果你能帮助我,那就太好了.谢谢,iDomo.

Ray*_*hen 8

您无法正确管理堆栈指针.特别是,你的调用malloc会使堆栈失去平衡,pop esp最终会将错误的值弹出esp.因此,当您尝试ret从无效堆栈(CPU无法读取返回地址)时,会发生访问冲突.目前还不清楚为什么你在推动和弹出esp; 没有成就.