Masm DLL程序里面的循环

时间:2016-02-07 01:00:58

标签: c++ dll masm

我写了一个MASM程序并将其动态加载到我的C ++应用程序中。 我一直在for循环中调用它,但在某个时刻它只是改变了循环的迭代器而且一切都崩溃了。

循环代码:

for (int i = 0; i < 64; i++){
    if (useAsm){
        if (0 <= i && i <= 15){//F
            F = FFunc(res[1],res[2],res[3]);
            g = i;
        }
        else if (16 <= i && i <= 31){//G
            F = GFunc(res[1], res[2], res[3]);
            g = ((5 * i + 1) & 0x0F);
        }
        else if (32 <= i & i <= 47){//H
            F = HFunc(res[1], res[2], res[3]);
            g = ((3 * i + 5) & 0x0F);
        }
        else if (48 <= i & i <= 63){//I
            F = IFunc(res[1], res[2], res[3]);
            g = ((7 * i) & 0x0F);
        }
    }
}
当我24岁时,我在F = GFunc(res[1], res[2], res[3]);被改变了

这是MASM程序的代码

GFunc proc  Bval: DWORD,
        Cval: DWORD,
        Dval: DWORD
mov eax, Cval
xor eax, Bval
and eax, Dval
xor eax, Cval
ret

FFunc工作正常,所以我真的不明白为什么会这样。

我检查了反汇编:

call        dword ptr [GFunc]  
add         esp,0Ch  

add esp,0Ch似乎在某种程度上覆盖了我,至少那是调试器告诉我的。

1 个答案:

答案 0 :(得分:1)

看起来C ++编译器认为你的汇编函数遵循cdecl calling convention,但你的汇编函数很可能遵循stdcall约定。

解决此问题的一种方法是将GFunc的声明更改为:

extern DWORD __stdcall GFunc(DWORD, DWORD, DWORD);